Skip to content

Commit 07c0dc1

Browse files
committed
Add "Graph interval" label to interval picker
1 parent 6cabfeb commit 07c0dc1

File tree

4 files changed

+60
-22
lines changed

4 files changed

+60
-22
lines changed

assets/js/dashboard/components/segmented-control.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export function SegmentedControl<T extends string>({
2323
<div
2424
role="group"
2525
aria-label={ariaLabel}
26-
className="flex-1 inline-flex items-stretch rounded-lg border border-gray-300 p-0.5 dark:border-gray-600"
26+
className="inline-flex items-stretch rounded-lg border border-gray-300 p-0.5 dark:border-gray-600"
2727
>
2828
{options.map(({ value, label }) => {
2929
const isSelected = value === selected
@@ -38,7 +38,7 @@ export function SegmentedControl<T extends string>({
3838
data-testid={getTestId?.(value, isSelected)}
3939
data-selected={isSelected}
4040
className={classNames(
41-
'flex-1 whitespace-nowrap rounded-md py-1.5 px-2 text-sm font-medium transition-colors',
41+
'flex-1 whitespace-nowrap rounded-md py-1 px-1.5 text-xs font-medium transition-colors',
4242
isSelected
4343
? 'bg-gray-150 text-gray-900 dark:bg-gray-600/80 dark:text-gray-100'
4444
: 'text-gray-500 dark:text-gray-300'

assets/js/dashboard/nav-menu/dashboard-options-menu.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { useDashboardOptionsContext } from '../stats/graph/dashboard-options-con
1212
import { useDashboardStateContext } from '../dashboard-state-context'
1313
import { DashboardPeriod } from '../dashboard-time-periods'
1414
import { IntervalPicker } from '../stats/graph/interval-picker'
15-
import { MenuSeparator } from './nav-menu-components'
1615
import { AppNavigationLink } from '../navigation/use-app-navigate'
1716
import { useSiteContext } from '../site-context'
1817
import * as api from '../api'
@@ -150,15 +149,12 @@ function DashboardOptionsMenuItems() {
150149
)}
151150
>
152151
{showIntervalSection && (
153-
<div className="flex m-1">
154-
<IntervalPicker
155-
selectedInterval={selectedInterval}
156-
onIntervalClick={onIntervalClick}
157-
options={availableIntervals}
158-
/>
159-
</div>
152+
<IntervalPicker
153+
selectedInterval={selectedInterval}
154+
onIntervalClick={onIntervalClick}
155+
options={availableIntervals}
156+
/>
160157
)}
161-
{showIntervalSection && hasActionItems && <MenuSeparator />}
162158
{!isRealtime && <ExportItem selectedInterval={selectedInterval} />}
163159
{importedSwitchVisible && (
164160
<>

assets/js/dashboard/stats/graph/interval-picker.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,17 @@ export function IntervalPicker({
144144
}))
145145

146146
return (
147-
<SegmentedControl
148-
ariaLabel="Graph data interval"
149-
options={controlOptions}
150-
selected={selectedInterval}
151-
onSelect={onIntervalClick}
152-
getTestId={(_value, isSelected) =>
153-
isSelected ? 'current-graph-interval' : 'graph-interval'
154-
}
155-
/>
147+
<div className="flex justify-between items-center gap-x-2 w-full pl-4 pr-2 py-1">
148+
<span className="shrink-0 text-sm font-medium text-gray-700 dark:text-gray-100">Graph interval</span>
149+
<SegmentedControl
150+
ariaLabel="Graph data interval"
151+
options={controlOptions}
152+
selected={selectedInterval}
153+
onSelect={onIntervalClick}
154+
getTestId={(_value, isSelected) =>
155+
isSelected ? 'current-graph-interval' : 'graph-interval'
156+
}
157+
/>
158+
</div>
156159
)
157160
}

e2e/tests/dashboard/filtering.spec.ts

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,8 @@ test.describe('location filtering tests', () => {
569569
name: 'pageview',
570570
country_code: 'EE',
571571
subdivision1_code: 'EE-37',
572-
city_geoname_id: 588_409
572+
city_geoname_id: 588_409,
573+
browser: 'Chrome'
573574
}
574575
]
575576
})
@@ -618,6 +619,18 @@ test.describe('location filtering tests', () => {
618619
await test.step('filtering by city', async () => {
619620
const cityFilterRow = filterRow(page, 'city')
620621
const cityInput = page.getByPlaceholder('Select a City')
622+
const browserFilterRow = filterRow(page, 'browser')
623+
const browserInput = page.getByPlaceholder('Select a Browser', {
624+
exact: true
625+
})
626+
627+
// Add a browser filter so city ends up as the 4th pill. This ensures it overflows
628+
// into "See more" regardless of viewport width.
629+
await filterButton(page).click()
630+
await filterItemButton(page, 'Browser').click()
631+
await browserInput.fill('chrom')
632+
await suggestedItem(browserFilterRow, 'Chrome').click()
633+
await applyFilterButton(page).click()
621634

622635
await filterButton(page).click()
623636
await locationFilterButton(page).click()
@@ -627,6 +640,7 @@ test.describe('location filtering tests', () => {
627640

628641
await applyFilterButton(page).click()
629642

643+
await page.getByRole('button', { name: /See.*more/ }).click()
630644
await expect(
631645
page.getByRole('link', { name: 'City is Tallinn' })
632646
).toBeVisible()
@@ -755,7 +769,9 @@ test.describe('operating system filtering tests', () => {
755769
{
756770
name: 'pageview',
757771
operating_system: 'Windows',
758-
operating_system_version: '11'
772+
operating_system_version: '11',
773+
browser: 'Chrome',
774+
browser_version: '14.0.7'
759775
},
760776
{
761777
name: 'pageview',
@@ -795,6 +811,28 @@ test.describe('operating system filtering tests', () => {
795811
const operatingSystemVersionInput = page.getByPlaceholder(
796812
'Select an Operating system version'
797813
)
814+
const browserFilterRow = filterRow(page, 'browser')
815+
const browserVersionFilterRow = filterRow(page, 'browser_version')
816+
const browserInput = page.getByPlaceholder('Select a Browser', {
817+
exact: true
818+
})
819+
const browserVersionInput = page.getByPlaceholder(
820+
'Select a Browser Version'
821+
)
822+
823+
// Add browser and browser version filters so OS version ends up as the 4th pill.
824+
// This ensures it overflows into "See more" regardless of viewport width
825+
await filterButton(page).click()
826+
await filterItemButton(page, 'Browser').click()
827+
await browserInput.fill('chrom')
828+
await suggestedItem(browserFilterRow, 'Chrome').click()
829+
await applyFilterButton(page).click()
830+
831+
await filterButton(page).click()
832+
await filterItemButton(page, 'Browser').click()
833+
await browserVersionInput.fill('14')
834+
await suggestedItem(browserVersionFilterRow, '14.0.7').click()
835+
await applyFilterButton(page).click()
798836

799837
await filterButton(page).click()
800838
await operatingSystemFilterButton(page).click()
@@ -804,6 +842,7 @@ test.describe('operating system filtering tests', () => {
804842

805843
await applyFilterButton(page).click()
806844

845+
await page.getByRole('button', { name: /See.*more/ }).click()
807846
await expect(
808847
page.getByRole('link', { name: 'Operating system version is 11' })
809848
).toBeVisible()

0 commit comments

Comments
 (0)