Repository navigation
Commit e6e0907
authored
feat(app): close search & session drawers on outside click (#2682)
## Why
When a detail drawer is open on the **Search** page, clicking outside of the logs table should dismiss it. Same for the session drawer on the **Sessions** page. Previously these drawers only closed via the X button, Esc, or breadcrumb navigation.
These drawers are Mantine `Drawer`s rendered with `withOverlay={false}` (so the page stays interactive behind them), which means there is no overlay to catch outside clicks — hence Mantine's built-in `closeOnClickOutside` does nothing.
## What
Added a small reusable hook, `useCloseOnClickOutside`, and wired it into the row-table / session detail drawers. It's **on by default** (opt out with `closeOnClickOutside={false}`).
- **Search**: `DBSqlRowTableWithSidebar` (row detail drawer) and `DirectTraceSidePanel`. Keep-open zone = the results panel (`[data-testid="search-results-panel"]`).
- **Sessions**: `SessionSidePanel`. Keep-open zone = the session list (`[data-testid="session-card-list"]`). Gated to the root view (`!selectedEvent`), mirroring the existing Esc behavior so deep in-panel navigation isn't skipped.
- **Default keep-open zone**: `DBSqlRowTableWithSidebar` defaults its keep-open zone to its own results table (`[data-testid="search-results-table"]`), so every consumer gets clean row-switching without a page needing to opt in.
### Behavior
- Clicking a different row/session switches the panel.
- Clicking inside the drawer or any popup it spawns (Select dropdown, date picker, nested modal) keeps it open — the hook treats Mantine floating layers (`role="dialog"`/`tooltip`/`listbox`/`menu`, dropdown classes, overlays) as "inside", which is what makes it robust against portaled content.
- Clicking anywhere else on the page (search bar, filters, chart, empty space) closes it.
### Reuse safety
`DBSqlRowTableWithSidebar` / `DBRowSidePanel` are reused in several places. The other consumers (`PodDetailsSidePanel`, `PatternSidePanel`, K8s node/namespace/pod detail panels) render them inside their own Mantine `Drawer` (`role="dialog"`), so the floating-layer exemption neutralizes the behavior there — clicks inside the parent drawer count as "inside". Dashboards render the table directly, where click-outside-to-close is the desired behavior and the default table keep-open zone prevents any close/reopen jank.
### Note / possible follow-up
On Search, "outside of the logs table" is taken fairly literally: the keep-open zone is the results panel (table + find-in-page), so clicking the histogram/stats above it also closes the drawer. If we'd rather keep it open across the whole results area, that's a one-line change to which element carries the `data-testid`.
## Testing
- New unit test `useCloseOnClickOutside.test.tsx` (4 cases) — passing.
- Existing `SessionSidePanel`, `DirectTraceSidePanel`, `DBSearchPage.directTrace`, and `DBRowSidePanel` suites — passing (30 tests across 7 suites).
- Lint clean on changed files; changeset included.
Made with [Cursor](https://cursor.com)1 parent de2c8a0 commit e6e0907
9 files changed
Lines changed: 253 additions & 2 deletions
File tree
- .changeset
- packages/app/src
- components
- Search
- hooks
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
202 | 202 | | |
203 | 203 | | |
204 | 204 | | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
205 | 211 | | |
206 | 212 | | |
207 | 213 | | |
| |||
2297 | 2303 | | |
2298 | 2304 | | |
2299 | 2305 | | |
| 2306 | + | |
2300 | 2307 | | |
2301 | 2308 | | |
2302 | 2309 | | |
| |||
2613 | 2620 | | |
2614 | 2621 | | |
2615 | 2622 | | |
2616 | | - | |
| 2623 | + | |
| 2624 | + | |
| 2625 | + | |
| 2626 | + | |
| 2627 | + | |
| 2628 | + | |
2617 | 2629 | | |
2618 | 2630 | | |
2619 | 2631 | | |
| |||
2622 | 2634 | | |
2623 | 2635 | | |
2624 | 2636 | | |
| 2637 | + | |
| 2638 | + | |
| 2639 | + | |
2625 | 2640 | | |
2626 | 2641 | | |
2627 | 2642 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| 40 | + | |
40 | 41 | | |
41 | 42 | | |
42 | 43 | | |
| |||
79 | 80 | | |
80 | 81 | | |
81 | 82 | | |
| 83 | + | |
| 84 | + | |
82 | 85 | | |
83 | 86 | | |
84 | 87 | | |
| |||
90 | 93 | | |
91 | 94 | | |
92 | 95 | | |
| 96 | + | |
| 97 | + | |
93 | 98 | | |
94 | 99 | | |
95 | 100 | | |
| |||
146 | 151 | | |
147 | 152 | | |
148 | 153 | | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
149 | 162 | | |
150 | 163 | | |
151 | 164 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
215 | 215 | | |
216 | 216 | | |
217 | 217 | | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
218 | 222 | | |
219 | 223 | | |
220 | 224 | | |
| |||
382 | 386 | | |
383 | 387 | | |
384 | 388 | | |
| 389 | + | |
385 | 390 | | |
386 | 391 | | |
387 | 392 | | |
| |||
474 | 479 | | |
475 | 480 | | |
476 | 481 | | |
477 | | - | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
478 | 486 | | |
479 | 487 | | |
480 | 488 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| 38 | + | |
38 | 39 | | |
39 | 40 | | |
40 | 41 | | |
| |||
201 | 202 | | |
202 | 203 | | |
203 | 204 | | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
204 | 209 | | |
205 | 210 | | |
206 | 211 | | |
| |||
1067 | 1072 | | |
1068 | 1073 | | |
1069 | 1074 | | |
| 1075 | + | |
| 1076 | + | |
1070 | 1077 | | |
1071 | 1078 | | |
1072 | 1079 | | |
| |||
1093 | 1100 | | |
1094 | 1101 | | |
1095 | 1102 | | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + | |
| 1108 | + | |
| 1109 | + | |
| 1110 | + | |
| 1111 | + | |
| 1112 | + | |
| 1113 | + | |
| 1114 | + | |
| 1115 | + | |
| 1116 | + | |
1096 | 1117 | | |
1097 | 1118 | | |
1098 | 1119 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
49 | 53 | | |
50 | 54 | | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
51 | 59 | | |
52 | 60 | | |
53 | 61 | | |
| |||
67 | 75 | | |
68 | 76 | | |
69 | 77 | | |
| 78 | + | |
| 79 | + | |
70 | 80 | | |
71 | 81 | | |
72 | 82 | | |
| |||
111 | 121 | | |
112 | 122 | | |
113 | 123 | | |
| 124 | + | |
| 125 | + | |
114 | 126 | | |
115 | 127 | | |
116 | 128 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
| |||
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| 21 | + | |
| 22 | + | |
20 | 23 | | |
21 | 24 | | |
22 | 25 | | |
| |||
27 | 30 | | |
28 | 31 | | |
29 | 32 | | |
| 33 | + | |
| 34 | + | |
30 | 35 | | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
31 | 42 | | |
32 | 43 | | |
33 | 44 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
0 commit comments