Repository navigation
feat(app): add a row-click preference to expand result rows inline #3117
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
Changes from all commits
6d59684
89e61ab
eae6338
6358e05
8bafede
50a3a00
8667e3a
27143f3
472b3bc
466bca7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| --- | ||
| '@hyperdx/app': minor | ||
| --- | ||
|
|
||
| Add a Preferences → Search results → Row click setting. Leave it at `Open side | ||
| panel` (the default) for the existing behavior, or set it to `Expand inline` to | ||
| have a row click expand the row in place — the chevron's 16px hit target is hard | ||
| to aim at while scanning logs. With inline expansion on, the side panel moves to | ||
| a hover button on the row, stays one click away from an expanded row, and keeps | ||
| receiving row clicks while it is open. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,14 +16,24 @@ import { IconFlask } from '@tabler/icons-react'; | |
| import { OPTIONS_FONTS } from './config/fonts'; | ||
| import { useAppTheme } from './theme/ThemeProvider'; | ||
| import { isValidThemeName, themes } from './theme'; | ||
| import { UserPreferences, useUserPreferences } from './useUserPreferences'; | ||
| import { | ||
| DEFAULT_ROW_CLICK_ACTION, | ||
| RowClickAction, | ||
| UserPreferences, | ||
| useUserPreferences, | ||
| } from './useUserPreferences'; | ||
|
|
||
| const OPTIONS_COLOR_MODE = [ | ||
| { label: 'System', value: 'system' }, | ||
| { label: 'Light', value: 'light' }, | ||
| { label: 'Dark', value: 'dark' }, | ||
| ]; | ||
|
|
||
| const OPTIONS_ROW_CLICK_ACTION: { label: string; value: RowClickAction }[] = [ | ||
| { label: 'Open side panel', value: 'sidePanel' }, | ||
| { label: 'Expand inline', value: 'expand' }, | ||
| ]; | ||
|
|
||
| // Brand theme options (generated from theme registry) | ||
| const OPTIONS_BRAND_THEMES = Object.values(themes).map(t => ({ | ||
| label: t.displayName, | ||
|
|
@@ -108,6 +118,27 @@ export const UserPreferencesModal = ({ | |
| /> | ||
| </SettingContainer> | ||
|
|
||
| <Divider label="Search results" labelPosition="left" mt="sm" /> | ||
| <SettingContainer | ||
| label="Row click" | ||
| description="What clicking a result row does. The chevron always expands inline." | ||
| > | ||
| <Select | ||
| data-testid="row-click-action-select" | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — The new preference control is untested and its The seven new unit tests seed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Right on both counts — the testid was left over from an E2E spec I ended up deleting. Rather than drop it, 85271bb adds
A wrong key or option value now fails rather than passing green, and the testid has a consumer. |
||
| value={userPreferences.rowClickAction ?? DEFAULT_ROW_CLICK_ACTION} | ||
| onChange={value => { | ||
| const option = OPTIONS_ROW_CLICK_ACTION.find( | ||
| o => o.value === value, | ||
| ); | ||
| if (option) { | ||
| setUserPreference({ rowClickAction: option.value }); | ||
| } | ||
| }} | ||
| data={OPTIONS_ROW_CLICK_ACTION} | ||
| allowDeselect={false} | ||
| /> | ||
| </SettingContainer> | ||
|
|
||
| <Divider | ||
| label={ | ||
| <Group align="center" gap="xs"> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| import { Provider } from 'jotai'; | ||
| import { screen } from '@testing-library/react'; | ||
| import userEvent from '@testing-library/user-event'; | ||
|
|
||
| import { UserPreferencesModal } from '@/UserPreferencesModal'; | ||
| import type { UserPreferences } from '@/useUserPreferences'; | ||
|
|
||
| const STORAGE_KEY = 'hdx-user-preferences'; | ||
|
|
||
| const renderModal = (stored?: Partial<UserPreferences>) => { | ||
| window.localStorage.clear(); | ||
| if (stored) { | ||
| window.localStorage.setItem( | ||
| STORAGE_KEY, | ||
| // `colorMode` is what marks stored preferences as already migrated. | ||
| JSON.stringify({ colorMode: 'dark', ...stored }), | ||
| ); | ||
| } | ||
| return renderWithMantine( | ||
| <Provider> | ||
| <UserPreferencesModal opened onClose={() => {}} /> | ||
| </Provider>, | ||
| ); | ||
| }; | ||
|
|
||
| const readStoredPreferences = (): UserPreferences => | ||
| JSON.parse(window.localStorage.getItem(STORAGE_KEY) ?? '{}'); | ||
|
|
||
| describe('UserPreferencesModal', () => { | ||
| describe('Row click', () => { | ||
| it('shows the default action for users with no stored preference', () => { | ||
| renderModal(); | ||
|
|
||
| expect(screen.getByTestId('row-click-action-select')).toHaveValue( | ||
| 'Open side panel', | ||
| ); | ||
| }); | ||
|
|
||
| it('reflects a stored preference', () => { | ||
| renderModal({ rowClickAction: 'expand' }); | ||
|
|
||
| expect(screen.getByTestId('row-click-action-select')).toHaveValue( | ||
| 'Expand inline', | ||
| ); | ||
| }); | ||
|
|
||
| it('stores the selected action', async () => { | ||
| renderModal(); | ||
|
|
||
| await userEvent.click(screen.getByTestId('row-click-action-select')); | ||
| await userEvent.click( | ||
| await screen.findByRole('option', { | ||
| name: 'Expand inline', | ||
| hidden: true, | ||
| }), | ||
| ); | ||
|
|
||
| expect(screen.getByTestId('row-click-action-select')).toHaveValue( | ||
| 'Expand inline', | ||
| ); | ||
| expect(readStoredPreferences().rowClickAction).toBe('expand'); | ||
| }); | ||
| }); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -96,7 +96,10 @@ import { | |
| UNDEFINED_WIDTH, | ||
| } from '@/tableUtils'; | ||
| import { FormatTime } from '@/useFormatTime'; | ||
| import { useUserPreferences } from '@/useUserPreferences'; | ||
| import { | ||
| DEFAULT_ROW_CLICK_ACTION, | ||
| useUserPreferences, | ||
| } from '@/useUserPreferences'; | ||
| import { | ||
| getChartColorInfo, | ||
| getLogLevelClass, | ||
|
|
@@ -385,7 +388,7 @@ export const RawLogTable = memo( | |
| rows: Record<string, any>[]; | ||
| isLoading?: boolean; | ||
| fetchNextPage?: (options?: FetchNextPageOptions | undefined) => any; | ||
| onRowDetailsClick: (row: Record<string, any>) => void; | ||
| onRowDetailsClick?: (row: Record<string, any>) => void; | ||
| generateRowId: (row: Record<string, any>) => RowWhereResult; | ||
| hasNextPage?: boolean; | ||
| highlightedLineId?: string; | ||
|
|
@@ -453,9 +456,25 @@ export const RawLogTable = memo( | |
| ); | ||
|
|
||
| const { | ||
| userPreferences: { isUTC }, | ||
| userPreferences: { isUTC, rowClickAction }, | ||
| } = useUserPreferences(); | ||
|
|
||
| // The ClickHouse dashboard's slow-query list has no side panel to open, so | ||
| // inline expansion is the only thing a row click can do there. | ||
| const canOpenSidePanel = onRowDetailsClick != null; | ||
|
|
||
| // Inline expansion is owned by the expand-button column, so tables that hide | ||
| // it (surrounding context, patterns) always fall back to the side panel. | ||
| const prefersInlineExpand = | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — A preference labelled "Search results" silently changes row-click behavior for every row table in the app
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — A preference labelled "Search results" changes row clicks in every table, including small dashboard tiles
Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Deliberate, and I would rather not scope it to the search page in this PR. The preference is opt-in and off by default, so nothing changes for anyone who does not go looking for it. For someone who does turn it on, "a row click expands the row" reading the same everywhere is the behavior I would expect from a global preference; having it silently revert to the drawer in a dashboard tile is the more surprising outcome. The drawer stays reachable in those tiles through the hover button and the expanded row's maximize button. The tile-height concern is real, but it applies equally to the chevron, which already expands inline in those same tiles today and is unaffected by this preference. If small tiles turn out to be the wrong surface for inline details, the fix belongs with the expand column rather than with this preference. Happy to thread the choice down from |
||
| showExpandButton && | ||
| (!canOpenSidePanel || | ||
| (rowClickAction ?? DEFAULT_ROW_CLICK_ACTION) === 'expand'); | ||
|
|
||
| // Once the side panel is open it stays the active surface, so clicks keep | ||
| // moving it from row to row instead of expanding rows behind it. | ||
| const expandInlineOnRowClick = | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — Opening the side panel strands already-expanded rows: the body button stops collapsing them and drops
|
||
| prefersInlineExpand && (!canOpenSidePanel || highlightedLineId == null); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor —
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Confirmed and fixed in 85271bb. The reachable path is switching source with a row panel open: I fixed it in const sidePanel =
sourceData && (rowSource === sourceId || !rowSource) ? (
<DBRowSidePanel ... />
) : null;
...
{sidePanel}
<DBSqlRowTable highlightedLineId={sidePanel ? (rowId ?? undefined) : undefined} ... />This keeps
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — "Side panel is open" is inferred from
Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agreed the derivation is indirect, but leaving it as is — the fix would widen the PR past what it already touches. As you note, Threading an explicit
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — When Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond |
||
|
|
||
| const [columnSizeStorage, setColumnSizeStorage] = useLocalStorage< | ||
| Record<string, number> | ||
| >(`${tableId}-column-sizes`, {}); | ||
|
|
@@ -1195,9 +1214,23 @@ export const RawLogTable = memo( | |
| [styles.isTruncated]: !wrapLinesEnabled, | ||
| })} | ||
| onClick={() => { | ||
| _onRowExpandClick(row.original); | ||
| if (expandInlineOnRowClick) { | ||
| toggleRowExpansion(rowId); | ||
| } else { | ||
| _onRowExpandClick(row.original); | ||
| } | ||
| }} | ||
| aria-label="View details for log entry" | ||
| aria-expanded={ | ||
| expandInlineOnRowClick ? isExpanded : undefined | ||
| } | ||
| // Deliberately distinct from the chevron's "Expand log | ||
| // details" so the two hit targets stay addressable | ||
| // apart in tests and assistive tech. | ||
| aria-label={ | ||
| expandInlineOnRowClick | ||
| ? `${isExpanded ? 'Collapse' : 'Expand'} log row` | ||
| : 'View details for log entry' | ||
| } | ||
| > | ||
| {row | ||
| .getVisibleCells() | ||
|
|
@@ -1265,6 +1298,11 @@ export const RawLogTable = memo( | |
| onToggleWrap={() => | ||
| setWrapLinesEnabled(!wrapLinesEnabled) | ||
| } | ||
| onOpenSidePanel={ | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — Hover "Open in side panel" button stays visible when a row click already opens the panel
Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond |
||
| prefersInlineExpand && canOpenSidePanel | ||
| ? () => _onRowExpandClick(row.original) | ||
| : undefined | ||
| } | ||
| /> | ||
| )} | ||
| </button> | ||
|
|
@@ -1278,6 +1316,7 @@ export const RawLogTable = memo( | |
| virtualKey={virtualRow.key.toString()} | ||
| source={source} | ||
| rowId={rowId} | ||
| canOpenSidePanel={canOpenSidePanel} | ||
| > | ||
| {renderRowDetails?.({ | ||
| id: rowId, | ||
|
|
@@ -1909,7 +1948,9 @@ function DBSqlRowTableComponent({ | |
| fetchNextPage={fetchNextPage} | ||
| // onPropertySearchClick={onPropertySearchClick} | ||
| hasNextPage={hasNextPage} | ||
| onRowDetailsClick={_onRowDetailsClick} | ||
| // Passed through conditionally so tables with no side panel (the | ||
| // ClickHouse dashboard's slow-query list) don't offer to open one. | ||
| onRowDetailsClick={onRowDetailsClick ? _onRowDetailsClick : undefined} | ||
| onScroll={onScroll} | ||
| generateRowId={getRowWhere} | ||
| isError={isError} | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -120,23 +120,30 @@ export default function DBSqlRowTableWithSideBar({ | |
| [sourceData], | ||
| ); | ||
|
|
||
| // `rowWhere`/`rowSource` survive a source switch, so a stale `rowWhere` can | ||
| // outlive the panel it belongs to. Deriving the table's highlight from this | ||
| // element keeps it from highlighting a row — and from treating the panel as | ||
| // open, which suppresses inline expansion — while no panel is mounted. | ||
| const sidePanel = | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — The stale- Nothing covers that a leftover |
||
| sourceData && (rowSource === sourceId || !rowSource) ? ( | ||
| <DBRowSidePanel | ||
| source={sourceData} | ||
| rowId={rowId ?? undefined} | ||
| aliasWith={aliasWith} | ||
| onClose={onCloseSidebar} | ||
| closeOnClickOutside={closeOnClickOutside} | ||
| keepOpenSelector={keepOpenSelector} | ||
| /> | ||
| ) : null; | ||
|
|
||
| return ( | ||
| <RowSidePanelContext value={context ?? {}}> | ||
| {sourceData && (rowSource === sourceId || !rowSource) && ( | ||
| <DBRowSidePanel | ||
| source={sourceData} | ||
| rowId={rowId ?? undefined} | ||
| aliasWith={aliasWith} | ||
| onClose={onCloseSidebar} | ||
| closeOnClickOutside={closeOnClickOutside} | ||
| keepOpenSelector={keepOpenSelector} | ||
| /> | ||
| )} | ||
| {sidePanel} | ||
| <DBSqlRowTable | ||
| config={config} | ||
| sourceId={sourceId} | ||
| onRowDetailsClick={onOpenSidebar} | ||
| highlightedLineId={rowId ?? undefined} | ||
| highlightedLineId={sidePanel ? (rowId ?? undefined) : undefined} | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — The stale- The seven new unit tests all drive
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — The PR's central fix — gating Every new unit test drives Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — The new highlightedLineId derivation has no test; reverting it keeps every test green This is the fix for the stale Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — No test covers the new rule that hides highlightedLineId when the side panel isn't mounted Inline expansion is disabled whenever Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond |
||
| enabled={enabled} | ||
| isLive={isLive ?? true} | ||
| queryKeyPrefix={'dbSqlRowTable'} | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,11 @@ | ||
| import React, { useState } from 'react'; | ||
| import { notifications } from '@mantine/notifications'; | ||
| import { IconCopy, IconLink, IconTextWrap } from '@tabler/icons-react'; | ||
| import { | ||
| IconCopy, | ||
| IconLayoutSidebarRightExpand, | ||
| IconLink, | ||
| IconTextWrap, | ||
| } from '@tabler/icons-react'; | ||
|
|
||
| import { RowWhereResult } from '@/hooks/useRowWhere'; | ||
| import { | ||
|
|
@@ -19,6 +24,8 @@ interface DBRowTableRowButtonsProps { | |
| sourceId?: string; | ||
| isWrapped: boolean; | ||
| onToggleWrap: () => void; | ||
| /** Omitted when clicking the row already opens the side panel. */ | ||
| onOpenSidePanel?: () => void; | ||
| } | ||
|
|
||
| const DBRowTableRowButtons: React.FC<DBRowTableRowButtonsProps> = ({ | ||
|
|
@@ -27,6 +34,7 @@ const DBRowTableRowButtons: React.FC<DBRowTableRowButtonsProps> = ({ | |
| sourceId, | ||
| isWrapped, | ||
| onToggleWrap, | ||
| onOpenSidePanel, | ||
| }) => { | ||
| const [isCopied, setIsCopied] = useState(false); | ||
| const [isUrlCopied, setIsUrlCopied] = useState(false); | ||
|
|
@@ -105,6 +113,15 @@ const DBRowTableRowButtons: React.FC<DBRowTableRowButtonsProps> = ({ | |
| > | ||
| <IconLink size={16} /> | ||
| </DBRowTableIconButton> | ||
| {onOpenSidePanel && ( | ||
| <DBRowTableIconButton | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟠 major — The side panel's only remaining direct entry point is unreachable by keyboard and hidden from screen readers
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — The new "Open in side panel" control is not keyboard reachable
Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond |
||
| onClick={onOpenSidePanel} | ||
| variant="copy" | ||
| title="Open in side panel" | ||
| > | ||
| <IconLayoutSidebarRightExpand size={16} /> | ||
| </DBRowTableIconButton> | ||
| )} | ||
|
greptile-apps[bot] marked this conversation as resolved.
Resolved
|
||
| </div> | ||
| ); | ||
| }; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -30,12 +30,15 @@ export const ExpandedLogRow = memo( | |
| virtualKey, | ||
| source, | ||
| rowId, | ||
| canOpenSidePanel, | ||
| }: { | ||
| children: React.ReactNode; | ||
| columnsLength: number; | ||
| virtualKey: string; | ||
| source?: TSource; | ||
| rowId: string; | ||
| /** False on tables that render no side panel, so the URL params go nowhere. */ | ||
| canOpenSidePanel?: boolean; | ||
| }) => { | ||
| const openSidebar = useSidebarOpener(); | ||
|
|
||
|
|
@@ -51,16 +54,16 @@ export const ExpandedLogRow = memo( | |
| <div className={cx('mx-2 mb-2 rounded', styles.expandedRowContent)}> | ||
| <div className="position-relative"> | ||
| <div className="px-3 pt-2 position-relative"> | ||
| {openSidebar && ( | ||
| {canOpenSidePanel && ( | ||
| <button | ||
| type="button" | ||
| className={cx( | ||
| 'position-absolute top-0 end-0 mt-1 me-1 p-1 border-0 bg-transparent text-muted rounded', | ||
| styles.expandButton, | ||
| )} | ||
| onClick={() => openSidebar(rowId, source?.id)} | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — Expanded row's side-panel button drops The diff now offers two routes from a row to the panel: the new hover button goes through Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — Expanded row's 'Open in side panel' skips onOpenSidebar and drops aliasWith, unlike the new hover button The expanded row's button still opens the panel through Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟠 major — The expanded row's 'Open in side panel' button skips aliasWith and live-tail pause that the hover button applies With Nothing blocks merge automatically, but a maintainer will expect this fixed if it is a real defect in code this PR changes. If it is about surrounding code, reply and say so instead of patching. Do not widen the PR. How to respond |
||
| title="Open in sidebar" | ||
| aria-label="Open in sidebar" | ||
| title="Open in side panel" | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔵 minor — Expanded rows still offer "Open in side panel" on tables that have no side panel This PR deliberately hides the row hover button when There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Correct, and fixed in 85271bb. Worth noting this was reachable before this PR too (the chevron already expanded rows on that table), just much harder to stumble into. Extended the no-side-panel unit test to assert the button is absent after expanding, not only before. |
||
| aria-label="Open in side panel" | ||
| style={{ | ||
| zIndex: 1, | ||
| fontSize: '12px', | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔵 minor — Preference is scoped as "Search results" but applies to every row table in the app
rowClickActionis read inRawLogTable, which backs dashboard table tiles (DBDashboardPage.tsx:1390), the Kubernetes pod/node/namespace side panels (PodDetailsSidePanel.tsx:203,NodeDetailsSidePanel.tsx:194,NamespaceDetailsSidePanel.tsx:181), the service-dashboard slowest-events tile and the chart preview panel — all of which are short, fixed-height surfaces where a tall inline expansion is a worse fit than the panel. Either retitle the section to something accurate (e.g. "Result rows") or thread an opt-in prop from the search page so the preference only governs the full-height results table.Advisory. Fix if it is a small defect in code this PR changes; otherwise reply in the thread. Do not widen the PR or touch files it did not already change. How to respond