* Migrate frontend to TypeScript with Deno-based tooling (#206)
Compiles assets/*.ts via sensiolabs/typescript-bundle (standalone SWC
binary) and adds Deno for formatting, linting, type-checking, and
tests, keeping the project's no-Node/npm approach intact. Wires all
four into CI, the Justfile, and the pre-commit hook.
* fix: build TypeScript assets before running PHPUnit in CI
The tests job ran bin/console sass:build but never typescript:build,
so var/typescript/ didn't exist and any page rendering the importmap
(e.g. backoffice/base.html.twig) errored during tests.
* test: add regression test for backoffice navbar-toggler dead target
Guards against the navbar-toggler button pointing at a collapse
target (#navbarSupportedContent) that isn't rendered for the current
user — the bug hit on the login page before #210 restructured the
nav to always render at least one item (the Releases link) regardless
of auth state.
* fix: stop hand-enumerating TS files for deno check
deno check assets/*.ts assets/controllers/*.ts assets/controllers/bo/*.ts
was duplicated in CI and the Justfile, and silently misses any new
controller subdirectory (fmt/lint/test already recurse assets/ via
deno.json). Add a top-level exclude for assets/vendor/ (respected by
all deno subcommands, unlike the per-task include/exclude blocks) so
deno check assets/ can recurse safely instead.
* fix: GitHubReleasesService date parsing and falsy release name
- Move the release-mapping array_map inside the try block so a
malformed published_at (or any other parse failure) degrades to the
same empty-list fallback as an HTTP failure, instead of throwing
uncaught out of the cache callback.
- Stop treating a release literally named "0" as unnamed — the old
`?:` fallback is falsy for that string and silently substituted the
tag name instead.
- Render release dates in UTC explicitly; Twig's date filter otherwise
silently converts to the app's default timezone (Europe/Amsterdam),
which could show the wrong calendar day for releases near midnight.
* docs: add scope-creep-as-a-service rule to CLAUDE.md
Per user instruction: when a review turns up a real bug outside the
current task's scope, fix it in the same MR (with a regression test)
rather than just reporting it, unless it needs a human design call.
* feat: password reset via symfonycasts/reset-password-bundle (#179)
Implements the full password reset flow using the SymfonyCasts reset-password-bundle.
* ci: share base layer cache between dev and prod builds
* fix: use CSS form selector in tests instead of translated button text
* fix: translate missing validator string for reset password email field
* fix: translate reset password form labels via TranslatorInterface
* ci: override MAILER_DSN to null for PHPUnit so mailer host is not required
* feat: add Sentry User Feedback widget to backoffice (#178)
Install @sentry/browser via AssetMapper and initialize the feedback
integration on all backoffice pages. The CDN loader script is moved to
an overridable block so backoffice pages use the npm SDK without
double-initialising Sentry.
Sentry is initialised only when a DSN is configured (SENTRY_DSN env
var). When a user is logged in their email is pre-filled in the feedback
form via Sentry.setUser(); both name and email remain optional so
anonymous submissions are supported by simply leaving those fields empty.
* feat: add Spotlight sidecar for local Sentry development testing
Add the Spotlight container to compose.override.yaml so the feedback
widget and error events can be inspected locally without sending anything
to Sentry. The JS SDK switches to spotlight mode automatically when no
SENTRY_DSN is configured.
* feat: route PHP Sentry events to Spotlight in dev
Add a when@dev block to sentry.yaml that initialises the PHP Sentry SDK
with a placeholder DSN and forwards all events to the Spotlight sidecar
over the internal Docker network (http://spotlight:8969/stream).
The JS SDK already uses localhost:8969 via spotlight:true when no real
SENTRY_DSN is set, which is correct since the browser cannot reach the
internal Docker hostname.
* fix: use spotlight_url to route PHP dev errors to Spotlight sidecar
* fix: manually mount Sentry feedback widget to work around v10 setupOnce guard
Sentry v10's setupOnce() is skipped when the integration name is already
in the module-level guard array, so autoInject never mounts the widget.
Switching to autoInject: false and calling createWidget() directly is
reliable and confirmed working in the browser.
Also use the tunnel option to forward JS events to the local Spotlight
sidecar when no real DSN is configured, and enable SentryBundle in dev
so PHP errors are also routed to Spotlight.
CI / Build and deploy to ${{ startsWith(github.ref, 'refs/tags/') && 'production' || (github.ref == 'refs/heads/main' && 'acceptance' || '') }} (push) Has been skipped
* Some tests
* More tests!
* Tests 3
* Move getScores from Candidate to Quiz
* Add some suggestions for future refactoring
* - **Add Gedmo doctrine-extensions and Stof bundle integration**
- Added `stof/doctrine-extensions-bundle` and `gedmo/doctrine-extensions` dependencies.
- Integrated `Timestampable` behavior for `Created` fields in entities.
- Updated `bundles.php` to register StofDoctrineExtensionsBundle.
- Added configuration for the Stof bundle.
- Simplified `SeasonVoter` with `match` expression and added new tests.
- Minor fixes and adjustments across various files.
* WIP
* All the tests
* Base64 tests
* Symfomny 7.4.0
* Update
* Update recipe
* PHP 8.5
* Rector changes
* More 8.5
* Things
- Removed EasyAdmin controllers and configurations.
- Uninstalled `easycorp/easyadmin-bundle` and related dependencies.
- Cleaned up all associated routes, bundles, and vendor references.
This commit introduces a refactored EliminationFactory for better modularity, updates the elimination preparation process, and adds functionality to view eliminations. Backoffice templates and forms have been reorganized, minor translations were corrected, and additional assets like styles and flashes were included for enhanced user experience.