Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
4425981
chore(ui): migrate toolchain to pnpm + oxlint/oxfmt (SEP migration Ph…
Jul 1, 2026
1bd6495
feat(ui): React 19 / RR7 / Vite 8 / Vitest 4 / TS 6 (SEP migration Ph…
Jul 1, 2026
e430d3d
feat(ui): bring in @sep/{api,shared,framework} with tests (SEP migrat…
Jul 1, 2026
c711ca9
feat(ui): mount snippets + mysql_backups as native routes (SEP migrat…
Jul 1, 2026
eabef01
Sync post-migration SEP frontend features into PMM
Jul 7, 2026
78d7429
feat: use PageContainer from @percona/percona-ui for page width
Jul 13, 2026
7b88ca2
Sync SEP-1555 + SEP-1556 frontend changes into migrated PMM apps
Jul 13, 2026
a61777b
feat(ui): gate SEP nav apps behind admin + settings in inventory section
Jul 13, 2026
079b63b
fix(ui): pass routeBase to mysql_backups plugin so Restore tab resolves
Jul 14, 2026
5e90798
PMM-15216: chore: update @percona/percona-ui to version 1.0.24 and ad…
Jul 15, 2026
a2453ce
PMM-15216 fix ui build: bootstrap pnpm via corepack, drop yarn leftover
Jul 16, 2026
03d5f02
PMM-15216 fix ui build: install pnpm in rpmbuild images
cursoragent Jul 16, 2026
c2c84db
Merge branch 'main' into PMM-15216
cursoragent Jul 16, 2026
f4248ea
fix(ui): pass initial value to useRef in InstallClientPage
cursoragent Jul 16, 2026
6905c60
style(ui): oxfmt Settings.tsx after main merge
cursoragent Jul 16, 2026
627550c
feat(pmm-ui): replace Snippets app with Collect Diagnostic Data (dipper)
Jul 16, 2026
22e0824
Merge branch 'main' into PMM-15216
Jul 18, 2026
418d104
fix(pmm-ui): migrate ATW (Collect Diagnostic Data) instead of dipper
Jul 18, 2026
0047157
PMM-15216: fix linter formatting
Jul 20, 2026
3869d15
Merge branch 'main' into PMM-15216
Jul 20, 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
7 changes: 4 additions & 3 deletions .devcontainer/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,15 @@ def install_go():


def install_node():
"""Installs Node.js 22 and Yarn."""
"""Installs Node.js 22 and pnpm (via corepack)."""

run_commands([
"dnf module enable -y nodejs:22",
"dnf install -y nodejs npm",
"npm install -g yarn@1.22.22",
"corepack enable",
"corepack prepare pnpm@11.1.3 --activate",
"node --version",
"yarn --version",
"pnpm --version",
])


Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/ui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,15 @@ jobs:
- name: Check out code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

- name: Enable corepack
run: corepack enable

- name: Setup nodejs
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version-file: ui/.nvmrc
cache: yarn
cache-dependency-path: ui/yarn.lock
cache: pnpm
cache-dependency-path: ui/pnpm-lock.yaml

- name: Check formatting
run: make format-check
Expand Down
6 changes: 3 additions & 3 deletions Makefile.devcontainer
Original file line number Diff line number Diff line change
Expand Up @@ -62,17 +62,17 @@ run: run-all ## Aliased to "run-all"
echo "run is aliased to run-all"

ui-setup: ## Install UI dependencies
cd ui && yarn install
cd ui && pnpm install

run-ui: ui-setup setup-livereload ## Start vite dev server for UI with HMR
mv /srv/grafana/plugins/pmm-compat-app /srv/grafana/plugins/pmm-compat-app.bak; \
ln -sfn $(CURDIR)/ui/apps/pmm-compat/dist /srv/grafana/plugins/pmm-compat-app; \
supervisorctl restart grafana; \
trap 'rm -f /srv/grafana/plugins/pmm-compat-app; mv /srv/grafana/plugins/pmm-compat-app.bak /srv/grafana/plugins/pmm-compat-app; supervisorctl restart grafana' EXIT; \
cd ui && yarn dev
cd ui && pnpm dev

build-ui: ui-setup ## Build UI and deploy to system dirs
cd ui && yarn build
cd ui && pnpm build
rm -rf /usr/share/pmm-ui
cp -r ui/apps/pmm/dist /usr/share/pmm-ui
rm -rf /usr/share/percona-dashboards/panels/pmm-compat-app /srv/grafana/plugins/pmm-compat-app
Expand Down
3 changes: 3 additions & 0 deletions build/docker/rpmbuild/Dockerfile.el8
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ RUN dnf update -y && \
dnf install -y --enablerepo=ol8_codeready_builder glibc-static && \
dnf clean all && rm -rf /var/cache/dnf

# UI build uses pnpm (packageManager in ui/package.json); nodesource nodejs ships npm/yarn only.
RUN npm install -g pnpm@11.1.3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to pass ppm version during docker build (read from some file in repo)? It will simplify the maintenance in future (less files are required to be changed during version bump).


# Copy Go from official golang image to avoid QEMU extraction issues
COPY --from=golang /usr/local/go /usr/local/go

Expand Down
3 changes: 3 additions & 0 deletions build/docker/rpmbuild/Dockerfile.el9
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ RUN dnf update -y && \
dnf install -y --enablerepo=ol9_codeready_builder glibc-static && \
dnf clean all && rm -rf /var/cache/dnf

# UI build uses pnpm (packageManager in ui/package.json); nodesource nodejs ships npm/yarn only.
RUN npm install -g pnpm@11.1.3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the same as above


# Copy Go from official golang image to avoid QEMU extraction issues
COPY --from=golang /usr/local/go /usr/local/go

Expand Down
3 changes: 3 additions & 0 deletions build/docker/rpmbuild/Dockerfile.hetzner-el9
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ RUN dnf update -y && \
dnf install -y --enablerepo=crb glibc-static && \
dnf clean all && rm -rf /var/cache/dnf

# UI build uses pnpm (packageManager in ui/package.json); nodesource nodejs ships npm/yarn only.
RUN npm install -g pnpm@11.1.3

# Configure EPEL to use European mirror
RUN sed -i 's|metalink=|#metalink=|g' /etc/yum.repos.d/epel*.repo && \
sed -i 's|#baseurl=.*|baseurl=https://ftp.fau.de/epel/9/Everything/$basearch/|g' /etc/yum.repos.d/epel.repo || true
Expand Down
18 changes: 18 additions & 0 deletions ui/.oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"singleQuote": true,
"trailingComma": "es5",
"tabWidth": 2,
"semi": true,
"printWidth": 80,
"bracketSpacing": true,
"arrowParens": "always",
"endOfLine": "lf",
"ignorePatterns": [
"dist",
"node_modules",
"pnpm-lock.yaml",
"storybook-static",
"**/.config/**"
]
}
21 changes: 13 additions & 8 deletions ui/Makefile
Original file line number Diff line number Diff line change
@@ -1,27 +1,32 @@
dev:
yarn dev
pnpm dev

ci: setup format-check lint test build

format: setup
yarn format
pnpm format

format-check: setup
yarn format:check
pnpm format:check

lint: setup
yarn lint
pnpm lint

test: setup
yarn test
pnpm test

setup:
yarn install
# Prefer corepack (honors packageManager pin). Fall back to a global npm
# install so feature builds work against the current rpmbuild image, which
# ships nodejs+yarn but not pnpm until rpmbuild:3 is republished.
corepack enable pnpm || sudo corepack enable pnpm || true
command -v pnpm >/dev/null 2>&1 || sudo npm install -g pnpm@11.1.3
pnpm install

build: setup
yarn build
pnpm build

release: build

clean:
yarn clean
pnpm clean
5 changes: 0 additions & 5 deletions ui/apps/pmm-compat/.config/webpack/webpack.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
*/

import CopyWebpackPlugin from 'copy-webpack-plugin';
import ESLintPlugin from 'eslint-webpack-plugin';
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin';
import path from 'path';
import ReplaceInFileWebpackPlugin from 'replace-in-file-webpack-plugin';
Expand Down Expand Up @@ -247,10 +246,6 @@ const config = async (env): Promise<Configuration> => {
},
typescript: { configFile: path.join(process.cwd(), 'tsconfig.json') },
}),
new ESLintPlugin({
extensions: ['.ts', '.tsx'],
lintDirtyModulesOnly: Boolean(env.development), // don't lint on start, only lint changed files
}),
]
: []),
],
Expand Down
3 changes: 0 additions & 3 deletions ui/apps/pmm-compat/.eslintrc

This file was deleted.

4 changes: 0 additions & 4 deletions ui/apps/pmm-compat/.prettierrc.js

This file was deleted.

48 changes: 20 additions & 28 deletions ui/apps/pmm-compat/package.json
Original file line number Diff line number Diff line change
@@ -1,51 +1,55 @@
{
"name": "pmm-compat",
"version": "1.0.0",
"license": "AGPL-3.0-only",
"author": "Percona LLC",
"scripts": {
"build": "webpack -c ./webpack.config.ts --env production",
"dev": "webpack -w -c ./webpack.config.ts --env development",
"test:watch": "jest --watch --onlyChanged",
"test": "jest --passWithNoTests --maxWorkers 4",
"typecheck": "tsc --noEmit",
"lint": "eslint --cache --ignore-path ./.gitignore --ext .js,.jsx,.ts,.tsx .",
"lint:fix": "yarn run lint --fix && prettier --write --list-different .",
"check-types": "tsc --noEmit",
"lint": "oxlint --config ../../oxlintrc.json src",
"lint:fix": "oxlint --config ../../oxlintrc.json --fix src && oxfmt --write src",
"format": "oxfmt --write src",
"e2e": "playwright test",
"sign": "npx --yes @grafana/sign-plugin@latest",
"clean": "rm -rf dist"
},
"author": "Percona LLC",
"license": "AGPL-3.0-only",
"dependencies": {
"@emotion/css": "11.10.6",
"@grafana/data": "12.4.2",
"@grafana/runtime": "12.4.2",
"@grafana/schema": "12.4.2",
"@grafana/ui": "12.4.2",
"@pmm/shared": "workspace:*",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.30.2",
"rxjs": "7.8.1"
},
"devDependencies": {
"@grafana/eslint-config": "^8.0.0",
"@grafana/plugin-e2e": "^1.17.1",
"@grafana/tsconfig": "^2.0.0",
"@stylistic/eslint-plugin-ts": "^2.9.0",
"@swc/core": "^1.3.90",
"@swc/helpers": "^0.5.0",
"@swc/jest": "^0.2.26",
"@testing-library/jest-dom": "6.1.4",
"@testing-library/react": "14.0.0",
"@types/jest": "^29.5.0",
"@types/node": "^20.8.7",
"@types/react": "^18.3.0",
"@types/react-dom": "^18.3.0",
"@types/testing-library__jest-dom": "5.14.8",
"@typescript-eslint/eslint-plugin": "^6.18.0",
"@typescript-eslint/parser": "^6.18.0",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.7.3",
"eslint": "^8.0.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-deprecation": "^2.0.0",
"eslint-plugin-jsdoc": "^46.8.0",
"eslint-plugin-react": "^7.33.0",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-webpack-plugin": "^4.0.1",
"fork-ts-checker-webpack-plugin": "^8.0.0",
"glob": "^10.5.0",
"identity-obj-proxy": "3.0.0",
"imports-loader": "^5.0.0",
"jest": "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"prettier": "^2.8.7",
"replace-in-file-webpack-plugin": "^1.0.6",
"sass": "1.63.2",
"sass-loader": "13.3.1",
Expand All @@ -64,17 +68,5 @@
},
"engines": {
"node": ">=18"
},
"dependencies": {
"@emotion/css": "11.10.6",
"@grafana/data": "12.4.2",
"@grafana/runtime": "12.4.2",
"@grafana/schema": "12.4.2",
"@grafana/ui": "12.4.2",
"@pmm/shared": "*",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.30.2",
"rxjs": "7.8.1"
}
}
5 changes: 4 additions & 1 deletion ui/apps/pmm-compat/src/compat.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ describe('compat', () => {
const replaceMock = jest.fn();
const originalLocation = window.location;

const setLocation = (search: string, pathname = '/graph/d/some-dashboard') => {
const setLocation = (
search: string,
pathname = '/graph/d/some-dashboard'
) => {
Object.defineProperty(window, 'location', {
value: {
...originalLocation,
Expand Down
Loading
Loading