-
Notifications
You must be signed in to change notification settings - Fork 4
Add bounded sidebar task navigation stack #721
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
Merged
Changes from 94 commits
Commits
Show all changes
95 commits
Select commit
Hold shift + click to select a range
65b3380
chore: checkpoint KENT-356 implementation
Nek-12 a1fde69
refactor: replace sidebar stack bridge
Nek-12 6dcf40e
feat: add sidebar navigation admission and restoration
Nek-12 b9d347c
fix: coordinate board sidebar selector changes
Nek-12 6ca037d
chore: record sidebar verification boundary
Nek-12 2f438ba
fix: satisfy sidebar lint and verification checks
Nek-12 37d1f8e
docs: record final sidebar verification
Nek-12 b810afc
fix: remediate sidebar navigation review findings
Nek-12 8442b51
fix: harden sidebar route deletion remediation
Nek-12 a8a3ddf
fix: finalize sidebar restoration ownership
Nek-12 d5d3a54
fix: surface sidebar navigation outcomes
Nek-12 f6bb87f
fix: reconcile sidebar review outcomes
Nek-12 1e4d73d
fix: unify board deletion coordination
Nek-12 98e54fc
fix: defer deletion selector consumption
Nek-12 597830d
fix: centralize board selector ownership
Nek-12 73005d8
fix: remove board task sentinels
Nek-12 72756bf
fix: close sidebar on route changes
Nek-12 11dc5e0
docs: record route change verification
Nek-12 8f6de73
fix: centralize pathname close ownership
Nek-12 ef83352
docs: record passing desktop suite
Nek-12 d81222e
fix: subscribe to router history for sidebar close
Nek-12 1620b1f
refactor: trim sidebar scope
Nek-12 2cebcc2
docs: record production scope cap
Nek-12 e141855
refactor: fit production scope cap
Nek-12 237c1d1
refactor: meet complete scope cap
Nek-12 9ee2296
docs: record complete scope cap
Nek-12 200ac45
refactor: simplify sidebar scope remediation
Nek-12 cdf9a04
docs: record structural scope remediation
Nek-12 38719b8
fix: subscribe to router lifecycle navigation
Nek-12 5833f06
docs: record final route remediation scope
Nek-12 7c0721b
fix: close sidebar before route loading
Nek-12 9b16014
chore: use shared translation in route test
Nek-12 2cc0d4e
fix: observe router pathname for sidebar close
Nek-12 879a2d6
docs: record pathname observer scope
Nek-12 b2edf10
refactor: centralize sidebar route transition owner
Nek-12 03ca35e
refactor: centralize sidebar route transitions
Nek-12 400e960
docs: record centralized route contract verification
Nek-12 278d929
refactor: defer task deletion route reconciliation
Nek-12 8da2d8c
docs: record deferred deletion reconciliation
Nek-12 8e67687
fix: scope deferred deletion reconciliation
Nek-12 a64c1d6
refactor: reduce sidebar provider duplication
Nek-12 a196e8d
docs: record scoped deletion activation
Nek-12 a5d4b18
fix: preserve stale deletion scope through invalidation
Nek-12 5149bd5
docs: record invalidation scope guard
Nek-12 90a8b21
refactor: derive deletion harness contract
Nek-12 6d2fa5b
fix: close sidebar before pathname navigation
Nek-12 cfd9279
docs: record pathname lifecycle remediation
Nek-12 fbe43e8
refactor: centralize pathname route ownership
Nek-12 6bce95e
docs: record single pathname route authority
Nek-12 c40beb9
refactor: unify typed route transition dispatch
Nek-12 d85875f
refactor: reduce typed route dispatch scope
Nek-12 0a870c6
refactor: compact typed route model
Nek-12 99cb6ac
fix: preserve typed optional route search
Nek-12 970c7a2
refactor: narrow route search adapter
Nek-12 a1557e6
docs: record unified typed route dispatch
Nek-12 f2eecb8
docs: record final route dispatch verification
Nek-12 5b2060d
fix: close sidebar before route navigation
Nek-12 356ff60
test: guard sidebar route close ordering
Nek-12 84abf8b
refactor: compact synchronous route close
Nek-12 b983de6
docs: record route ordering guard
Nek-12 77cc09c
test: consolidate Home route guard
Nek-12 05f2894
fix: commit complete sidebar close state
Nek-12 f08a1cd
docs: record complete route close flush
Nek-12 8d002fd
refactor: unify sidebar presentation lifecycle
Nek-12 93a5d5a
docs: record single lifecycle scope
Nek-12 ded3ab7
test: guard active sidebar stack removal
Nek-12 377a148
test: consolidate sidebar fixture sequence
Nek-12 1508407
fix: narrow sidebar fixture sequence
Nek-12 4c45327
fix: close sidebar before route loading
Nek-12 161f259
fix: preserve typed router search contract
Nek-12 b01a61c
docs: record QA source mismatch
Nek-12 94d6824
fix: defer sidebar route close commit
Nek-12 fb0b0b0
refactor: remove superseded sidebar implementation
Nek-12 8234f01
docs: redesign sidebar stack plan
Nek-12 29082cc
docs: close sidebar plan lifecycle gaps
Nek-12 e75d50c
docs: revoke stale sidebar navigation synchronously
Nek-12 247fb40
docs: separate sidebar capture from navigation
Nek-12 5941da2
docs: make sidebar capability replay-safe
Nek-12 dc086cc
docs: scope all sidebar page settlement
Nek-12 d96ab05
docs: delete feature-typed sidebar results
Nek-12 85abae7
docs: own sidebar roots through teardown
Nek-12 291e219
docs: release sidebar roots synchronously
Nek-12 a6d3cfe
docs: keep sidebar internals out of product spec
Nek-12 58ea35a
docs: narrow sidebar plan scope
Nek-12 95786b0
docs: restore project sidebar ownership
Nek-12 c3200ad
docs: refetch project owners after deletion
Nek-12 8a0ec61
feat: add sidebar task navigation stack
Nek-12 23408e1
fix: correct sidebar project and dependency navigation
Nek-12 7bab83f
fix: centralize sidebar project error code
Nek-12 402f04e
fix: strengthen sidebar destination equality coverage
Nek-12 51d3393
fix: restore sidebar destination contracts
Nek-12 41537eb
chore: merge main into sidebar stack
Nek-12 f365d8f
fix: preserve sidebar destination completion
Nek-12 ca8baeb
chore: merge current main into sidebar stack
Nek-12 5ea3067
fix: centralize missing task classification
Nek-12 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
There are no files selected for viewing
Large diffs are not rendered by default.
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
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
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,61 @@ | ||
| import { createBrowserNativeBridge } from "@app/native-bridge"; | ||
| import { QueryClient, QueryObserver } from "@tanstack/react-query"; | ||
| import { renderHook } from "@testing-library/react"; | ||
| import { createElement, type ReactNode } from "react"; | ||
|
|
||
| import { isProjectMissingError, RpcError } from "@/api"; | ||
| import { createTestServices, TestAppProviders } from "@/test-support/app-services"; | ||
| import { | ||
| invalidateProjectDeleteQueries, | ||
| useProjectDeletedEvents, | ||
| } from "./projectDeletionEvents"; | ||
| import { queryKeys } from "./queryKeys"; | ||
|
|
||
| describe("Project deletion owner refresh", () => { | ||
| it.each([ | ||
| ["Project Edit", queryKeys.projectEdit("project-1")], | ||
| ["New Task", queryKeys.workspaces("project-1")], | ||
| ["Link Workflow", queryKeys.projectWorkflowLinks("project-1")], | ||
| ["Project Workflow Editor", queryKeys.projectWorkflowLinks("project-1")], | ||
| ])("drives the native deletion event through a second %s owner read", async (_name, queryKey) => { | ||
| const bridge = createBrowserNativeBridge(); | ||
| const services = createTestServices([], bridge); | ||
| const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); | ||
| let requests = 0; | ||
| const observer = new QueryObserver(queryClient, { | ||
| queryFn: async () => { | ||
| requests += 1; | ||
| if (requests === 1) return { request: requests }; | ||
| throw new RpcError({ | ||
| code: -32000, | ||
| data: { reason: "project_not_found" }, | ||
| message: "missing", | ||
| method: "owner.read", | ||
| }); | ||
| }, | ||
| queryKey, | ||
| }); | ||
| const unsubscribe = observer.subscribe(() => undefined); | ||
| await observer.refetch(); | ||
| let refresh: Promise<void> | undefined; | ||
| const handler = vi.fn(() => { | ||
| refresh = invalidateProjectDeleteQueries(queryClient, "project-1"); | ||
| }); | ||
| const wrapper = ({ children }: Readonly<{ children: ReactNode }>) => | ||
| createElement(TestAppProviders, { children, services }); | ||
| const view = renderHook(() => { | ||
| useProjectDeletedEvents(bridge, handler); | ||
| }, { wrapper }); | ||
| await Promise.resolve(); | ||
|
|
||
| await bridge.projectDeletion.notifyDeleted({ projectID: "project-1" }); | ||
| await refresh; | ||
|
|
||
| expect(handler).toHaveBeenCalledOnce(); | ||
| expect(requests).toBe(2); | ||
| expect(isProjectMissingError(observer.getCurrentResult().error)).toBe(true); | ||
| view.unmount(); | ||
| unsubscribe(); | ||
| queryClient.clear(); | ||
| }); | ||
| }); |
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
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.