Skip to content

refactor: remove ExtJS completely — SolidJS SPA only#470

Merged
CybotTM merged 5 commits into
mainfrom
refactor/remove-extjs
Jun 30, 2026
Merged

refactor: remove ExtJS completely — SolidJS SPA only#470
CybotTM merged 5 commits into
mainfrom
refactor/remove-extjs

Conversation

@CybotTM

@CybotTM CybotTM commented Jun 30, 2026

Copy link
Copy Markdown
Member

What

Removes the legacy ExtJS UI completely — the app is now the SolidJS SPA under /ui only. Split into reviewable commits (single PR):

  1. refactor(ui): redirect / to the SPA worklog, drop the ExtJS nav link/ (route _start) now 302-redirects to /ui/tracking, so every go-home flow (login success, OAuth callback, 403 page, Jira macro) funnels to the SPA. Drops the "Time tracking" nav link (Worklog is now the time-tracking entry) and the ExtJS-only /getProjectStructure endpoint.
  2. refactor(ui): drop legacyUrl and the last-view strangler crutch — removes the ExtJS↔SPA last-view restore machinery and the legacyUrl config (Help links /api.yml directly).
  3. chore: delete ExtJS source, built assets, and the dead base layout — deletes assets/ (ExtJS SDK + widgets + Stimulus + encore entry), templates/index.html.twig, the orphaned templates/base.html.twig, the ExtJS bits under public/build/ (selective — keeps build/css/header.css + the logos), and ProjectRepository::getProjectStructure. The 403 page no longer pulls ExtJS CSS. (~4,200 files / ~84 MB.)
  4. build: remove the webpack-encore toolchain — drops symfony/webpack-encore-bundle, the entire webpack/babel/stimulus/sass npm toolchain, webpack.config.js, config/packages/{dev,test}/webpack_encore.yaml, WebpackEncoreBundle, and npm ci --legacy-peer-deps (no peer conflicts left). Root npm deps are now just Playwright + axe (e2e).
  5. test(e2e): rewrite the suite for the SolidJS-only app — rebases e2e onto the SPA: login()/ui/tracking, waitForGrid()→the SolidJS grid; deletes the pure-ExtJS grid specs (covered by worklog-crud/worklog-grid-editing); rewrites navigation.spec for SPA nav/modals; prunes the dead ExtJS test helpers.

Verification (local)

  • PHP unit 1590✓, PHPStan✓, php-cs-fixer✓, Twig lint✓ (enforced by the pre-commit hook on every commit).
  • Frontend typecheck✓ / lint✓ / test 329✓ / Vite build✓.
  • E2E: 85 passed, 0 failed against the live e2e stack (1 pre-existing worklog-grid contention flake passes on retry).
  • Functional/controller/integration PHP tests need the CI test DB and run there (the index controller tests were updated to assert the redirect).

Notes

  • prod/:production behaviour is unchanged except / now redirects to /ui/tracking. The default landing for an authenticated user is the Worklog.
  • "Blocked upgrades": the encore removal unblocks dropping the legacy npm toolchain (done) and --legacy-peer-deps (done). No composer upgrades were specifically blocked by ExtJS/encore — the available updates are routine Symfony 8.1.0→8.1.1 patches, left to the normal Dependabot flow (no version bumps in a feature PR).
  • config/reference.php (auto-generated) is intentionally left untouched; it regenerates on a future full run.

CybotTM added 5 commits June 30, 2026 10:05
The root route (_start) now 302-redirects into the SolidJS SPA at /ui/tracking
instead of rendering the ExtJS shell — so every go-home flow (login success,
OAuth callback, the 403 page, the Jira macro) funnels to the new UI. Remove the
legacy 'Time tracking' nav link (desktop + drawer); 'Worklog' is now the
time-tracking entry. Drop the ExtJS-only /getProjectStructure endpoint (it only
fed the old shell's globalThis.projectsData). Update the index controller tests
to assert the redirect.

Signed-off-by: Sebastian Mendel <github@sebastianmendel.de>
With / now redirecting straight to the SPA worklog, the ExtJS<->SPA last-view
memory (restore-on-login) is obsolete: delete the last-view.html.twig partial,
its login 'mark' + SPA 'consume' includes, the header's tt:lastView write, and
the SPA's mirror write in App.tsx. Remove the legacyUrl AppConfig field (it only
fed Help's API-spec link) — Help now links /api.yml directly; drop it from the
SPA shell config and the test fixtures.

Signed-off-by: Sebastian Mendel <github@sebastianmendel.de>
Removes the entire legacy ExtJS UI now that / serves the SolidJS SPA:
- assets/ (ExtJS SDK + netresearch widgets/stores/models, encore app entry,
  Stimulus bootstrap, ExtJS icon/style sources)
- templates/index.html.twig (ExtJS shell) and templates/base.html.twig
  (orphaned encore layout — nothing extended it)
- public/build ExtJS artifacts: js/ (ext-js + netresearch), the encore app/
  runtime/chunk bundles, entrypoints.json + manifest.json, css/app.* and the
  ExtJS-only timetracker.css, and the ExtJS grid icons. Kept: build/css/header.css
  (SPA shell) and the logos.
- ProjectRepository::getProjectStructure (+ its private helpers) — only the
  removed ExtJS endpoint/shell consumed the project-tree structure.
- error403.html.twig no longer pulls ext-all-gray.css / timetracker.css; its
  own inline styles render the page.

Signed-off-by: Sebastian Mendel <github@sebastianmendel.de>
ExtJS was the only consumer of the encore build (retired in #431, now deleted).
Remove the toolchain entirely:
- composer: drop symfony/webpack-encore-bundle (require-dev) + Flex unconfigure
- npm: package.json down to Playwright + axe (e2e only); drop webpack, encore,
  babel, stimulus, sass, core-js, regenerator; regenerate package-lock
- delete webpack.config.js and config/packages/{dev,test}/webpack_encore.yaml
- remove WebpackEncoreBundle from bundles.php
- Dockerfile: drop 'npm ci --legacy-peer-deps' (no encore peer conflicts left)
- restore the /node_modules + /public/build-ui gitignores as standalone entries

Signed-off-by: Sebastian Mendel <github@sebastianmendel.de>
The ExtJS shell is gone, so the e2e suite is rebased onto the SPA:
- login() lands on /ui/tracking (was /); waitForGrid() targets the SolidJS
  worklog grid (table.tracking-table) instead of .x-grid
- delete the pure-ExtJS grid specs entries.spec + entry-operations.spec (the
  SPA grid is covered by worklog-crud + worklog-grid-editing)
- rewrite navigation.spec for SPA header nav / modals (drop ExtJS tab-bar,
  grid-column, sorting and last-view tests)
- drop the legacy 'Time tracking' link test; point settings/export login
  helpers + effectiveness tests at the SPA worklog grid; remove the
  show_empty_line effectiveness test (no SPA grid effect)
- prune the now-dead ExtJS helpers from helpers/grid.ts + helpers/navigation.ts
Validated against the e2e stack: 85 passed, 0 failed.

Signed-off-by: Sebastian Mendel <github@sebastianmendel.de>
Copilot AI review requested due to automatic review settings June 30, 2026 09:18
@sonarqubecloud

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request removes the legacy Webpack Encore toolchain along with a large volume of unused Ext JS 4.1 SDK files, assets, and configurations. The root Node dependencies are simplified to only include Playwright and Axe for end-to-end testing, which allows for the removal of the --legacy-peer-deps workaround in the Dockerfile. As there are no review comments provided, I have no feedback to evaluate.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@codecov

codecov Bot commented Jun 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 84.00%. Comparing base (89ef111) to head (ab5f224).

Additional details and impacted files
@@             Coverage Diff              @@
##               main     #470      +/-   ##
============================================
- Coverage     84.17%   84.00%   -0.18%     
+ Complexity     2848     2829      -19     
============================================
  Files           190      189       -1     
  Lines          7710     7615      -95     
============================================
- Hits           6490     6397      -93     
+ Misses         1220     1218       -2     
Flag Coverage Δ
integration 52.38% <ø> (-0.70%) ⬇️
unit 49.88% <ø> (+0.61%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@CybotTM CybotTM merged commit e0c714a into main Jun 30, 2026
26 of 27 checks passed
@CybotTM CybotTM deleted the refactor/remove-extjs branch June 30, 2026 10:30
CybotTM added a commit that referenced this pull request Jul 2, 2026
…ide with screenshots, ADR record, agent rules (#494)

## Summary

Full documentation overhaul: a verified-facts rewrite of the guides, a
new illustrated user guide, a corrected ADR record, refreshed agent
rules, an extended in-app Help page, and a full-structure README.

A 5-domain audit against the actual code found that, beyond routine
drift, several large docs (DEPLOYMENT_GUIDE, CODE_EXAMPLES,
TROUBLESHOOTING, configuration, development, testing, and ADRs 003–013)
described **infrastructure this application never had** — Redis layers,
JWT auth, `/api/v1`, ParaTest/Panther suites, ~50 invented env vars and
`app:*` console commands. Everything replaced here was re-derived from
`Makefile`, `composer.json`, `compose.yml`, `.env*`, `config/`, `src/`
and the real CI workflows; every command, route, env var and version in
the new docs was verified to exist.

## What's in here

- **New [user guide](docs/user-guide.md)** covering every feature, with
20 English 1440px screenshots — including the QoL features (dark mode,
compact density, left/right sidebar navigation, Alt shortcut badges);
[features.md](docs/features.md) and [FAQ.md](docs/FAQ.md) rewritten for
the current SolidJS UI
- **README expanded to a full project page**: TOC, About, grouped
features, screenshot gallery, first-login credentials for the dev stack,
key-config table, mermaid architecture diagram,
Usage/Testing/Deployment/Contributing/Security sections
- **Developer guides rewritten** ([development](docs/development.md),
[configuration](docs/configuration.md), [testing](docs/testing.md)) —
~5,300 lines of fiction replaced by ~1,300 verified lines; configuration
now documents the real ticket-system admin fields (SERVER OAuth 1.0a vs
CLOUD OAuth 2.0) and internal-Jira ticket mirroring
- **Ops docs rewritten** ([deployment](docs/DEPLOYMENT_GUIDE.md),
[troubleshooting](docs/TROUBLESHOOTING.md)) from `compose.yml` /
`docker-bake.hcl` / the publish workflow
- **ADR record corrected**: index now lists all 17 ADRs; dated *reality
notes* on ADRs whose bodies describe never-built infrastructure (bodies
kept as history); new
[ADR-015](docs/adr/ADR-015-php-8-5-symfony-8-upgrade.md) (PHP
8.5/Symfony 8), [ADR-016](docs/adr/ADR-016-solidjs-frontend-rewrite.md)
(ExtJS→SolidJS, #470/#490),
[ADR-017](docs/adr/ADR-017-jira-cloud-oauth2.md) (dual-mode Jira auth,
#416)
- **API/internals references** (api.md, DTO/EVENT/REPOSITORY docs)
aligned with the code — all 65 endpoint headings now map to real routes
- **AGENTS.md**: drift fixed (PHPStan 10, PER-CS), new scoped files for
`frontend/` and `e2e/`, `CLAUDE.md` symlinks restored at all five levels
- **In-app Help** (`/ui/help`): new "The pages" section (EN+DE) and a
link to the user guide — lint/typecheck/346 Vitest tests green
- **CONTRIBUTING**: the enforced-but-undocumented DCO sign-off
requirement is now documented
- **Removed**: `README.rst` (stale duplicate), `TASKS.md` (abandoned
2025 notes), `docs/CODE_EXAMPLES.md` (68 KB of examples for services
that never existed); all references updated

## Review

Copilot raised 2 inline comments (PER-CS leftover in src/AGENTS.md,
404ing v4_EOL release link) — both fixed in 41fee70, threads replied to
and resolved. Gemini reviewed with no findings.

## Verification

- Every documented `make`/`composer`/`bin/console` command checked
against `Makefile`, `composer.json` scripts and `src/Command/`
- All relative links and image references across 58 markdown files
resolve
- ADR PR/commit references verified via GitHub (#416, #470, #490)
- Frontend change: `bun run lint`, `bun run typecheck`, `bun run test`
(346 passing), page visually verified in the running e2e stack
- Host unit suite green (1557 tests) via the CaptainHook pre-commit gate
on every commit

## Follow-ups (out of scope, found during verification)

- `docker/nginx/default.conf` forwards to `phpfpm:9000` but the prod
compose service is named `app` — the deployment guide documents the
alias workaround; compose.yml should probably gain a `phpfpm` network
alias
- The admin Users form still offers a `CTL` user type
(`frontend/src/admin/entities.ts`) that `UserType::from()` rejects
- Jira Cloud OAuth 2.0: data model + admin form exist (#416), but the
runtime 3LO flow is not implemented yet (`JiraAuthenticationService` is
OAuth1-only) — ADR-017 records this honestly
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants