Repository navigation
Conversation
…ntent Drive (#37827) When a user's menu has Content Drive but not Content Search or Site Browser, MenuGuardService now sends their URLs to the Content Drive equivalent instead of the first portlet: - /c/content and /c/site-browser open Content Drive - /c/content?filter=<variable> opens it filtered by that content type - /c/content/<inode> looks the content up and opens it by identifier and language (?editContent=&editContentLang=) - /c/content/new/<type> opens ?createContent=<type> Edit and create links restore the CD_ params Content Drive adds when it hands off to the legacy editor. Edit and create links that come from Content Drive itself are not redirected, since Content Drive still sends legacy-editor content to those URLs and redirecting would loop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 tasks
Contributor
|
Claude finished @zJaaal's task in 2m 5s —— View job PR ReviewRe-reviewed after the fixes in Resolved
New IssuesNo new issues. Spot-checked the rest of the diff:
Looks good to merge from a review standpoint. |
31 tasks
31 tasks
… double navigation (#37759) - Containers and templates stored as files now pass their folder to goToSiteBrowser(path). The menu guard turns //<host>/<folder>/ into Content Drive's ?path=, switching to that site first when it is not the current one. The legacy Site Browser still reads the folder from the session, so users who have it see no change. - When the inode lookup fails and the error handler has already navigated (a 401 goes to login), the guard now stops instead of also going to the first portlet. Rejections with no Content Drive equivalent are told apart with null. - The variant id is cleared on the Content Drive redirect too, not only when going to the first portlet. - The loop protection now covers edit links only. Nothing reads createContent yet, so a legacy create from Content Drive stays in Content Drive instead of jumping to the first portlet. - The Content Search filter goes over as contentType only, with no lookup: the Content Types chip now fills in the base type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#37759) The chip lists content types under their selected base type, so a link that names only a content type (filters=contentType:Blog) filtered the grid but left the chip empty. The chip now adds the base types of the host's content types, resolved from the content types it already loads, so no extra request. Content types the server does not return are dropped from the host's selection after a successful load, so a deleted type or a typo in an old link does not keep filtering with nothing to clear. Content Drive's init effect no longer tracks the default language: it re-ran when the language landed and re-read the page's original URL over any filter changed in between, including that cleanup. loadDefaultLanguage already seeds the language into the current filters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Member
Author
|
Replying to the review above (#37829 (comment)):
Written by Claude Code on behalf of @zJaaal. |
- menu-guard spec: the guard result starts undefined until the guard emits. - container list spec: narrow the file container found in the mock list. - Content Drive store: pass SYSTEM_HOST while the site has not loaded, as initContentDrive already falls back to. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dario-daza
added this pull request to stack #37833
September 30, 2026 18:48
dario-daza
added a commit
that referenced
this pull request
Sep 30, 2026
…ith the stack (#37759) - Follow the stack's numbering: route redirects (#37829) are Part 1, the legacy-editor side panel is Part 2. - Renumber the functional requirements so they increase in document order. - State the create location once: the folder Content Drive is showing, the `path` of a `createContent` link, or the site root. - Record that a workflow wizard action reports a save like a plain save (checked in edit_contentlet_js_inc.jsp), and add the rejected-save case. - Align with what #37829 implemented: the redirect keeps folder and filters, CD_ params are added on every legacy hand-off until this work, and page creates follow the same create flow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
dario-daza
removed this pull request from stack #37833
September 30, 2026 19:59
Member
Author
|
@dario-daza will take over the rest of the work on #37832 |
dario-daza
added a commit
that referenced
this pull request
Sep 30, 2026
…l spec The stack with #37829 was closed and its commits brought into this branch, so the spec now says Part 1 is already on the branch and Part 2's implementation follows in the same PR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Part of #37759. This PR does the routing half of that issue; the Content Drive side lands separately, so merging this should not close it.
Proposed Changes
When a user's menu has Content Drive but not Content Search or Site Browser,
MenuGuardServicenow redirects their URLs to the Content Drive equivalent. Before this change, it sent the user to their first portlet with no explanation. Every/c/:idroute goes through this guard, so internal navigations,routerLinks, and full-page links from JSPs, emails and bookmarks are all covered./c/content/content-drive/c/content?filter=<variable>/content-drive?filters=contentType:<variable>/c/content/<inode>/content-drive?editContent=<identifier>&editContentLang=<languageId>(looked up withGET /api/v1/content/<inode>)/c/content/new/<type>/content-drive?createContent=<type>/c/content/new/content-drive/c/site-browser/content-drive/c/site-browser?path=//<host>/<folder>//content-drive?path=/<folder>/, switching to<host>first when it is not the current siteCD_-prefixed params Content Drive adds when it hands off to the legacy editor, so the user lands back on their folder and filters. Other params, such asvariantNameand the legacyfolderinode, have no Content Drive equivalent and are dropped.DotRouterService.goToSiteBrowser(path), and the guard maps it with the host stripped (Content Drive'spathis a folder inside the current site). The legacy Site Browser still reads the session, so users who have it see no change. If the host can't be found, the user lands on Content Drive at the root./c/content/<inode>, and openingeditContentwould send it straight back. Create links are always redirected: nothing readscreateContentyet, so a legacy create from Content Drive now stays in Content Drive instead of jumping to the first portlet.Content Types chip (shared
libs/uicomponent)A link that names only a content type (
filters=contentType:Blog) filtered the grid but left the Content Types chip empty, because the chip lists content types under their selected base type.DotContentTypeFilterComponentnow:ensure, so there is no extra request. The chip reads "Content Types: Blog" and the next selection emitted carries both.The asset picker uses the same component. The change only adds base types that a selected content type already implies, so a host that passes both sees no difference.
For that cleanup to stick in Content Drive, its init effect no longer tracks the default language. It used to re-run when the language arrived, re-reading the page's original URL over any filter changed in between.
loadDefaultLanguagealready adds the language to the current filters, so only a site change re-runs the init now.What is left on #37759
This PR builds the URLs. Opening them fully is the Content Drive side of the same issue:
editContentalready opens content that uses the new editor. For content that uses the legacy editor, it needs the side-panel handling that the Content Drive side adds.createContentis a new param that Content Drive doesn't read yet, so for now a create link opens Content Drive with nothing selected. The Content Drive side should confirm the name and consume it, and must open legacy creates inside Content Drive rather than navigate to/c/content/new/<type>, or the redirect loops./c/content/<inode>for legacy content, or stay for the case where the side-panel flag is off.Checklist
menu-guard.service.spec.tscovers each redirect row,CD_param restoration, lookup failure and the already-redirected case, folder paths on the current site, another site and an unknown host, the "portlet still in menu" and "no Content Drive" cases, and the loop protection (31 tests).dot-content-type-filter.component.spec.tscovers the base type fill-in and the unknown-type drop, including a failed load.dot-content-drive.store.spec.tscovers a filter changed before the default language lands. The router service, container list and template list specs assert the folder is passed./content-driveroute.Additional Info
/c/content?filter=URLs (contentListingNavigation.ts,listingContent.page.ts) drive the legacy listing as an admin who still has Content Search, so this guard never redirects them.🤖 Generated with Claude Code