What's Changed
๐ Notable Changes
- Installer: Write connection string to the final available appsettings.*.json (closes #21833) by @AndyButland in #22817
๐ฆ Dependencies
- Bump the npm_and_yarn group across 1 directory with 6 updates by @dependabot[bot] in #23440
- Build(deps): Bump the npm_and_yarn group across 1 directory with 2 updates by @dependabot[bot] in #23452
- build(deps): bumps @umbraco-ui/uui from 2.0.1 to 2.0.2 by @iOvergaard in #23490
- Build(deps-dev): Bump basic-ftp from 5.3.0 to 5.3.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in #23503
- Dependencies: Update backoffice npm packages to latest minors and patches (#23429) by @iOvergaard in #23498
- Dependencies: Update Tiptap to 3.29.2 by @leekelleher in #23562
- Build(deps): Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in #23561
- Dependencies: Pin SQLitePCLRaw.lib.e_sqlite3 to a non-vulnerable version (closes #23325) by @AndyButland in #23393
- Dependencies: Update NuGet packages to latest minor and patch versions by @AndyButland in #23570
- Dependencies: Update NuGet packages to latest minor and patch versions by @AndyButland in #23607
- Dependencies: Update NuGet packages to latest minor and patch versions (18) by @AndyButland in #23681
- Dependencies: Update NuGet packages to latest minor and patch versions by @AndyButland in #23733
๐ New Features
- Bulk Actions: Show progress in a shared dialog for bulk publish, unpublish, delete, move & copy (closes #20797) by @iOvergaard in #21215
- Extension API: Add userEntryPoint extension type (closes #19485) by @iOvergaard in #23409
- Recycle bin: Support restoring a document or media item without its descendants at the service level (closes #23417) by @AndyButland in #23448
- Media Picker: Show ancestor breadcrumb path in search results table view (closes #23101) by @AndyButland in #23116
- Pickers: Show the number of selected items in the tree and collection item picker modals by @madsrasmussen in #23606
- Tree Item Picker: Make table rows and cards with children navigable in pickers during selection by @madsrasmussen in #23593
- Pickers: Split browse and search into tabs by @madsrasmussen in #23617
- Media: drag n drop CTA for Collections and Pickers (Closes #18332) by @Abdjulaziz in #22739
- Collections: Remember the view, filter, ordering and page of a collection (closes #22418) by @madsrasmussen in #23571
- Document Tree: Add card and table views by @madsrasmussen in #23642
๐ค Performance
- Avoid some string allocations by @Henr1k80 in #23402
- Normalize culture code casing in SetCultureInfo and SetPublishInfo by @ronaldbarendse in #23425
- Backoffice Performance: Defer decorator controller creation to hostConnected by @iOvergaard in #22519
- Media: Narrow sibling name-uniqueness fetch so writes scale on large libraries (closes #23446) by @AndyButland in #23447
- Published cache: Populate the ID/key map from seeded and cached content (closes #23583) by @AndyButland in #23586
- Tree: Increase child page size to 100 by @madsrasmussen in #23585
- Tree: Avoid reloads on no-change config updates by @nielslyngsoe in #23670
- Performance: Only load server information once when instantiating the backoffice by @nielslyngsoe in #23673
- Content Workspace: get languages from context by @nielslyngsoe in #23668
- Published Cache: Stop writing unread member rows to the database cache (closes #23070) by @AndyButland in #23730
- Content & Media: Batch cold read-through for Children()/Descendants() traversal by @AndyButland in #23358
- Micro-optimisation: Speed & memory improvements for
CompositeStringStringKeyby @patrickdemooij9 in #23471 - Micro-optimisations: Avoid redundant allocations in file name and log filter by @patrickdemooij9 in #23474
- Micro-optimisations: Improve memory usage for
ReplaceManystring extension method by @patrickdemooij9 in #23483 - Micro-optimisation: Avoid
Activator.CreateInstancewhen creatingMediaWithCropsby @patrickdemooij9 in #23496 - Micro-optimisations: Delivery API node parse improvement by @patrickdemooij9 in #23506
๐ Bug Fixes
- Member Types: Fixed issue with missing icon for workspace design view by @abjerner in #23391
- Extension API: Guard against a cleared manifest when an extension is unregistered mid-initialization (closes #23384) by @AndyButland in #23395
- Date Time Picker: Honour min/max config on the time-zone-aware editors (closes #23372) by @AndyButland in #23373
- Migrations: Fix errors upgrading v13 databases with block editors to v17 by @AndyButland in #23401
- Current User: Re-fetch the current user when authorization is regained after a session timeout by @iOvergaard in #23408
- Collection Views: Accumulate table selection across pages (closes #23403) by @rickbutterfield in #23406
- Content Workspaces: Redirect stale variant workspace URLs when the content type variance changes by @iOvergaard in #23385
- Fix: Block thumbnail picker restricted to image files by @TechPdo in #21848
- Imaging: Respect
ImageFileTypesconfiguration in management API factories by @iOvergaard in #23413 - Users: Validate avatar uploads against configured image file types by @iOvergaard in #23415
- Maindom: Broadcast cache instructions without maindom by @Zeegaan in #23421
- Scoping: Restore
LogIncompletedScopeswarning for uncompleted child scopes (closes #15243) by @AndyButland in #23424 - HTML Utilities: Ensure that space is added between all elements in
StripHtmlTagsby @arknu in #23245 - Block Workspace: Guard block label render against a destroyed workspace (closes #22745) by @iOvergaard in #23449
- Backoffice: Support running in insecure browser contexts (plain HTTP on IP addresses) by @iOvergaard in #23426
- Migrations: Migrate settings values for block editors when a block has no content values (closes #23392) by @AndyButland in #23404
- Logging: Prevent session-id log enricher recursion / stack overflow (closes #16744) by @AndyButland in #23423
- Preview: Refresh external preview tabs and their token on repeat preview (closes #21820) by @iOvergaard in #23450
- Content Types: Fix stale published cache when property variance changes without content type variance changing by @lauraneto in #23445
- Routing: Add close button to access denied route when displayed in modal (closes #23451) by @ShekharTarare in #23456
- Block Editors: Preserve published state of property-less blocks on upgrade (closes #23379) by @AndyButland in #23383
- Elements: Delete relations when deleting an element folder (closes #23387) by @AndyButland in #23394
- Localization: Fix punctuation in resetFocalPoint string by @bjarnef in #23479
- Auth: Do not treat a boot-time token refresh rejection as a session timeout (closes #23462) by @iOvergaard in #23494
- Block Grid: Use the content element type name in the invalid-location tag (closes #23092) by @iOvergaard in #23511
- Navigation Cache: Prevent concurrent alias map corruption (closes #23518) by @ambientttt in #23519
- Confirm Modal: Escaped special characters in item names by @leekelleher in #23542
- Tiptap RTE: Load configured stylesheets regardless of extension styles (closes #21819) by @leekelleher in #23497
- Tiptap RTE: Render
umbLinkviaMarkViewto stopdata-router-slotattribute leaking into stored HTML by @leekelleher in #23488 - Tiptap RTE: Preserve block-level elements nested in
<div>containers (closes #22654) by @leekelleher in #23489 - Localization: Danish translation for BlockEditor confirmDeleteBlockTitle by @nielslyngsoe in #23543
- Basic Authentication: Allow preview requests from an authenticated back-office user (closes #23475) by @AndyButland in #23539
- Migrations: Only rebuild the published cache for migration plans that request it (closes #23537) by @AndyButland in #23533
- Content Notifications: Raise
ContentSavedNotificationon save-and-publish (closes #23523) by @AndyButland in #23528 - Imaging: Enforce max width/height when HMAC is configured by @AndyButland in #23521
- Management API: Generate valid operation IDs for minor API versions, and upgrade @hey-api/openapi-ts by @iOvergaard in #23499
- Tiptap RTE: Prevent duplicate toolbar items when reordering a newly dragged item (closes #23524) by @AndyButland in #23538
- Scoping: Isolate the ambient scope stacks across execution context flows (closes #23366) by @Ron-Brouwer in #23492
- Tiptap RTE: Fix crash when content contains an embedded media node by @leekelleher in #23563
- Elements: Fix property-variance parity gaps with Documents by @lauraneto in #23467
- Publishing: Save the document before publishing it with descendants (closes #14925) by @iOvergaard in #23554
- Content Types: Fix
MovePropertyTypeorphaning the property when moving it to no group (closes #23481) by @AndyButland in #23493 - Permissions: Respect custom IElementContainerPermissionService for backoffice UI action visibility by @lauraneto in #23491
- Localization: Add missing Swedish translations by @DanielToxic in #23567
- SignalR Events: Filter document and media notifications by the recipient's start-node access by @AndyButland in #23555
- Tiptap RTE: Retain media folder context across picker modals (closes #23367) by @leekelleher in #23507
- Preview: Add the CSP nonce to the injected preview badge script (closes #23530) by @iOvergaard in #23560
- Block editors: Pair inner block values by block key when merging variant data (closes #23525) by @iOvergaard in #23527
- Image Cropper: Fix button labels (closes #23604) by @idseefeld in #23605
- Segments: Fix mandatory segment property validation (closes #23576) by @kjac in #23587
- Code Block: style update by @nielslyngsoe in #23578
- Content type designer: add root property styles by @nielslyngsoe in #23611
- Navigation Cache: Change from
HashSet<T>toConcurrentHashSet<T>inNavigationSnapshot(closes #23577) by @arknu in #23615 - Localization: Restore from recycle bin and image crops property editor by @Lantzify in #23621
- Hotfix: export a Backoffice version of demandCustomElement by @nielslyngsoe in #23624
- Hotfix: adding backwards compatible exports by @nielslyngsoe in #23626
- Hotfix: Reintroduce deprecated UUI components by @nielslyngsoe in #23628
- Pagination: 100% wide by @nielslyngsoe in #23640
- Localization: Update Danish translations by @bjarnef in #23622
- Authentication: Log silent auto-link failures in
BackOfficeSignInManagerandMemberSignInManager(closes #23632) by @noonand in #23655 - Log Viewer: Send log viewer date range as local-day instants and honour time portions (closes #14710) by @readingdancer in #23460
- Blocks: Inline Editing Context API Race Condition (Closes #22444) by @nielslyngsoe in #23610
- Routing: Don't retain the fallback default culture captured during an upgrade boot (closes #22581) by @AndyButland in #23653
- Property Context: proper observation cleanup by @nielslyngsoe in #23674
- Segments: Handle segment values for
IsPropertyValidby @kjac in #23691 - Migrations: Don't rebuild the published cache after a failed migration plan (closes #23612) by @AndyButland in #23709
- OpenIddict: Prevent
ConcurrencyExceptionwhen several instances register the same application (closes #23544) by @arnelirobles in #23599 - OpenIddict: Compare ConsentType and ApplicationType only when the descriptor sets them (follow-up to #23599) by @arnelirobles in #23727
- oEmbed: Fix HttpClient initialization race in OEmbedProviderBase (closes #23697) by @AndyButland in #23715
- Cleanup: refinement of cleanup localization by @nielslyngsoe in #23686
- Content Types: Allow editing compositions on document types that are inherited from (closes #23103) by @AndyButland in #23433
- Migrations: Resolve date default constraints by lookup rather than by convention (closes #23702) by @AndyButland in #23704
- Variant selector: avoid rendering fallback shortly by @nielslyngsoe in #23721
- Logging: Include the GUID key alongside the integer id in log messages (closes #23547) by @AndyButland in #23552
- Members: Indicate that withheld sensitive values exist instead of showing their defaults by @AndyButland in #23707
- Tiptap RTE: Fix table toolbar menu staying open after deleting table (closes #23658) by @andreaslborg in #23669
- TipTap RTE: Remove toolbar shadow before scroll (closes #23710) by @andreaslborg in #23716
- Block Grid: Fx clean up Blocks from Areas by @nielslyngsoe in #23726
- Migrations: Correct conversion of nested single block list values (for 18) (closes #23596) by @AndyButland in #23603
- Document Link Picker: Scope search results to the selected/inherited culture by @madsrasmussen in #23761
- Migrations: Correct conversion of nested single block list values (for 17) (closes #23596) by @AndyButland in #23602
- Blocks: Inline editing hides the box if only a single box would be presented by @nielslyngsoe in #23692
๐งช Testing
- QA: add acceptance tests for missing property editors by @andr317c in #23420
- Fix recursive acceptance helper search (#23323) by @Digipex in #23335
- Tests: Cherrypick acceptance test changes from main to v17 by @andr317c in #23442
- Tests: Stabilise flaky acceptance tests by @andr317c in #23410
- Tests: Fix flaky media order-direction acceptance test by @andr317c in #23469
- Acceptance Tests: Export
UiBaseLocatorsinacceptance-test-helpersby @rickbutterfield in #22401 - Tests: Cherry-pick acceptance tests from main to v17 and fix for v17 UI by @andr317c in #23468
- Elements: Expand test coverage by @lauraneto in #23546
๐ก๏ธ Code Quality, Documentation and Refactoring
- Extension Insights: Migrate Extension collection table view to table kind by @madsrasmussen in #22861
- Webhook Delivery: Migrate custom table collection view to generic table kind by @madsrasmussen in #22858
- Backoffice: Tidy up leftover
elementNameconstants by @leekelleher in #23439 - AI Docs: Correct and trim solution- and project-scoped CLAUDE.md files by @AndyButland in #23480
- Code Quality: Resolved warnings by @lumikrynd in #23508
- Login: Remove @hey-api/openapi-ts from the login project (closes #23500) by @iOvergaard in #23501
- Documentation: Add a warning that discourages the use of
StripHtmlfor XSS prevention by @jorikvanveen in #23614 - Chore: auto fix of eslint warnings by @nielslyngsoe in #23631
- ESLint: clean up old params by @nielslyngsoe in #23639
- ESlint: Auto fix of jsdocs warnings by @nielslyngsoe in #23647
- Chore: MD knowledge regarding general purpose by @nielslyngsoe in #23638
- Chore: Better code readability by @nielslyngsoe in #23635
- Claude MD: update on when to comment by @nielslyngsoe in #23672
- Block Rich Text Editor Impl.: cleanup & deprecate by @nielslyngsoe in #23720
- Auth: Obsolete services already removed in V19 by @kjac in #23759
๐งโ๐ป Developer Experience
- Config Repositories: Defer store-backed config observables via a shared base so consumers need not await initialized by @iOvergaard in #23416
- ESlint: Advice
nullcontroller alias by @nielslyngsoe in #23601 - Array State: support value to be undefined by @nielslyngsoe in #23584
- ESLint: switch to eslint-import-x by @nielslyngsoe in #23629
- Localization: Type-safe keys for term() and by @iOvergaard in #22887
New Contributors
- @Digipex made their first contribution in #23335
- @ambientttt made their first contribution in #23519
- @Ron-Brouwer made their first contribution in #23492
- @jorikvanveen made their first contribution in #23614
- @noonand made their first contribution in #23655
- @arnelirobles made their first contribution in #23599
Full Changelog: release-18.1.1...release-18.2.0-rc