Version: 3.12.0
Highlights
Safer, self-updating plugins
Plugins now update from right inside Leantime: update notices surface available versions, a one-click update applies them with automatic rollback if something goes wrong, and you can opt in to fully automatic plugin updates. A new version guard and crash breaker keep an incompatible or failing plugin from taking down the rest of your workspace. (#3920, #3921, #3922)
A refreshed, consistent interface
A new shared component library brings cards, dialogs, forms, menus, tabs and more onto one consistent look and type scale across the whole app - from reports and My Work to kanban boards, goals, ideas and plugin screens. Dialog titles, close buttons and Delete actions now live in a standard modal header, and menus, filters and panels all use one dropdown. (#3887, #3900, #3901, #3881, #3884)
Upgrade Notes
- Database update: 3.12 runs a small migration (db version 3.5.30) that merges duplicate plugin rows left by older plugin updates. After upgrading, log in as an admin and confirm the database update screen, or run
php bin/leantime db:migrate. - Plugin compatibility: plugins can now declare the Leantime versions they support (
"extra": {"leantime": {"requires": ">=3.12 <4.0"}}in their composer.json). Plugins that don't declare a range are treated as supporting 3.x. A plugin that doesn't support the running version is skipped instead of loaded, shown as "Not compatible" in My Apps, and admins get a notification.system:updatelists such plugins before updating. Plugins configured viaLEAN_PLUGINSare not checked. - Crash breaker: a plugin that causes 5 failing requests within 10 minutes is disabled automatically (its license stays active) and admins are notified.
- One-click plugin updates reuse the stored license key and verify the new version in a separate PHP process before keeping it. The server needs a PHP command line available; without one the update is rolled back. Automatic plugin updates are off by default and only install minor/patch releases.
- Installing from git: a new Composer dependency (
composer/semver) was added. The release packages include it; git-based installs need to runcomposer install. - New plugin and component strings are English-only for now.
New Features
- One-click and automatic plugin updates - Update notices, one-click updates with rollback, and opt-in automatic updates, with duplicate plugin rows merged (#3921, #3922)
- Plugin stability safeguards - A version guard and crash breaker isolate incompatible or failing plugins (#3920)
- Enhanced select fields - All selects moved to a faster enhanced picker (SlimSelect v2), including a new tag field and in-field tag entry, replacing Chosen (#3873, #3874, #3904)
- New UI building blocks - Added date picker, button groups, checkboxes and toggles, radios, accordions, info tips, empty states, avatars, badges, status dots, tags, progress bars, alerts, steps and more (#3918, #3914, #3908, #3911, #3919, #3912, #3913, #3906, #3905, #3910, #3917, #3915)
- Table view-bar actions - Export and Columns moved into the view bar, with Show Tasks inside the Filter menu (#3898)
- Delete in the dialog header - Delete actions now live in the dialog header's ⋮ menu instead of the body (#3902)
Bug Fixes
- Plugin notices now display their text instead of a raw language key (#3924)
- Docs page polish: header rules, Delete placement, save status and title field, and the empty page now sits in a proper card (#3903, #3886)
- Composer lists built while plugins were unavailable are no longer cached (#3883)
- Core component text, tabs and view-bar labels now follow the type scale, with chip hover, height and Edit-label fixes in dialogs, tables and row menus (#3897, #3896, #3895)
Dependency Updates
- Bumped plugins adding a 50% retention offer on cancel (#3878)
- Bumped plugins with enhanced selects for CustomFields and the StrategyPro goal KPI picker (#3875)
What's Changed
Other Changes
- feat(components): forms.select no-op primitive + migrate 115 selects (43 files) by @marcelfolaron in #3873
- feat(components): enhanced forms.select on SlimSelect v2, drop Chosen by @marcelfolaron in #3874
- chore: bump plugins (enhanced selects for CustomFields and the StrategyPro goal KPI picker) by @marcelfolaron in #3875
- chore: bump plugins (50% retention offer on cancel) by @marcelfolaron in #3878
- feat(components): forms.chip — one handler for every status/priority/milestone/assignee picker by @marcelfolaron in #3879
- fix(views): don't cache a composer list built while plugins were unavailable by @marcelfolaron in #3883
- feat(components): actions.dropdown — one component for every menu, filter and panel dropdown by @marcelfolaron in #3881
- feat(components): one width scale for selects and text inputs by @marcelfolaron in #3882
- feat(components): navigation.view-tabs — views and page actions above the content box by @marcelfolaron in #3884
- feat(components): one underline look for section tabs in cards and modals by @marcelfolaron in #3885
- fix(wiki): empty Docs page sits in a white card by @marcelfolaron in #3886
- feat(components): elements.card, core text tokens, report Resources page on the shared look by @marcelfolaron in #3887
- feat(report): every report page on elements.card, all report text on the type scale by @marcelfolaron in #3888
- feat(components): plain core boxes on elements.card by @marcelfolaron in #3889
- feat(components): shared entity cards on elements.card (project, milestone, blueprint item, team member, plugin) by @marcelfolaron in #3890
- feat(components): kanban, idea, goal and other entity cards on elements.card by @marcelfolaron in #3891
- feat(components): My Work to-do cards on elements.card by @marcelfolaron in #3892
- feat(components): comments, status updates, subtasks and file tiles on elements.card by @marcelfolaron in #3893
- fix(components): tab and view-bar labels on the type scale (14px) by @marcelfolaron in #3895
- fix(components): chip hover underline in dialogs, chip height in tables, bold Edit in row menu by @marcelfolaron in #3896
- fix(components): all core component text on the type scale by @marcelfolaron in #3897
- feat(components): table Export / Columns in the view bar; Show Tasks inside Filter by @marcelfolaron in #3898
- feat(components): forms.label — one field label look by @marcelfolaron in #3899
- feat(components): actions.modal-header — dialog header row with its own close X by @marcelfolaron in #3900
- feat(components): every titled core dialog uses the modal header by @marcelfolaron in #3901
- feat(components): Delete moves from dialog bodies into the header ⋮ by @marcelfolaron in #3902
- fix(wiki): Docs page — header rules, Delete placement, save status, title field by @marcelfolaron in #3903
- feat(components): forms.tags — tag field on the enhanced select by @marcelfolaron in #3904
- feat(components): elements.section-header; core section titles use it by @marcelfolaron in #3907
- feat(components): elements.badge + elements.status-dot by @marcelfolaron in #3906
- feat(components): elements.tag-list for read-only tags; Blueprint item field says Title by @marcelfolaron in #3905
- feat(components): feedback.progress; core completion bars use it by @marcelfolaron in #3910
- feat(components): elements.list-item; report Needs attention uses it by @marcelfolaron in #3909
- feat(components): elements.avatar by @marcelfolaron in #3913
- feat(components): forms.checkbox (+ toggle variant) and forms.radio by @marcelfolaron in #3908
- feat(components): navigation.steps; invite onboarding uses it by @marcelfolaron in #3915
- feat(components): elements.details-list and feedback.alert by @marcelfolaron in #3917
- feat(components): elements.empty-state by @marcelfolaron in #3912
- feat(components): variants the plugins need (icon button, modal eyebrow, header status, accent/selected card, stat tones) by @marcelfolaron in #3916
- feat(components): elements.info-tip; dialogs announce loaded content by @marcelfolaron in #3919
- feat(components): forms.button-group (joined + segmented) by @marcelfolaron in #3914
- feat(components): elements.accordion on native
- feat(components): forms.date-picker by @marcelfolaron in #3918
- feat(plugins): version guard and crash breaker for plugins by @marcelfolaron in #3920
- feat(plugins): update notices and one-click plugin updates with rollback by @marcelfolaron in #3921
- feat(plugins): opt-in automatic plugin updates; merge duplicate plugin rows by @marcelfolaron in #3922
- fix(plugins): plugin notices never read as a bare language key by @marcelfolaron in #3924
- Release v3.12.0 by @marcelfolaron in #3925
Full Changelog: v3.11.0...v3.12.0