diff --git a/src/courseware/course/Course.jsx b/src/courseware/course/Course.jsx
index a5468fb3f4..913a8ce8d5 100644
--- a/src/courseware/course/Course.jsx
+++ b/src/courseware/course/Course.jsx
@@ -9,16 +9,15 @@ import { breakpoints, useWindowSize } from '@openedx/paragon';
import { AlertList } from '@src/generic/user-messages';
import { useModel } from '@src/generic/model-store';
import { getCoursewareOutlineSidebarSettings } from '../data/selectors';
-import { Trigger as CourseOutlineTrigger } from './sidebar/sidebars/course-outline';
import Chat from './chat/Chat';
import SidebarProvider from './sidebar/SidebarContextProvider';
-import SidebarTriggers from './sidebar/SidebarTriggers';
import NewSidebarProvider from './new-sidebar/SidebarContextProvider';
-import NewSidebarTriggers from './new-sidebar/SidebarTriggers';
+import { NotificationsDiscussionsSidebarTriggerSlot } from '../../plugin-slots/NotificationsDiscussionsSidebarTriggerSlot';
import { CelebrationModal, shouldCelebrateOnSectionLoad, WeeklyGoalCelebrationModal } from './celebration';
import CourseBreadcrumbs from './CourseBreadcrumbs';
import ContentTools from './content-tools';
import Sequence from './sequence';
+import { CourseOutlineMobileSidebarTriggerSlot } from '../../plugin-slots/CourseOutlineMobileSidebarTriggerSlot';
const Course = ({
courseId,
@@ -109,8 +108,8 @@ const Course = ({
>
)}
-
- {isNewDiscussionSidebarViewEnabled ? : }
+
+
diff --git a/src/courseware/course/sequence/Sequence.jsx b/src/courseware/course/sequence/Sequence.jsx
index 69444eeb53..db7c781a71 100644
--- a/src/courseware/course/sequence/Sequence.jsx
+++ b/src/courseware/course/sequence/Sequence.jsx
@@ -18,16 +18,13 @@ import SequenceContainerSlot from '../../../plugin-slots/SequenceContainerSlot';
import { getCoursewareOutlineSidebarSettings } from '../../data/selectors';
import CourseLicense from '../course-license';
-import Sidebar from '../sidebar/Sidebar';
-import NewSidebar from '../new-sidebar/Sidebar';
-import {
- Trigger as CourseOutlineTrigger,
- Sidebar as CourseOutlineTray,
-} from '../sidebar/sidebars/course-outline';
+import { NotificationsDiscussionsSidebarSlot } from '../../../plugin-slots/NotificationsDiscussionsSidebarSlot';
import messages from './messages';
import HiddenAfterDue from './hidden-after-due';
import { SequenceNavigation, UnitNavigation } from './sequence-navigation';
import SequenceContent from './SequenceContent';
+import CourseOutlineSidebarSlot from '../../../plugin-slots/CourseOutlineSidebarSlot';
+import CourseOutlineSidebarTriggerSlot from '../../../plugin-slots/CourseOutlineSidebarTriggerSlot';
const Sequence = ({
unitId,
@@ -46,7 +43,6 @@ const Sequence = ({
const {
isStaff,
originalUserIsStaff,
- isNewDiscussionSidebarViewEnabled,
} = useModel('courseHomeMeta', courseId);
const sequence = useModel('sequences', sequenceId);
const unit = useModel('units', unitId);
@@ -166,8 +162,8 @@ const Sequence = ({
const defaultContent = (
<>
-
-
+
+
{!isEnabledOutlineSidebar && (
@@ -209,7 +205,7 @@ const Sequence = ({
{unitHasLoaded && renderUnitNavigation(false)}
- {isNewDiscussionSidebarViewEnabled ?
:
}
+
>
diff --git a/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/README.md b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/README.md
new file mode 100644
index 0000000000..317dee73b6
--- /dev/null
+++ b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/README.md
@@ -0,0 +1,43 @@
+# Course Outline Mobile Sidebar Trigger Slot
+
+### Slot ID: `course_outline_mobile_sidebar_trigger_slot`
+
+## Description
+
+This slot is used to replace/modify/hide the course outline sidebar mobile trigger.
+
+## Example
+
+### Default content
+![Trigger slot with default content](./screenshot_default.png)
+
+### Replaced with custom component
+![📌 in trigger slot](./screenshot_custom.png)
+
+The following `env.config.jsx` will replace the course outline sidebar mobile trigger entirely.
+
+```js
+import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework';
+
+const config = {
+ pluginSlots: {
+ course_outline_mobile_sidebar_trigger_slot: {
+ keepDefault: false,
+ plugins: [
+ {
+ op: PLUGIN_OPERATIONS.Insert,
+ widget: {
+ id: 'custom_sidebar_trigger_component',
+ type: DIRECT_PLUGIN,
+ RenderWidget: () => (
+ 📌
+ ),
+ },
+ },
+ ]
+ }
+ },
+}
+
+export default config;
+```
diff --git a/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/index.tsx b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/index.tsx
new file mode 100644
index 0000000000..f192003b01
--- /dev/null
+++ b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/index.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+import { PluginSlot } from '@openedx/frontend-plugin-framework';
+
+import CourseOutlineTrigger from '../../courseware/course/sidebar/sidebars/course-outline/CourseOutlineTrigger';
+
+export const CourseOutlineMobileSidebarTriggerSlot : React.FC = () => (
+
+);
diff --git a/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/screenshot_custom.png b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/screenshot_custom.png
new file mode 100644
index 0000000000..90196f9cf7
Binary files /dev/null and b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/screenshot_custom.png differ
diff --git a/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/screenshot_default.png b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/screenshot_default.png
new file mode 100644
index 0000000000..ed59111086
Binary files /dev/null and b/src/plugin-slots/CourseOutlineMobileSidebarTriggerSlot/screenshot_default.png differ
diff --git a/src/plugin-slots/CourseOutlineSidebarSlot/README.md b/src/plugin-slots/CourseOutlineSidebarSlot/README.md
new file mode 100644
index 0000000000..d82eccb5a6
--- /dev/null
+++ b/src/plugin-slots/CourseOutlineSidebarSlot/README.md
@@ -0,0 +1,39 @@
+# Course Outline Sidebar Slot
+
+### Slot ID: `course_outline_sidebar_slot`
+
+## Description
+
+This slot is used to replace/modify/hide the course outline sidebar.
+
+## Example
+
+![📊 in sidebar slot](./screenshot.png)
+
+The following `env.config.jsx` will replace the course outline sidebar entirely.
+
+```js
+import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework';
+
+const config = {
+ pluginSlots: {
+ course_outline_sidebar_slot: {
+ keepDefault: false,
+ plugins: [
+ {
+ op: PLUGIN_OPERATIONS.Insert,
+ widget: {
+ id: 'custom_sidebar_component',
+ type: DIRECT_PLUGIN,
+ RenderWidget: () => (
+ 📊
+ ),
+ },
+ },
+ ]
+ }
+ },
+}
+
+export default config;
+```
diff --git a/src/plugin-slots/CourseOutlineSidebarSlot/index.jsx b/src/plugin-slots/CourseOutlineSidebarSlot/index.jsx
new file mode 100644
index 0000000000..58823dabbc
--- /dev/null
+++ b/src/plugin-slots/CourseOutlineSidebarSlot/index.jsx
@@ -0,0 +1,16 @@
+import { PluginSlot } from '@openedx/frontend-plugin-framework';
+
+import CourseOutlineTray from '../../courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray';
+
+const CourseOutlineSidebarSlot = () => (
+
+);
+
+export default CourseOutlineSidebarSlot;
diff --git a/src/plugin-slots/CourseOutlineSidebarSlot/screenshot.png b/src/plugin-slots/CourseOutlineSidebarSlot/screenshot.png
new file mode 100644
index 0000000000..f66ed21761
Binary files /dev/null and b/src/plugin-slots/CourseOutlineSidebarSlot/screenshot.png differ
diff --git a/src/plugin-slots/CourseOutlineSidebarTriggerSlot/README.md b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/README.md
new file mode 100644
index 0000000000..7164c85f97
--- /dev/null
+++ b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/README.md
@@ -0,0 +1,40 @@
+# Course Outline Sidebar Trigger Slot
+
+### Slot ID: `course_outline_sidebar_trigger_slot`
+
+## Description
+
+This slot is used to replace/modify/hide the course outline sidebar trigger.
+
+## Example
+
+![📌 in trigger slot with sidebar closed](./screenshot_1.png)
+![📌 in trigger slot with sidebar open](./screenshot_2.png)
+
+The following `env.config.jsx` will replace the course outline sidebar trigger entirely.
+
+```js
+import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework';
+
+const config = {
+ pluginSlots: {
+ course_outline_sidebar_trigger_slot: {
+ keepDefault: false,
+ plugins: [
+ {
+ op: PLUGIN_OPERATIONS.Insert,
+ widget: {
+ id: 'custom_sidebar_trigger_component',
+ type: DIRECT_PLUGIN,
+ RenderWidget: () => (
+ 📌
+ ),
+ },
+ },
+ ]
+ }
+ },
+}
+
+export default config;
+```
diff --git a/src/plugin-slots/CourseOutlineSidebarTriggerSlot/index.jsx b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/index.jsx
new file mode 100644
index 0000000000..83dbc3b16a
--- /dev/null
+++ b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/index.jsx
@@ -0,0 +1,16 @@
+import { PluginSlot } from '@openedx/frontend-plugin-framework';
+
+import CourseOutlineTrigger from '../../courseware/course/sidebar/sidebars/course-outline/CourseOutlineTrigger';
+
+const CourseOutlineSidebarTriggerSlot = () => (
+
+);
+
+export default CourseOutlineSidebarTriggerSlot;
diff --git a/src/plugin-slots/CourseOutlineSidebarTriggerSlot/screenshot_1.png b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/screenshot_1.png
new file mode 100644
index 0000000000..598de7ae1a
Binary files /dev/null and b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/screenshot_1.png differ
diff --git a/src/plugin-slots/CourseOutlineSidebarTriggerSlot/screenshot_2.png b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/screenshot_2.png
new file mode 100644
index 0000000000..746ddb652a
Binary files /dev/null and b/src/plugin-slots/CourseOutlineSidebarTriggerSlot/screenshot_2.png differ
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarSlot/README.md b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/README.md
new file mode 100644
index 0000000000..418d041426
--- /dev/null
+++ b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/README.md
@@ -0,0 +1,43 @@
+# Notifications Discussions Sidebar Slot
+
+### Slot ID: `notifications_discussions_sidebar_slot`
+
+## Description
+
+This slot is used to replace/modify/hide the notifications discussions sidebar.
+
+## Example
+
+### Default content
+![Sidebar slot with default content](./screenshot_default.png)
+
+### Replaced with custom component
+![📊 in sidebar slot](./screenshot_custom.png)
+
+The following `env.config.jsx` will replace the notifications discussions sidebar.
+
+```js
+import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework';
+
+const config = {
+ pluginSlots: {
+ notifications_discussions_sidebar_slot: {
+ keepDefault: false,
+ plugins: [
+ {
+ op: PLUGIN_OPERATIONS.Insert,
+ widget: {
+ id: 'custom_sidebar_component',
+ type: DIRECT_PLUGIN,
+ RenderWidget: () => (
+ 📊
+ ),
+ },
+ },
+ ]
+ }
+ },
+}
+
+export default config;
+```
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarSlot/index.tsx b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/index.tsx
new file mode 100644
index 0000000000..3f7454d8c5
--- /dev/null
+++ b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/index.tsx
@@ -0,0 +1,28 @@
+import React from 'react';
+
+import { PluginSlot } from '@openedx/frontend-plugin-framework';
+import { useModel } from '@src/generic/model-store';
+
+import Sidebar from '../../courseware/course/sidebar/Sidebar';
+import NewSidebar from '../../courseware/course/new-sidebar/Sidebar';
+
+interface Props {
+ courseId: string;
+}
+
+export const NotificationsDiscussionsSidebarSlot : React.FC = ({ courseId }) => {
+ const {
+ isNewDiscussionSidebarViewEnabled,
+ } = useModel('courseHomeMeta', courseId);
+
+ return (
+
+ );
+};
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarSlot/screenshot_custom.png b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/screenshot_custom.png
new file mode 100644
index 0000000000..a6561d7dac
Binary files /dev/null and b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/screenshot_custom.png differ
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarSlot/screenshot_default.png b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/screenshot_default.png
new file mode 100644
index 0000000000..46021fe926
Binary files /dev/null and b/src/plugin-slots/NotificationsDiscussionsSidebarSlot/screenshot_default.png differ
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/README.md b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/README.md
new file mode 100644
index 0000000000..3dc610572e
--- /dev/null
+++ b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/README.md
@@ -0,0 +1,43 @@
+# Notifications Discussions Sidebar Trigger Slot
+
+### Slot ID: `notifications_discussions_sidebar_trigger_slot`
+
+## Description
+
+This slot is used to replace/modify/hide the notifications discussions sidebar trigger.
+
+## Example
+
+### Default content
+![Trigger slot with default content](./screenshot_default.png)
+
+### Replaced with custom component
+![📬 in trigger slot](./screenshot_custom.png)
+
+The following `env.config.jsx` will replace the notifications discussions sidebar trigger.
+
+```js
+import { DIRECT_PLUGIN, PLUGIN_OPERATIONS } from '@openedx/frontend-plugin-framework';
+
+const config = {
+ pluginSlots: {
+ notifications_discussions_sidebar_trigger_slot: {
+ keepDefault: false,
+ plugins: [
+ {
+ op: PLUGIN_OPERATIONS.Insert,
+ widget: {
+ id: 'custom_sidebar_trigger_component',
+ type: DIRECT_PLUGIN,
+ RenderWidget: () => (
+ 📬
+ ),
+ },
+ },
+ ]
+ }
+ },
+}
+
+export default config;
+```
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/index.tsx b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/index.tsx
new file mode 100644
index 0000000000..8027ea2105
--- /dev/null
+++ b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/index.tsx
@@ -0,0 +1,28 @@
+import React from 'react';
+
+import { PluginSlot } from '@openedx/frontend-plugin-framework';
+import { useModel } from '@src/generic/model-store';
+
+import SidebarTriggers from '../../courseware/course/sidebar/SidebarTriggers';
+import NewSidebarTriggers from '../../courseware/course/new-sidebar/SidebarTriggers';
+
+interface Props {
+ courseId: string;
+}
+
+export const NotificationsDiscussionsSidebarTriggerSlot : React.FC = ({ courseId }) => {
+ const {
+ isNewDiscussionSidebarViewEnabled,
+ } = useModel('courseHomeMeta', courseId);
+
+ return (
+
+ );
+};
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/screenshot_custom.png b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/screenshot_custom.png
new file mode 100644
index 0000000000..6c250fa11b
Binary files /dev/null and b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/screenshot_custom.png differ
diff --git a/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/screenshot_default.png b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/screenshot_default.png
new file mode 100644
index 0000000000..35fa47b11d
Binary files /dev/null and b/src/plugin-slots/NotificationsDiscussionsSidebarTriggerSlot/screenshot_default.png differ
diff --git a/src/plugin-slots/README.md b/src/plugin-slots/README.md
index 5c20d87f39..2b404e6a9b 100644
--- a/src/plugin-slots/README.md
+++ b/src/plugin-slots/README.md
@@ -4,3 +4,8 @@
* [`footer_slot`](./FooterSlot/)
* [`sequence_container_slot`](./SequenceContainerSlot/)
* [`unit_title_slot`](./UnitTitleSlot/)
+* [`course_outline_sidebar_slot`](./CourseOutlineSidebarSlot/)
+* [`course_outline_sidebar_trigger_slot`](./CourseOutlineSidebarTriggerSlot)
+* [`course_outline_mobile_sidebar_trigger_slot`](./CourseOutlineMobileSidebarTriggerSlot/)
+* [`notifications_discussions_sidebar_slot`](./NotificationsDiscussionsSidebarSlot/)
+* [`notifications_discussions_sidebar_trigger_slot`](./NotificationsDiscussionsSidebarTriggerSlot/)