Skip to content

Commit 109aeca

Browse files
authored
fix(explore): Always render column for incomplete equations (#94918)
When there are incomplete equations, we should still render a placeholder column for it to avoid the situation where the column appears/disappears based on the equation being complete or not.
1 parent 4ad0029 commit 109aeca

File tree

6 files changed

+37
-41
lines changed

6 files changed

+37
-41
lines changed

static/app/views/explore/multiQueryMode/queryVisualizations/table.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ function AggregatesTable({
191191
<TableBodyCell key={j}>
192192
<MultiQueryFieldRenderer
193193
index={index}
194-
column={columns[j]!}
194+
column={columns[j]}
195195
data={row}
196196
unit={meta?.units?.[field]}
197197
meta={meta}
@@ -298,7 +298,7 @@ function SpansTable({spansTableResult, query: queryParts, index}: SampleTablePro
298298
<TableBodyCell key={j}>
299299
<MultiQueryFieldRenderer
300300
index={index}
301-
column={columnsFromEventView[j]!}
301+
column={columnsFromEventView[j]}
302302
data={row}
303303
unit={meta?.units?.[field]}
304304
meta={meta}

static/app/views/explore/tables/aggregateColumnEditorModal.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,7 @@ export function AggregateColumnEditorModal({
7979
}, [columns]);
8080

8181
const handleApply = useCallback(() => {
82-
onColumnsChange(
83-
tempColumns
84-
.filter(col => {
85-
if (isVisualize(col)) {
86-
return col.isValid();
87-
}
88-
return true;
89-
})
90-
.map(col => (isVisualize(col) ? col.toJSON() : col))
91-
);
82+
onColumnsChange(tempColumns.map(col => (isVisualize(col) ? col.toJSON() : col)));
9283
closeModal();
9384
}, [closeModal, onColumnsChange, tempColumns]);
9485

static/app/views/explore/tables/aggregatesTable.tsx

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -103,23 +103,14 @@ export function AggregatesTable({aggregatesTableResult}: AggregatesTableProps) {
103103
);
104104

105105
const columns = useMemo(() => {
106-
const cols = eventView.getColumns().reduce(
106+
return eventView.getColumns().reduce(
107107
(acc, col) => {
108108
acc[col.key] = col;
109109
return acc;
110110
},
111111
{} as Record<string, TableColumn<string>>
112112
);
113-
114-
return visibleAggregateFields
115-
.map(aggregateField => {
116-
const key = isGroupBy(aggregateField)
117-
? aggregateField.groupBy
118-
: aggregateField.yAxis;
119-
return cols[key];
120-
})
121-
.filter(defined);
122-
}, [visibleAggregateFields, eventView]);
113+
}, [eventView]);
123114

124115
return (
125116
<Fragment>
@@ -129,21 +120,25 @@ export function AggregatesTable({aggregatesTableResult}: AggregatesTableProps) {
129120
<TableHeadCell isFirst={false}>
130121
<TableHeadCellContent />
131122
</TableHeadCell>
132-
{columns.map((column, i) => {
123+
{visibleAggregateFields.map((aggregateField, i) => {
133124
// Hide column names before alignment is determined
134125
if (result.isPending) {
135126
return <TableHeadCell key={i} isFirst={i === 0} />;
136127
}
137128

138-
const fieldType = meta.fields?.[column.key];
139-
const align = fieldAlignment(column.key, fieldType);
140-
const label = prettifyField(column.key, stringTags, numberTags);
129+
const field = isGroupBy(aggregateField)
130+
? aggregateField.groupBy
131+
: aggregateField.yAxis;
132+
133+
const fieldType = meta.fields?.[field];
134+
const align = fieldAlignment(field, fieldType);
135+
const label = prettifyField(field, stringTags, numberTags);
141136

142-
const direction = sorts.find(s => s.field === column.key)?.kind;
137+
const direction = sorts.find(s => s.field === field)?.kind;
143138

144139
function updateSort() {
145140
const kind = direction === 'desc' ? 'asc' : 'desc';
146-
setSorts([{field: column.key, kind}]);
141+
setSorts([{field, kind}]);
147142
}
148143

149144
return (
@@ -165,7 +160,7 @@ export function AggregatesTable({aggregatesTableResult}: AggregatesTableProps) {
165160
/>
166161
)}
167162
</TableHeadCellContent>
168-
{i !== columns.length - 1 && (
163+
{i !== visibleAggregateFields.length - 1 && (
169164
<GridResizer
170165
dataRows={
171166
!result.isError && !result.isPending && result.data
@@ -213,13 +208,17 @@ export function AggregatesTable({aggregatesTableResult}: AggregatesTableProps) {
213208
</StyledLink>
214209
</Tooltip>
215210
</TableBodyCell>
216-
{columns.map((column, j) => {
211+
{visibleAggregateFields.map((aggregateField, j) => {
212+
const field = isGroupBy(aggregateField)
213+
? aggregateField.groupBy
214+
: aggregateField.yAxis;
215+
217216
return (
218217
<TableBodyCell key={j}>
219218
<FieldRenderer
220-
column={column}
219+
column={columns[field]}
221220
data={row}
222-
unit={meta?.units?.[column.key]}
221+
unit={meta?.units?.[field]}
223222
meta={meta}
224223
/>
225224
</TableBodyCell>

static/app/views/explore/tables/fieldRenderer.spec.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ describe('FieldRenderer tests', function () {
4646
it('renders span.op', function () {
4747
render(
4848
<FieldRenderer
49-
column={eventView.getColumns()[3]!}
49+
column={eventView.getColumns()[3]}
5050
data={mockedEventData}
5151
meta={{}}
5252
/>,
@@ -59,7 +59,7 @@ describe('FieldRenderer tests', function () {
5959
it('renders span id link to traceview', function () {
6060
render(
6161
<FieldRenderer
62-
column={eventView.getColumns()[0]!}
62+
column={eventView.getColumns()[0]}
6363
data={mockedEventData}
6464
meta={{}}
6565
/>,
@@ -76,7 +76,7 @@ describe('FieldRenderer tests', function () {
7676
it('renders transaction id link to traceview', function () {
7777
render(
7878
<FieldRenderer
79-
column={eventView.getColumns()[4]!}
79+
column={eventView.getColumns()[4]}
8080
data={mockedEventData}
8181
meta={{}}
8282
/>,
@@ -93,7 +93,7 @@ describe('FieldRenderer tests', function () {
9393
it('renders trace id link to traceview', function () {
9494
render(
9595
<FieldRenderer
96-
column={eventView.getColumns()[2]!}
96+
column={eventView.getColumns()[2]}
9797
data={mockedEventData}
9898
meta={{}}
9999
/>,
@@ -110,7 +110,7 @@ describe('FieldRenderer tests', function () {
110110
it('renders timestamp', function () {
111111
render(
112112
<FieldRenderer
113-
column={eventView.getColumns()[1]!}
113+
column={eventView.getColumns()[1]}
114114
data={mockedEventData}
115115
meta={{}}
116116
/>,

static/app/views/explore/tables/fieldRenderer.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import ExternalLink from 'sentry/components/links/externalLink';
99
import TimeSince from 'sentry/components/timeSince';
1010
import {space} from 'sentry/styles/space';
1111
import type {Project} from 'sentry/types/project';
12+
import {defined} from 'sentry/utils';
1213
import type {TableDataRow} from 'sentry/utils/discover/discoverQuery';
1314
import type {EventData, MetaType} from 'sentry/utils/discover/eventView';
1415
import EventView from 'sentry/utils/discover/eventView';
@@ -37,9 +38,9 @@ import {TraceViewSources} from 'sentry/views/performance/newTraceDetails/traceHe
3738
import {getTraceDetailsUrl} from 'sentry/views/performance/traceDetails/utils';
3839

3940
interface FieldProps {
40-
column: TableColumn<keyof TableDataRow>;
4141
data: EventData;
4242
meta: MetaType;
43+
column?: TableColumn<keyof TableDataRow>;
4344
unit?: string;
4445
}
4546

@@ -104,7 +105,6 @@ function BaseExploreFieldRenderer({
104105
const theme = useTheme();
105106
const dateSelection = EventView.fromLocation(location).normalizeDateSelection(location);
106107
const query = new MutableSearch(userQuery);
107-
const field = String(column.key);
108108
const {projects} = useProjects();
109109
const projectsMap = useMemo(() => {
110110
return projects.reduce(
@@ -116,6 +116,12 @@ function BaseExploreFieldRenderer({
116116
);
117117
}, [projects]);
118118

119+
if (!defined(column)) {
120+
return nullableValue(null);
121+
}
122+
123+
const field = String(column.key);
124+
119125
const renderer = getExploreFieldRenderer(field, meta, projectsMap);
120126

121127
let rendered = renderer(data, {

static/app/views/explore/tables/spansTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ export function SpansTable({spansTableResult}: SpansTableProps) {
142142
return (
143143
<TableBodyCell key={j}>
144144
<FieldRenderer
145-
column={columnsFromEventView[j]!}
145+
column={columnsFromEventView[j]}
146146
data={row}
147147
unit={meta?.units?.[field]}
148148
meta={meta}

0 commit comments

Comments
 (0)