Skip to content

Commit e476ffb

Browse files
committed
feat: move sequence navigation to plugin slot
1 parent b6c29df commit e476ffb

6 files changed

Lines changed: 108 additions & 6 deletions

File tree

src/courseware/course/sequence/Sequence.jsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@ import SequenceExamWrapper from '@edx/frontend-lib-special-exams';
1313
import PageLoading from '@src/generic/PageLoading';
1414
import { useModel } from '@src/generic/model-store';
1515
import { useSequenceBannerTextAlert, useSequenceEntranceExamAlert } from '@src/alerts/sequence-alerts/hooks';
16-
import SequenceContainerSlot from '../../../plugin-slots/SequenceContainerSlot';
16+
import SequenceContainerSlot from '@src/plugin-slots/SequenceContainerSlot';
17+
import { CourseOutlineSidebarSlot } from '@src/plugin-slots/CourseOutlineSidebarSlot';
18+
import { CourseOutlineSidebarTriggerSlot } from '@src/plugin-slots/CourseOutlineSidebarTriggerSlot';
19+
import { NotificationsDiscussionsSidebarSlot } from '@src/plugin-slots/NotificationsDiscussionsSidebarSlot';
20+
import SequenceNavigationSlot from '@src/plugin-slots/SequenceNavigationSlot';
1721

1822
import { getCoursewareOutlineSidebarSettings } from '../../data/selectors';
1923
import CourseLicense from '../course-license';
20-
import { NotificationsDiscussionsSidebarSlot } from '../../../plugin-slots/NotificationsDiscussionsSidebarSlot';
2124
import messages from './messages';
2225
import HiddenAfterDue from './hidden-after-due';
23-
import { SequenceNavigation, UnitNavigation } from './sequence-navigation';
26+
import { UnitNavigation } from './sequence-navigation';
2427
import SequenceContent from './SequenceContent';
25-
import { CourseOutlineSidebarSlot } from '../../../plugin-slots/CourseOutlineSidebarSlot';
26-
import { CourseOutlineSidebarTriggerSlot } from '../../../plugin-slots/CourseOutlineSidebarTriggerSlot';
2728

2829
const Sequence = ({
2930
unitId,
@@ -172,7 +173,7 @@ const Sequence = ({
172173
<div className="sequence w-100">
173174
{!isEnabledOutlineSidebar && (
174175
<div className="sequence-navigation-container">
175-
<SequenceNavigation
176+
<SequenceNavigationSlot
176177
sequenceId={sequenceId}
177178
unitId={unitId}
178179
nextHandler={() => {

src/plugin-slots/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@
2323
* [`org.openedx.frontend.learning.progress_tab_grade_breakdown.v1`](./ProgressTabGradeBreakdownSlot/)
2424
* [`org.openedx.frontend.learning.progress_tab_related_links.v1`](./ProgressTabRelatedLinksSlot/)
2525
* [`org.openedx.frontend.learning.sequence_container.v1`](./SequenceContainerSlot/)
26+
* [`org.openedx.frontend.learning.sequence_navigation.v1`](./SequenceNavigationSlot/)
2627
* [`org.openedx.frontend.learning.unit_title.v1`](./UnitTitleSlot/)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Sequence Navigation Slot
2+
3+
### Slot ID: `org.openedx.frontend.learning.sequence_navigation.v1`
4+
5+
### Slot ID Aliases
6+
* `sequence_navigation_slot`
7+
8+
### Props:
9+
* `sequenceId`
10+
* `unitId`
11+
* `nextHandler`
12+
* `onNavigate`
13+
* `previousHandler`
14+
15+
## Description
16+
17+
This slot is used to replace/modify/hide the sequence navigation.
18+
19+
## Example
20+
21+
### Default content
22+
![Sequence navigation slot with default content](./screenshot_default.png)
23+
24+
### Replaced with custom component
25+
![📖 in sequence navigation slot](./screenshot_custom.png)
26+
27+
The following `env.config.jsx` will replace the sequence navigation entirely.
28+
29+
```js
30+
import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework';
31+
32+
const config = {
33+
pluginSlots: {
34+
'org.openedx.frontend.learning.sequence_navigation.v1': {
35+
keepDefault: false,
36+
plugins: [
37+
{
38+
op: PLUGIN_OPERATIONS.Insert,
39+
widget: {
40+
id: 'custom_sequence_navigation',
41+
type: DIRECT_PLUGIN,
42+
RenderWidget: () => (
43+
<h1 className="bg-gray-100 text-center">📖</h1>
44+
),
45+
},
46+
},
47+
]
48+
}
49+
},
50+
}
51+
52+
export default config;
53+
```
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import { PluginSlot } from '@openedx/frontend-plugin-framework';
4+
5+
import { SequenceNavigation } from '../../courseware/course/sequence/sequence-navigation';
6+
7+
const SequenceNavigationSlot = ({
8+
sequenceId,
9+
unitId,
10+
nextHandler,
11+
onNavigate,
12+
previousHandler,
13+
}) => (
14+
<PluginSlot
15+
id="org.openedx.frontend.learning.sequence_navigation.v1"
16+
idAliases={['sequence_navigation_slot']}
17+
slotOptions={{
18+
mergeProps: true,
19+
keepDefault: false,
20+
}}
21+
pluginProps={{
22+
sequenceId,
23+
unitId,
24+
nextHandler,
25+
onNavigate,
26+
previousHandler,
27+
}}
28+
>
29+
<SequenceNavigation
30+
sequenceId={sequenceId}
31+
unitId={unitId}
32+
nextHandler={nextHandler}
33+
onNavigate={onNavigate}
34+
previousHandler={previousHandler}
35+
/>
36+
</PluginSlot>
37+
);
38+
39+
SequenceNavigationSlot.propTypes = {
40+
sequenceId: PropTypes.string.isRequired,
41+
unitId: PropTypes.string.isRequired,
42+
nextHandler: PropTypes.func.isRequired,
43+
onNavigate: PropTypes.func.isRequired,
44+
previousHandler: PropTypes.func.isRequired,
45+
};
46+
47+
export default SequenceNavigationSlot;
984 KB
Loading
981 KB
Loading

0 commit comments

Comments
 (0)