From 8d2679d9cf94bb7cb03740db6bdde0105f1c346c Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Sun, 26 Apr 2026 00:41:04 +0530 Subject: [PATCH 1/8] feat: Introduce slot for customizing course tab navigation Adds a new plugin slot (`CourseTabsNavigationSlot`) to enable customization, modification, or hiding of the course tab navigation. Updated relevant components to integrate with the new slot. --- src/course-tabs/CourseTabsNavigation.tsx | 15 +++--- src/course-tabs/{index.js => index.ts} | 2 +- .../components/CompletionIcon.test.jsx | 2 +- .../CourseTabsNavigationSlot/README.md | 38 ++++++++++++++ .../course-tabs-navigation-shadow.png | Bin 0 -> 5140 bytes .../CourseTabsNavigationSlot/index.tsx | 8 +++ .../{LoadedTabPage.jsx => LoadedTabPage.tsx} | 48 ++++++++---------- 7 files changed, 75 insertions(+), 38 deletions(-) rename src/course-tabs/{index.js => index.ts} (50%) create mode 100644 src/plugin-slots/CourseTabsNavigationSlot/README.md create mode 100644 src/plugin-slots/CourseTabsNavigationSlot/course-tabs-navigation-shadow.png create mode 100644 src/plugin-slots/CourseTabsNavigationSlot/index.tsx rename src/tab-page/{LoadedTabPage.jsx => LoadedTabPage.tsx} (73%) diff --git a/src/course-tabs/CourseTabsNavigation.tsx b/src/course-tabs/CourseTabsNavigation.tsx index 87a1b92c4a..d9d315c1dd 100644 --- a/src/course-tabs/CourseTabsNavigation.tsx +++ b/src/course-tabs/CourseTabsNavigation.tsx @@ -1,16 +1,14 @@ import React from 'react'; -import classNames from 'classnames'; import { useIntl } from '@edx/frontend-platform/i18n'; -import { CourseTabLinksSlot } from '../plugin-slots/CourseTabLinksSlot'; -import { CoursewareSearch, CoursewareSearchToggle } from '../course-home/courseware-search'; -import { useCoursewareSearchState } from '../course-home/courseware-search/hooks'; -import Tabs from '../generic/tabs/Tabs'; +import { CoursewareSearch, CoursewareSearchToggle } from '@src/course-home/courseware-search'; +import { useCoursewareSearchState } from '@src/course-home/courseware-search/hooks'; +import { CourseTabLinksSlot } from '@src/plugin-slots/CourseTabLinksSlot'; +import Tabs from '@src/generic/tabs/Tabs'; import messages from './messages'; -interface CourseTabsNavigationProps { +export interface CourseTabsNavigationProps { activeTabSlug?: string; - className?: string | null; tabs: Array<{ title: string; slug: string; @@ -20,14 +18,13 @@ interface CourseTabsNavigationProps { const CourseTabsNavigation = ({ activeTabSlug = undefined, - className = null, tabs, }:CourseTabsNavigationProps) => { const intl = useIntl(); const { show } = useCoursewareSearchState(); return ( -
+
diff --git a/src/course-tabs/index.js b/src/course-tabs/index.ts similarity index 50% rename from src/course-tabs/index.js rename to src/course-tabs/index.ts index e2236ee726..801de27856 100644 --- a/src/course-tabs/index.js +++ b/src/course-tabs/index.ts @@ -1,2 +1,2 @@ -/* eslint-disable import/prefer-default-export */ export { default as CourseTabsNavigation } from './CourseTabsNavigation'; +export type { CourseTabsNavigationProps } from './CourseTabsNavigation'; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.jsx index cb026fb46b..7664b02357 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.jsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; -import CompletionIcon from './CompletionIcon'; +import { CompletionIcon } from './CompletionIcon'; describe('CompletionIcon', () => { it('renders check circle icon when completion is equal to total and completion tracking is enabled', () => { diff --git a/src/plugin-slots/CourseTabsNavigationSlot/README.md b/src/plugin-slots/CourseTabsNavigationSlot/README.md new file mode 100644 index 0000000000..084bf07b02 --- /dev/null +++ b/src/plugin-slots/CourseTabsNavigationSlot/README.md @@ -0,0 +1,38 @@ +# Course Tab Navigation Slot + +### Slot ID: `org.openedx.frontend.learning.course_tabs_navigation.v1` + +### Props: +NONE + +## Description + +This slot is used to replace/modify/hide the entire course tab navigation. + +## Example + +### Added a drop shadow to Course Tabs bar +![Added a drop shadow to Course Tabs bar](./course-tabs-navigation-shadow.png) + +The following `env.config.jsx` will add a new course tab call "Custom Tab". + +```js +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + "org.openedx.frontend.learning.course_tab_navigation.v1": { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Wrap, + widgetId: 'default_contents', + wrapper: ({component}) => (
{component}
) + }, + ], + }, + }, +} + +export default config; +``` diff --git a/src/plugin-slots/CourseTabsNavigationSlot/course-tabs-navigation-shadow.png b/src/plugin-slots/CourseTabsNavigationSlot/course-tabs-navigation-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3c6617be2f09ad7213766378dd63cd8a6d3988 GIT binary patch literal 5140 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 literal 0 HcmV?d00001 diff --git a/src/plugin-slots/CourseTabsNavigationSlot/index.tsx b/src/plugin-slots/CourseTabsNavigationSlot/index.tsx new file mode 100644 index 0000000000..eda1e470b2 --- /dev/null +++ b/src/plugin-slots/CourseTabsNavigationSlot/index.tsx @@ -0,0 +1,8 @@ +import { CourseTabsNavigation, type CourseTabsNavigationProps } from '@src/course-tabs'; +import { PluginSlot } from '@openedx/frontend-plugin-framework'; + +export const CourseTabsNavigationSlot = ({ tabs, activeTabSlug }: CourseTabsNavigationProps) => ( + + + +); diff --git a/src/tab-page/LoadedTabPage.jsx b/src/tab-page/LoadedTabPage.tsx similarity index 73% rename from src/tab-page/LoadedTabPage.jsx rename to src/tab-page/LoadedTabPage.tsx index 67a1b86595..2ff80fc84b 100644 --- a/src/tab-page/LoadedTabPage.jsx +++ b/src/tab-page/LoadedTabPage.tsx @@ -1,27 +1,35 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Helmet } from 'react-helmet'; import { getConfig } from '@edx/frontend-platform'; import { useToggle } from '@openedx/paragon'; -import { CourseTabsNavigation } from '../course-tabs'; -import { useModel } from '../generic/model-store'; -import { AlertList } from '../generic/user-messages'; -import StreakModal from '../shared/streak-celebration'; -import InstructorToolbar from '../instructor-toolbar'; -import useEnrollmentAlert from '../alerts/enrollment-alert'; -import useLogistrationAlert from '../alerts/logistration-alert'; +import { CourseTabsNavigationSlot } from '@src/plugin-slots/CourseTabsNavigationSlot'; + +import { useModel } from '@src/generic/model-store'; +import { AlertList } from '@src/generic/user-messages'; +import useEnrollmentAlert from '@src/alerts/enrollment-alert'; +import useLogistrationAlert from '@src/alerts/logistration-alert'; +import StreakModal from '@src/shared/streak-celebration'; +import InstructorToolbar from '@src/instructor-toolbar'; import ProductTours from '../product-tours/ProductTours'; +interface LoadedTabPageProps { + activeTabSlug: string; + children: React.ReactNode; + courseId: string; + metadataModel: string; + unitId: string | null; +} + const LoadedTabPage = ({ activeTabSlug, - children, + children = null, courseId, - metadataModel, - unitId, -}) => { + metadataModel = 'courseHomeMeta', + unitId = null, +}: LoadedTabPageProps) => { const { celebrations, org, @@ -80,7 +88,7 @@ const LoadedTabPage = ({ ...logistrationAlert, }} /> - +
{children}
@@ -89,18 +97,4 @@ const LoadedTabPage = ({ ); }; -LoadedTabPage.propTypes = { - activeTabSlug: PropTypes.string.isRequired, - children: PropTypes.node, - courseId: PropTypes.string.isRequired, - metadataModel: PropTypes.string, - unitId: PropTypes.string, -}; - -LoadedTabPage.defaultProps = { - children: null, - metadataModel: 'courseHomeMeta', - unitId: null, -}; - export default LoadedTabPage; From 5fff87507cae4653316167724f2f9d0accb1b3ef Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Tue, 28 Apr 2026 22:53:53 +0530 Subject: [PATCH 2/8] refactor: Separate course outline data and sidebar context logic Splits `useCourseOutlineSidebar` into `useCourseOutlineData` and `useCourseOutlineSidebar` for improved separation of responsibilities. Updates components and styles to reflect this change. This change allows the usage of the course outline outside of a sidebar context. --- .../course-outline/CourseOutlineTray.jsx | 39 ++++-- .../course-outline/CourseOutlineTray.scss | 4 +- .../course-outline/CourseOutlineTrigger.jsx | 4 +- .../components/SidebarSection.jsx | 4 +- .../components/SidebarSequence.jsx | 4 +- .../course-outline/components/SidebarUnit.jsx | 2 +- .../components/UnitLinkWrapper.tsx | 14 +- .../sidebar/sidebars/course-outline/hooks.js | 131 +++++++++++------- 8 files changed, 123 insertions(+), 79 deletions(-) diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.jsx b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.jsx index 8eaf5e8a0b..2609f48f3e 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.jsx @@ -9,29 +9,25 @@ import { import { LOADING } from '@src/constants'; import PageLoading from '@src/generic/PageLoading'; +import { useParams } from 'react-router-dom'; import SidebarSection from './components/SidebarSection'; import SidebarSequence from './components/SidebarSequence'; import { ID } from './constants'; -import { useCourseOutlineSidebar } from './hooks'; +import { useCourseOutlineData, useCourseOutlineSidebar } from './hooks'; import messages from './messages'; -const CourseOutlineTray = () => { +export const CourseOutline = ({ shouldDisplayFullScreen = false, onToggleCollapse = null }) => { const intl = useIntl(); const [selectedSection, setSelectedSection] = useState(null); const [isDisplaySequenceLevel, setDisplaySequenceLevel, setDisplaySectionLevel] = useToggle(true); - + const { unitId, courseId } = useParams(); const { - courseId, - unitId, - currentSidebar, - handleToggleCollapse, - isActiveEntranceExam, - shouldDisplayFullScreen, courseOutlineStatus, activeSequenceId, sections, sequences, - } = useCourseOutlineSidebar(); + isActiveEntranceExam, + } = useCourseOutlineData(); const resolvedSectionId = selectedSection || Object.keys(sections).find( @@ -50,7 +46,6 @@ const CourseOutlineTray = () => { setDisplaySequenceLevel(); setSelectedSection(id); }; - const sidebarHeading = (
{isDisplaySequenceLevel && backButtonTitle ? ( @@ -67,19 +62,20 @@ const CourseOutlineTray = () => { {intl.formatMessage(messages.courseOutlineTitle)} )} + {onToggleCollapse + && ( + )}
); - - if (isActiveEntranceExam || currentSidebar !== ID) { + if (isActiveEntranceExam) { return null; } - if (courseOutlineStatus === LOADING) { return (
{ ); }; +const CourseOutlineTray = () => { + const { + currentSidebar, + shouldDisplayFullScreen, + handleToggleCollapse, + } = useCourseOutlineSidebar(); + + if (currentSidebar !== ID) { + return null; + } + return ; +}; + CourseOutlineTray.ID = ID; export default CourseOutlineTray; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss index a574f02736..82c68f4452 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss @@ -13,7 +13,7 @@ } .outline-sidebar-heading-wrapper { - border: 1px solid #d7d3d1; + border: 1px solid var(--pgn-color-light-700); &.sticky { position: sticky; @@ -29,7 +29,7 @@ .course-sidebar-section { background: var(--pgn-color-white); - border: 1px solid #d7d3d1; + border: 1px solid var(--pgn-color-light-700); button { line-height: 1.75rem; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTrigger.jsx b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTrigger.jsx index abccd14aed..3d6039598f 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTrigger.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTrigger.jsx @@ -4,17 +4,17 @@ import { useIntl } from '@edx/frontend-platform/i18n'; import { IconButton } from '@openedx/paragon'; import { MenuOpen as MenuOpenIcon } from '@openedx/paragon/icons'; -import { useCourseOutlineSidebar } from './hooks'; +import { useCourseOutlineData, useCourseOutlineSidebar } from './hooks'; import { ID } from './constants'; import messages from './messages'; const CourseOutlineTrigger = ({ isMobileView }) => { const intl = useIntl(); + const { isActiveEntranceExam } = useCourseOutlineData(); const { currentSidebar, shouldDisplayFullScreen, handleToggleCollapse, - isActiveEntranceExam, } = useCourseOutlineSidebar(); const isDisplayForDesktopView = !isMobileView && !shouldDisplayFullScreen && currentSidebar !== ID; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx index 034575743b..246201ff37 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx @@ -6,7 +6,7 @@ import { ChevronRight as ChevronRightIcon } from '@openedx/paragon/icons'; import courseOutlineMessages from '@src/course-home/outline-tab/messages'; import CompletionIcon from './CompletionIcon'; -import { useCourseOutlineSidebar } from '../hooks'; +import { useCourseOutlineData } from '../hooks'; const SidebarSection = ({ section, handleSelectSection }) => { const intl = useIntl(); @@ -18,7 +18,7 @@ const SidebarSection = ({ section, handleSelectSection }) => { completionStat, } = section; - const { activeSequenceId, isEnabledCompletionTracking } = useCourseOutlineSidebar(); + const { activeSequenceId, isEnabledCompletionTracking } = useCourseOutlineData(); const isActiveSection = sequenceIds.includes(activeSequenceId); const sectionTitle = ( diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx index 5e1fb37a4f..e612a93c2d 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx @@ -5,7 +5,7 @@ import { useIntl } from '@edx/frontend-platform/i18n'; import { Collapsible } from '@openedx/paragon'; import courseOutlineMessages from '@src/course-home/outline-tab/messages'; -import { useCourseOutlineSidebar } from '../hooks'; +import { useCourseOutlineData } from '../hooks'; import CompletionIcon from './CompletionIcon'; import SidebarUnit from './SidebarUnit'; import { UNIT_ICON_TYPES } from './UnitIcon'; @@ -28,7 +28,7 @@ const SidebarSequence = ({ } = sequence; const [open, setOpen] = useState(defaultOpen); - const { activeSequenceId, units, isEnabledCompletionTracking } = useCourseOutlineSidebar(); + const { activeSequenceId, units, isEnabledCompletionTracking } = useCourseOutlineData(); const isActiveSequence = id === activeSequenceId; const sectionTitle = ( diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx index b2f6bc7249..e88408319b 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx @@ -28,7 +28,7 @@ const SidebarUnit = ({ const completeAndEnabled = complete && isCompletionTrackingEnabled; return ( -
  • +
  • = ({ courseId, children, }) => { - const { handleUnitClick } = useCourseOutlineSidebar(); + const { handleUnitClick } = useCourseOutlineData(); + const { shouldDisplayFullScreen, handleToggleCollapse } = useCourseOutlineSidebar(); const { pathname } = useLocation(); const isPreview = pathname.startsWith('/preview'); const baseUrl = `/course/${courseId}/${sequenceId}/${id}`; const link = isPreview ? `/preview${baseUrl}` : baseUrl; + const handleClick = React.useCallback(() => { + // Hide the sidebar after selecting a unit on a mobile device. + if (shouldDisplayFullScreen) { + handleToggleCollapse(); + } + handleUnitClick({ sequenceId, activeUnitId, id }); + }, [handleUnitClick, sequenceId, activeUnitId, id]); return ( handleUnitClick({ sequenceId, activeUnitId, id })} + onClick={handleClick} > {children} diff --git a/src/courseware/course/sidebar/sidebars/course-outline/hooks.js b/src/courseware/course/sidebar/sidebars/course-outline/hooks.js index 1e180fa279..8b0a2360da 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/hooks.js +++ b/src/courseware/course/sidebar/sidebars/course-outline/hooks.js @@ -1,28 +1,27 @@ -import { - useContext, useEffect, useLayoutEffect, useState, -} from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { useParams } from 'react-router-dom'; import { sendTrackEvent, sendTrackingLogEvent } from '@edx/frontend-platform/analytics'; import { breakpoints } from '@openedx/paragon'; - -import { useModel } from '@src/generic/model-store'; import { LOADED } from '@src/constants'; -import { checkBlockCompletion, getCourseOutlineStructure } from '@src/courseware/data/thunks'; import { - getCoursewareOutlineSidebarSettings, + getCourseOutline, getCourseOutlineShouldUpdate, getCourseOutlineStatus, + getCoursewareOutlineSidebarSettings, getSequenceId, - getCourseOutline, getSequenceStatus, } from '@src/courseware/data/selectors'; +import { checkBlockCompletion, getCourseOutlineStructure } from '@src/courseware/data/thunks'; + +import { useModel } from '@src/generic/model-store'; +import { + useContext, useEffect, useLayoutEffect, useState, +} from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { useParams } from 'react-router-dom'; import SidebarContext from '../../SidebarContext'; import { setOutlineSidebarCollapsed } from '../../utils/storage'; import { ID } from './constants'; -// eslint-disable-next-line import/prefer-default-export -export const useCourseOutlineSidebar = () => { +export const useCourseOutlineData = () => { const dispatch = useDispatch(); const { enableCompletionTracking: isEnabledCompletionTracking, @@ -31,43 +30,26 @@ export const useCourseOutlineSidebar = () => { const courseOutlineStatus = useSelector(getCourseOutlineStatus); const sequenceStatus = useSelector(getSequenceStatus); const activeSequenceId = useSelector(getSequenceId); - const { sections = {}, sequences = {}, units = {} } = useSelector(getCourseOutline); + const { + sections = {}, + sequences = {}, + units = {}, + } = useSelector(getCourseOutline); const { courseId } = useParams(); const course = useModel('coursewareMeta', courseId); - const { - unitId, - currentSidebar, - toggleSidebar, - shouldDisplayFullScreen, - } = useContext(SidebarContext); - - // Course outline state is now fully controlled by SidebarContextProvider - // This component only renders when currentSidebar === 'COURSE_OUTLINE' - const [isOpen, setIsOpen] = useState(true); - const { entranceExamEnabled, entranceExamPassed, } = course.entranceExamData || {}; const isActiveEntranceExam = entranceExamEnabled && !entranceExamPassed; - const collapseSidebar = () => { - toggleSidebar(null); - setOutlineSidebarCollapsed(true); - }; - - const handleToggleCollapse = () => { - if (currentSidebar === ID) { - collapseSidebar(); - } else { - toggleSidebar(ID); - setOutlineSidebarCollapsed(false); - } - }; - - const handleUnitClick = ({ sequenceId, activeUnitId, id }) => { + const handleUnitClick = ({ + sequenceId, + activeUnitId, + id, + }) => { const logEvent = (eventName, widgetPlacement) => { const findSequenceByUnitId = () => Object.values(sequences).find(seq => seq.unitIds.includes(activeUnitId)); const activeSequence = findSequenceByUnitId(activeUnitId); @@ -91,10 +73,64 @@ export const useCourseOutlineSidebar = () => { logEvent('edx.ui.lms.sequence.tab_selected', 'left'); dispatch(checkBlockCompletion(courseId, sequenceId, activeUnitId)); + }; + + // Load course outline structure when needed + useEffect(() => { + if (courseOutlineStatus !== LOADED || courseOutlineShouldUpdate) { + dispatch(getCourseOutlineStructure(courseId)); + } + }, [courseId, courseOutlineShouldUpdate]); + + return { + isEnabledCompletionTracking, + isActiveEntranceExam, + courseOutlineStatus, + activeSequenceId, + sections, + sequences, + units, + handleUnitClick, + sequenceStatus, + }; +}; - // Hide the sidebar after selecting a unit on a mobile device. - if (shouldDisplayFullScreen) { - handleToggleCollapse(); +export const useCourseOutlineSidebar = () => { + const dispatch = useDispatch(); + const courseOutlineShouldUpdate = useSelector(getCourseOutlineShouldUpdate); + const courseOutlineStatus = useSelector(getCourseOutlineStatus); + + const { courseId } = useParams(); + const course = useModel('coursewareMeta', courseId); + + const { + unitId, + currentSidebar, + toggleSidebar, + shouldDisplayFullScreen, + } = useContext(SidebarContext); + + // Course outline state is now fully controlled by SidebarContextProvider + // This component only renders when currentSidebar === 'COURSE_OUTLINE' + const [isOpen, setIsOpen] = useState(true); + + const { + entranceExamEnabled, + entranceExamPassed, + } = course.entranceExamData || {}; + const isActiveEntranceExam = entranceExamEnabled && !entranceExamPassed; + + const collapseSidebar = () => { + toggleSidebar(null); + setOutlineSidebarCollapsed(true); + }; + + const handleToggleCollapse = () => { + if (currentSidebar === ID) { + collapseSidebar(); + } else { + toggleSidebar(ID); + setOutlineSidebarCollapsed(false); } }; @@ -121,21 +157,12 @@ export const useCourseOutlineSidebar = () => { }, [currentSidebar]); return { - courseId, + isActiveEntranceExam, unitId, currentSidebar, shouldDisplayFullScreen, - isEnabledCompletionTracking, isOpen, setIsOpen, handleToggleCollapse, - isActiveEntranceExam, - courseOutlineStatus, - activeSequenceId, - sections, - sequences, - units, - handleUnitClick, - sequenceStatus, }; }; From e11b0683a0d1e1c994954e4cd247b82a74fe1210 Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Wed, 29 Apr 2026 01:05:47 +0530 Subject: [PATCH 3/8] feat: Add new slots for customizing course outline section and sequence completion icons Introduces `CourseOutlineSidebarSectionCompletionIconSlot` and `CourseOutlineSidebarSequenceCompletionIconSlot` to enable customization, modification, or replacement of completion icons in the course outline. Updated components to integrate with these new slots. --- ...ourseOutlineTray.jsx => CourseOutline.tsx} | 74 ++++++++---------- .../course-outline/CourseOutlineTray.test.jsx | 6 +- .../course-outline/CourseOutlineTray.tsx | 20 +++++ ...nIcon.test.jsx => CompletionIcon.test.tsx} | 0 ...{CompletionIcon.jsx => CompletionIcon.tsx} | 19 +++-- .../components/SidebarSection.jsx | 10 ++- .../components/SidebarSequence.jsx | 10 ++- .../README.md | 51 ++++++++++++ ...course-outline-section-completion-icon.png | Bin 0 -> 72078 bytes .../course-outline-section-original.png | Bin 0 -> 66473 bytes .../index.tsx | 20 +++++ .../README.md | 48 ++++++++++++ ...ourse-outline-sequence-completion-icon.png | Bin 0 -> 55662 bytes .../index.tsx | 19 +++++ 14 files changed, 220 insertions(+), 57 deletions(-) rename src/courseware/course/sidebar/sidebars/course-outline/{CourseOutlineTray.jsx => CourseOutline.tsx} (73%) create mode 100644 src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.tsx rename src/courseware/course/sidebar/sidebars/course-outline/components/{CompletionIcon.test.jsx => CompletionIcon.test.tsx} (100%) rename src/courseware/course/sidebar/sidebars/course-outline/components/{CompletionIcon.jsx => CompletionIcon.tsx} (70%) create mode 100644 src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/README.md create mode 100644 src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/course-outline-section-completion-icon.png create mode 100644 src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/course-outline-section-original.png create mode 100644 src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/index.tsx create mode 100644 src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/README.md create mode 100644 src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/course-outline-sequence-completion-icon.png create mode 100644 src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/index.tsx diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.jsx b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutline.tsx similarity index 73% rename from src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.jsx rename to src/courseware/course/sidebar/sidebars/course-outline/CourseOutline.tsx index 2609f48f3e..33ced87281 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutline.tsx @@ -1,26 +1,39 @@ -import { useState } from 'react'; -import classNames from 'classnames'; -import { Button, useToggle, IconButton } from '@openedx/paragon'; import { useIntl } from '@edx/frontend-platform/i18n'; +import { Button, IconButton, useToggle } from '@openedx/paragon'; +import { LOADING } from '@src/constants'; import { MenuOpen as MenuOpenIcon, ChevronLeft as ChevronLeftIcon, } from '@openedx/paragon/icons'; - -import { LOADING } from '@src/constants'; +import { + useCourseOutlineData, +} from '@src/courseware/course/sidebar/sidebars/course-outline/hooks'; import PageLoading from '@src/generic/PageLoading'; +import classNames from 'classnames'; +import { useState } from 'react'; import { useParams } from 'react-router-dom'; -import SidebarSection from './components/SidebarSection'; import SidebarSequence from './components/SidebarSequence'; -import { ID } from './constants'; -import { useCourseOutlineData, useCourseOutlineSidebar } from './hooks'; +import SidebarSection from './components/SidebarSection'; import messages from './messages'; -export const CourseOutline = ({ shouldDisplayFullScreen = false, onToggleCollapse = null }) => { +interface CourseOutlineProps { + shouldDisplayFullScreen?: boolean; + onToggleCollapse?: () => void; +} + +interface CoursePageParams extends Record { + courseId: string; + unitId: string; +} + +export const CourseOutline = ({ + shouldDisplayFullScreen = false, + onToggleCollapse, +}: CourseOutlineProps) => { const intl = useIntl(); - const [selectedSection, setSelectedSection] = useState(null); + const [selectedSection, setSelectedSection] = useState(null); const [isDisplaySequenceLevel, setDisplaySequenceLevel, setDisplaySectionLevel] = useToggle(true); - const { unitId, courseId } = useParams(); + const { unitId, courseId } = useParams(); const { courseOutlineStatus, activeSequenceId, @@ -30,19 +43,19 @@ export const CourseOutline = ({ shouldDisplayFullScreen = false, onToggleCollaps } = useCourseOutlineData(); const resolvedSectionId = selectedSection - || Object.keys(sections).find( - (sectionId) => sections[sectionId].sequenceIds.includes(activeSequenceId), - ); + || Object.keys(sections).find( + (sectionId):boolean => sections[sectionId].sequenceIds.includes(activeSequenceId), + )!; const sectionsIds = Object.keys(sections); - const sequenceIds = sections[resolvedSectionId]?.sequenceIds || []; - const backButtonTitle = sections[resolvedSectionId]?.title; + const sequenceIds: string[] = sections[resolvedSectionId]?.sequenceIds || []; + const backButtonTitle: string | undefined = sections[resolvedSectionId]?.title; const handleBackToSectionLevel = () => { setDisplaySectionLevel(); setSelectedSection(null); }; - const handleSelectSection = (id) => { + const handleSelectSection = (id:string) => { setDisplaySequenceLevel(); setSelectedSection(id); }; @@ -62,8 +75,7 @@ export const CourseOutline = ({ shouldDisplayFullScreen = false, onToggleCollaps {intl.formatMessage(messages.courseOutlineTitle)} )} - {onToggleCollapse - && ( + {onToggleCollapse && ( {isDisplaySequenceLevel - ? sequenceIds.map((sequenceId) => ( + ? sequenceIds.map((sequenceId: string) => ( )) : sectionsIds.map((sectionId) => ( @@ -125,20 +136,3 @@ export const CourseOutline = ({ shouldDisplayFullScreen = false, onToggleCollaps
  • ); }; - -const CourseOutlineTray = () => { - const { - currentSidebar, - shouldDisplayFullScreen, - handleToggleCollapse, - } = useCourseOutlineSidebar(); - - if (currentSidebar !== ID) { - return null; - } - return ; -}; - -CourseOutlineTray.ID = ID; - -export default CourseOutlineTray; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.test.jsx b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.test.jsx index aba41c8291..653a9bc8d5 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.test.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.test.jsx @@ -74,7 +74,7 @@ describe('', () => { await expect(screen.queryByText(messages.loading.defaultMessage)).not.toBeInTheDocument(); expect(screen.getByRole('button', { name: section.title })).toBeInTheDocument(); expect(screen.getByRole('button', { name: messages.toggleCourseOutlineTrigger.defaultMessage })).toBeInTheDocument(); - expect(screen.getByRole('button', { name: `${sequence.title} , ${courseOutlineMessages.incompleteAssignment.defaultMessage}` })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: new RegExp(`${sequence.title} , ${courseOutlineMessages.incompleteAssignment.defaultMessage}`) })).toBeInTheDocument(); expect(screen.getByText(unit.title)).toBeInTheDocument(); }); @@ -115,13 +115,13 @@ describe('', () => { const sidebarBackBtn = screen.queryByRole('button', { name: section.title }); expect(sidebarBackBtn).toBeInTheDocument(); - expect(screen.getByRole('button', { name: `${sequence.title} , ${courseOutlineMessages.incompleteAssignment.defaultMessage}` })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: new RegExp(`${sequence.title} , ${courseOutlineMessages.incompleteAssignment.defaultMessage}`) })).toBeInTheDocument(); await user.click(sidebarBackBtn); expect(sidebarBackBtn).not.toBeInTheDocument(); expect(screen.queryByText(messages.courseOutlineTitle.defaultMessage)).toBeInTheDocument(); - await user.click(screen.getByRole('button', { name: `${section.title} , ${courseOutlineMessages.incompleteSection.defaultMessage}` })); + await user.click(screen.getByRole('button', { name: new RegExp(`${section.title} , ${courseOutlineMessages.incompleteSection.defaultMessage}`) })); expect(screen.queryByRole('button', { name: section.title })).toBeInTheDocument(); }); }); diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.tsx b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.tsx new file mode 100644 index 0000000000..88f30fcfbe --- /dev/null +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.tsx @@ -0,0 +1,20 @@ +import { CourseOutline } from './CourseOutline'; +import { ID } from './constants'; +import { useCourseOutlineSidebar } from './hooks'; + +const CourseOutlineTray = () => { + const { + currentSidebar, + shouldDisplayFullScreen, + handleToggleCollapse, + } = useCourseOutlineSidebar(); + + if (currentSidebar !== ID) { + return null; + } + return ; +}; + +CourseOutlineTray.ID = ID; + +export default CourseOutlineTray; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.tsx similarity index 100% rename from src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.jsx rename to src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.tsx diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.tsx similarity index 70% rename from src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.jsx rename to src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.tsx index 9b3a855db8..a3fa67f5d7 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.tsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import { CheckCircle as CheckCircleIcon, LmsCompletionSolid as LmsCompletionSolidIcon, @@ -6,7 +5,15 @@ import { import { DashedCircleIcon } from '../icons'; -const CompletionIcon = ({ completionStat: { completed = 0, total = 0 }, enabled }) => { +export interface CompletionIconProps { + completionStat: { + completed: number; + total: number; + }; + enabled: boolean; +} + +export const CompletionIcon = ({ completionStat: { completed = 0, total = 0 }, enabled }: CompletionIconProps) => { const percentage = total !== 0 ? Math.min((completed / total) * 100, 100) : 0; const remainder = 100 - percentage; @@ -20,12 +27,4 @@ const CompletionIcon = ({ completionStat: { completed = 0, total = 0 }, enabled } }; -CompletionIcon.propTypes = { - completionStat: PropTypes.shape({ - completed: PropTypes.number, - total: PropTypes.number, - }).isRequired, - enabled: PropTypes.bool.isRequired, -}; - export default CompletionIcon; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx index 246201ff37..bfd2aa5d18 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx @@ -1,3 +1,6 @@ +import { + CourseOverviewSectionCompletionIconSlot, +} from '@src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { useIntl } from '@edx/frontend-platform/i18n'; @@ -5,7 +8,6 @@ import { Button, Icon } from '@openedx/paragon'; import { ChevronRight as ChevronRightIcon } from '@openedx/paragon/icons'; import courseOutlineMessages from '@src/course-home/outline-tab/messages'; -import CompletionIcon from './CompletionIcon'; import { useCourseOutlineData } from '../hooks'; const SidebarSection = ({ section, handleSelectSection }) => { @@ -24,7 +26,11 @@ const SidebarSection = ({ section, handleSelectSection }) => { const sectionTitle = ( <>
    - +
    {title} diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx index e612a93c2d..458b05ed0e 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSequence.jsx @@ -1,3 +1,6 @@ +import { + CourseOverviewSequenceCompletionIconSlot, +} from '@src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot'; import { useState } from 'react'; import classNames from 'classnames'; import PropTypes from 'prop-types'; @@ -6,7 +9,6 @@ import { Collapsible } from '@openedx/paragon'; import courseOutlineMessages from '@src/course-home/outline-tab/messages'; import { useCourseOutlineData } from '../hooks'; -import CompletionIcon from './CompletionIcon'; import SidebarUnit from './SidebarUnit'; import { UNIT_ICON_TYPES } from './UnitIcon'; @@ -34,7 +36,11 @@ const SidebarSequence = ({ const sectionTitle = ( <>
    - +
    {title} diff --git a/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/README.md b/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/README.md new file mode 100644 index 0000000000..68550f8bca --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/README.md @@ -0,0 +1,51 @@ +# Course Outline Sidebar Section Completion Icon Slot + +### Slot ID: `org.openedx.frontend.learning.course_outline_sidebar_section_completion_icon.v1` + +## Description + +This slot is used to replace/modify/hide the completion icon for sections in the course outline sidebar. + +### Props: +* `completionStat: { completed, total }`: Object containing the completion status of the section +* `enabled`: Boolean indicating if completion tracking is enabled for the section + +## Example + +### Unmodified Course Outline +![Course outline without modifications](./course-outline-section-original.png) + +### Replaced with a custom component +![custom progress display for section](./course-outline-section-completion-icon.png) + +The following `env.config.jsx` will replace the course outline sidebar section completion icon with a custom component. + +```js +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; +import { Bubble } from '@openedx/paragon'; + + +const config = { + pluginSlots: { + 'org.openedx.frontend.learning.course_outline_sidebar_section_completion_icon.v1': { + keepDefault: false, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_icon', + type: DIRECT_PLUGIN, + RenderWidget: ({completionStat, enabled}) => ( + + {completionStat.completed}/{completionStat.total} + + ), + }, + }, + ] + } + }, +} + +export default config; +``` diff --git a/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/course-outline-section-completion-icon.png b/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/course-outline-section-completion-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3b98ef1465bfd936b79c1b8b50df04e05268a81f GIT binary patch literal 72078 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 M;__m}AHMkfFU@%zo&W#< literal 0 HcmV?d00001 diff --git a/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/course-outline-section-original.png b/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/course-outline-section-original.png new file mode 100644 index 0000000000000000000000000000000000000000..3b49210407c4cb6d68ba480039c270aa6e1ff493 GIT binary patch literal 66473 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 P{PMk#Qj{zaH}wBsHucAS literal 0 HcmV?d00001 diff --git a/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/index.tsx b/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/index.tsx new file mode 100644 index 0000000000..b1d9419657 --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarSectionCompletionIconSlot/index.tsx @@ -0,0 +1,20 @@ +import { + CompletionIcon, + type CompletionIconProps, +} from '@src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon'; +import { PluginSlot } from '@openedx/frontend-plugin-framework'; + +import React from 'react'; + +interface Props extends CompletionIconProps { + active: boolean; +} + +export const CourseOverviewSectionCompletionIconSlot = ({ completionStat, enabled, active }: Props) => ( + + + +); diff --git a/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/README.md b/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/README.md new file mode 100644 index 0000000000..556d6d0d1e --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/README.md @@ -0,0 +1,48 @@ +# Course Outline Sidebar Sequence Completion Icon Slot + +### Slot ID: `org.openedx.frontend.learning.course_outline_sidebar_sequence_completion_icon.v1` + +## Description + +This slot is used to replace/modify/hide the completion icon for sequences in the course outline sidebar. + +### Props: +* `completionStat: { completed, total }`: Object containing the completion status of the sequence +* `enabled`: Boolean indicating if completion tracking is enabled for the sequence + +## Example + +### Replaced with a custom component +![custom progress display for sequence](./course-outline-sequence-completion-icon.png) + +The following `env.config.jsx` will replace the course outline sidebar sequence completion icon with a custom component. + +```js +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; +import { Bubble } from '@openedx/paragon'; + + +const config = { + pluginSlots: { + 'org.openedx.frontend.learning.course_outline_sidebar_sequence_completion_icon.v1': { + keepDefault: false, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_icon', + type: DIRECT_PLUGIN, + RenderWidget: ({completionStat, enabled}) => ( + + {completionStat.completed}/{completionStat.total} + + ), + }, + }, + ] + } + }, +} + +export default config; +``` diff --git a/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/course-outline-sequence-completion-icon.png b/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/course-outline-sequence-completion-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3363ab1de1fcb116ecc676268080116c22c816e0 GIT binary patch literal 55662 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

    iiuOI`LzEc8I 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

    T! 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 literal 0 HcmV?d00001 diff --git a/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/index.tsx b/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/index.tsx new file mode 100644 index 0000000000..0740d74f1e --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarSequenceCompletionIconSlot/index.tsx @@ -0,0 +1,19 @@ +import { + CompletionIcon, + type CompletionIconProps, +} from '@src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon'; +import { PluginSlot } from '@openedx/frontend-plugin-framework'; + +import React from 'react'; + +interface Props extends CompletionIconProps { + active: boolean; +} +export const CourseOverviewSequenceCompletionIconSlot = ({ completionStat, enabled, active }: Props) => ( + + + +); From 9446f2da11ce47bafdb8080298025e6d8c31e998 Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Wed, 29 Apr 2026 12:03:35 +0530 Subject: [PATCH 4/8] feat: Add slot for customizing course outline sidebar unit icons Introduces `CourseOutlineSidebarUnitIconSlot` to enable customization, modification, or replacement of unit icons in the course outline sidebar. Refactors `UnitIcon` to support TypeScript and updates related components to integrate with the new slot. --- .../course-outline/components/SidebarUnit.jsx | 5 ++- .../{UnitIcon.test.jsx => UnitIcon.test.tsx} | 4 +- .../components/{UnitIcon.jsx => UnitIcon.tsx} | 40 +++++++++++------ .../README.md | 42 ++++++++++++++++++ .../course-outline-unit-icon-replaced.png | Bin 0 -> 52616 bytes .../index.tsx | 28 ++++++++++++ 6 files changed, 101 insertions(+), 18 deletions(-) rename src/courseware/course/sidebar/sidebars/course-outline/components/{UnitIcon.test.jsx => UnitIcon.test.tsx} (83%) rename src/courseware/course/sidebar/sidebars/course-outline/components/{UnitIcon.jsx => UnitIcon.tsx} (56%) create mode 100644 src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md create mode 100644 src/plugin-slots/CourseOutlineSidebarUnitIconSlot/course-outline-unit-icon-replaced.png create mode 100644 src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx index e88408319b..9e3a739f2e 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarUnit.jsx @@ -1,9 +1,10 @@ +import { CourseOutlineSidebarUnitIconSlot } from '@src/plugin-slots/CourseOutlineSidebarUnitIconSlot'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { useIntl } from '@edx/frontend-platform/i18n'; import messages from '../messages'; -import UnitIcon, { UNIT_ICON_TYPES } from './UnitIcon'; +import { UNIT_ICON_TYPES } from './UnitIcon'; import UnitLinkWrapper from './UnitLinkWrapper'; const SidebarUnit = ({ @@ -38,7 +39,7 @@ const SidebarUnit = ({ }} >

    - +
    diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.tsx similarity index 83% rename from src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.jsx rename to src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.tsx index e5f70d1286..7182f47927 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.test.tsx @@ -1,9 +1,9 @@ import { render } from '@testing-library/react'; -import UnitIcon, { UNIT_ICON_TYPES } from './UnitIcon'; +import UnitIcon, { UNIT_ICON_TYPES, UnitIconType } from './UnitIcon'; describe('', () => { - Object.keys(UNIT_ICON_TYPES).forEach((type) => { + Object.keys(UNIT_ICON_TYPES).forEach((type:UnitIconType) => { it(`renders default ${type} icon correctly`, () => { const { container } = render(); const icon = container.querySelector('svg'); diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.tsx similarity index 56% rename from src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.jsx rename to src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.tsx index 47992f215a..78672b9a63 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon.tsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Locked as LockedIcon, @@ -10,6 +9,7 @@ import { LmsVideocam as LmsVideocamIcon, LmsVideocamComplete as LmsVideocamCompleteIcon, } from '@openedx/paragon/icons'; +import React, { SVGProps } from 'react'; export const UNIT_ICON_TYPES = { video: 'video', @@ -17,10 +17,30 @@ export const UNIT_ICON_TYPES = { vertical: 'vertical', lock: 'lock', other: 'other', -}; +} as const; + +export type UnitIconType = typeof UNIT_ICON_TYPES[keyof typeof UNIT_ICON_TYPES]; + +export interface UnitIconProps extends SVGProps { + type: UnitIconType; + isCompleted: boolean; +} + +type IconType = React.ComponentType>; + +interface IconPair { + default: IconType; + complete: IconType; +} -const UnitIcon = ({ type, isCompleted, ...props }) => { - const iconMap = { +type IconMapVal = IconType | IconPair; + +function isIconPair(val: IconMapVal): val is IconPair { + return typeof val === 'object' && 'default' in val && 'complete' in val; +} + +const UnitIcon = ({ type, isCompleted, ...props }: UnitIconProps) => { + const iconMap: Record = { [UNIT_ICON_TYPES.video]: { default: LmsVideocamIcon, complete: LmsVideocamCompleteIcon, @@ -37,20 +57,12 @@ const UnitIcon = ({ type, isCompleted, ...props }) => { }, }; - let Icon = iconMap[type || UNIT_ICON_TYPES.other]; - - if (typeof Icon === 'object') { - Icon = iconMap[type || UNIT_ICON_TYPES.other]?.[isCompleted ? 'complete' : 'default']; - } + const iconEntry = iconMap[type || UNIT_ICON_TYPES.other]; + const Icon: IconType = isIconPair(iconEntry) ? iconEntry[isCompleted ? 'complete' : 'default'] : iconEntry; return ( ); }; -UnitIcon.propTypes = { - type: PropTypes.oneOf(Object.keys(UNIT_ICON_TYPES)).isRequired, - isCompleted: PropTypes.bool.isRequired, -}; - export default UnitIcon; diff --git a/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md new file mode 100644 index 0000000000..45ff57d67e --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/README.md @@ -0,0 +1,42 @@ +# Course Outline Sidebar Unit Icon Slot + +### Slot ID: `org.openedx.frontend.learning.course_outline_sidebar_unit_icon.v1` + +### Props: +* `type`: The type of the unit. +* `isCompleted`: Whether the unit is completed. + +## Description + +This slot is used to replace/modify/hide the unit icon in the course outline sidebar. + +## Example + +### Replaced Unit Icon +![Replaced Unit Icon](./course-outline-unit-icon-replaced.png) + +The following `env.config.jsx` will replace the unit icon with a custom icon. + +```jsx +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + 'org.openedx.frontend.learning.course_outline_sidebar_unit_icon.v1': { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_unit_icon', + type: DIRECT_PLUGIN, + RenderWidget: ({isCompleted}) => (isCompleted ? '🗹' : '☐'), + }, + }, + ], + }, + }, +}; + +export default config; +``` diff --git a/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/course-outline-unit-icon-replaced.png b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/course-outline-unit-icon-replaced.png new file mode 100644 index 0000000000000000000000000000000000000000..afcf03aea2a966bbd4fa3909be3a400ba2b3672b GIT binary patch literal 52616 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 A4gdfE literal 0 HcmV?d00001 diff --git a/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx new file mode 100644 index 0000000000..4ea731b875 --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarUnitIconSlot/index.tsx @@ -0,0 +1,28 @@ +import { PluginSlot } from '@openedx/frontend-plugin-framework'; +import UnitIcon, { + UNIT_ICON_TYPES, + type UnitIconType, + type UnitIconProps, +} from '@src/courseware/course/sidebar/sidebars/course-outline/components/UnitIcon'; +import React from 'react'; + +export interface Props extends UnitIconProps { + active: boolean; +} +export { + UNIT_ICON_TYPES, + type UnitIconType, +}; + +export const CourseOutlineSidebarUnitIconSlot = ({ + type, isCompleted, active, ...props +}: Props) => ( + + + +); From ef36142913ceded02ea534a1987195a785958f10 Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Fri, 1 May 2026 19:32:19 +0530 Subject: [PATCH 5/8] refactor: Enhance course outline sidebar with CSS variables for styling customization Replaces hardcoded styles with CSS variables to enable flexible theming and dynamic styling of the course sidebar components. Adjusts related JSX and SCSS for consistency. --- .../sidebars/course-outline/CourseOutline.tsx | 8 +++---- .../course-outline/CourseOutlineTray.scss | 23 +++++++++++++++---- .../components/CompletionIcon.test.tsx | 1 + .../components/SidebarSection.jsx | 7 ++---- .../components/UnitIcon.test.tsx | 1 + 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutline.tsx b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutline.tsx index 33ced87281..c6b156fe40 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutline.tsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutline.tsx @@ -60,25 +60,25 @@ export const CourseOutline = ({ setSelectedSection(id); }; const sidebarHeading = ( -
    +
    {isDisplaySequenceLevel && backButtonTitle ? ( ) : ( - + {intl.formatMessage(messages.courseOutlineTitle)} )} {onToggleCollapse && ( diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss index 82c68f4452..ed06a6424a 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss @@ -13,7 +13,10 @@ } .outline-sidebar-heading-wrapper { - border: 1px solid var(--pgn-color-light-700); + border-width: var(--learning-sidebar-outline-heading-wrapper-border-width, 1px); + border-style: solid; + border-color: var(--learning-sidebar-outline-heading-wrapper-border-color, var(--pgn-color-light-700)); + background-color: var(--learning-sidebar-outline-heading-wrapper-bg-color, var(--pgn-color-light-200)); &.sticky { position: sticky; @@ -24,12 +27,18 @@ .outline-sidebar-heading { font-weight: var(--pgn-typography-font-weight-bold); + color: var(--learning-sidebar-outline-heading-text-color, var(--pgn-color-dark-500)); } } .course-sidebar-section { - background: var(--pgn-color-white); - border: 1px solid var(--pgn-color-light-700); + background: var(--learning-sidebar-outline-section-bg-color, var(--pgn-color-white)); + + border-width: var(--learning-sidebar-outline-section-border-width, 1px); + border-style: solid; + border-color: var(--learning-sidebar-outline-section-border-color, var(--pgn-color-light-700)); + + margin-bottom: var(--learning-sidebar-outline-section-margin-bottom, var(--pgn-spacing-spacer-2)); button { line-height: 1.75rem; @@ -38,11 +47,17 @@ &:focus::before { border-radius: 0; } + + padding: var(--learning-sidebar-outline-section-padding-y, var(--pgn-spacing-spacer-3-5)) var(--learning-sidebar-outline-section-padding-x, var(--pgn-spacing-spacer-4)); + } + &.active-section button { + background-color: var(--learning-sidebar-outline-section-active-bg-color, var(--pgn-color-light-100)); } } .outline-sidebar-toggle-btn { font-size: 1.5rem; + background-color: var(--learning-sidebar-outline-toggle-btn-bg-color, var(--pgn-color-light-200)); .collapsed & { transform: scale(-1, 1); @@ -78,7 +93,7 @@ } &:last-child .pgn_collapsible { - margin-bottom: 0px !important; + margin-bottom: 0 !important; } } diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.tsx b/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.tsx index 7664b02357..8e51445cb1 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.tsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/CompletionIcon.test.tsx @@ -1,3 +1,4 @@ +import '@testing-library/jest-dom'; import { render, screen } from '@testing-library/react'; import { CompletionIcon } from './CompletionIcon'; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx index bfd2aa5d18..92881ffcc2 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/SidebarSection.jsx @@ -47,13 +47,10 @@ const SidebarSection = ({ section, handleSelectSection }) => { ); return ( -
  • +
  • - ) : ( - - {intl.formatMessage(messages.courseOutlineTitle)} - - )} - {onToggleCollapse && ( - - )} -
  • + ); if (isActiveEntranceExam) { return null; diff --git a/src/courseware/course/sidebar/sidebars/course-outline/components/CourseOutlineHeading.tsx b/src/courseware/course/sidebar/sidebars/course-outline/components/CourseOutlineHeading.tsx new file mode 100644 index 0000000000..e14036353d --- /dev/null +++ b/src/courseware/course/sidebar/sidebars/course-outline/components/CourseOutlineHeading.tsx @@ -0,0 +1,51 @@ +import { useIntl } from '@edx/frontend-platform/i18n'; +import { Button, IconButton } from '@openedx/paragon'; +import { + MenuOpen as MenuOpenIcon, + ChevronLeft as ChevronLeftIcon, +} from '@openedx/paragon/icons'; +import messages from '../messages'; + +export interface CourseOutlineHeadingProps { + isSequenceLevel: boolean; + title?: string; + onClickBack: () => void; + onToggleCollapse?: () => void; +} + +export const CourseOutlineHeading = ({ + isSequenceLevel, + title, + onClickBack, + onToggleCollapse, +}:CourseOutlineHeadingProps) => { + const intl = useIntl(); + return ( +
    + {isSequenceLevel && title ? ( + + ) : ( + + {intl.formatMessage(messages.courseOutlineTitle)} + + )} + {onToggleCollapse && ( + + )} +
    + ); +}; diff --git a/src/plugin-slots/CourseOutlineSidebarHeadingSlot/README.md b/src/plugin-slots/CourseOutlineSidebarHeadingSlot/README.md new file mode 100644 index 0000000000..334ed75ba9 --- /dev/null +++ b/src/plugin-slots/CourseOutlineSidebarHeadingSlot/README.md @@ -0,0 +1,46 @@ +# Course Outline Sidebar Heading Slot + +### Slot ID: `org.openedx.frontend.learning.course_outline_sidebar_heading.v1` + +## Description + +This slot is used to replace/modify/hide the heading for sections in the course outline sidebar. + +### Props: +- `onToggleCollapse`: Function to toggle the collapse state of the section. +- `isSequenceLevel`: Boolean indicating if the section is a sequence level. +- `title`: The title of the section. +- `onClickBack`: Function to call when the back button is clicked. + +## Example + +### Wrapped with a border +![course outline sidebar heading with outline](./course-outline-heading-with-outline.png) + +The following `env.config.jsx` will wrap the default heading with a border. + +```js +import { PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + 'org.openedx.frontend.learning.course_outline_sidebar_heading.v1': { + keepDefault: true, + plugins: [ + { + op: PLUGIN_OPERATIONS.Wrap, + widgetId: 'default_contents', + wrapper: ({ component }) => ( +
    + {component} +
    + ), + }, + ], + }, + }, +}; + +export default config; + +``` diff --git a/src/plugin-slots/CourseOutlineSidebarHeadingSlot/course-outline-heading-with-outline.png b/src/plugin-slots/CourseOutlineSidebarHeadingSlot/course-outline-heading-with-outline.png new file mode 100644 index 0000000000000000000000000000000000000000..51e66abae8e7dcdf43af359fc9edcdf303d17e88 GIT binary patch literal 40059 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 ( + + + +); From 3bdfbf96105246ca95672434d0a7d4023cbc1abd Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Tue, 19 May 2026 01:11:19 +0530 Subject: [PATCH 7/8] feat: Add `SequenceBottomNavigationSlot` for customizable sequence navigation Introduces a new plugin slot (`SequenceBottomNavigationSlot`) for extending or replacing the default bottom navigation in course sequences. Updates `Sequence` component to integrate with this slot. Includes documentation and examples for plugin usage. --- src/courseware/course/Course.test.jsx | 2 +- src/courseware/course/sequence/Sequence.jsx | 18 ++++- .../sequence-navigation/UnitNavigation.jsx | 2 +- src/courseware/course/test-utils.jsx | 22 +++--- .../SequenceBottomNavigationSlot/README.md | 66 ++++++++++++++++++ .../arrow-naviation.png | Bin 0 -> 18773 bytes .../default-navigation.png | Bin 0 -> 22352 bytes .../SequenceBottomNavigationSlot/index.tsx | 47 +++++++++++++ 8 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 src/plugin-slots/SequenceBottomNavigationSlot/README.md create mode 100644 src/plugin-slots/SequenceBottomNavigationSlot/arrow-naviation.png create mode 100644 src/plugin-slots/SequenceBottomNavigationSlot/default-navigation.png create mode 100644 src/plugin-slots/SequenceBottomNavigationSlot/index.tsx diff --git a/src/courseware/course/Course.test.jsx b/src/courseware/course/Course.test.jsx index 1bf61f0eef..c4d5d57de1 100644 --- a/src/courseware/course/Course.test.jsx +++ b/src/courseware/course/Course.test.jsx @@ -188,7 +188,7 @@ describe('Course', () => { await setupDiscussionSidebar(); - const { rerender } = render(, { store: testStore }); + const { rerender } = render(, { store: testStore, wrapWithRouter: true }); loadUnit(); const sidebar = await screen.findByTestId('sidebar-DISCUSSIONS'); diff --git a/src/courseware/course/sequence/Sequence.jsx b/src/courseware/course/sequence/Sequence.jsx index e8bf9e2882..4b12cab2ac 100644 --- a/src/courseware/course/sequence/Sequence.jsx +++ b/src/courseware/course/sequence/Sequence.jsx @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-use-before-define */ +import SequenceBottomNavigationSlot from '@src/plugin-slots/SequenceBottomNavigationSlot'; import { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; @@ -224,7 +225,22 @@ const Sequence = ({ isOriginalUserStaff={originalUserIsStaff} renderUnitNavigation={renderUnitNavigation} /> - {unitHasLoaded && renderUnitNavigation(false)} + {unitHasLoaded && ( + { + logEvent('edx.ui.lms.sequence.previous_selected', 'bottom'); + handlePrevious(); + }} + nextHandler={() => { + logEvent('edx.ui.lms.sequence.next_selected', 'bottom'); + handleNext(); + }} + onNavigate={onNavigate} + /> + )}
    diff --git a/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx b/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx index ce8903dd4f..e0c9ad0188 100644 --- a/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx +++ b/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx @@ -2,13 +2,13 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; import { useIntl } from '@edx/frontend-platform/i18n'; +import { NextUnitTopNavTriggerSlot } from '@src/plugin-slots/NextUnitTopNavTriggerSlot'; import { GetCourseExitNavigation } from '../../course-exit'; import { useSequenceNavigationMetadata } from './hooks'; import messages from './messages'; import PreviousButton from './generic/PreviousButton'; import NextButton from './generic/NextButton'; -import { NextUnitTopNavTriggerSlot } from '../../../../plugin-slots/NextUnitTopNavTriggerSlot'; const UnitNavigation = ({ sequenceId, diff --git a/src/courseware/course/test-utils.jsx b/src/courseware/course/test-utils.jsx index 74afc67beb..43c5a13f43 100644 --- a/src/courseware/course/test-utils.jsx +++ b/src/courseware/course/test-utils.jsx @@ -1,12 +1,11 @@ -import React from 'react'; -import { Factory } from 'rosie'; import { getConfig, snakeCaseObject } from '@edx/frontend-platform'; import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; -import MockAdapter from 'axios-mock-adapter'; import { breakpoints } from '@openedx/paragon'; -import { executeThunk } from '@src/utils'; import { initializeTestStore, render } from '@src/setupTest'; -import SidebarContext from '@src/courseware/course/sidebar/SidebarContext'; +import { executeThunk } from '@src/utils'; +import MockAdapter from 'axios-mock-adapter'; +import React from 'react'; +import { Factory } from 'rosie'; import { buildTopicsFromUnits } from '../data/__factories__/discussionTopics.factory'; import * as thunks from '../data/thunks'; import Course from './Course'; @@ -43,15 +42,14 @@ const setupDiscussionSidebar = async (HomeMetaParams) => { mockData.unitId = firstUnitId; const [firstSequenceId] = Object.keys(state.models.sequences); mockData.sequenceId = firstSequenceId; - const contextValue = { courseId: mockData.courseId, currentSidebar: null, toggleSidebar: jest.fn() }; - const wrapper = await render( - - - , - { store: testStore, wrapWithRouter: true }, + return render( + , + { + store: testStore, + wrapWithRouter: true, + }, ); - return wrapper; }; export default setupDiscussionSidebar; diff --git a/src/plugin-slots/SequenceBottomNavigationSlot/README.md b/src/plugin-slots/SequenceBottomNavigationSlot/README.md new file mode 100644 index 0000000000..4ca651ec5a --- /dev/null +++ b/src/plugin-slots/SequenceBottomNavigationSlot/README.md @@ -0,0 +1,66 @@ +# Sequence Bottom Navigation Slot + +### Slot ID: `org.openedx.frontend.learning.sequence_bottom_navigation.v1` + +### Props: +* `sequenceId` (string) — Current sequence identifier +* `unitId` (string) — Current unit identifier +* `nextHandler` (function) — Handler for next navigation action +* `onNavigate` (function) — Handler for direct unit navigation +* `previousHandler` (function) — Handler for previous navigation action + +## Description + +This slot is used to replace/modify/hide the sequence navigation component that controls navigation between units within a course sequence at the bottom of the page. + +## Example + +### Default Navigation +![Default Navigation](./default-navigation.png) + +### Replaced with top naviation arrows +![Top navigation at bottom](./arrow-navigation.png) + +```js +import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework'; + +const config = { + pluginSlots: { + 'org.openedx.frontend.learning.sequence_bottom_navigation.v1': { + keepDefault: false, + plugins: [ + { + op: PLUGIN_OPERATIONS.Insert, + widget: { + id: 'custom_sequence_navigation', + type: DIRECT_PLUGIN, + RenderWidget: ({ + sequenceId, + unitId, + nextHandler, + onNavigate, + previousHandler + }) => { + const { courseId } = useParams(); + return ( +
    + +
    + ); + }, + }, + }, + ], + }, + }, +}; + +export default config; +``` diff --git a/src/plugin-slots/SequenceBottomNavigationSlot/arrow-naviation.png b/src/plugin-slots/SequenceBottomNavigationSlot/arrow-naviation.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfd615189c6d6d987dcbfb94318519cd364d4f8 GIT binary patch literal 18773 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 literal 0 HcmV?d00001 diff --git a/src/plugin-slots/SequenceBottomNavigationSlot/default-navigation.png b/src/plugin-slots/SequenceBottomNavigationSlot/default-navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..d07c1be223f2ba1347f33d2e057a088f464655f6 GIT binary patch literal 22352 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 literal 0 HcmV?d00001 diff --git a/src/plugin-slots/SequenceBottomNavigationSlot/index.tsx b/src/plugin-slots/SequenceBottomNavigationSlot/index.tsx new file mode 100644 index 0000000000..ea9ff0cb0d --- /dev/null +++ b/src/plugin-slots/SequenceBottomNavigationSlot/index.tsx @@ -0,0 +1,47 @@ +import { UnitNavigation } from '@src/courseware/course/sequence/sequence-navigation'; +import React from 'react'; +import { PluginSlot } from '@openedx/frontend-plugin-framework'; + +export interface SequenceBottomNavigationSlotProps { + courseId: string; + sequenceId: string; + unitId: string; + nextHandler: () => void; + onNavigate: (unitId: string) => void; + previousHandler: () => void; +} + +const SequenceBottomNavigationSlot = ({ + courseId, + sequenceId, + unitId, + nextHandler, + onNavigate, + previousHandler, +}: SequenceBottomNavigationSlotProps) => ( + + + +); + +export default SequenceBottomNavigationSlot; From 5db75dca95a5e64e9b1da6fc57d00137051b43c5 Mon Sep 17 00:00:00 2001 From: "kshitij.sobti" Date: Tue, 19 May 2026 13:05:53 +0530 Subject: [PATCH 8/8] refactor: Remove unused CSS variables from course outline sidebar styles --- .../course-outline/CourseOutlineTray.scss | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss index ed06a6424a..ec8bb50230 100644 --- a/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss +++ b/src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.scss @@ -13,10 +13,7 @@ } .outline-sidebar-heading-wrapper { - border-width: var(--learning-sidebar-outline-heading-wrapper-border-width, 1px); - border-style: solid; - border-color: var(--learning-sidebar-outline-heading-wrapper-border-color, var(--pgn-color-light-700)); - background-color: var(--learning-sidebar-outline-heading-wrapper-bg-color, var(--pgn-color-light-200)); + border: 1px solid var(--pgn-color-light-700); &.sticky { position: sticky; @@ -27,18 +24,12 @@ .outline-sidebar-heading { font-weight: var(--pgn-typography-font-weight-bold); - color: var(--learning-sidebar-outline-heading-text-color, var(--pgn-color-dark-500)); } } .course-sidebar-section { - background: var(--learning-sidebar-outline-section-bg-color, var(--pgn-color-white)); - - border-width: var(--learning-sidebar-outline-section-border-width, 1px); - border-style: solid; - border-color: var(--learning-sidebar-outline-section-border-color, var(--pgn-color-light-700)); - - margin-bottom: var(--learning-sidebar-outline-section-margin-bottom, var(--pgn-spacing-spacer-2)); + background: var(--pgn-color-white); + border: 1px solid var(--pgn-color-light-700); button { line-height: 1.75rem; @@ -47,17 +38,11 @@ &:focus::before { border-radius: 0; } - - padding: var(--learning-sidebar-outline-section-padding-y, var(--pgn-spacing-spacer-3-5)) var(--learning-sidebar-outline-section-padding-x, var(--pgn-spacing-spacer-4)); - } - &.active-section button { - background-color: var(--learning-sidebar-outline-section-active-bg-color, var(--pgn-color-light-100)); } } .outline-sidebar-toggle-btn { font-size: 1.5rem; - background-color: var(--learning-sidebar-outline-toggle-btn-bg-color, var(--pgn-color-light-200)); .collapsed & { transform: scale(-1, 1);