Problem
In the Learning MFE, the right sidebar is part of the learning experience and currently shows two panels by default.
This is not ideal because:
The upsell panel is visible by default, even though it is not part of the Open edX core offering, and there is no supported way to disable it.
In courses that don’t offer a paid track, the upsell panel is empty.
The upsell panel is titled “Notifications”, which conflicts with the platform’s actual notifications tray and causes confusion (see screenshots below).
Discussions and upsell panel code are tightly coupled to the sidebar, making refactoring and future evolution of the sidebar more difficult.
The sidebar imports the Upsell panel directly, and the visibility state is also shared.
Even though Discussions takes priority in course units where it is enabled, learners still run into inconsistent behavior:
On units where discussions are disabled, the upsell panel may appear as the default sidebar content.
When discussions are visible, learners still see the clock icon and can click through to “no new notifications”.
Discussions panel is open in the right sidebar after clicking the discussions button on top-right.
Upsell panel is open in the right sidebar after clicking the upsell button on top-right.
Notifications tray is open on top of the page after clicking the bell button on right of header.
Current technical implementation
As of now, there are 3 plugin slots at work, as shown in the image below.
NotificationsDiscussionsSidebarTriggerSlot: This is where the code of triggers (buttons) for opening/closing discussions and upsell panel reside.
NotificationsDiscussionsSidebarSlot: This is where the code of discussions panel (as iframe) and upsell panel reside.
NotificationTraySlot: This plugin slot is within the upsell panel code (widget?) and can be used to insert content that is to be displayed in the upsell panel.
Visual representation of code structure that currently powers the right sidebar
Proposed way forward
Must have
Instance managers are able to enable or disable upsell panel in a supported way. Its default state is disabled because it is not part of core offering.
Discussions panel is enabled by default and is visible if discussions are enabled for a unit.
Text in the upsell panel does not imply that it has anything to do with notifications.
Nice to have
Instances are able to easily add more widgets like LTI tools, etc., in the sidebar via plugin slots.
Default state (open/close) of both left and right sidebar is controlled by a single setting/waffle flag (e.g., ACTIVE_RIGHT_SIDEBAR_AS_DEFAULT). Only 1 sidebar is open at any given time (which is already the case).
From technical perspective
Implement a panel registry/slot adapter pattern for the right sidebar:
The sidebar becomes a generic host for panels, dynamically rendering triggers and content based on a registry.
Only the discussions panel remains the default and is visible to all users.
The upsell panel (confusingly named “NotificationTray”) and other optional panels can be injected explicitly by instances via the registry.
Benefits
Provides a clean default experience for the community.
Preserves upsell functionality for instances like 2U without having to maintain a new plugin.
New panels with tools can be added without touching the core sidebar code.
Simplifies maintenance and supports opt-in configuration.
image-20260101-064539.png
Visual representation of proposed code structure
Migration plan
Initially, the Upsell widget will continue to live within the Learning MFE codebase but will be disabled by default. It will be enabled explicitly via configuration using a plugin slot registered through env.config.js.
There will be a clear timeline to either:
move the Upsell widget configuration into their own env.config.js, or
package the Upsell widget as a standalone plugin that can be injected via the same mechanism.
Related documents
INVESTIGATE: Does notification panel (not tray) in right sidebar exist in a plugin? · Issue #1832 · openedx/frontend-app-learning
Problem
In the Learning MFE, the right sidebar is part of the learning experience and currently shows two panels by default.
This is not ideal because:
The upsell panel is visible by default, even though it is not part of the Open edX core offering, and there is no supported way to disable it.
In courses that don’t offer a paid track, the upsell panel is empty.
The upsell panel is titled “Notifications”, which conflicts with the platform’s actual notifications tray and causes confusion (see screenshots below).
Discussions and upsell panel code are tightly coupled to the sidebar, making refactoring and future evolution of the sidebar more difficult.
The sidebar imports the Upsell panel directly, and the visibility state is also shared.
Even though Discussions takes priority in course units where it is enabled, learners still run into inconsistent behavior:
On units where discussions are disabled, the upsell panel may appear as the default sidebar content.
When discussions are visible, learners still see the clock icon and can click through to “no new notifications”.
Discussions panel is open in the right sidebar after clicking the discussions button on top-right.
Upsell panel is open in the right sidebar after clicking the upsell button on top-right.
Notifications tray is open on top of the page after clicking the bell button on right of header.
Current technical implementation
As of now, there are 3 plugin slots at work, as shown in the image below.
NotificationsDiscussionsSidebarTriggerSlot: This is where the code of triggers (buttons) for opening/closing discussions and upsell panel reside.
NotificationsDiscussionsSidebarSlot: This is where the code of discussions panel (as iframe) and upsell panel reside.
NotificationTraySlot: This plugin slot is within the upsell panel code (widget?) and can be used to insert content that is to be displayed in the upsell panel.
Visual representation of code structure that currently powers the right sidebar
Proposed way forward
Must have
Instance managers are able to enable or disable upsell panel in a supported way. Its default state is disabled because it is not part of core offering.
Discussions panel is enabled by default and is visible if discussions are enabled for a unit.
Text in the upsell panel does not imply that it has anything to do with notifications.
Nice to have
Instances are able to easily add more widgets like LTI tools, etc., in the sidebar via plugin slots.
Default state (open/close) of both left and right sidebar is controlled by a single setting/waffle flag (e.g., ACTIVE_RIGHT_SIDEBAR_AS_DEFAULT). Only 1 sidebar is open at any given time (which is already the case).
From technical perspective
Implement a panel registry/slot adapter pattern for the right sidebar:
The sidebar becomes a generic host for panels, dynamically rendering triggers and content based on a registry.
Only the discussions panel remains the default and is visible to all users.
The upsell panel (confusingly named “NotificationTray”) and other optional panels can be injected explicitly by instances via the registry.
Benefits
Provides a clean default experience for the community.
Preserves upsell functionality for instances like 2U without having to maintain a new plugin.
New panels with tools can be added without touching the core sidebar code.
Simplifies maintenance and supports opt-in configuration.
image-20260101-064539.png
Visual representation of proposed code structure
Migration plan
Initially, the Upsell widget will continue to live within the Learning MFE codebase but will be disabled by default. It will be enabled explicitly via configuration using a plugin slot registered through env.config.js.
There will be a clear timeline to either:
move the Upsell widget configuration into their own env.config.js, or
package the Upsell widget as a standalone plugin that can be injected via the same mechanism.
Related documents
INVESTIGATE: Does notification panel (not tray) in right sidebar exist in a plugin? · Issue #1832 · openedx/frontend-app-learning