Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions RELEASE.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
Release Notes
=============

Version 0.66.2
--------------

- fix b2b dashboard empty language code (#3293)
- prefer existing B2B enrollment over next_run_id when picking same-language run (#3291)
- filter server-side, remove video count (#3287)
- fix fallback when no language is selected (#3286)
- set s-maxage via NEXT_CACHE_S_MAXAGE_SECONDS (#3280)
- fix: assert run.title in DashboardCard heading test (#3282)
- fix: adjust duration position and remove institution label from the video series page and change the title of video and playlist on drawer (#3270)
- qdrant: Automatically compute optimizer settings (#3273)

Version 0.65.6 (Released May 04, 2026)
--------------

Expand Down
11 changes: 0 additions & 11 deletions frontends/api/src/hooks/learningResources/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,16 +193,6 @@ const useSimilarLearningResources = (
})
}

const useVectorSimilarLearningResources = (
id: number,
opts?: { enabled?: boolean },
) => {
return useQuery({
...learningResourceQueries.vectorSimilar(id),
...opts,
})
}

const useInfiniteLearningResourceItems = (
id: number,
params: Omit<ItemsListRequest, "offset">,
Expand All @@ -229,7 +219,6 @@ export {
usePlatformsList,
useSchoolsList,
useSimilarLearningResources,
useVectorSimilarLearningResources,
useInfiniteLearningResourceItems,
learningResourceQueries,
offerorQueries,
Expand Down
16 changes: 9 additions & 7 deletions frontends/api/src/hooks/learningResources/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import type {
LearningResourcesApiLearningResourcesSummaryListRequest as LearningResourcesSummaryListRequest,
PaginatedLearningResourceRelationshipList,
VideoPlaylistResource,
LearningResourcesApiLearningResourcesVectorSimilarListRequest,
} from "../../generated/v1"
import type { VectorLearningResourcesSearchApiVectorLearningResourcesSearchRetrieveRequest as VectorLearningResourcesSearchRetrieveRequest } from "../../generated/v0"
import { infiniteQueryOptions, queryOptions } from "@tanstack/react-query"
Expand Down Expand Up @@ -54,10 +55,9 @@ const learningResourceKeys = {
detailsRoot: () => [...learningResourceKeys.root, "detail"],
detail: (id: number) => [...learningResourceKeys.detailsRoot(), id],
similar: (id: number) => [...learningResourceKeys.detail(id), "similar"],
vectorSimilar: (id: number) => [
...learningResourceKeys.detail(id),
"vector_similar",
],
vectorSimilar: (
params: LearningResourcesApiLearningResourcesVectorSimilarListRequest,
) => [...learningResourceKeys.detail(params.id), "vector_similar", params],
itemsRoot: (id: number) => [...learningResourceKeys.detail(id), "items"],
items: (id: number, params: ItemsListRequest) => [
...learningResourceKeys.itemsRoot(id),
Expand Down Expand Up @@ -174,12 +174,14 @@ const learningResourceQueries = {
.learningResourcesSimilarList({ id })
.then((res) => res.data),
}),
vectorSimilar: (id: number) =>
vectorSimilar: (
params: LearningResourcesApiLearningResourcesVectorSimilarListRequest,
) =>
queryOptions({
queryKey: learningResourceKeys.vectorSimilar(id),
queryKey: learningResourceKeys.vectorSimilar(params),
queryFn: () =>
learningResourcesApi
.learningResourcesVectorSimilarList({ id })
.learningResourcesVectorSimilarList(params)
.then((res) => res.data),
}),
list: (params: LearningResourcesListRequest) =>
Expand Down
10 changes: 6 additions & 4 deletions frontends/main/next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ const NEXT_PUBLIC_OPTIMIZE_IMAGES = Boolean(
)
const IS_LOCAL_DEV = process.env.NODE_ENV === "development"

const NEXT_CACHE_S_MAXAGE_SECONDS =
process.env.NEXT_CACHE_S_MAXAGE_SECONDS || "1800"
const PAGE_CACHE_CONTROL = `s-maxage=${NEXT_CACHE_S_MAXAGE_SECONDS}, stale-if-error=86400, stale-while-revalidate=86400`

const processFeatureFlags = () => {
const featureFlagPrefix =
process.env.NEXT_PUBLIC_POSTHOG_FEATURE_PREFIX || "FEATURE_"
Expand Down Expand Up @@ -69,8 +73,7 @@ const nextConfig = {
headers: [
{
key: "Cache-Control",
value:
"s-maxage=1800, stale-if-error=86400, stale-while-revalidate=86400",
value: PAGE_CACHE_CONTROL,
},
],
},
Expand All @@ -86,8 +89,7 @@ const nextConfig = {
headers: [
{
key: "Cache-Control",
value:
"s-maxage=1800, stale-if-error=86400, stale-while-revalidate=86400",
value: PAGE_CACHE_CONTROL,
},
],
},
Expand Down
61 changes: 35 additions & 26 deletions frontends/main/src/app-pages/DashboardPage/ContractContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ import { ResourceType, getKey } from "./CoursewareDisplay/helpers"
import {
getCourseRunForSelectedLanguage,
getDistinctLanguageOptions,
getEnrollmentForSelectedLanguage,
getResolvedRunForSelectedLanguage,
getSelectedLanguageOption,
selectBestContractEnrollmentForLanguage,
} from "./CoursewareDisplay/languageOptions"
import UnstyledRawHTML from "@/components/UnstyledRawHTML/UnstyledRawHTML"

Expand Down Expand Up @@ -350,29 +350,34 @@ const OrgProgramCollectionDisplay: React.FC<{
/>
))}
{rawCourses.map((course) => {
const selectedLanguageOption = getSelectedLanguageOption(
course,
selectedLanguageKey,
)
const selectedRun = getCourseRunForSelectedLanguage(
course,
selectedLanguageKey,
)
// Filter enrollments to only those matching this contract
const contractEnrollments =
enrollments?.filter(
(enrollment) => enrollment.b2b_contract_id === contract.id,
) ?? []
const selectedLanguageEnrollment = getEnrollmentForSelectedLanguage(
contractEnrollments,
selectedLanguageOption,
selectedRun,
// Prefer the user's existing enrollment for the selected language
// over the next/best run, so older-run enrollments stay visible
// when the contract surfaces a newer run.
const selectedLanguageEnrollment =
selectBestContractEnrollmentForLanguage(
course,
contractEnrollments,
selectedLanguageKey,
)
const selectedLanguageOption = getSelectedLanguageOption(
course,
selectedLanguageKey,
)
const selectedRun = selectedLanguageEnrollment
? ((course.courseruns ?? []).find(
(r) => r.id === selectedLanguageEnrollment.run.id,
) ?? null)
: getCourseRunForSelectedLanguage(course, selectedLanguageKey)
const resolvedRun = getResolvedRunForSelectedLanguage(
course,
selectedLanguageOption,
selectedRun,
selectedLanguageEnrollment ?? null,
selectedLanguageEnrollment,
contract.id,
)
return (
Expand Down Expand Up @@ -473,30 +478,34 @@ const OrgProgramDisplay: React.FC<{
{programLoading || coursesQuery.isLoading
? skeleton
: courses.map((course) => {
const selectedLanguageOption = getSelectedLanguageOption(
course,
selectedLanguageKey,
)
const selectedRun = getCourseRunForSelectedLanguage(
course,
selectedLanguageKey,
)
// Filter enrollments to only those matching this contract
const contractEnrollments =
courseRunEnrollments?.filter(
(enrollment) => enrollment.b2b_contract_id === contract?.id,
) ?? []
// Prefer the user's existing enrollment for the selected
// language over the next/best run, so older-run enrollments
// stay visible when the contract surfaces a newer run.
const selectedLanguageEnrollment =
getEnrollmentForSelectedLanguage(
selectBestContractEnrollmentForLanguage(
course,
contractEnrollments,
selectedLanguageOption,
selectedRun,
selectedLanguageKey,
)
const selectedLanguageOption = getSelectedLanguageOption(
course,
selectedLanguageKey,
)
const selectedRun = selectedLanguageEnrollment
? ((course.courseruns ?? []).find(
(r) => r.id === selectedLanguageEnrollment.run.id,
) ?? null)
: getCourseRunForSelectedLanguage(course, selectedLanguageKey)
const resolvedRun = getResolvedRunForSelectedLanguage(
course,
selectedLanguageOption,
selectedRun,
selectedLanguageEnrollment ?? null,
selectedLanguageEnrollment,
contract?.id,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ describe.each([
})
expect(courseLink).toHaveAttribute("href", coursewareUrl)
expect(
within(card).getByRole("heading", { name: course.title, level: 3 }),
within(card).getByRole("heading", { name: courseRun.title, level: 3 }),
).toBeInTheDocument()
})

Expand Down
Loading
Loading