What's Changed
- refactor: batch dashboard by @pateljannat in #2081
- fix: course form issues by @pateljannat in #2096
- fix: duplicate enrollment validation on update by @raizasafeel in #2104
- fix(security): remove ignore_xss_filter to enable HTML sanitization by @raizasafeel in #2103
- fix: misc permission issues by @pateljannat in #2108
- fix: check permission of session user during batch enrollment by @pateljannat in #2109
- fix: misc issues by @pateljannat in #2115
- fix(lesson): render codesandbox by @raizasafeel in #2116
- fix: misc issues by @pateljannat in #2119
- fix: misc issues by @pateljannat in #2120
- fix: permission issue during quiz submission by @pateljannat in #2126
- fix: permission issue during quiz submission (backport #2126) by @mergify[bot] in #2127
- fix: sanitize data before creating new course or batch by @pateljannat in #2129
- fix: verify quiz answers on server side by @pateljannat in #2131
- fix: student home page issue when not enrolled in any batch by @pateljannat in #2132
- fix: assignment upload issue by @pateljannat in #2135
- fix: batch admin conditions by @pateljannat in #2136
- fix: misc issues by @pateljannat in #2137
- feat: nudge students to complete their profile by @pateljannat in #2138
- fix: if certificate is linked to a batch then don't validate course enrollment by @pateljannat in #2141
- fix: misc issues by @pateljannat in #2143
- fix: show profile nudge as icon when sidebar is collapsed by @Owaishk08 in #2144
- fix: misc issues by @pateljannat in #2155
- fix: pricing section issue in course form by @pateljannat in #2157
- fix: pricing section issue in course form (backport #2157) by @mergify[bot] in #2158
- feat: Google Meet integration for Live Classes by @rathorevaibhav in #2122
- fix(payment gateway): add delete functionality and field details by @raizasafeel in #2156
- fix: assignment conditions for save button visibility by @pateljannat in #2163
- fix: misc issues by @pateljannat in #2164
- merge
developintomain-hotifxby @pateljannat in #2165 - fix: use backend field metadata for billing and transaction forms by @raizasafeel in #2167
- fix(persona): redirection route and skip button by @raizasafeel in #2168
- fix: misc issues by @pateljannat in #2171
- feat: demo data by @pateljannat in #2159
- feat: payment reminder setting by @pateljannat in #2182
- fix(security): prevent stored XSS decoding in _lms.py by @raizasafeel in #2185
- fix: evaluator role synched between doctype and role by @raizasafeel in #2186
- feat: navigate between questions in quiz by @pateljannat in #2188
- fix: sidebar scroll issue by @pateljannat in #2194
- feat: added speed controls by @jagadish-7 in #2080
- feat: Frappe appointment booking for trial sites by @pateljannat in #2202
- feat: Frappe appointment booking for trial sites (backport #2202) by @mergify[bot] in #2203
- fix: assignment issues by @pateljannat in #2205
- feat: mark questions for review in quiz by @pateljannat in #2206
- fix: hide evaluators search when list is empty by @LeoDanielA01 in #2197
- feat(lesson): add support for html (heading, block code, list) by @raizasafeel in #2207
- feat: add member modal, refactor control filters by @raizasafeel in #2209
- feat(control): better ux, inline create functionality for link by @raizasafeel in #2210
- refactor(multiselect): selected values are shown in input by @raizasafeel in #2211
- fix: improve sidebar scrolling with overflow by @LeoDanielA01 in #2199
- feat: change checkbox to switches, controls styling by @raizasafeel in #2214
- fix: assignment issues (backport #2205) by @mergify[bot] in #2223
- fix: reload and persist status filters in programming submissions by @LeoDanielA01 in #2220
- fix: misc issues by @pateljannat in #2229
- revert(course): use checkbox with tooltip for certification filter by @raizasafeel in #2228
- fix: misc issues (backport #2229) by @mergify[bot] in #2230
- fix: LiveCodeSession reference error and UI loading state by @LeoDanielA01 in #2218
- fix: misc issues by @pateljannat in #2233
- fix(JobDetail): application count and button now load properly on pag… by @LeoDanielA01 in #2238
- fix: course progress updated for scorm and video end event by @raizasafeel in #2247
- fix: misc issues in batch by @NagariaHussain in #2246
- fix: course progress updated for scorm and video end event (backport #2247) by @mergify[bot] in #2258
- fix: misc ui improvements by @pateljannat in #2260
- fix: misc ui improvements (backport #2260) by @mergify[bot] in #2261
- fix: add overflow-y-auto to settings dialog content panel (#2079) by @NuriaAmoros in #2262
- fix: better sanitization of form fields by @pateljannat in #2264
- fix: remove horizontal scrollbar and duplicate overflow div in sidebar by @Owaishk08 in #2265
- fix(style): improve payment gateway header text visibility in dark mode by @LeoDanielA01 in #2269
- fix(style): improve header text contrast in settings pages dark mode by @LeoDanielA01 in #2270
- fix: evaluator navigation by syncing modal visibility with route change by @LeoDanielA01 in #2271
- fix: prevent path transversals in lms by @raizasafeel in #2274
- fix: prevent path transversals in lms (backport #2274) by @mergify[bot] in #2275
- fix(notifications): single-line mobile header and improve empty state by @LeoDanielA01 in #2250
- fix: prevent unauthorised enrollments in paid courses by @raizasafeel in #2282
- fix: prevent unauthorised enrollments in paid courses (backport #2282) by @mergify[bot] in #2283
- fix: take max signups from Frappe settings for custom LMS signup by @Rl0007 in #2288
- feat: course package import and export by @pateljannat in #2286
- revert: change switches into checkbox by @raizasafeel in #2291
- fix: misc issues by @pateljannat in #2293
- fix: allow zero amount checkout with coupons by @raizasafeel in #2292
- fix: prevent xss in meta data by @raizasafeel in #2294
- fix: prevent xss in meta data (backport #2294) by @mergify[bot] in #2295
- fix: improved list for assignments and programming exercises by @pateljannat in #2296
- fix: misc issues by @pateljannat in #2298
- fix: prevent path traversal in scorm file by @raizasafeel in #2299
- refactor: jobs and certified participants view by @pateljannat in #2308
- feat: rtl support by @raizasafeel in #2310
- fix: loading state on batch details, student enrollment by admin by @raizasafeel in #2311
- fix: allow None for optional args in get_payment_link by @raizasafeel in #2314
- fix: allow None for optional args in get_order_summary by @raizasafeel in #2315
- fix: allow None for optional args in get_payment_link (backport #2314) by @mergify[bot] in #2317
- fix: render styles properly in text editor by @raizasafeel in #2322
- feat: on chapter completion continue learning takes you to next chapter by @raizasafeel in #2321
- fix: show job count on jobs listing for guest users by @raizasafeel in #2325
- fix: render styles properly in text editor (backport #2322) by @mergify[bot] in #2328
- feat: on chapter completion continue learning takes you to next chapter (backport #2321) by @mergify[bot] in #2327
- fix(patches): stale imports breaking bench migrate by @raizasafeel in #2336
- fix: update notification count on sidebar after they are read by @raizasafeel in #2338
- fix: sidebar_for_certified_members patch by @raizasafeel in #2342
- fix: sanitize lesson blocks from server and client by @raizasafeel in #2344
- fix: sidebar_for_certified_members patch (backport #2342) by @mergify[bot] in #2358
- fix(patches): stale imports breaking bench migrate (backport #2336) by @mergify[bot] in #2359
- fix: sanitize lesson blocks from server and client (backport #2344) by @mergify[bot] in #2357
- fix: use before_insert to assign student role to preserve password by @raizasafeel in #2363
- fix: use before_insert to assign student role to preserve password (backport #2363) by @mergify[bot] in #2364
- fix: set proper payments version in frappe dependencies by @raizasafeel in #2365
- feat: add empty states to settings by @raizasafeel in #2367
- fix: timezone now renders for courses and batches by @raizasafeel in #2376
- fix: keep only active course chapter expanded by @musaabhasan in #2372
- fix: user roles are removed on uninstall by @raizasafeel in #2377
- fix: user input questions now renders in quiz results by @raizasafeel in #2378
- fix(settings): meta image uploads successfully by @raizasafeel in #2380
- perf: refactor course outline and lesson to use qb by @raizasafeel in #2381
- fix: recalculate enrollment on course progress save from desk by @raizasafeel in #2382
- fix(quiz): exam submissions and scope check_answer by @raizasafeel in #2383
- perf: refactor course outline and lesson to use qb (backport #2381) by @mergify[bot] in #2384
- refactor(ui): consistent layout, header, and footer across pages by @raizasafeel in #2388
- fix: user roles are removed on uninstall (backport #2377) by @mergify[bot] in #2391
- fix: timezone now renders for courses and batches (backport #2376) by @mergify[bot] in #2390
- fix(quiz): exam submissions and scope check_answer (backport #2383) by @mergify[bot] in #2393
- fix: cloudflare/bunny embeds auto-complete after 30s by @raizasafeel in #2394
- fix(quiz): block direct create/write on LMS Quiz Submission by @raizasafeel in #2395
- feat: add empty states to settings (backport #2367) by @mergify[bot] in #2389
- fix: system manager permissions are set properly on install by @raizasafeel in #2399
- fix: system manager permissions are set properly on install (backport #2399) by @mergify[bot] in #2400
- fix: batch errors are now rendered by @raizasafeel in #2407
- fix(certificate): permission and progress check by @raizasafeel in #2406
- fix: race condition caused duplicate course progress by @raizasafeel in #2411
- fix: job application page is now visible by @raizasafeel in #2413
- fix: drop member email from certified participants response by @raizasafeel in #2414
- fix: mobile layout scroll by @raizasafeel in #2419
- feat: progress control in settings by @raizasafeel in #2426
- perf(quiz): batch question fetch, centralize question field names by @raizasafeel in #2427
- fix(quiz): attempted quiz count during submission by @raizasafeel in #2428
- refactor(lms): clean up course/batch UI and add typed form controls by @raizasafeel in #2424
- fix(courses): tab icons on coursedetail, consistent field styling by @raizasafeel in #2435
- fix(coupon): skip expiry date validation for disabled coupons by @NagariaHussain in #2434
- fix: zoom live class not auto-recording by @NagariaHussain in #2438
- Add ukrainian translation by @gromko in #2439
- fix: scope evaluator writes to the assigned by @raizasafeel in #2441
- fix: enforce member ownership on assignment submission by @raizasafeel in #2440
- fix(ui): batch form layout polish and rich-text instructor bios by @raizasafeel in #2442
- refactor(settings): clean up settings ui by @raizasafeel in #2436
- fix: sidebar overflow in collapsed state by @Owaishk08 in #2320
- feat(lesson): gate private lesson media, SCORM by @raizasafeel in #2446
- feat(lesson): gate private lesson media, SCORM (backport #2446) by @mergify[bot] in #2447
- fix: apply role filter to Members Load More by @raizasafeel in #2448
- fix: apply role filter to Members Load More (backport #2448) by @mergify[bot] in #2449
- fix: stop settings form focus rings from clipping at scroll edge by @raizasafeel in #2450
- fix: ui enhancements by @raizasafeel in #2451
- feat(lms): redesign the lesson editor — inline title, instructor notes, shared BlockEditor by @raizasafeel in #2469
- fix: save new applicable items when editing an existing coupon by @sayali-fossist in #2473
- fix: form control consistency, discussions UX, pricing validation, SCORM guards by @raizasafeel in #2477
- feat: redesign lesson editor and course video, add discussions, and UI consistency pass by @raizasafeel in #2482
- feat: notifications slide-over, 10-option quizzes + QuizForm redesign, dashboard tables by @raizasafeel in #2484
- perf(video-watch): add (member, lesson, source) index by @raizasafeel in #2491
- perf(video-watch): add (member, lesson, source) index (backport #2491) by @mergify[bot] in #2492
- fix(persona): force full-width Selects on persona form by @raizasafeel in #2494
- fix(editor): open the active lesson's chapter in the outline accordion by @raizasafeel in #2495
- fix: sanitize rendered HTML and restrict quiz uploads by @raizasafeel in #2496
- fix(router): install shared router for standalone AssessmentPlugin mounts by @IridescentGil in #2416
- fix: move video-watch-duration index patch to correct package path by @raizasafeel in #2498
- feat: UI enhancements across courses, editor, outline, sidebar, quiz & batches by @raizasafeel in #2502
- Merge develop into main-hotfix by @raizasafeel in #2503
- Merge
main-hotfixintomainby @raizasafeel in #2505 - fix(sidebar): truncate long link labels so controls are accessible in more by @raizasafeel in #2508
- fix: cypress test, lesson editor autosave crash by @raizasafeel in #2509
- fix(reviews): show real review dates instead of "Today" everywhere by @raizasafeel in #2516
- fix(lesson-editor): harden lesson create/rename/delete flow by @raizasafeel in #2519
- feat: email account setup from frontend by @raizasafeel in #2518
- fix(sidebar): highlight home link on its own route by @raizasafeel in #2520
- fix: send a separate reminder for recorded batch by @raizasafeel in #2521
- fix(editor): remove block clipboard keyboard shortcuts by @raizasafeel in #2522
- feat(persona): redesign as questionnaire stepper by @raizasafeel in #2526
- fix: prose list bullet visibility by @raizasafeel in #2528
- fix(evaluator): make "Add Slot" work on the availability profile by @raizasafeel in #2530
- fix: contain SCORM extraction to the authorised course directory by @raizasafeel in #2529
- fix: guard Attach fields in settings against non-string values by @raizasafeel in #2531
- fix(cert-request): block booking evaluations for other users by @raizasafeel in #2532
- fix(lesson): serve private media without the recent send_private_file by @raizasafeel in #2535
- fix(lesson): preserve rich formatting when pasting HTML into the editor by @raizasafeel in #2536
- fix(delete): clean up all lesson/course back-references on deletion by @raizasafeel in #2537
- fix(course editor): commit chapter rename on Enter by @NagariaHussain in #2542
- fix: add json guard on course lesson content by @raizasafeel in #2546
- fix: add json guard on course lesson content (backport #2546) by @mergify[bot] in #2549
- fix(lesson): emit images inside pasted list items as image blocks by @raizasafeel in #2550
- fix(lesson): emit images inside pasted list items as image blocks (backport #2550) by @mergify[bot] in #2551
- fix: resolve race condition hiding course outline for non admins by @raizasafeel in #2556
- refactor: frappe-ui beta.24 migration and clean up settings by @raizasafeel in #2565
- fix: fire on_update hook on enrollment progress update by @raizasafeel in #2557
- fix: stop fetching the outline before the course loads by @raizasafeel in #2566
- feat(persona): add 'how did you hear about us' question by @raizasafeel in #2567
- fix: harden access-control checks by @raizasafeel in #2568
- fix: miscellaneous fixes across payments, jobs, assignments, batches, and editor by @raizasafeel in #2569
- fix(editor): don't send null docname on lesson file upload by @raizasafeel in #2570
New Contributors
- @Owaishk08 made their first contribution in #2144
- @rathorevaibhav made their first contribution in #2122
- @LeoDanielA01 made their first contribution in #2189
- @jagadish-7 made their first contribution in #2080
- @NuriaAmoros made their first contribution in #2262
- @iamrubeng made their first contribution in #2278
- @musaabhasan made their first contribution in #2372
- @gromko made their first contribution in #2439
- @sayali-fossist made their first contribution in #2473
- @IridescentGil made their first contribution in #2416
- @AryamanSharma14 made their first contribution in #2515
Full Changelog: v2.45.2...v2.59.0