Skip to content

Course builder improvements#3096

Open
brianhogg wants to merge 26 commits intodevfrom
course-builder-improvements
Open

Course builder improvements#3096
brianhogg wants to merge 26 commits intodevfrom
course-builder-improvements

Conversation

@brianhogg
Copy link
Copy Markdown
Contributor

@brianhogg brianhogg commented Feb 16, 2026

Description

  • Show permalink for new lessons and quizzes right after saving
  • Quiz set to Published by default
  • Create named quiz url using title if none manually entered
  • Add lesson description (content)
  • Hide the "Add Existing Lesson" modal after selecting a lesson
  • Improved section selection, and highlighting of the current section

Fixes #3033, #3056, #3097, #2938, #3030

How has this been tested?

Screenshots

Types of changes

Checklist:

  • This PR requires and contains at least one changelog file.
  • My code has been tested.
  • My code passes all existing automated tests.
  • My code follows the LifterLMS Coding & Documentation Standards.

Note

Medium Risk
Changes touch both the course builder sync pipeline (JS + PHP) and lesson/quiz persistence, including new logic to conditionally overwrite lesson content. Risk is moderate because regressions could affect saving behavior and sidebar/editor UX across lessons, quizzes, and assignments.

Overview
Improves the Course Builder editing flow by adding in-builder lesson content editing (with a new content_added_in_builder flag) and preventing builder saves from overwriting existing lesson content that was created outside the builder.

Updates the sync/save response handling so newly saved lessons/quizzes/assignments can immediately display refreshed permalinks/slugs/titles without full re-renders, and sets new quizzes to publish by default (with quiz posts created using the provided title to generate a named URL).

Polishes builder UX: closes the sidebar editor when the selected model is trashed, ensures the “Add Existing Lesson” popover reliably closes after selection, and refines section selection/highlighting (auto-select first section on load, broader click target, improved selected styling).

Reviewed by Cursor Bugbot for commit 1809a9b. Bugbot is set up for automated code reviews on this repo. Configure here.

@ideadude ideadude moved this to Awaiting Review in Development Feb 16, 2026
@brianhogg brianhogg added this to the Next Available Release milestone Feb 20, 2026
@brianhogg brianhogg marked this pull request as ready for review February 20, 2026 14:57
@brianhogg brianhogg moved this from Awaiting Review to Review in Progress in Development Feb 20, 2026
@brianhogg brianhogg modified the milestones: Next Available Release, 10.0 Apr 2, 2026
@brianhogg
Copy link
Copy Markdown
Contributor Author

@cursor review

Copy link
Copy Markdown

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1809a9b. Configure here.

} ).render().$el,
onHide: function() {
Backbone.pubSub.off( 'lesson-search-select', hidePopover );
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale event listener from broken onHide cleanup

Medium Severity

The onHide callback calls Backbone.pubSub.off('lesson-search-select', hidePopover), but hidePopover was never directly registered as a listener. The actual listener is the anonymous function passed to Backbone.pubSub.once(...). So the off call is a no-op and never cleans up the once handler. If the user dismisses the popover without selecting a lesson and then reopens it, stale once handlers accumulate. On the next lesson selection, all stale handlers fire, calling pop.hide() on old references and running $('.webui-popover').remove() multiple times, potentially removing unrelated popovers.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 1809a9b. Configure here.

this.lesson.add_quiz( quiz );
this.model = this.lesson.get( 'quiz' );
this.listenTo( this.model, 'change:_points', this.render_points );
this.listenTo( this.model, 'change:permalink', this.render_settings );
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing change:name listener in add_existing_quiz

Low Severity

add_existing_quiz registers change:permalink but not change:name on the new model, unlike add_new_quiz which registers both. For cloned quizzes, the server generates a new slug returned as name. In the sync handler, permalink is set before name, so change:permalink triggers render_settings before name is updated — rendering the settings with a stale slug value that never gets corrected.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 1809a9b. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Review in Progress

Development

Successfully merging this pull request may close these issues.

2 participants