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 ( + + {isNewDiscussionSidebarViewEnabled ? : } + + ); +}; 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 ( + + {isNewDiscussionSidebarViewEnabled ? : } + + ); +}; 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/)