Skip to content

Commit 60b4e8e

Browse files
committed
fix: Persist timeseries sub display type selection from editor
1 parent e87660a commit 60b4e8e

5 files changed

Lines changed: 55 additions & 2 deletions

File tree

‎packages/app/src/components/DBEditTimeChartForm/ChartPreviewPanel.tsx‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ type ChartPreviewPanelProps = {
179179
/** Required dashboard filters with nothing selected that block this tile. */
180180
missingRequiredFilterNames?: string[];
181181
setValue: (name: 'orderBy', value: string) => void;
182+
setDisplayType: (displayType: DisplayType) => void;
182183
onSubmit: () => void;
183184
};
184185

@@ -197,6 +198,7 @@ export function ChartPreviewPanel({
197198
dbTimeChartConfig,
198199
missingRequiredFilterNames,
199200
setValue,
201+
setDisplayType,
200202
onSubmit,
201203
}: ChartPreviewPanelProps) {
202204
const [isSampleEventsOpen, setIsSampleEventsOpen] = useState(false);
@@ -305,6 +307,7 @@ export function ChartPreviewPanel({
305307
<DBTimeChart
306308
sourceId={sourceId}
307309
config={dbTimeChartConfig}
310+
setDisplayType={setDisplayType}
308311
onTimeRangeSelect={onTimeRangeSelect}
309312
referenceLines={
310313
alert &&

‎packages/app/src/components/DBEditTimeChartForm/EditTimeChartForm.tsx‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { isReducibleRangeQuery } from '@hyperdx/common-utils/dist/core/promql';
1515
import {
1616
displayTypeSupportsBuilderAlerts,
1717
displayTypeSupportsRawSqlAlerts,
18+
isTimeSeriesDisplayType,
1819
} from '@hyperdx/common-utils/dist/core/utils';
1920
import {
2021
displayTypeRequiresSource,
@@ -1168,8 +1169,16 @@ export default function EditTimeChartForm({
11681169
name="displayType"
11691170
render={({ field: { onChange, value } }) => (
11701171
<Tabs
1171-
value={value}
1172-
onChange={onChange}
1172+
// Stacked variants are picked from the preview's display
1173+
// switcher and live under the Time Series tab.
1174+
value={
1175+
isTimeSeriesDisplayType(value) ? DisplayType.Line : value
1176+
}
1177+
onChange={v => {
1178+
if (v === DisplayType.Line && isTimeSeriesDisplayType(value))
1179+
return;
1180+
onChange(v);
1181+
}}
11731182
radius={'xs'}
11741183
mb="md"
11751184
data-testid="chart-type-input"
@@ -1352,6 +1361,7 @@ export default function EditTimeChartForm({
13521361
previewDashboardFilters?.missingRequiredFilterNames
13531362
}
13541363
setValue={(name, value) => setValue(name, value)}
1364+
setDisplayType={type => setValue('displayType', type)}
13551365
onSubmit={onSubmit}
13561366
/>
13571367
<SaveToDashboardModal

‎packages/app/src/components/DBEditTimeChartForm/__tests__/ChartPreviewPanel.test.tsx‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ const renderPanel = (
114114
showSampleEvents={false}
115115
showGeneratedPromql={false}
116116
setValue={jest.fn()}
117+
setDisplayType={jest.fn()}
117118
onSubmit={jest.fn()}
118119
{...overrides}
119120
/>,

‎packages/app/tests/e2e/components/ChartEditorComponent.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,6 +1255,11 @@ export class ChartEditorComponent {
12551255
await this.applyDisplaySettings();
12561256
}
12571257

1258+
/** Switch line / stacked bar / stacked line from the preview's toolbar. */
1259+
async setPreviewDisplayType(type: 'line' | 'stacked_bar' | 'stacked_line') {
1260+
await this.editorForm().getByTestId(`display-switcher-${type}`).click();
1261+
}
1262+
12581263
/** A "Line interpolation" option's (visually hidden) radio in the open drawer. */
12591264
lineInterpolationOption(mode: 'Smooth' | 'Linear' | 'Step'): Locator {
12601265
return this.page

‎packages/app/tests/e2e/features/line-interpolation.spec.ts‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,38 @@ test.describe('Line interpolation', { tag: ['@dashboard'] }, () => {
4343
await expect(editor.lineInterpolationOption('Step')).toBeChecked();
4444
});
4545
});
46+
47+
test('stacked line picked in the editor saves and defaults to linear', async ({
48+
page,
49+
}) => {
50+
const dashboardPage = new DashboardPage(page);
51+
const editor = dashboardPage.chartEditor;
52+
53+
await dashboardPage.goto();
54+
await dashboardPage.createNewDashboard();
55+
await dashboardPage.addTile();
56+
await expect(editor.nameInput).toBeVisible();
57+
await editor.waitForDataToLoad();
58+
await editor.setChartName('Stacked line tile');
59+
await editor.setPreviewDisplayType('stacked_line');
60+
61+
await editor.openDisplaySettings();
62+
await expect(editor.lineInterpolationOption('Linear')).toBeChecked();
63+
await editor.applyDisplaySettings();
64+
65+
await editor.save();
66+
await expect(dashboardPage.getTiles()).toHaveCount(1, { timeout: 10000 });
67+
await expect(
68+
dashboardPage
69+
.getTiles()
70+
.first()
71+
.getByTestId('display-switcher-stacked_line'),
72+
).toHaveAttribute('data-active', 'true');
73+
74+
await dashboardPage.editTile(0);
75+
await expect(editor.nameInput).toBeVisible();
76+
await editor.setPreviewDisplayType('stacked_bar');
77+
await editor.openDisplaySettings();
78+
await expect(page.getByTestId('line-interpolation-control')).toBeHidden();
79+
});
4680
});

0 commit comments

Comments
 (0)