Import Common Cartridge and SCORM packages#105
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Align the user-side relation manager with CourseUsersRelationManager by adding assigned course labels, search columns, bulk detach, and pivot timestamps. Co-authored-by: Cursor <cursoragent@cursor.com>
…s-relation-manager Enhance CoursesRelationManager for user course assignment
Register the test form Livewire component, keep learners on course when HTML5 completion is blocked, dispatch CourseStarted from the launch step, and only use Rise launch paths that exist on disk. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 3 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a7ac69e. Configure here.
|
|
||
| if (count > 0 && index >= count - 1) { | ||
| notifyCompleted(); | ||
| } |
There was a problem hiding this comment.
Single-slide HTML5 auto-completes
Medium Severity
The HTML5 package bridge treats GetCurrentSlideIndex() >= GetSlideCount() - 1 as course completion. When a Storyline export has only one slide, that condition is true on the first poll, so the parent player posts completion before the learner has meaningfully progressed.
Reviewed by Cursor Bugbot for commit a7ac69e. Configure here.
| $builder->groups([]); | ||
|
|
||
| $course = Course::where('slug', $courseSlug)->firstOrFail(); | ||
| return $builder; |
There was a problem hiding this comment.
Embedded courses hide certificate nav
Medium Severity
Imported SCORM/HTML5 courses enable embedded player mode and clear sidebar navigation, including the Certificate group. linkToCurrentStep always returns the launch step URL for embedded courses, so learners who finish via the player have no in-panel path to the completion or certificate page.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit a7ac69e. Configure here.
|
|
||
| $step = $this->steps()->first(); | ||
|
|
||
| return $step instanceof Step ? $step : null; |
There was a problem hiding this comment.
Launch step fallback ignores lesson order
Medium Severity
launchStep() falls back to $this->steps()->first() when no document has a retained SCORM package. The steps() relation orders only by lms_steps.order, not lesson order, so the chosen step can be the wrong lesson’s step or a non-document step in multi-lesson embedded courses.
Reviewed by Cursor Bugbot for commit a7ac69e. Configure here.


Summary
imsmanifest.xml, build courses/lessons/steps from cartridge structure, and extract Articulate Storyline slide content into document steps where possible.filament-lms:import-cartridgesArtisan command (sync or queued), with completion notifications and config undercommon_cartridge_import.Test plan
vendor/bin/pest tests/Feature/CommonCartridgeImportTest.php tests/Feature/ImportCartridgesCommandTest.php tests/Feature/ScormPackageServingTest.phpscorm_package_*columns onlms_documents)filament-lms:import-cartridges --file=... --sync) and verify SCORM content loads in a document stepMade with Cursor
Note
High Risk
Large feature touching course completion, authenticated file serving, and client-side SCORM bridges; incorrect progress or auth checks could mark courses complete prematurely or expose package files.
Overview
Adds Common Cartridge / SCORM / Articulate import and learner playback: ZIP packages are parsed (
imsmanifest.xmlor Storylineframe.xml), courses are created via a queued job orfilament-lms:import-cartridges, and retained packages are stored on documents with new schema columns.Embedded player mode (
embedded_player,completion_modeon courses) hides LMS step navigation, serves package assets through authenticatedScormPackageController, and syncs progress viaScormCommitControllerplus in-page SCORM 1.2 / HTML5 bridges.ScormProgressServiceenforces minimum session time and guards manual completion.Admin gains Import SCORM Package on the course list, course fields for embedded player settings, and a backfill command for existing package documents. Learner UX updates include full-width interactive iframes, optional exit-with-complete flow,
LmsTestFormShowfor card-style knowledge checks, and sanitized step text rendering.Reviewed by Cursor Bugbot for commit a7ac69e. Bugbot is set up for automated code reviews on this repo. Configure here.