Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
621b8e6
Scaffold Vue frontend (migration phase 0)
lyubov-voloshko Oct 15, 2026
fe70464
Vue frontend phase 1: SiteNova design system and foundations
lyubov-voloshko Oct 21, 2026
60af426
Vue frontend phase 2: field widget system
lyubov-voloshko Oct 21, 2026
32297e5
Vue frontend phase 3: feature pages
lyubov-voloshko Oct 22, 2026
c07e807
Fix Vue header tab alignment and navigation
lyubov-voloshko Oct 29, 2026
2489b3c
Fix menu triggers with click listeners and the /api dev proxy
lyubov-voloshko Oct 29, 2026
261cdd8
Add Playwright end-to-end tests for the Vue frontend
lyubov-voloshko Oct 29, 2026
b0929c2
Polish Vue filter dialogs and modal close button
lyubov-voloshko Oct 30, 2026
9221fa6
Tidy Vue record preview foreign keys and related records
lyubov-voloshko Oct 30, 2026
b51acc5
Move Vue row edit related records into a side panel
lyubov-voloshko Oct 30, 2026
d40c126
Ignore stale table loads after switching Vue connections
lyubov-voloshko Oct 30, 2026
50aeb1a
Let the Vue table header wrap its actions before the search
lyubov-voloshko Oct 30, 2026
294e7ad
Match the Vue row edit skeleton to the page and hide its footer
lyubov-voloshko Oct 30, 2026
486186a
Fix the Vue automation WHEN badge contrast and action method width
lyubov-voloshko Nov 2, 2026
3d5f764
Pin Vue settings save bars to the page bottom and hide the footer
lyubov-voloshko Nov 2, 2026
32bdd0a
Move the Vue table AI insights button to the end of the header actions
lyubov-voloshko Nov 2, 2026
c4df71d
Center the Vue dashboards and profile sidebar icons when collapsed
lyubov-voloshko Nov 2, 2026
5c02222
Add a dark theme to the Vue frontend
lyubov-voloshko Nov 2, 2026
faab8dc
Check Vue route parity with Angular and add a FRONTEND build arg
lyubov-voloshko Nov 3, 2026
1912bf8
Serve the Vue build's hashed files like Angular's under nginx
lyubov-voloshko Nov 3, 2026
ea226c9
Build the Vue frontend into the Docker images by default
lyubov-voloshko Nov 3, 2026
35760c9
Remove the Angular frontend and move the Vue app to frontend/
lyubov-voloshko Nov 3, 2026
d4c730f
Merge main into vue-migration
lyubov-voloshko Nov 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
49 changes: 35 additions & 14 deletions .github/workflows/frontend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,35 +22,56 @@ defaults:
run:
working-directory: frontend

# TODO: add a lint job once ESLint migration replaces the (already-removed in
# @angular-devkit/build-angular v20) `tslint` builder that `yarn lint` calls.

jobs:
test:
check:
runs-on: ubuntu-latest
timeout-minutes: 20
container:
image: mcr.microsoft.com/playwright:v1.58.1-noble
permissions:
contents: read
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: pnpm/action-setup@v4
with:
package_json_file: frontend/package.json
- uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'yarn'
cache-dependency-path: frontend/yarn.lock
- run: yarn install --immutable
- name: Run unit tests
run: yarn test:ci
cache: 'pnpm'
cache-dependency-path: frontend/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
- name: Lint
run: pnpm lint
- name: Typecheck
run: pnpm typecheck
- name: Unit tests
run: pnpm test:ci
- name: Build (self-hosted)
run: pnpm build
- name: Build (SaaS)
run: pnpm build:saas
- name: Build Storybook
run: pnpm build-storybook

license:
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: pnpm/action-setup@v4
with:
package_json_file: frontend/package.json
- uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'yarn'
cache-dependency-path: frontend/yarn.lock
cache: 'pnpm'
cache-dependency-path: frontend/pnpm-lock.yaml
- run: pnpm install --frozen-lockfile
# OFL-1.1: the Geist and Space Grotesk fonts (@fontsource-variable/*).
- name: license checker
run: 'npx --yes license-checker --onlyAllow="MIT;ISC;Python-2.0;Apache-2.0;BSD;MPL;CC;Custom: http://github.com/dscape/statsd-parser;" --excludePrivatePackages'
run: 'npx --yes license-checker --onlyAllow="MIT;ISC;Python-2.0;Apache-2.0;BSD;MPL;CC;OFL-1.1;Custom: http://github.com/dscape/statsd-parser;" --excludePrivatePackages'
11 changes: 7 additions & 4 deletions .github/workflows/storybook.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
package_json_file: frontend/package.json
- uses: actions/setup-node@v4
with:
node-version: '24'
cache: yarn
cache-dependency-path: frontend/yarn.lock
- run: cd frontend && yarn install --frozen-lockfile
- run: cd frontend && yarn storybook:build
cache: pnpm
cache-dependency-path: frontend/pnpm-lock.yaml
- run: cd frontend && pnpm install --frozen-lockfile
- run: cd frontend && pnpm build-storybook
- uses: actions/upload-pages-artifact@v3
with:
path: frontend/storybook-static
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@
/out-tsc
# Only exists if Bazel was run
/bazel-out
/frontend/dist
/frontend/coverage

# dependencies
/node_modules
/frontend/node_modules
.yarn/

# yarn berry cache (not tracked at repo root)
Expand Down
29 changes: 16 additions & 13 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
RocketAdmin is a database administration panel that allows users to manage database connections, tables, and data. It consists of multiple components in a monorepo structure:

- **backend/** - NestJS API server (TypeScript, ES modules)
- **frontend/** - Angular 19 web application (standalone components)
- **frontend/** - Vue 3 web application (Vite, Pinia, vue-router)
- **rocketadmin-agent/** - NestJS agent for connecting to databases behind firewalls
- **autoadmin-ws-server/** - WebSocket server for agent communication
- **shared-code/** - Shared data access layer and utilities used by backend and agent
Expand All @@ -30,11 +30,13 @@ pnpm test-saas # Run SaaS-specific tests

```bash
cd frontend
yarn start # Start Angular dev server
yarn build # Production build
yarn test:ci # Run tests headlessly (CI mode)
yarn test --browsers=ChromeHeadlessCustom --no-watch --no-progress # Headless tests
yarn lint # TSLint (deprecated, needs ESLint migration)
pnpm install # Installed on its own, not as a workspace member
pnpm dev # Start Vite dev server (proxies /api)
pnpm build # Production build (pnpm build:saas for SaaS)
pnpm lint # biome + eslint-plugin-vue
pnpm typecheck # vue-tsc
pnpm test:ci # Vitest (unit and component tests)
pnpm test:e2e # Playwright against a mocked API
```

### Running Backend Tests with Docker
Expand Down Expand Up @@ -84,7 +86,7 @@ pnpm migration:revert # Revert last migration

- Uses pnpm workspaces with packages: `backend`, `rocketadmin-agent`, `shared-code`
- `shared-code` is imported as `@rocketadmin/shared-code` workspace dependency
- Frontend is a separate Angular project (not a workspace member)
- Frontend is a separate pnpm project with its own lockfile (not a workspace member)

### Backend (NestJS)

Expand All @@ -102,15 +104,16 @@ pnpm migration:revert # Revert last migration
- `saas-tests/` - SaaS-specific feature tests
- `complex-table-tests/` - Complex table operation tests

### Frontend (Angular 19)
### Frontend (Vue 3)

See `frontend/CLAUDE.md` for detailed frontend architecture.
See `frontend/CLAUDE.md` for detailed frontend architecture and conventions.

Key points:
- Standalone components (no NgModules)
- BehaviorSubject-based state management (no NgRx)
- Multi-environment builds (development, production, saas, saas-production)
- Jasmine/Karma testing with ChromeHeadless
- `<script setup lang="ts">` components, Composition API, composables for shared logic
- Pinia setup stores; TanStack Vue Query for cached server data
- UI primitives in `src/components/ui/` (SiteNova design system); colours only via `--color-*` variables, BEM class names
- Multi-environment builds via Vite modes (development, production, saas, saas-production)
- Vitest + @vue/test-utils for unit tests, Playwright for e2e

### Shared Code

Expand Down
29 changes: 16 additions & 13 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
RocketAdmin is a database administration panel that allows users to manage database connections, tables, and data. It consists of multiple components in a monorepo structure:

- **backend/** - NestJS API server (TypeScript, ES modules)
- **frontend/** - Angular 19 web application (standalone components)
- **frontend/** - Vue 3 web application (Vite, Pinia, vue-router)
- **rocketadmin-agent/** - NestJS agent for connecting to databases behind firewalls
- **autoadmin-ws-server/** - WebSocket server for agent communication
- **shared-code/** - Shared data access layer and utilities used by backend and agent
Expand All @@ -30,11 +30,13 @@ pnpm test-saas # Run SaaS-specific tests

```bash
cd frontend
yarn start # Start Angular dev server
yarn build # Production build
yarn test:ci # Run tests headlessly (CI mode)
yarn test --browsers=ChromeHeadlessCustom --no-watch --no-progress # Headless tests
yarn lint # TSLint (deprecated, needs ESLint migration)
pnpm install # Installed on its own, not as a workspace member
pnpm dev # Start Vite dev server (proxies /api)
pnpm build # Production build (pnpm build:saas for SaaS)
pnpm lint # biome + eslint-plugin-vue
pnpm typecheck # vue-tsc
pnpm test:ci # Vitest (unit and component tests)
pnpm test:e2e # Playwright against a mocked API
```

### Running Backend Tests with Docker
Expand Down Expand Up @@ -84,7 +86,7 @@ pnpm migration:revert # Revert last migration

- Uses pnpm workspaces with packages: `backend`, `rocketadmin-agent`, `shared-code`
- `shared-code` is imported as `@rocketadmin/shared-code` workspace dependency
- Frontend is a separate Angular project (not a workspace member)
- Frontend is a separate pnpm project with its own lockfile (not a workspace member)

### Backend (NestJS)

Expand All @@ -102,15 +104,16 @@ pnpm migration:revert # Revert last migration
- `saas-tests/` - SaaS-specific feature tests
- `complex-table-tests/` - Complex table operation tests

### Frontend (Angular 19)
### Frontend (Vue 3)

See `frontend/CLAUDE.md` for detailed frontend architecture.
See `frontend/CLAUDE.md` for detailed frontend architecture and conventions.

Key points:
- Standalone components (no NgModules)
- BehaviorSubject-based state management (no NgRx)
- Multi-environment builds (development, production, saas, saas-production)
- Jasmine/Karma testing with ChromeHeadless
- `<script setup lang="ts">` components, Composition API, composables for shared logic
- Pinia setup stores; TanStack Vue Query for cached server data
- UI primitives in `src/components/ui/` (SiteNova design system); colours only via `--color-*` variables, BEM class names
- Multi-environment builds via Vite modes (development, production, saas, saas-production)
- Vitest + @vue/test-utils for unit tests, Playwright for e2e

### Shared Code

Expand Down
24 changes: 10 additions & 14 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,23 @@ FROM node:24.22.1-slim AS front_builder
ARG VERSION
ARG SAAS
SHELL ["/bin/bash", "-c"]
RUN npm install -g pnpm@10.33.0
WORKDIR /app/frontend
COPY frontend/package.json frontend/yarn.lock frontend/.yarnrc.yml frontend/angular.json frontend/browserslist frontend/tsconfig.app.json frontend/tsconfig.json /app/frontend/
COPY frontend/.yarn /app/frontend/.yarn
RUN apt-get update && apt-get install -y \
git \
&& rm -rf /var/lib/apt/lists/*
RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --immutable --network-timeout 1000000 --silent
COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml /app/frontend/
RUN --mount=type=cache,target=/root/.local/share/pnpm/store pnpm install --frozen-lockfile
COPY frontend/.env frontend/.env.production frontend/.env.saas-production frontend/index.html frontend/index.saas.html frontend/vite.config.ts frontend/tsconfig.json frontend/tsconfig.app.json frontend/tsconfig.node.json /app/frontend/
COPY frontend/scripts /app/frontend/scripts
COPY frontend/public /app/frontend/public
COPY frontend/src /app/frontend/src

# Update version if VERSION build arg is provided
# Update version if VERSION build arg is provided (the build scripts write src/version.ts)
RUN if [[ -n $VERSION ]]; then \
cd frontend; \
echo "Updating package.json version to $VERSION" && \
npm version $VERSION --no-git-tag-version && \
yarn update-version; \
npm version $VERSION --no-git-tag-version; \
fi

RUN if [[ -n $SAAS ]]; then API_ROOT=/api yarn build --configuration=saas-production; \
else API_ROOT=/api yarn build --configuration=production; fi
RUN ls /app/frontend/dist/rocketadmin/browser
RUN if [[ -n $SAAS ]]; then pnpm build:saas; else pnpm build; fi
RUN ls /app/frontend/dist

FROM node:24.22.1-slim

Expand All @@ -43,7 +39,7 @@ COPY rocketadmin-agent /app/rocketadmin-agent
RUN --mount=type=cache,target=/root/.local/share/pnpm/store pnpm install --frozen-lockfile
RUN cd shared-code && ../node_modules/.bin/tsc
RUN cd backend && ../node_modules/.bin/tsc && pnpm exec nest build
COPY --from=front_builder /app/frontend/dist/rocketadmin/browser /var/www/html
COPY --from=front_builder /app/frontend/dist /var/www/html
COPY frontend/nginx/default.conf /etc/nginx/sites-enabled/default
RUN mkdir -p /app/backend/node_modules/.cache && chown -R appuser:appuser /app/backend/node_modules/.cache
# c8 report dir for `just test-coverage` (the test compose runs this image as appuser)
Expand Down
Loading
Loading