v3.0.0-beta.1
Pre-release
Pre-release
What's Changed
- Display: Fix default home welcome visibility by @christianbeeznest in #8182
- Course: Fix default home welcome visibility by @christianbeeznest in #8184
- Internal: Use Request class instead of superglobals by @AngelFQC in #8186
- Plugin buycourses2 1 by @christianbeeznest in #8188
- Plugin: Improve BuyCourses user service flow, validation and admin UX by @christianbeeznest in #8199
- Plugin: wrap all hardcoded UI strings in i18n calls across PHP and TPL files by @christianbeeznest in #8200
- Plugin: Fix service-based limits and admin course access by @christianbeeznest in #8201
- Document: Restore document.users_copy_files setting in modern Documents and Personal Files by @christianbeeznest in #8202
- Admin: Restore admin-only status settings in role-based user forms by @christianbeeznest in #8204
- Document: Use Symfony cache directory for temporary copy files by @christianbeeznest in #8205
- Admin: Implement career and promotion support in global agenda events (setting allow_careers_in_global_agenda) by @christianbeeznest in #8206
- Announcement: restore course_announcement_scheduled_by_date support by @christianbeeznest in #8207
- Announcement: remove obsolete anonymous global visibility setting by @christianbeeznest in #8208
- Migration: Remove obsolete setting hide_global_announcements_when_not… by @christianbeeznest in #8209
- Settings: remove obsolete settings and legacy mappings by @christianbeeznest in #8210
- Plugin: Fix BuyCourses course access and service limit flow by @christianbeeznest in #8211
- Learnpath: Reuse canonical learning_path folder by @christianbeeznest in #8212
- Internal: Avoid mkdir warning when Serializer cache already exists by @christianbeeznest in #8214
- Learnpath: Disable forced SCORM debug logging by @christianbeeznest in #8215
- Internal: Use course locale only for requests with course context by @christianbeeznest in #8216
- User: Respect open course access setting by @christianbeeznest in #8217
- Learnpath: Fix LP files tab hierarchy flag by @christianbeeznest in #8247
- Internal: Wire finished reminder setting to cron command by @christianbeeznest in #8251
- Internal: Restore homepage course categories setting by @christianbeeznest in #8253
- Internal: Restore core editor settings support in TinyMCE by @christianbeeznest in #8271
- Migration: Add V210 migrations path for 2.1 by @christianbeeznest in #8272
- Internal: Remove dead legacy redirect_after_login logic by @christianbeeznest in #8273
- Dropbox: Restore dropbox mailing option in modern Vue flow by @christianbeeznest in #8274
- Exercise: Restore exercise settings behavior in legacy quiz flow by @christianbeeznest in #8281
- Forum: Restore forum settings behavior by @christianbeeznest in #8283
- Learnpath: Make LP document folders collapsible by @christianbeeznest in #8284
- Course: Support categorized course settings safely by @christianbeeznest in #8288
- Gradebook: Restore gradebook settings behavior by @christianbeeznest in #8289
- Language: Restore language settings behavior by @christianbeeznest in #8290
- Internal: Restore mail settings behavior by @christianbeeznest in #8291
- Message: Restore session message timeframe setting by @christianbeeznest in #8292
- User: Restore password reminder and chat profile settings by @christianbeeznest in #8293
- User: Restore registration settings behavior by @christianbeeznest in #8294
- Internal: Restore webservice API key settings by @christianbeeznest in #8295
- Internal: Restore external webservice settings by @christianbeeznest in #8296
- User: Restore user workflow settings by @christianbeeznest in #8305
- User: Restore skill assignment notification setting by @christianbeeznest in #8306
- User: Restore skill badge notifications by @christianbeeznest in #8307
- User: Restore security settings behavior by @christianbeeznest in #8310
- Internal: Restore custom platform settings behavior by @christianbeeznest in #8324
- Document: Consolidate API document downloads by @christianbeeznest in #8325
- Session: Restore legacy session settings by @christianbeeznest in #8327
- Learnpath: Restore LP availability visibility and prerequisite settings by @christianbeeznest in #8329
- Learnpath: Restore SCORM legacy settings by @christianbeeznest in #8332
- Learnpath: Restore legacy learning path settings by @christianbeeznest in #8333
- Course: Restore per-tool course introduction by @christianbeeznest in #8336
- Course: Restore tools shortcuts by @christianbeeznest in #8337
- Admin: Hide disabled settings in sub-URLs by @christianbeeznest in #8338
- Assignment: Implement my_courses_show_pending_work setting by @christianbeeznest in #8339
- Internal: Apply webservice API key settings by @christianbeeznest in #8340
- Internal: Apply session SameSite setting by @christianbeeznest in #8341
- User: Apply profile address setting by @christianbeeznest in #8342
- Learnpath: Apply video context menu setting by @christianbeeznest in #8343
- Course: Keep course home intro always available by @christianbeeznest in #8344
- Exercise: Implement pending exercise attempts list for MyCourses by @christianbeeznest in #8345
- Exercise: Add keep-alive ping during exercise attempts by @christianbeeznest in #8346
- Exercise: Apply session filter setting to pending tests by @christianbeeznest in #8347
- Learnpath: Restore learning path flow setting by @christianbeeznest in #8348
- Session: Allow base course teachers to view session assignments by @christianbeeznest in #8349
- Document: Support group document quota setting by @christianbeeznest in #8350
- User: Enforce prevent_multiple_simultaneous_login on Symfony login by @christianbeeznest in #8353
- Admin: Allow admins to clear user active sessions - refs #3405 by @christianbeeznest in #8354
- Course: Fix course creation capability pre-check fallback by @christianbeeznest in #8356
- Course: Apply max courses per user to course creation by @christianbeeznest in #8357
- Course: Improve course tool shortcuts visibility setting by @christianbeeznest in #8358
- Course: Add teacher badge to course cards by @christianbeeznest in #8359
- Admin: Fix tab persistence in user list by @ywarnier in #8355
- Document: Restore cloud link support by @christianbeeznest in #8362
- Document: Restore editable comments by @christianbeeznest in #8364
- Auth: LDAP: enable extra field synchronisation - refs BT#22093 by @NicoDucou in #8370
- Auth: Ldap: enable the use of ldaps configuration -refs BT#22093 by @NicoDucou in #8371
- Tracking: Restore compact skill layout - refs BT#23429 by @christianbeeznest in #8375
- Plugin: Complete BuyCourses recurring services and VAT handling by @christianbeeznest in #8374
- Plugin: Persist BuyCourses course creation display flag by @christianbeeznest in #8376
- Internal: Prevent autofocus on sortable pagination forms - refs BT#23432 by @christianbeeznest in #8377
- Display: Improve course and session picture management - refs #8331 by @christianbeeznest in #8379
- Admin: Add admin password strength checker - refs #8077 by @christianbeeznest in #8380
- User: Restore first login password change - refs #8078 by @christianbeeznest in #8381
- User: Fix password escaping in user emails - refs #6963 by @christianbeeznest in #8382
- Glossary: Generate glossary terms from documents - refs #8079 by @christianbeeznest in #8383
- Glossary: Improve glossary export downloads - refs #8080 by @christianbeeznest in #8384
- Course: Add selected text context to AI chat - refs #7372 by @christianbeeznest in #8385
- Glossary: Exclude existing terms when generating through AI - refs #8372 by @christianbeeznest in #8386
- Search: Improve search result thumbnails - refs #7268 by @christianbeeznest in #8387
- Survey: Fix survey question option layout - refs #6450 by @christianbeeznest in #8388
- User: Add crop and delete for profile photo - refs #5547 by @christianbeeznest in #8389
- Exercise: Add answer feedback to more question types - refs #2044 by @christianbeeznest in #8391
- User: Delete assignment files with users - refs #2596 by @christianbeeznest in #8392
- Social: Show friends posts on social wall - refs #2677 by @christianbeeznest in #8393
- Learnpath: Accept SCORM score after completed - refs #4595 by @christianbeeznest in #8394
- Gradebook: Improve gradebook score input layout - refs #8081 by @christianbeeznest in #8395
- Course: Add course tracking activity reports - refs #2239 by @christianbeeznest in #8396
- Course: Track direct course resource access - refs #7939 by @christianbeeznest in #8397
- Admin: Move activities audit to security block - refs #7322 by @christianbeeznest in #8398
- Tracking: Add reports registry framework - refs #7325 by @christianbeeznest in #8399
- Admin: Complete reports registry cleanup - refs #7325 by @christianbeeznest in #8400
- Ticket: Prevent autofocus on ticket reply form - refs BT#23432 by @christianbeeznest in #8401
- Skill: Add certificate search and skills menu links - refs #7629 by @christianbeeznest in #8404
- Bug : when reload page on quiz attempt, radio checked input are not displayed has checked. by @chamilo-uga in #8402
- Internal: Fix installer database password maxlength - refs #6915 by @christianbeeznest in #8407
- Exercise: Fix course copy quiz question category settings - refs #2351 by @christianbeeznest in #8408
- Group: Fix group auto-fill duplicate users - refs #2517 by @christianbeeznest in #8409
- Agenda: Fix agenda event time selection - refs #8086 by @christianbeeznest in #8410
- Session: Reimplement session result move tool - refs #7435 by @christianbeeznest in #8411
- Attendance: Reimplement official code settings in C2 - refs #7498 by @christianbeeznest in #8412
- Document: Add TinyMCE document autosave drafts - refs #2663 by @christianbeeznest in #8413
- Course: Add support for language in resources - resf #7244 by @christianbeeznest in #8414
- Internal: Fix mail template saving - resf #2941 by @christianbeeznest in #8415
- Usergroup: Migrate interfaces to Vue by @ywarnier in #8416
- Search: Add Xapian extraction for modern office files - resf #7267 by @christianbeeznest in #8417
- Search: Add AI media extraction to Xapian indexing - resf #7269 by @christianbeeznest in #8418
- Document: Add SVG drawing editor to documents - refs #8282 by @christianbeeznest in #8420
- Learnpath: Improve LP video next step overlay - refs #2668 by @christianbeeznest in #8421
- Learnpath: Improve learning path style - refs #7534 by @christianbeeznest in #8422
- Course: Add AI course analyzer proof of concept - refs #7310 by @christianbeeznest in #8424
- Plugin: Check OpenSSL availability for IMS/LTI keys - refs #7294 by @christianbeeznest in #8425
- Internal: Add NProgress for SPA route loading - refs #8142 by @christianbeeznest in #8426
- Course: Show course categories on Vue homepage - refs #5201 by @christianbeeznest in #8427
- Admin: Add usergroup members preview page - refs #6395 by @christianbeeznest in #8428
- Learnpath: Add advanced learning path access by date - refs #6346 by @christianbeeznest in #8429
- Course: Fix class-linked course group synchronization - refs #5774 by @christianbeeznest in #8430
- Usergroup: Improve class group course synchronization - refs #1710 by @christianbeeznest in #8431
- Plugin: Differentiate commercial plugins in admin - refs #7323 by @christianbeeznest in #8432
- Social: Fix social group images in search results by @christianbeeznest in #8433
- Internal: Handle expired sessions in Tour AJAX by @christianbeeznest in #8434
- Internal: Handle invalid course context in CidReqListener by @christianbeeznest in #8435
- Internal: Fix quarterly statistics AJAX loading by @christianbeeznest in #8436
- Plugin: Adapt Zoom plugin integration by @christianbeeznest in #8439
- Plugin: Adapt MaintenanceMode plugin integration by @christianbeeznest in #8440
- Plugin: Improve plugin list filters by @christianbeeznest in #8441
- Plugin: Adapt Redirection plugin integration by @christianbeeznest in #8442
- Plugin: Add verified plugin list filter by @christianbeeznest in #8443
- Learnpath: Restore AI study helper for LP documents by @christianbeeznest in #8445
- Plugin: Implement TopLinks course shortcuts integration by @christianbeeznest in #8446
- Plugin: Avoid BuyCourses table lookup before plugin install by @christianbeeznest in #8447
- Course: Enhance AI course analyzer with lesson context by @christianbeeznest in #8448
- Document: Make document autosave drafts collapsible by @christianbeeznest in #8449
- Plugin: Fix Zoom course meeting invitation flow by @christianbeeznest in #8451
- Course: Improve resource language advanced settings by @christianbeeznest in #8452
- Plugin: Harden ExternalNotificationConnect plugin integration by @christianbeeznest in #8453
- Plugin: Adapt CourseHomeNotify to course home by @christianbeeznest in #8456
- Plugin: Adapt CourseLegal course agreement flow by @christianbeeznest in #8458
- Plugin: Update Static plugin compatibility by @christianbeeznest in #8461
- Plugin: Integrate ShowUserInfo plugin by @christianbeeznest in #8466
- Plugin: Integrate StudentFollowUp plugin by @christianbeeznest in #8468
- Plugin: Improve Learning Calendar plugin UI and agenda integration by @christianbeeznest in #8470
- Plugin: Improve survey export plugins by @christianbeeznest in #8471
- Plugin: Improve UserRemoteService plugin safety and UI by @christianbeeznest in #8472
- Plugin: Improve MigrationMoodle plugin safety and task flow by @christianbeeznest in #8473
- Plugin: Improve EmbedRegistry plugin safety by @christianbeeznest in #8474
- Plugin: Improve SearchCourse plugin integration by @christianbeeznest in #8475
- Plugin: Improve Rss plugin region integration by @christianbeeznest in #8476
- Plugin: Improve Dictionary plugin integration by @christianbeeznest in #8477
- Plugin: Improve GoogleMaps admin integration by @christianbeeznest in #8478
- Plugin: Improve BeforeLogin plugin integration by @christianbeeznest in #8479
- Plugin: Improve CourseBlock course settings integration by @christianbeeznest in #8480
- Plugin: Improve CustomFooter region integration by @christianbeeznest in #8481
- Plugin: Improve CustomCertificate integration by @christianbeeznest in #8482
- Plugin: Improve NoSearchIndex plugin behavior by @christianbeeznest in #8484
- Plugin: Fix BBB stale meeting closure by @christianbeeznest in #8485
- Plugin: Improve NotebookTeacher plugin behavior by @christianbeeznest in #8488
- Plugin: CStudio: Blank all unused files in plugin's vendor/jspdf lib … by @ywarnier in #8489
- Plugin: Improve Justification plugin management by @christianbeeznest in #8492
- Plugin: Improve QuestionOptionsEvaluation plugin management by @christianbeeznest in #8493
- Internal: API: Message: Replaces /api/messages/by-group/list?groupId=N endpoint with /usergroups/{usergroupId}/messages by @AngelFQC in #8454
- Plugin: Restore ExerciseSignature signing flow by @christianbeeznest in #8495
- Plugin: Fix BBB recording dates and recording links rendering by @christianbeeznest in #8496
- install: Fix web installer migration flow by @christianbeeznest in #8498
- Plugin: Fix GradingElectronic gradebook export flow by @christianbeeznest in #8505
- Plugin: Fix CheckExtraFieldAuthorCompany field detection by @christianbeeznest in #8507
- Plugin: Adapt CleanDeletedFiles to new version storage by @christianbeeznest in #8511
- Plugin: Improve Dashboard plugin admin overview by @christianbeeznest in #8512
- Plugin: Adapt ExtraMenuFromWebservice to Vue topbar by @christianbeeznest in #8514
- Plugin: Adapt Mobidico launcher to new version by @christianbeeznest in #8516
- Plugin: Adapt ShowRegions to rendered Chamilo 2 regions by @christianbeeznest in #8517
- Plugin: Adapt HelloWorld plugin to Chamilo 2 regions by @christianbeeznest in #8518
- Plugin: Adapt ExtAuth logout behavior to Chamilo 2 Vue layout by @christianbeeznest in #8519
- Plugin: Apply resubscription check to admin session enrolment by @christianbeeznest in #8521
- Plugin: Classify commercial and freemium plugins by @christianbeeznest in #8522
- Document: Improve document editor defaults and option help by @christianbeeznest in #8523
- Replace all axios calls with baseService utilities by @AngelFQC in #8506
- Ai helper: Add Claude AI provider support by @christianbeeznest in #8525
- Learnpath: Fix LP URL and media item rendering - refs #8483 by @christianbeeznest in #8526
- Course: Improve course and document UI behavior - refs #8450 by @christianbeeznest in #8527
- Internal: Remove duplicate student view switch by @christianbeeznest in #8533
- User: Fix login captcha activation and case handling - refs #8494 by @christianbeeznest in #8534
- Introduce
CourseContextRoleListenerto dynamically assign contextual course roles by @AngelFQC in #8491 - Learnpath: Fix LP item view initialization in student view - refs #8483 by @christianbeeznest in #8535
- Link: Improve link management navigation - refs #8532 by @christianbeeznest in #8536
- Plugin: Add map provider support for social locations by @christianbeeznest in #8539
- Document: Fix document quota display and validation by @christianbeeznest in #8541
- Tracking: Fix my space report metrics by @christianbeeznest in #8542
- Plugin: Improve dashboard admin overview by @christianbeeznest in #8543
- Plugin: Fix plugin commercial classifications by @christianbeeznest in #8544
- Plugin: Adapt external webservice menu to sidebar by @christianbeeznest in #8545
- Exercise: Fix hotspot AJAX course context by @christianbeeznest in #8546
- Admin: Improve admin user authentication forms by @christianbeeznest in #8547
- Admin: Always show session summary data to admins by @christianbeeznest in #8550
- Plugin: Improve CStudio editor labels, tooltips and UI behavior - refs #8552 by @christianbeeznest in #8554
- Learnpath: Fix learning path visibility icon state - refs #8538 by @christianbeeznest in #8556
- Forum: Migrate forum tool to Vue and API Platform by @christianbeeznest in #8560
- Survey: Migrate survey tool to Vue and API by @christianbeeznest in #8562
- Admin: Fix course tool visibility settings - refs BT#23501 by @christianbeeznest in #8565
- Internal: Enhance copy-paste blocking for TinyMCE editors - refs #8564 by @christianbeeznest in #8566
- Internal: Improve personal file import dialog and folder actions - refs BT#23496 by @christianbeeznest in #8567
- Internal: Admin: Only limit access URL management to having Global Ad… by @NicoDucou in #8572
- Install: Fix upgrade installer old root path input by @christianbeeznest in #8573
- Security: moodle import zip by @AngelFQC in #8574
- Security: SSRF via unprotected mPDF in legacy certificate generation (GHSA-mw74-xqfh-r8gj) by @AngelFQC in #8577
- Refactor: Reusable single-page PDF rendering method in PDF class by @AngelFQC in #8578
- Security: Restrict allowed classes in Sequence::getUnSerializeGraph() by @AngelFQC in #8579
- Migration: Add legacy migration support structures by @christianbeeznest in #8581
- Internal: Add Ricky legacy GradingElectronic data importer by @christianbeeznest in #8582
- Plugin: Add BuyCourses service copy action by @christianbeeznest in #8586
- Plugin: Add BuyCourses AI course benefits by @christianbeeznest in #8587
- Plugin: Add BuyCourses course creation service translations by @christianbeeznest in #8588
- Plugin: Add BuyCourses service link copy action by @christianbeeznest in #8589
- Plugin: Add BuyCourses monthly yearly service tabs by @christianbeeznest in #8590
- Plugin: Enforce AI token limits per user by @christianbeeznest in #8591
- Plugin: Fix BuyCourses student catalog sections by @christianbeeznest in #8592
- Plugin: Fix BuyCourses translated HTML descriptions by @christianbeeznest in #8596
- Plugin: Fix BuyCourses service availability checks by @christianbeeznest in #8597
- Plugin: Fix BuyCourses purchase and course creation UI by @christianbeeznest in #8598
- Plugin: Fix BuyCourses purchase and course limit bugs by @christianbeeznest in #8601
- Bump codecov/codecov-action from 5 to 7 by @dependabot[bot] in #8559
- Plugin: Add BuyCourses empty catalog admin actions by @christianbeeznest in #8603
- Plugin: Improve BuyCourses plugin translations by @christianbeeznest in #8604
- Social: Fix personal files translated labels - refs BT#23496 by @christianbeeznest in #8606
- Display: Close sidebar menu on mobile navigation - refs BT#23519 by @christianbeeznest in #8611
- Forum: Organize state providers and processors by @christianbeeznest in #8612
- Forum: Restore basic forum settings by @christianbeeznest in #8613
- Forum: Improve migration legacy to vue + API by @christianbeeznest in #8614
- Survey: Organize state providers and processors by @christianbeeznest in #8615
- Internals: keep soft-deleted users out of the user-to-URL list by @AngelFQC in #8610
- Security: stored XSS via language name in admin panel by @AngelFQC in #8607
- Security: harden user-import XML parsing against XXE by @AngelFQC in #8609
- Security: add CSRF tokens to gradebook delete/lock/form actions by @AngelFQC in #8625
- Security: enforce CSRF token validation on state-changing admin endpoints by @AngelFQC in #8600
- Assignment: Fix assignment attached document filtering - refs #8557 by @christianbeeznest in #8626
- Assignment: Add submission preview action - refs #6558 by @christianbeeznest in #8627
- Course: Hide empty state when sticky courses exist by @christianbeeznest in #8628
- Admin: Fix admin dashboard assignment pages by @christianbeeznest in #8629
- Internal: Move course report toolbar above title by @christianbeeznest in #8630
- Admin: Fix admin question action links by @christianbeeznest in #8631
- Admin: Fix admin question pagination and preview by @christianbeeznest in #8632
- Search: Add pagination to content search results by @christianbeeznest in #8633
- Search: Add Xapian pagination and restore webpack config by @christianbeeznest in #8634
- Editor: Fix TinyMCE Firefox outline and spacing by @christianbeeznest in #8635
- Display: Fix learner tracking profile responsive layout by @christianbeeznest in #8637
- Display: Fix stable My courses sidebar loading state by @christianbeeznest in #8638
- Social: Fix folder label translation in personal files - refs BT#23496 by @christianbeeznest in #8639
- Display: Close login sidebar on mobile navigation - refs BT#23519 by @christianbeeznest in #8640
- Internal: Log task grading requests and disclose generated media by @christianbeeznest in #8641
- Learnpath: Fix undefined payload in LP advanced access delete by @christianbeeznest in #8642
- Bump the composer group across 1 directory with 5 updates by @dependabot[bot] in #8643
- Revert legacy Ricky DB migration support structures by @christianbeeznest in #8644
- Security: enforce teacher-student enrollment check on student tracking page by @AngelFQC in #8602
- Security: stored XSS via social group discussion thread title by @AngelFQC in #8595
- Security: stored XSS in messages and social-group discussions via unsanitized v-html by @AngelFQC in #8594
- Admin: Display single authentication method as read-only - refs #8540 by @christianbeeznest in #8648
- Security: Fix IDOR and mass-assignment in PushSubscription API resource by @AngelFQC in #8651
- Security: Path traversal + arbitrary file write via sub-language admin panel by @AngelFQC in #8652
- Security: Exposed test token generation endpoint enables privilege escalation by @AngelFQC in #8654
- Session: Fix user and class enrollment - refs #8551 by @christianbeeznest in #8655
- Security: SSRF via mPDF/Dompdf in Wiki PDF export — route through the shared PDF class by @AngelFQC in #8593
- Security: Remove path-traversal-prone placeholder endpoints in FileManagerController by @AngelFQC in #8653
- Security: Unauthenticated Template Creation via /template/document-templates/create by @AngelFQC in #8659
- Security: Unauthenticated Disclosure of Private Course Template Content by @AngelFQC in #8658
- Security: Unauthenticated Template Deletion by @AngelFQC in #8657
- Fix login as admin/hr + access to sessions report as HR by @ywarnier in #8663
- Security: Missing Source-Course Authorization in Course Maintenance Copy Endpoints by @AngelFQC in #8664
- Bump actions/checkout from 6 to 7 by @dependabot[bot] in #8649
- Security: Restrict Course Maintenance to teachers of the current course by @AngelFQC in #8665
- Security: SQL Injection in ExtraField::get_where_clause() via unescaped array filter values by @AngelFQC in #8666
- Survey: Harden Vue writes and polish configuration UI by @christianbeeznest in #8668
- Forum: Improve Vue form reply and thread parity by @christianbeeznest in #8669
- Internal: Add signed update package verification - refs #5004 by @christianbeeznest in #8531
- Forum: Improve default category and required errors by @christianbeeznest in #8679
- Plugin: CStudio: Improve editor access and navigation by @christianbeeznest in #8680
- Plugin: BuyCourses: Use Chamilo language codes for translated HTML by @christianbeeznest in #8684
- Plugin: BuyCourses: Link courses to service user limits by @christianbeeznest in #8686
- Fix: show correct status label for all user types in user_information by @addow in #8676
- Fix oauth2 invalid state retry by @AngelFQC in #8687
- Fix: auto-retry OAuth2 flow on invalid state instead of showing error by @addow in #8674
- Plugin: BuyCourses: Fix catalog labels and service states by @christianbeeznest in #8688
- Plugin: BuyCourses: Improve paid course display and cleanup by @christianbeeznest in #8691
- Plugin: BuyCourses: Improve selected service badge by @christianbeeznest in #8692
- AI: Avoid duplicate generated image badge by @christianbeeznest in #8693
- CI: Bump actions/cache from 5 to 6 by @dependabot[bot] in #8671
- Plugin: BuyCourses: Clarify upgrade pricing and duration rules by @christianbeeznest in #8695
- Plugin: BuyCourses: Prefer highest active service by @christianbeeznest in #8696
- Course Description: migrate legacy tool to Vue and API Platform by @christianbeeznest in #8697
- BuyCourses: add service sale audit trail by @christianbeeznest in #8701
- BuyCourses: add service active state by @christianbeeznest in #8702
- Internal: Fix language flipping between SPA and legacy pages + tests for CourseFromRequestHelper by @AngelFQC in #8685
- Announcement: Migrate announcements to Vue and API Platform by @christianbeeznest in #8703
- Learning path: fix item deletion indexing by @christianbeeznest in #8706
- Search: harden Xapian indexing failures by @christianbeeznest in #8707
- Course: show course details from catalogue by @christianbeeznest in #8708
- BuyCourses: fix missing coupon code warning by @christianbeeznest in #8709
- Search: add Xapian rebuild command by @christianbeeznest in #8710
- BuyCourses: document recurring services cron by @christianbeeznest in #8711
- BuyCourses: restore cancelled service renewal - refs #8704 by @christianbeeznest in #8712
- Plugin: BuyCourses: limit coupon applications for services - refs #8705 by @christianbeeznest in #8713
- Course: validate duplicate course creation by @christianbeeznest in #8714
- Course Progress: complete Vue migration by @christianbeeznest in #8715
- Fix repository PHP code style by @christianbeeznest in #8716
- Learnpath: Migrate legacy code to vue + Api symfony by @christianbeeznest in #8667
- Wiki: Migrate legacy tool to Vue by @christianbeeznest in #8717
- Notebook: Migrate legacy tool to Vue and Symfony by @christianbeeznest in #8719
- Fix ECS issues in migrated tools by @christianbeeznest in #8720
- Portfolio: Migrate legacy tool to Vue and Symfony by @christianbeeznest in #8721
- Learnpath: Fix post-merge builder and runtime issues by @christianbeeznest in #8724
- Security: Stored XSS in course chat (sanitizer ran before Markdown) by @AngelFQC in #8727
- Migration: complete Ticket Vue administration and parity by @christianbeeznest in #8731
- Learnpath: Fix post-migration review observations by @christianbeeznest in #8732
- Learnpath: Add AI quick-test generation for documents - refs #8730 by @christianbeeznest in #8733
- AI: Add WYSIWYG translations with translate_html by @christianbeeznest in #8734
- AI: Add terms and conditions translation - refs #8363 by @christianbeeznest in #8736
- Admin: Reuse installed version provider after removing installer - refs #8683 by @christianbeeznest in #8737
- Gradebook: Apply Arabic font to complete result chart - refs #2852 by @christianbeeznest in #8738
- Tools: Fix invalid introduction editor configuration by @christianbeeznest in #8739
- Internal: Standardize user-facing tutor terminology - refs #8390 by @christianbeeznest in #8740
- Rooms: Link rooms to sessions and attendances - refs #7541 by @christianbeeznest in #8741
- Learning paths: Report SCORM upload limit errors by @christianbeeznest in #8744
- Exercise: Fix numeric string score formatting by @christianbeeznest in #8745
- Surveys: Expose invitation learning path context by @christianbeeznest in #8746
- API: Support JWT access for Chamilo Mobile by @christianbeeznest in #8747
- API: support JWT learning path runtime writes by @christianbeeznest in #8748
- Migration: add normalized LP completion fields - refs BT#23461 by @christianbeeznest in #8646
- Sf7 ap4 migration by @AngelFQC in #8725
- Fix CI for php-8.3 + s7 + ap4 by @AngelFQC in #8749
- Learnpath: Migrate learning path final item runtime by @christianbeeznest in #8750
- Fix Symfony container validation errors by @christianbeeznest in #8751
- Security: Add File Integrity Monitoring page by @ywarnier in #8752
- Internal: Apply ECS formatting to learning path final item by @christianbeeznest in #8753
- Internal: Use AccessDecisionManager instead of Security::isGranted in voters by @AngelFQC in #8756
- Learnpath: Fix certificate images in PDF export by @christianbeeznest in #8757
- Internal: Remove legacy admin table by @christianbeeznest in #8759
- Course: Restore course home tools and shortcuts by @christianbeeznest in #8762
- Learnpath: Clarify learning path user access modes by @christianbeeznest in #8763
- Internal: Rename name fields to title - refs #8326 by @christianbeeznest in #8765
- Internal: Fix stale User admin association by @christianbeeznest in #8767
- Internal: migrating PUT operations to PATCH by @AngelFQC in #8766
- Ticket: Fix ticket creation validation and assignee fallback- refs #8403 by @christianbeeznest in #8771
- MCP: add course authoring and review workflow by @christianbeeznest in #8770
- Exercise: Migrate legacy exercise tool to Vue by @christianbeeznest in #8580
- Course: restore add teachers option mapping by @christianbeeznest in #8773
- Mobile: add FCM device registration API by @christianbeeznest in #8774
- Mobile: integrate messaging and assignment APIs by @christianbeeznest in #8775
- Upgrade Doctrine ORM to 3.x (#8723) by @AngelFQC in #8772
- Ticket: Fix ticket assignee search and file information by @christianbeeznest in #8781
- MCP: Add full OAuth2.1 server feature to enable auto-connect from MCP… by @ywarnier in #8780
- Internal: Add resource language visibility setting by @christianbeeznest in #8782
- Migration: support long resource titles by @christianbeeznest in #8786
- MCP: complete follow-up tool improvements by @christianbeeznest in #8787
- Migration: prepare long resource titles in V200 by @christianbeeznest in #8788
- Migration: add safe Ricky certificate processing by @christianbeeznest in #8789
- Migration: Fix Ricky exercise runtime and restore quiz question/answer relations - refs BT#23466 by @christianbeeznest in #8790
- Refactor: remove client-specific migration identifiers by @christianbeeznest in #8791
- Security: add session expiration warning - refs BT#23459 by @christianbeeznest in #8795
- Security: MessageAttachment API item GET missing message-ownership check (IDOR) by @AngelFQC in #8794
- Security: make session expiration warning configurable by @christianbeeznest in #8797
- Migration: remove audited quiz repair migrations by @christianbeeznest in #8800
- Security: predictable password reset / email confirmation tokens via api_get_unique_id() by @AngelFQC in #8793
- Resource file deletion via delete_variant by @AngelFQC in #8726
- Security: Authenticated arbitrary resource file read via mismatched resourceFileId by @AngelFQC in #8728
- Exercise: honor category matrix question limits by @christianbeeznest in #8802
- Security: Reflected XSS via access_url_id/add_type attribute breakout in access_url edit admin pages by @AngelFQC in #8792
- Exercise: Fix official code settings for exercise PDF exports and class user ordering - refs #7498 by @christianbeeznest in #8805
- Plugin: CStudio: Add AI-assisted content generation - refs #8785 by @christianbeeznest in #8806
- Learning path: expose authorized SCORM runtime packages by @christianbeeznest in #8809
- Learning path: allow ZIP output for SCORM runtime packages by @christianbeeznest in #8810
- Security: Stored XSS via inline HTML delivery of social post attachments by @AngelFQC in #8808
- Security: Missing authorization on ContactCategory CRUD routes by @AngelFQC in #8807
- Ticket: restore teacher courses and course context by @christianbeeznest in #8812
- Course: Migrate course users tool to Vue by @christianbeeznest in #8813
- User: Migrate course sessions tool to Vue by @christianbeeznest in #8815
- User: Migrate course classes tool to Vue by @christianbeeznest in #8814
- Group: Migrate course groups tool to Vue by @christianbeeznest in #8816
- API Platform: read course context from CidReqHelper and declare cid/sid/gid in the operations (LearningPath, Portfolio, Forum, CourseInvitation, Ai, CalendarEvent) by @AngelFQC in #8818
- Course: Migrate course settings tool to Vue by @christianbeeznest in #8820
- Admin: Migrate global question bank to Vue by @christianbeeznest in #8821
- Course: Fix password-protected course entry test by @christianbeeznest in #8764
- Settings: Add assignment download fullname option - refs #8286 by @christianbeeznest in #8823
- [Needs DB change before merging] Work: #add parameter to add user fullname in submission download indi… by @NicoDucou in #8285
- CI: fix special case behat tests and complete with test for existing … by @NicoDucou in #8825
- Security: Skip unregistered roles in ResourceAclHelper instead of crashing by @addow in #8735
- Fix six export endpoints returning HTTP 500 after the CidReqHelper migration by @AngelFQC in #8826
- Bump guzzlehttp/guzzle from 7.14.2 to 7.15.3 in the composer group across 1 directory by @dependabot[bot] in #8827
- Gradebook: Add customizable grading modes and forum participation scoring by @AngelFQC in #8583
- Course: Migrate course reporting tool to Vue by @christianbeeznest in #8828
- Admin: Fix document upload skip setting type by @christianbeeznest in #8829
- CI: Replace Behat with Playwright by @ywarnier in #8796
- Plugin: CStudio: fix repeated section creation - refs #8822 by @christianbeeznest in #8837
- Reporting: Migrate global reporting suite to Vue by @christianbeeznest in #8838
- Flushfix2 by @ywarnier in #8836
- Internal: Write resource tracking events inside the flush transaction by @AngelFQC in #8840
- Plugin: CStudio: add Chamilo course content blocks - refs #8824 by @christianbeeznest in #8841
- Internal: Fix unnecessary plugin requests by @christianbeeznest in #8842
- Survey: Improve survey API error messages by @christianbeeznest in #8844
- Editor: Hide personal files in course file manager by @christianbeeznest in #8847
- Editor: Fix tiny filemanager navigation by @christianbeeznest in #8848
- User: Fix reporting navigation for students by @christianbeeznest in #8849
- Document: Fix learning paths folder access in documents by @christianbeeznest in #8850
- Learnpath: Fix learning path prerequisites, auto-launch and exercise settings by @christianbeeznest in #8851
- Learnpath: Improve learning path student view and exercise workflow by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8855
- Bump squizlabs/php_codesniffer from 3.13.5 to 3.13.6 in the composer group across 1 directory by @dependabot[bot] in https://github.com/chamilo/chamilo-lms/pull/8834
- Course: Fix moodle4 course export import by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8856
- Install: Add AI Act demo course to new installations by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8857
- Updater: support V300 migration namespace by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8858
- Internal: Restore MCP allowed roles value template by @krista445 in https://github.com/chamilo/chamilo-lms/pull/8843
- Security: harden PENS remote transport against SSRF by @krista445 in https://github.com/chamilo/chamilo-lms/pull/8846
- Plugin: OnlyOffice: restore modern document integrations by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8859
- OnlyOffice: allow document creation in course root by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8860
- Plugin: OnlyOffice: improve exercise editor integration by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8861
- Course: preserve settings in full MBZ restore by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8862
- Course: Moodle export: resolve stale learning path references by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8863
- Plugin: CStudio: align editor styling with Chamilo by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8864
- Plugin: CStudio: improve Chamilo visual integration by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8865
- Internal: Fix ai act multilingual content by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8866
- Install: update AI Act course backup by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8867
- Security: Require teacher rights to reorder course tools by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8868
- Security: Add central CSRF protection for API Platform and legacy AJAX by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8832
- Documents: restore embedded images in learning paths by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8869
- Security: Restrict SessionRelCourseRelUser API operations and scope its collection by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8870
- Security: Tie UserRelCourseVote writes to the voting user and scope its collection by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8871
- Security: Require teacher rights to reach the course settings form by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8872
- Security: Scope the UserRelUser collection to the caller's own relations by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8874
- Exercise: complete OnlyOffice editing and review - refs #7533 by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8876
- Security: Scope exercise results, tracking rows and user skills to their owner by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8875
- Security: Require course membership to read a student publication resource by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8877
- Security: Plugins: Validate the plugin name before using it to build a file path by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8879
- Security: Onlyoffice: Take the callback document path only from the signed hash by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8881
- Security: Onlyoffice: Restrict the callback download URL to the configured document server by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8880
- Learnpath: Fix lp prerequisite scores by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8882
- MCP: reduce registration log noise by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8883
- Course: backup: preserve root-level document files by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8884
- Course: backup: preserve normalized document paths by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8885
- Install: refresh demo course backups by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8886
- Course: import: resolve document sidecar path collisions by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8887
- Install: add demo courses on updates by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8888
- Ticket: fix reporter confirmation response - refs #8718 by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8889
- Admin: fix password checker bulk actions and speed - refs #8077 by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8890
- UI: show flash messages after app is ready by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8891
- Reporting: route catalogue to modern reports - refs #7325 by @christianbeeznest in https://github.com/chamilo/chamilo-lms/pull/8893
- Plugins: fix PHP 8.2 dynamic property deprecations by @AngelFQC in https://github.com/chamilo/chamilo-lms/pull/8894
New Contributors
- @krista445 made their first contribution in https://github.com/chamilo/chamilo-lms/pull/8843
Full Changelog: v2.0.0...v3.0.0-beta.1