Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
2312860
feat(settings): extend types, add updateSettings API and useUpdateSet…
matejkubinec Mar 19, 2026
680823a
feat(settings): add Settings page shell with MUI tabs and placeholder…
matejkubinec Mar 19, 2026
b19e46d
feat(settings): implement SSH Key form with react-hook-form and useUp…
matejkubinec Mar 19, 2026
b6d5923
feat(settings): implement Metrics Resolution form with react-hook-form
matejkubinec Mar 19, 2026
11c2ecf
feat(settings): implement Advanced Settings form with react-hook-form
matejkubinec Mar 19, 2026
a6bba5c
feat(settings): add /settings route, update Configuration menu and PM…
matejkubinec Mar 19, 2026
805e281
fix(settings): resolve useMemo exhaustive-deps lint; add Settings loa…
matejkubinec Mar 19, 2026
261a367
feat: smaller improvements
matejkubinec Mar 19, 2026
614e2c7
fix: tooltips on advanced page
matejkubinec Mar 23, 2026
981e60f
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Mar 23, 2026
7ba6546
feat: update imports, use types files, run formatter
matejkubinec Apr 2, 2026
4af5a59
Merge branch 'v3'
matejkubinec Apr 2, 2026
3b60e9a
PMM-14930 Send updated settings event
matejkubinec Apr 2, 2026
a4f770c
Enhanced layout behaviors to make settings better
freenandes Apr 2, 2026
255cf82
Improved layout in Settings' Metrics Resolution tab
freenandes Apr 3, 2026
638feaf
Enhance Settings UI and improve user experience
freenandes Apr 3, 2026
0be67d2
Fixed surfaces colors and how it's applied to pages
freenandes Apr 3, 2026
67499d2
Refactor Settings test to remove MemoryRouter
freenandes Apr 6, 2026
e7d80da
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 9, 2026
116ee62
PMM-14852 Fix Mongodb InMemory dashboard (#5219)
matejkubinec Apr 9, 2026
2fbf51b
Bump golang.org/x/sys from 0.42.0 to 0.43.0 (#5228)
dependabot[bot] Apr 9, 2026
5d94805
PMM-14944 Upgrade VictoriaMetrics to v1.139.0 (#5218)
ademidoff Apr 9, 2026
8e7d1f1
PMM-14980 Fix the healthcheck (#5227)
ademidoff Apr 9, 2026
d75782a
PMM-14930 Refactor sidebar collapsing
matejkubinec Apr 9, 2026
eb110f2
PMM-14930 Update settings messages
matejkubinec Apr 10, 2026
a3f081a
PMM-14930 Prevent navigation from grafana when on pmm ui page
matejkubinec Apr 10, 2026
31f0792
PMM-14930 Update percona-ui package
matejkubinec Apr 10, 2026
25f9069
PMM-14930 Correctly handle navitem clicks
matejkubinec Apr 10, 2026
626f6eb
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 10, 2026
a2f766b
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 21, 2026
8c4b3f4
PMM-14930 Use form components from percona-ui
matejkubinec Apr 21, 2026
5b9a0df
PMM-14930 Use zod for validation for metrics resolution
matejkubinec Apr 21, 2026
80d2a14
PMM-14930 Use zod for ssh key validation
matejkubinec Apr 21, 2026
a57598c
PMM-14930 Use zod for advanced settings validation
matejkubinec Apr 21, 2026
e54b75c
PMM-14930 Run lint & format
matejkubinec Apr 21, 2026
fe9437a
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 21, 2026
fbc02fd
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 21, 2026
114c6e1
PMM-14930 Refactoring and fixes
matejkubinec Apr 22, 2026
a563172
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 22, 2026
5ab549d
PMM-14930 Revert some changes
matejkubinec Apr 22, 2026
52b638f
PMM-14930 Cleanup settings payload
matejkubinec Apr 22, 2026
02ec8e7
PMM-14930 Use toPayload util function
matejkubinec Apr 22, 2026
4bcec3e
Merge branch 'PMM-14930-settings-page-native-ui' of github.com:percon…
matejkubinec Apr 22, 2026
9be33fb
PMM-14930 Run lint & format
matejkubinec Apr 22, 2026
5ba194d
PMM-14930 Use messages file
matejkubinec Apr 22, 2026
8da647d
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 23, 2026
0bfc549
PMM-14930 Correctly handle settings in readonly
matejkubinec Apr 23, 2026
6fb2eda
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 23, 2026
a106449
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 23, 2026
cfb2516
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 27, 2026
bec3970
PMM-14930 Use constant for feature management fields
matejkubinec Apr 27, 2026
edc2aac
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec Apr 28, 2026
0c51ec0
PMM-7 - PMM's AI-agent documentation housekeeping (#5298)
ondrejpatocka Apr 28, 2026
1fcce44
Merge branch 'v3' of github.com:percona/pmm into PMM-14930-settings-p…
matejkubinec Apr 29, 2026
42760dc
PMM-14930 Use same settings urls as previously
matejkubinec Apr 29, 2026
25fc9c4
PMM-14930 Add fallback for old settings page
matejkubinec Apr 30, 2026
262aef1
PMM-14930 Fix unit test
matejkubinec Apr 30, 2026
bab4ad1
PMM-14930 Improve settings redirection
matejkubinec May 6, 2026
8bea6a8
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec May 6, 2026
6bca417
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec May 6, 2026
86ed3ee
PMM-14995 Update existing PMM branding assets and styles (#5292)
pmcf-percona May 6, 2026
0b434f1
Merge branch 'v3' of github.com:percona/pmm into PMM-14930-settings-p…
matejkubinec May 6, 2026
c395432
PMM-15046 Move NavItem component to percona-ui and fix PMM sidebar in…
freenandes May 6, 2026
73885f9
PMM-14930 Fix redirect without tab info
matejkubinec May 6, 2026
1b0c808
Merge branch 'v3' of github.com:percona/pmm into PMM-14930-settings-p…
matejkubinec May 6, 2026
1e14320
Micro adjustement to a misalignment through padding
freenandes May 7, 2026
ab5da21
Merge branch 'PMM-14930-settings-page-native-ui' into PMM-15046-fix-s…
pmcf-percona May 7, 2026
18ce607
Merge branch 'v3' into PMM-14930-settings-page-native-ui
matejkubinec May 7, 2026
973cdaf
Merge branch 'PMM-14930-settings-page-native-ui' into PMM-15046-fix-s…
pmcf-percona May 7, 2026
a9a66a0
PMM-14930 Add additional data testisds to better match previous setti…
matejkubinec May 11, 2026
856288c
PMM-14930 Better align behaviour with old settings page
matejkubinec May 12, 2026
8eb24b8
Merge branch 'v3' of github.com:percona/pmm into PMM-14930-settings-p…
matejkubinec May 12, 2026
f1d56b0
Minor visual tweak on toggle spacing. Non-breaking
freenandes May 12, 2026
8c75396
Merge branch 'PMM-14930-settings-page-native-ui' into PMM-15046-fix-s…
pmcf-percona May 12, 2026
ec3513f
Merge remote-tracking branch 'origin/v3' into PMM-15046-fix-sidebar-i…
freenandes May 15, 2026
6397edf
PMM-15046 Bump @percona/percona-ui to 1.0.17 for upstream NavItem
freenandes May 15, 2026
16d9b79
PMM-15046 Update SidebarNavItem tests for upstream NavItem contract
freenandes May 15, 2026
ce595bf
Merge branch 'v3' into PMM-15046-fix-sidebar-inconsistencies
pmcf-percona May 15, 2026
77f19a1
Merge branch 'v3' into PMM-15046-fix-sidebar-inconsistencies
pmcf-percona May 18, 2026
bdf97e7
Merge branch 'v3' into PMM-15046-fix-sidebar-inconsistencies
pmcf-percona May 19, 2026
2d823ca
Merge branch 'v3' into PMM-15046-fix-sidebar-inconsistencies
pmcf-percona May 20, 2026
22984f8
Merge branch 'v3' into PMM-15046-fix-sidebar-inconsistencies
pmcf-percona May 21, 2026
f9aa2aa
Merge branch 'v3' into PMM-15046-fix-sidebar-inconsistencies
matejkubinec May 22, 2026
b8719eb
Merge branch 'v3' into PMM-15046-fix-sidebar-inconsistencies
mattiasimonato May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ui/apps/pmm/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"@mui/icons-material": "^7.3.7",
"@mui/material": "^7.3.7",
"@mui/x-date-pickers": "^7.5.0",
"@percona/percona-ui": "1.0.16",
"@percona/percona-ui": "1.0.17",
"@pmm/shared": "*",
"@reactour/tour": "^3.8.0",
"@tanstack/react-query": "^5.45.1",
Expand Down
4 changes: 2 additions & 2 deletions ui/apps/pmm/src/components/sidebar/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { FC, useCallback, useEffect, useState } from 'react';
import { useNavigation } from 'contexts/navigation';
import { NavigationHeading } from './nav-heading';
import { Drawer } from './drawer';
import { NavItem } from './nav-item';
import { SidebarNavItem } from './nav-item';
import List from '@mui/material/List';
import useMediaQuery from '@mui/material/useMediaQuery';
import { useTheme } from '@mui/material/styles';
Expand Down Expand Up @@ -69,7 +69,7 @@ export const Sidebar: FC = () => {
]}
>
{navTree.map((item) => (
<NavItem
<SidebarNavItem
key={item.id}
item={item}
activeItem={activeItem}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import { listItemIconClasses } from '@mui/material/ListItemIcon';
import { listItemTextClasses } from '@mui/material/ListItemText';
import { typographyClasses } from '@mui/material/Typography';
import { Theme } from '@mui/material';

export const getStyles = (
theme: Theme,
active: boolean,
drawerOpen: boolean,
level: number
) => ({
Expand All @@ -16,71 +13,33 @@ export const getStyles = (
? {
mr: level > 0 ? 1 : 0,
}
: {
py: 1.5,
},
: {},
navItemRootCollapsible: {
borderTopLeftRadius: 0,
borderBottomLeftRadius: 0,
},
listItemButton: {
px: 2,
height: 48,
borderRadius: 50,
justifyContent: drawerOpen ? undefined : 'center',

[`.${typographyClasses.root}`]: {
fontWeight: 600,
},

[`&, .${listItemIconClasses.root}`]: {
color: active ? theme.palette.primary.main : theme.palette.text.primary,
},
},
listItemButtonCollapsible: {
backgroundColor: active
? theme.components?.MuiListItemButton?.styleOverrides?.selected
: 'initial',
},
listCollapsible:
level === 0
? {
pl: 4,
pl: 4.75,
pb: 2,
}
: level === 1
? {
ml: 2.5,
pl: '11px',
pb: 2,
ml: 3.5,
pl: 1,
borderLeft: 1,
borderColor: theme.palette.divider,
}
: {},
listItemIcon: {
minWidth: 'auto',
},
listItemDivider: {
px: drawerOpen ? 2 : 1,
},
divider: {
flex: 1,
},
text: {
pl: 2,

[`&:hover .${listItemTextClasses.secondary}`]: {
color: 'inherit',
},

[`.${listItemTextClasses.secondary}`]: {
...theme.typography.helperText,
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
overflow: 'hidden',

color: active ? 'inherit' : theme.palette.text.disabled,
},
listItemButton: {
px: 2,
},
textOnly: {
m: 0,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { wrapWithRouter } from 'utils/testUtils';
import NavItem from './NavItem';
import { NavItemProps } from './NavItem.types';
import SidebarNavItem from './SidebarNavItem';
import { NavItemProps } from './SidebarNavItem.types';
import { NavItem as NavTreeItem } from 'types/navigation.types';
import { collapseClasses } from '@mui/material/Collapse';
import { MemoryRouterProps } from 'react-router-dom';
import { ThemeContextProvider, pmmThemeOptions } from '@percona/percona-ui';

const TEST_NAV_TREE: NavTreeItem = {
id: 'level-0',
Expand Down Expand Up @@ -44,19 +45,21 @@ const renderNavItem = ({
activeItem?: NavTreeItem;
} = {}) =>
render(
wrapWithRouter(
<NavItem
activeItem={activeItem}
item={TEST_NAV_TREE}
drawerOpen={true}
level={0}
{...props}
/>,
routerProps
)
<ThemeContextProvider themeOptions={pmmThemeOptions}>
{wrapWithRouter(
<SidebarNavItem
activeItem={activeItem}
item={TEST_NAV_TREE}
drawerOpen={true}
level={0}
{...props}
/>,
routerProps
)}
</ThemeContextProvider>
);

describe('NavItem', () => {
describe('SidebarNavItem', () => {
it('inner levels are closed by default', () => {
renderNavItem();

Expand Down Expand Up @@ -157,14 +160,14 @@ describe('NavItem', () => {
},
],
};
renderNavItem({
const { container } = renderNavItem({
activeItem: item,
props: { item },
});

fireEvent.click(screen.getByTestId('navitem-with-badge-toggle'));

expect(screen.getByTestId('navitem-dot')).toBeInTheDocument();
expect(container.querySelector('.MuiBadge-dot')).toBeInTheDocument();
});

it('renders divider if item has type "menu-divider"', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,24 @@
import { useLinkWithVariables } from 'hooks/utils/useLinkWithVariables';
import { FC, useCallback, useEffect, useMemo, useState } from 'react';
import { NavItemProps } from './NavItem.types';
import { NavItemProps } from './SidebarNavItem.types';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import { getLinkProps, hasChildMatch, shouldShowBadge } from './NavItem.utils';
import { getStyles } from './NavItem.styles';
import { getLinkProps, hasChildMatch, shouldShowBadge } from './SidebarNavItem.utils';
import { getStyles } from './SidebarNavItem.styles';
import { useTheme } from '@mui/material/styles';
import ListItemButton from '@mui/material/ListItemButton';
import ListItemIcon from '@mui/material/ListItemIcon';
import { NavItem } from '@percona/percona-ui';
import ListItemText from '@mui/material/ListItemText';
import Stack from '@mui/material/Stack';
import ListItem from '@mui/material/ListItem';
import List from '@mui/material/List';
import Collapse from '@mui/material/Collapse';
import Divider from '@mui/material/Divider';
import IconButton from '@mui/material/IconButton';
import Box from '@mui/material/Box';
import NavItemIcon from './nav-item-icon/NavItemIcon';
import NavItemTooltip from './nav-item-tooltip/NavItemTooltip';
import { DRAWER_WIDTH } from '../drawer/Drawer.constants';
import NavItemDot from './nav-item-dot/NavItemDot';
import NavItemBadge from './nav-item-badge/NavItemBadge';

const NavItem: FC<NavItemProps> = ({
const SidebarNavItem: FC<NavItemProps> = ({
activeItem,
item,
drawerOpen,
Expand All @@ -38,7 +35,7 @@ const NavItem: FC<NavItemProps> = ({
);
const linkProps = getLinkProps(item, url);
const theme = useTheme();
const styles = getStyles(theme, active, drawerOpen, level);
const styles = getStyles(theme, drawerOpen, level);
const dataTestid = `navitem-${item.id}`;
const showBadge = shouldShowBadge(item, open);

Expand Down Expand Up @@ -93,38 +90,29 @@ const NavItem: FC<NavItemProps> = ({
alignItems="center"
justifyContent="space-between"
sx={{
width: level === 0 ? DRAWER_WIDTH : undefined,
width: level === 0 ? DRAWER_WIDTH : '100%',
}}
data-testid={dataTestid + '-list-item'}
>
<ListItemButton
color="primary.main"
disableGutters
<NavItem
text={item.text ?? ''}
icon={item.icon ? <NavItemIcon icon={item.icon} /> : undefined}
showDot={showBadge && !!item.icon}
badge={
item.badge && item.badgeAlwaysVisible && drawerOpen
? <NavItemBadge badge={item.badge} />
: undefined
}
selected={active}
sx={[
styles.listItemButton,
level === 0 && styles.navItemRootCollapsible,
!drawerOpen && { justifyContent: 'center' },
]}
{...(linkProps as Omit<typeof linkProps, 'component'> & { component?: React.ElementType })}
onClick={handleOpenCollapsible}
{...linkProps}
data-testid={dataTestid}
data-navlevel={level}
>
{item.icon && (
<NavItemDot show={showBadge}>
<ListItemIcon sx={styles.listItemIcon}>
<NavItemIcon icon={item.icon} />
</ListItemIcon>
</NavItemDot>
)}
<ListItemText
primary={item.text}
className="navitem-primary-text"
sx={styles.text}
/>
{item.badge && item.badgeAlwaysVisible && drawerOpen && (
<NavItemBadge badge={item.badge} />
)}
</ListItemButton>
/>
{drawerOpen && (
<IconButton
data-testid={`${dataTestid}-toggle`}
Expand Down Expand Up @@ -154,7 +142,7 @@ const NavItem: FC<NavItemProps> = ({
>
<List component="div" disablePadding sx={styles.listCollapsible}>
{item.children.map((item) => (
<NavItem
<SidebarNavItem
key={item.id}
item={item}
activeItem={activeItem}
Expand Down Expand Up @@ -212,41 +200,29 @@ const NavItem: FC<NavItemProps> = ({
<ListItem
disablePadding
sx={{
width: level === 0 ? DRAWER_WIDTH : undefined,
width: level === 0 ? DRAWER_WIDTH : '100%',
}}
data-testid={dataTestid + '-list-item'}
>
<ListItemButton
disableGutters
<NavItem
text={item.text ?? ''}
secondaryText={item.secondaryText}
icon={item.icon ? <NavItemIcon icon={item.icon} /> : undefined}
badge={item.badge ? <NavItemBadge badge={item.badge} /> : undefined}
selected={active}
sx={[
styles.listItemButton,
styles.leafItem,
level === 0 && styles.navItemRoot,
!drawerOpen && { justifyContent: 'center' },
]}
selected={active}
{...linkProps}
{...(linkProps as Omit<typeof linkProps, 'component'> & { component?: React.ElementType })}
onClick={handleItemClick}
data-testid={dataTestid}
data-navlevel={level}
>
{item.icon ? (
<ListItemIcon sx={styles.listItemIcon}>
<NavItemIcon icon={item.icon} />
</ListItemIcon>
) : (
<Box sx={{ mr: -1 }} />
)}
<ListItemText
primary={item.text}
secondary={item.secondaryText}
className="navitem-primary-text"
sx={styles.text}
/>
{item.badge && <NavItemBadge badge={item.badge} />}
</ListItemButton>
/>
</ListItem>
</NavItemTooltip>
);
};

export default NavItem;
export default SidebarNavItem;
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export const getLinkProps = (item: NavItem, url?: string) => {

if (item.target && item.url) {
return {
component: 'a',
component: 'a' as const,
target: item.target,
href: url,
};
Expand Down
2 changes: 1 addition & 1 deletion ui/apps/pmm/src/components/sidebar/nav-item/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export { default as NavItem } from './NavItem';
export { default as SidebarNavItem } from './SidebarNavItem';

This file was deleted.

Loading
Loading