-
-
Notifications
You must be signed in to change notification settings - Fork 11.4k
Remove members-forward route #27040
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
jonatansberg
merged 29 commits into
main
from
ber-3506-rework-feature-flagging-for-release
Apr 8, 2026
Merged
Remove members-forward route #27040
Changes from all commits
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
006d371
Changed members routes to use feature-gated rendering
jonatansberg bc05ca9
Fixed member e2e routes after suite reshuffle
jonatansberg 171015d
Reduced duplicate members route tests
jonatansberg 4ad2087
Simplified members nav active route handling
jonatansberg fb4107c
Restored members React e2e coverage shape
jonatansberg ea2bff4
Fixed members e2e search selector
jonatansberg 60dca51
Fixed members review issues and e2e scoping
jonatansberg c62d580
Fixed members route regressions after rebase
jonatansberg 473f258
Fixed members e2e helper scoping after rebase
jonatansberg 892eac6
Fixed members-forward redirect assertion
jonatansberg a02a97b
Fixed members legacy e2e failures
jonatansberg 866378d
Prevented dual members import modals
jonatansberg 44321fa
Fixed shade imports after rebase
jonatansberg 5723454
Added members route access control
jonatansberg b075b69
Fixed legacy import mapping assertions
jonatansberg 996f9a6
Fixed legacy import redirect assertion
jonatansberg 1084372
Fixed legacy import hash-route assertion
jonatansberg c708e85
Fixed members import route handoff
jonatansberg 9f9400b
Fixed members saved views e2e selectors
jonatansberg 90aea91
Simplified members sidebar active state
jonatansberg 607038c
Fixed members import modal ownership gating
jonatansberg 501f508
Removed stale inAdminForward import gating
jonatansberg 00d337a
Removed trivial members route gate test
jonatansberg db66fc1
Reduced duplicate members test churn
jonatansberg 1557afb
Cleaned members e2e duplication
jonatansberg 9ff9e03
Removed redundant members import modal gate
jonatansberg 041886b
Stopped Ember members import modal rendering on React route
jonatansberg 84466ce
Simplified members nav state and Ember list opt-out
jonatansberg 54338d5
Reduced members list page test churn
jonatansberg File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
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
55 changes: 0 additions & 55 deletions
55
apps/admin/src/layout/app-sidebar/nav-content.helpers.test.ts
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| import {Outlet} from "@tryghost/admin-x-framework"; | ||
| import {EmberFallback} from "./ember-bridge"; | ||
| import {useFeatureFlag} from "./hooks/use-feature-flag"; | ||
|
|
||
| export function MembersRouteGate() { | ||
| const membersForwardEnabled = useFeatureFlag("membersForward"); | ||
|
|
||
| if (!membersForwardEnabled) { | ||
| return <EmberFallback />; | ||
jonatansberg marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| return <Outlet />; | ||
jonatansberg marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| import {render, screen} from '@testing-library/react'; | ||
| import React from 'react'; | ||
| import {beforeEach, describe, expect, it, vi} from 'vitest'; | ||
| import {MembersRoute} from './members-route'; | ||
|
|
||
| const {mockCanManageMembers, mockUseCurrentUser} = vi.hoisted(() => ({ | ||
| mockCanManageMembers: vi.fn(), | ||
| mockUseCurrentUser: vi.fn() | ||
| })); | ||
|
|
||
| vi.mock('@tryghost/admin-x-framework', () => ({ | ||
| Navigate: ({replace, to}: {replace?: boolean; to: string}) => React.createElement('div', { | ||
| 'data-replace': String(Boolean(replace)), | ||
| 'data-testid': 'navigate', | ||
| 'data-to': to | ||
| }) | ||
| })); | ||
|
|
||
| vi.mock('@tryghost/admin-x-framework/api/current-user', () => ({ | ||
| useCurrentUser: mockUseCurrentUser | ||
| })); | ||
|
|
||
| vi.mock('@tryghost/admin-x-framework/api/users', () => ({ | ||
| canManageMembers: mockCanManageMembers | ||
| })); | ||
|
|
||
| vi.mock('./members-route-gate', () => ({ | ||
| MembersRouteGate: () => React.createElement('div', {'data-testid': 'members-route-gate'}) | ||
| })); | ||
|
|
||
| describe('MembersRoute', () => { | ||
| beforeEach(() => { | ||
| mockCanManageMembers.mockReturnValue(true); | ||
| mockUseCurrentUser.mockReturnValue({ | ||
| data: { | ||
| id: '1', | ||
| roles: [{name: 'Administrator'}] | ||
| }, | ||
| isError: false, | ||
| isLoading: false | ||
| }); | ||
| }); | ||
|
|
||
| it('renders the members route gate for authorized users', () => { | ||
| render(<MembersRoute />); | ||
|
|
||
| expect(screen.getByTestId('members-route-gate')).toBeInTheDocument(); | ||
| }); | ||
|
|
||
| it('redirects users without member permissions to home', () => { | ||
| mockCanManageMembers.mockReturnValue(false); | ||
|
|
||
| render(<MembersRoute />); | ||
|
|
||
| expect(screen.getByTestId('navigate')).toHaveAttribute('data-to', '/'); | ||
| expect(screen.getByTestId('navigate')).toHaveAttribute('data-replace', 'true'); | ||
| }); | ||
|
|
||
| it('renders nothing while the current user is still loading', () => { | ||
| mockUseCurrentUser.mockReturnValue({ | ||
| data: undefined, | ||
| isError: false, | ||
| isLoading: true | ||
| }); | ||
|
|
||
| const {container} = render(<MembersRoute />); | ||
|
|
||
| expect(container).toBeEmptyDOMElement(); | ||
| }); | ||
|
|
||
| it('redirects to home when the current user is unavailable after loading', () => { | ||
| mockUseCurrentUser.mockReturnValue({ | ||
| data: undefined, | ||
| isError: false, | ||
| isLoading: false | ||
| }); | ||
|
|
||
| render(<MembersRoute />); | ||
|
|
||
| expect(screen.getByTestId('navigate')).toHaveAttribute('data-to', '/'); | ||
| }); | ||
| }); |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| import {Navigate} from "@tryghost/admin-x-framework"; | ||
| import {useCurrentUser} from "@tryghost/admin-x-framework/api/current-user"; | ||
| import {canManageMembers} from "@tryghost/admin-x-framework/api/users"; | ||
| import {MembersRouteGate} from "./members-route-gate"; | ||
|
|
||
| export function MembersRoute() { | ||
| const {data: currentUser, isError, isLoading} = useCurrentUser(); | ||
|
|
||
| if (!currentUser) { | ||
| if (isError || !isLoading) { | ||
| return <Navigate replace to="/" />; | ||
| } | ||
|
|
||
| return null; | ||
| } | ||
|
|
||
| if (!canManageMembers(currentUser)) { | ||
| return <Navigate replace to="/" />; | ||
| } | ||
|
|
||
| return <MembersRouteGate />; | ||
| } |
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
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.