Highlights
Complete Blade Template Migration
All remaining legacy .tpl.php, .sub.php, and .inc.php templates have been converted to Laravel Blade, completing the frontend template unification. 272 legacy files removed, 200 Blade files added (net reduction of 72 files). This covers all 16 canvas domains, shared submodules (Tickets, Comments, Files, Projects), simple domains (Auth, Install, Settings, etc.), and complex domains (Calendar, Clients, Ideas, Timesheets, Users, Wiki). (#3362)
Mobile API Surface
Backend API changes to support the Leantime Mobile app (first TestFlight beta). Includes server-authoritative session resolution so mobile clients authenticated via Bearer token can resolve "who am I" without pre-knowing their user id. (#3395)
Users::getUser()defaults to session user when no id passedUsers::getUsersWithProjectAccessandProjects::getProjectsUserHasAccessToresolve userId server-sideAuth\AccessToken::revokeCurrentToken()for secure client-side sign-outProjects::getProjectsByUserActivityfor recency-sorted project listsTickets::markTicketDone/markTicketReopen/getAllDoneUserTicketsfor quick-complete flowsTickets::getAllOpenUserTicketsnow shipsstatusClassandstatusTypefieldsTickets::quickAddTicketrespects per-project default status configurationMilestones::getAllMilestones()correctly filters totype='milestone'Calendar::mapEventDatatolerates NULL description, colors, and datesComments::addCommentis now RPC-friendly with optional entity and default father- JSON-RPC no longer wraps scalar return values into single-element arrays
- JSON-RPC enforces
@apiannotation — only explicitly marked service methods are callable
Task Collaborators
Full multi-collaborator support for task assignment. Tasks can now have multiple collaborators in addition to the primary assignee, with updated UI in both list and kanban views showing collaborator avatars. (#3337)
Bug Fixes
- PDO Constant Crash on Shared Hosting — Guarded all MySQL-specific PDO constants (
MYSQL_ATTR_SSL_VERIFY_SERVER_CERT, etc.) withdefined()checks in the database config; some cPanel/EasyApache PHP builds load pdo_mysql without these constants, causing a fatal error on all pages (#3371) - Commenter Role Cannot Comment — Fixed
enableCommenterForms()not re-enabling submit buttons inside reply comment boxes aftermakeInputReadonly()disabled all form elements; the commenter role was completely non-functional (#3194, #3186) - Wiki Article Creation Fails on Postgres — Fixed
createArticle()using camelCasesortIndexcolumn name which Postgres rejects; schema and all other repos use lowercasesortindex(#3382) - Wiki 500 on Postgres (Milestone JOIN) — Added
DatabaseHelper::castAs()to the milestoneleftJoiningetArticle(), matching the pattern used in Canvas, Ideas, and Goalcanvas repositories; also removedlimit(1)from UPDATE/DELETE queries that fail on Postgres (#3383) - Ideas Saved to canvasId 0 — POST handler in
IdeaDialognow readscanvasIdfrom the submitted form with session as fallback, preventing ideas from being invisibly saved to canvas 0 (#3181) - Kanban Board Cannot Scroll with 8+ Columns — Added
overflow-x: autoto the kanban row container and set columns toflex-shrink: 0withmin-width: 200pxso boards with many status columns are horizontally scrollable (#3394) - Calendar Zero-Date Crash —
getCalendar()now skips events with MySQL zero-date sentinels (0000-00-00) instead of crashing the entire calendar feed (#3396) - Resend Invite Button No-Op — Fixed
isset(null)check that silently prevented the resend invite action from executing (#3392) - Three Bugs: isset, limit(1), URL — Fixed isset on null parameter, removed redundant
limit(1)on DELETE (Postgres compat), and corrected a malformed URL (#3393) - 403 Permission Page Crash — Added missing
error403.blade.phptemplate so permission-gated pages render an error page instead of crashing (#3365) - Favorites Star Infinite Spinner — Fixed the star button on Project Hub spinning indefinitely after click by removing the loading class after the request completes (#3364)
- Wiki Sidebar Width & Dark Mode — Fixed wiki sidebar width, dark-mode editor dropdown rendering, and emoji picker ESC key propagation (#3361)
- moveTicket, KPI, Backlog, Tiptap — Restored moveTicket functionality, KPI milestone linking, backlog filter on Postgres, and tiptap list rendering (#3360)
- Postgres Compat & Plugin Install — Fixed password reset and canvas queries on Postgres, plus plugin install null-safety (#3359)
- MarketplacePlugin Nullable Properties — Made
MarketplacePluginmodel properties nullable for PHP 8.x strict type compatibility (#3356) - Secondary Color Case Sensitivity — Fixed case sensitivity issue in the secondary color setting (#3348)
- Referrer-Policy Header Syntax — Fixed syntax error in the Referrer-Policy header assignment (#3347)
Localization
Dependency Updates
What's Changed
Other Changes
- fix: PostgreSQL ROUND error, missing zp_canvas.color migration, and 3.7.2 changelog by @marcelfolaron in #3318
- Fix case sensitivity in secondary color setting by @Delvar in #3348
- Fix syntax for Referrer-Policy header assignment by @Delvar in #3347
- build(deps): bump brace-expansion by @dependabot[bot] in #3340
- Update ko-KR.ini — complete Korean translation by @madrobotnet in #3326
- build(deps-dev): bump yauzl from 3.2.0 to 3.2.1 by @dependabot[bot] in #3320
- make MarketplacePlugin model properties nullable for PHP 8.x by @shaunchokshi in #3356
- Add collaborator support to task assignment and UI (list + kanban) by @juarezsousa-ctrl in #3337
- fix: Postgres compat + plugin install null-safety (bundles 4 issues) by @marcelfolaron in #3359
- fix: moveTicket, KPI linking, backlog filter on Postgres, tiptap list rendering by @marcelfolaron in #3360
- fix: wiki sidebar width, dark-mode editor dropdowns, emoji ESC propagation by @marcelfolaron in #3361
- Backend API surface for Leantime Mobile (TestFlight) by @gloriafolaron in #3395
- Fix three bugs: isset on null param, redundant limit(1), malformed URL by @YoussefMansour9 in #3393
- Implement Arabic language by @Mohd-PH in #3370
- fix: add error403.blade.php to resolve crash on permission-gated pages by @Copilot in #3365
- fix: Resend Invite button silently no-ops due to isset(null) check by @mojotaker in #3392
- Fix favorites star spinning indefinitely after click on Project Hub by @Copilot in #3364
- refactor: migrate all .tpl.php/.sub.php/.inc.php templates to Blade by @marcelfolaron in #3362
- fix: 6 high-impact bugs — PDO crash, commenter role, Wiki Postgres, Ideas canvasId, Kanban scroll by @marcelfolaron in #3397
- fix(calendar): tolerate MySQL zero-date sentinel in getCalendar by @gloriafolaron in #3396
New Contributors
- @Delvar made their first contribution in #3348
- @madrobotnet made their first contribution in #3326
- @shaunchokshi made their first contribution in #3356
- @juarezsousa-ctrl made their first contribution in #3337
- @YoussefMansour9 made their first contribution in #3393
- @Mohd-PH made their first contribution in #3370
- @Copilot made their first contribution in #3365
- @mojotaker made their first contribution in #3392
Full Changelog: v3.7.2...v3.8.0