Compare commits

..

9 Commits

Author SHA1 Message Date
Marijn fde177167a Add CSRF token validation across backoffice forms
- Added CSRF validations to candidate correction, penalty, answer saving, and elimination forms.
- Updated corresponding Twig templates to include CSRF token inputs.
- Adjusted column count in `tab_result` template to maintain layout consistency.
2026-05-23 14:51:45 +02:00
Marijn 5dd0e3ded0 Added Gedmo stuff, fix translations 2026-05-23 12:40:16 +02:00
Marijn 03425024fe Fix Remember me (#111) 2026-05-21 21:38:31 +02:00
dependabot[bot] 182353e2eb Bump doctrine/persistence from 4.1.1 to 4.2.0 (#109)
Bumps [doctrine/persistence](https://github.com/doctrine/persistence) from 4.1.1 to 4.2.0.
- [Release notes](https://github.com/doctrine/persistence/releases)
- [Commits](https://github.com/doctrine/persistence/compare/4.1.1...4.2.0)

---
updated-dependencies:
- dependency-name: doctrine/persistence
  dependency-version: 4.2.0
  dependency-type: indirect
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-21 20:42:44 +02:00
dependabot[bot] 9badb1d875 Bump doctrine/migrations from 3.9.6 to 3.9.7 (#108)
Bumps [doctrine/migrations](https://github.com/doctrine/migrations) from 3.9.6 to 3.9.7.
- [Release notes](https://github.com/doctrine/migrations/releases)
- [Commits](https://github.com/doctrine/migrations/compare/3.9.6...3.9.7)

---
updated-dependencies:
- dependency-name: doctrine/migrations
  dependency-version: 3.9.7
  dependency-type: indirect
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-21 20:42:26 +02:00
dependabot[bot] df37faa5a3 Bump webmozart/assert from 2.3.0 to 2.4.0 (#110)
Bumps [webmozart/assert](https://github.com/webmozarts/assert) from 2.3.0 to 2.4.0.
- [Release notes](https://github.com/webmozarts/assert/releases)
- [Changelog](https://github.com/webmozarts/assert/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webmozarts/assert/compare/2.3.0...2.4.0)

---
updated-dependencies:
- dependency-name: webmozart/assert
  dependency-version: 2.4.0
  dependency-type: indirect
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-21 20:42:09 +02:00
dependabot[bot] 7ec052b0a1 Bump the twig group with 2 updates (#107)
Bumps the twig group with 2 updates: [twig/intl-extra](https://github.com/twigphp/intl-extra) and [twig/twig](https://github.com/twigphp/Twig).


Updates `twig/intl-extra` from 3.24.0 to 3.26.0
- [Release notes](https://github.com/twigphp/intl-extra/releases)
- [Commits](https://github.com/twigphp/intl-extra/compare/v3.24.0...v3.26.0)

Updates `twig/twig` from 3.24.0 to 3.26.0
- [Release notes](https://github.com/twigphp/Twig/releases)
- [Changelog](https://github.com/twigphp/Twig/blob/3.x/CHANGELOG)
- [Commits](https://github.com/twigphp/Twig/compare/v3.24.0...v3.26.0)

---
updated-dependencies:
- dependency-name: twig/intl-extra
  dependency-version: 3.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: twig
- dependency-name: twig/twig
  dependency-version: 3.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: twig
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-21 20:41:40 +02:00
dependabot[bot] f90fb00547 Bump the dev-dependencies group with 7 updates (#106)
---
updated-dependencies:
- dependency-name: friendsofphp/php-cs-fixer
  dependency-version: 3.95.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-dependencies
- dependency-name: phpstan/phpstan
  dependency-version: 2.1.55
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: phpstan/phpstan-doctrine
  dependency-version: 2.0.22
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: phpstan/phpstan-symfony
  dependency-version: 2.0.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: phpunit/phpunit
  dependency-version: 13.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: rector/rector
  dependency-version: 2.4.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
- dependency-name: doctrine/data-fixtures
  dependency-version: 2.2.1
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: dev-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-21 18:40:49 +00:00
Marijn aa39db3f5e Dependabot config (#105)
* Group Symfony and twig

* Enable automerge for dev dependencies
2026-05-21 20:35:48 +02:00
26 changed files with 493 additions and 278 deletions
+16 -1
View File
@@ -7,9 +7,24 @@ version: 2
updates: updates:
- package-ecosystem: "composer" # See documentation for possible values - package-ecosystem: "composer" # See documentation for possible values
directory: "/" # Location of package manifests directory: "/" # Location of package manifests
allow:
# Allow both direct and indirect updates for all packages
- dependency-type: "all"
schedule: schedule:
interval: "daily" interval: "daily"
ignore:
- dependency-name: "symfony/*"
update-types: [ "version-update:semver-major", "version-update:semver-minor" ]
groups:
dev-dependencies:
dependency-type: "development"
symfony:
patterns:
- "symfony/*"
twig:
patterns:
- "twig/*"
- package-ecosystem: "docker" - package-ecosystem: "docker"
directtory: "/" directory: "/"
schedule: schedule:
interval: "daily" interval: "daily"
@@ -0,0 +1,25 @@
name: Dependabot auto-merge
on: pull_request
permissions:
contents: write
pull-requests: write
jobs:
dependabot:
runs-on: ubuntu-latest
if: github.event.pull_request.user.login == 'dependabot[bot]'
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Enable auto-merge for Dependabot PRs
if: contains(steps.metadata.outputs.dependency-type, 'development')
run: |
gh pr review --approve "$PR_URL"
gh pr merge --auto --squash "$PR_URL"
env:
PR_URL: ${{github.event.pull_request.html_url}}
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
+1
View File
@@ -73,6 +73,7 @@
<inspection_tool class="PhpFullyQualifiedNameUsageInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true"> <inspection_tool class="PhpFullyQualifiedNameUsageInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="IGNORE_GLOBAL_NAMESPACE" value="true" /> <option name="IGNORE_GLOBAL_NAMESPACE" value="true" />
</inspection_tool> </inspection_tool>
<inspection_tool class="PhpPublicPropertyModifierCanBeOmittedInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="PhpStanGlobal" enabled="true" level="WEAK WARNING" enabled_by_default="true" /> <inspection_tool class="PhpStanGlobal" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
<inspection_tool class="SecurityAdvisoriesInspection" enabled="true" level="WARNING" enabled_by_default="true"> <inspection_tool class="SecurityAdvisoriesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="optionConfiguration"> <option name="optionConfiguration">
View File
Generated
+224 -145
View File
@@ -938,16 +938,16 @@
}, },
{ {
"name": "doctrine/migrations", "name": "doctrine/migrations",
"version": "3.9.6", "version": "3.9.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/migrations.git", "url": "https://github.com/doctrine/migrations.git",
"reference": "ffd8355cdd8505fc650d9604f058bf62aedd80a1" "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/migrations/zipball/ffd8355cdd8505fc650d9604f058bf62aedd80a1", "url": "https://api.github.com/repos/doctrine/migrations/zipball/96cb2a89b56c9efb0bac38e606dc0b0f13e650ec",
"reference": "ffd8355cdd8505fc650d9604f058bf62aedd80a1", "reference": "96cb2a89b56c9efb0bac38e606dc0b0f13e650ec",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1021,7 +1021,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/migrations/issues", "issues": "https://github.com/doctrine/migrations/issues",
"source": "https://github.com/doctrine/migrations/tree/3.9.6" "source": "https://github.com/doctrine/migrations/tree/3.9.7"
}, },
"funding": [ "funding": [
{ {
@@ -1037,7 +1037,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-02-11T06:46:11+00:00" "time": "2026-04-23T19:33:20+00:00"
}, },
{ {
"name": "doctrine/orm", "name": "doctrine/orm",
@@ -1129,19 +1129,20 @@
}, },
{ {
"name": "doctrine/persistence", "name": "doctrine/persistence",
"version": "4.1.1", "version": "4.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/persistence.git", "url": "https://github.com/doctrine/persistence.git",
"reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09" "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/persistence/zipball/b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", "url": "https://api.github.com/repos/doctrine/persistence/zipball/49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b",
"reference": "b9c49ad3558bb77ef973f4e173f2e9c2eca9be09", "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/deprecations": "^1",
"doctrine/event-manager": "^1 || ^2", "doctrine/event-manager": "^1 || ^2",
"php": "^8.1", "php": "^8.1",
"psr/cache": "^1.0 || ^2.0 || ^3.0" "psr/cache": "^1.0 || ^2.0 || ^3.0"
@@ -1152,13 +1153,13 @@
"phpstan/phpstan-phpunit": "^2", "phpstan/phpstan-phpunit": "^2",
"phpstan/phpstan-strict-rules": "^2", "phpstan/phpstan-strict-rules": "^2",
"phpunit/phpunit": "^10.5.58 || ^12", "phpunit/phpunit": "^10.5.58 || ^12",
"symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0", "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0",
"symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0" "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Doctrine\\Persistence\\": "src/Persistence" "Doctrine\\Persistence\\": "src"
} }
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@@ -1202,7 +1203,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/persistence/issues", "issues": "https://github.com/doctrine/persistence/issues",
"source": "https://github.com/doctrine/persistence/tree/4.1.1" "source": "https://github.com/doctrine/persistence/tree/4.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -1218,7 +1219,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-10-16T20:13:18+00:00" "time": "2026-04-26T12:12:52+00:00"
}, },
{ {
"name": "doctrine/sql-formatter", "name": "doctrine/sql-formatter",
@@ -8398,16 +8399,16 @@
}, },
{ {
"name": "twig/intl-extra", "name": "twig/intl-extra",
"version": "v3.24.0", "version": "v3.26.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/intl-extra.git", "url": "https://github.com/twigphp/intl-extra.git",
"reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f" "reference": "98f5ad5bff13230fcd2d834d9e79b50adf3ccda9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/intl-extra/zipball/32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/98f5ad5bff13230fcd2d834d9e79b50adf3ccda9",
"reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", "reference": "98f5ad5bff13230fcd2d834d9e79b50adf3ccda9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8446,7 +8447,7 @@
"twig" "twig"
], ],
"support": { "support": {
"source": "https://github.com/twigphp/intl-extra/tree/v3.24.0" "source": "https://github.com/twigphp/intl-extra/tree/v3.26.0"
}, },
"funding": [ "funding": [
{ {
@@ -8458,20 +8459,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-01-17T13:57:47+00:00" "time": "2026-05-19T20:44:48+00:00"
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v3.24.0", "version": "v3.26.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/Twig.git", "url": "https://github.com/twigphp/Twig.git",
"reference": "a6769aefb305efef849dc25c9fd1653358c148f0" "reference": "1fcae487b180d78e6351f4e0afa91f9eab96a2bc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0", "url": "https://api.github.com/repos/twigphp/Twig/zipball/1fcae487b180d78e6351f4e0afa91f9eab96a2bc",
"reference": "a6769aefb305efef849dc25c9fd1653358c148f0", "reference": "1fcae487b180d78e6351f4e0afa91f9eab96a2bc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8526,7 +8527,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/twigphp/Twig/issues", "issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.24.0" "source": "https://github.com/twigphp/Twig/tree/v3.26.0"
}, },
"funding": [ "funding": [
{ {
@@ -8538,20 +8539,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-03-17T21:31:11+00:00" "time": "2026-05-20T07:31:59+00:00"
}, },
{ {
"name": "webmozart/assert", "name": "webmozart/assert",
"version": "2.3.0", "version": "2.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/webmozarts/assert.git", "url": "https://github.com/webmozarts/assert.git",
"reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4" "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4", "url": "https://api.github.com/repos/webmozarts/assert/zipball/9007ea6f45ecf352a9422b36644e4bfc039b9155",
"reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4", "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8567,7 +8568,11 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"psalm": {
"pluginClass": "Webmozart\\Assert\\PsalmPlugin"
},
"branch-alias": { "branch-alias": {
"dev-master": "2.0-dev",
"dev-feature/2-0": "2.0-dev" "dev-feature/2-0": "2.0-dev"
} }
}, },
@@ -8598,9 +8603,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/webmozarts/assert/issues", "issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/2.3.0" "source": "https://github.com/webmozarts/assert/tree/2.4.0"
}, },
"time": "2026-04-11T10:33:05+00:00" "time": "2026-05-20T13:07:01+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [
@@ -8805,16 +8810,16 @@
}, },
{ {
"name": "doctrine/data-fixtures", "name": "doctrine/data-fixtures",
"version": "2.2.0", "version": "2.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/data-fixtures.git", "url": "https://github.com/doctrine/data-fixtures.git",
"reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97" "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7a615ba135e45d67674bb623d90f34f6c7b6bd97", "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/bf7ac3a050b54b261cedfb3d0a44733819062275",
"reference": "7a615ba135e45d67674bb623d90f34f6c7b6bd97", "reference": "bf7ac3a050b54b261cedfb3d0a44733819062275",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -8832,12 +8837,14 @@
"doctrine/dbal": "^3.5 || ^4", "doctrine/dbal": "^3.5 || ^4",
"doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0",
"doctrine/orm": "^2.14 || ^3", "doctrine/orm": "^2.14 || ^3",
"doctrine/phpcr-odm": "^1.8 || ^2.0",
"ext-sqlite3": "*", "ext-sqlite3": "*",
"fig/log-test": "^1", "fig/log-test": "^1",
"phpstan/phpstan": "2.1.31", "jackalope/jackalope-fs": "*",
"phpunit/phpunit": "10.5.45 || 12.4.0", "phpstan/phpstan": "2.1.46",
"symfony/cache": "^6.4 || ^7", "phpunit/phpunit": "10.5.63 || 12.5.12",
"symfony/var-exporter": "^6.4 || ^7" "symfony/cache": "^6.4 || ^7 || ^8",
"symfony/var-exporter": "^6.4 || ^7 || ^8"
}, },
"suggest": { "suggest": {
"alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)",
@@ -8868,7 +8875,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/data-fixtures/issues", "issues": "https://github.com/doctrine/data-fixtures/issues",
"source": "https://github.com/doctrine/data-fixtures/tree/2.2.0" "source": "https://github.com/doctrine/data-fixtures/tree/2.2.1"
}, },
"funding": [ "funding": [
{ {
@@ -8884,7 +8891,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-10-17T20:06:20+00:00" "time": "2026-04-01T13:56:01+00:00"
}, },
{ {
"name": "doctrine/doctrine-fixtures-bundle", "name": "doctrine/doctrine-fixtures-bundle",
@@ -8972,6 +8979,75 @@
], ],
"time": "2025-12-03T16:05:42+00:00" "time": "2025-12-03T16:05:42+00:00"
}, },
{
"name": "ergebnis/agent-detector",
"version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/ergebnis/agent-detector.git",
"reference": "e211f17928c8b95a51e06040792d57f5462fb271"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/e211f17928c8b95a51e06040792d57f5462fb271",
"reference": "e211f17928c8b95a51e06040792d57f5462fb271",
"shasum": ""
},
"require": {
"php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0"
},
"require-dev": {
"ergebnis/composer-normalize": "^2.51.0",
"ergebnis/license": "^2.7.0",
"ergebnis/php-cs-fixer-config": "^6.60.2",
"ergebnis/phpstan-rules": "^2.13.1",
"ergebnis/phpunit-slow-test-detector": "^2.24.0",
"ergebnis/rector-rules": "^1.18.1",
"fakerphp/faker": "^1.24.1",
"infection/infection": "^0.26.6",
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.54",
"phpstan/phpstan-deprecation-rules": "^2.0.4",
"phpstan/phpstan-phpunit": "^2.0.16",
"phpstan/phpstan-strict-rules": "^2.0.10",
"phpunit/phpunit": "^9.6.34",
"rector/rector": "^2.4.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.2-dev"
},
"composer-normalize": {
"indent-size": 2,
"indent-style": "space"
}
},
"autoload": {
"psr-4": {
"Ergebnis\\AgentDetector\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andreas Möller",
"email": "am@localheinz.com",
"homepage": "https://localheinz.com"
}
],
"description": "Provides a detector for detecting the presence of an agent.",
"homepage": "https://github.com/ergebnis/agent-detector",
"support": {
"issues": "https://github.com/ergebnis/agent-detector/issues",
"security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md",
"source": "https://github.com/ergebnis/agent-detector"
},
"time": "2026-05-07T08:19:07+00:00"
},
{ {
"name": "evenement/evenement", "name": "evenement/evenement",
"version": "v3.0.2", "version": "v3.0.2",
@@ -9082,22 +9158,23 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.94.2", "version": "v3.95.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
"reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63" "reference": "a28d88a5e172b27e78d0816992b15a9df3da20f1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7787ceff91365ba7d623ec410b8f429cdebb4f63", "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a28d88a5e172b27e78d0816992b15a9df3da20f1",
"reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63", "reference": "a28d88a5e172b27e78d0816992b15a9df3da20f1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"clue/ndjson-react": "^1.3", "clue/ndjson-react": "^1.3",
"composer/semver": "^3.4", "composer/semver": "^3.4",
"composer/xdebug-handler": "^3.0.5", "composer/xdebug-handler": "^3.0.5",
"ergebnis/agent-detector": "^1.1.1",
"ext-filter": "*", "ext-filter": "*",
"ext-hash": "*", "ext-hash": "*",
"ext-json": "*", "ext-json": "*",
@@ -9122,18 +9199,18 @@
"symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0"
}, },
"require-dev": { "require-dev": {
"facile-it/paraunit": "^1.3.1 || ^2.7.1", "facile-it/paraunit": "^1.3.1 || ^2.11.0",
"infection/infection": "^0.32.3", "infection/infection": "^0.32.7",
"justinrainbow/json-schema": "^6.6.4", "justinrainbow/json-schema": "^6.8.0",
"keradus/cli-executor": "^2.3", "keradus/cli-executor": "^2.3",
"mikey179/vfsstream": "^1.6.12", "mikey179/vfsstream": "^1.6.12",
"php-coveralls/php-coveralls": "^2.9.1", "php-coveralls/php-coveralls": "^2.9.1",
"php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.7", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8",
"php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.7", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8",
"phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.51", "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55",
"symfony/polyfill-php85": "^1.33", "symfony/polyfill-php85": "^1.33",
"symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.4", "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8",
"symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.1" "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8"
}, },
"suggest": { "suggest": {
"ext-dom": "For handling output formats in XML", "ext-dom": "For handling output formats in XML",
@@ -9174,7 +9251,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.2" "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.2"
}, },
"funding": [ "funding": [
{ {
@@ -9182,7 +9259,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-02-20T16:13:53+00:00" "time": "2026-05-15T09:20:44+00:00"
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
@@ -9470,11 +9547,11 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "2.1.46", "version": "2.1.55",
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/a193923fc2d6325ef4e741cf3af8c3e8f54dbf25", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9eaac3826ed5e9b8427350a43cac825eeca3f566",
"reference": "a193923fc2d6325ef4e741cf3af8c3e8f54dbf25", "reference": "9eaac3826ed5e9b8427350a43cac825eeca3f566",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -9519,20 +9596,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-04-01T09:25:14+00:00" "time": "2026-05-18T11:57:34+00:00"
}, },
{ {
"name": "phpstan/phpstan-doctrine", "name": "phpstan/phpstan-doctrine",
"version": "2.0.20", "version": "2.0.22",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan-doctrine.git", "url": "https://github.com/phpstan/phpstan-doctrine.git",
"reference": "72f4f7a02d6c98d9101e8616e0488bc0a785196d" "reference": "e87516b034749432d51653c0147e053e476e8c53"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/72f4f7a02d6c98d9101e8616e0488bc0a785196d", "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/e87516b034749432d51653c0147e053e476e8c53",
"reference": "72f4f7a02d6c98d9101e8616e0488bc0a785196d", "reference": "e87516b034749432d51653c0147e053e476e8c53",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -9566,6 +9643,7 @@
"phpstan/phpstan-strict-rules": "^2.0", "phpstan/phpstan-strict-rules": "^2.0",
"phpunit/phpunit": "^9.6.20", "phpunit/phpunit": "^9.6.20",
"ramsey/uuid": "^4.2", "ramsey/uuid": "^4.2",
"shipmonk/name-collision-detector": "^2.1",
"symfony/cache": "^5.4", "symfony/cache": "^5.4",
"symfony/uid": "^5.4 || ^6.4 || ^7.3" "symfony/uid": "^5.4 || ^6.4 || ^7.3"
}, },
@@ -9593,9 +9671,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/phpstan/phpstan-doctrine/issues", "issues": "https://github.com/phpstan/phpstan-doctrine/issues",
"source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.20" "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.22"
}, },
"time": "2026-03-13T13:44:51+00:00" "time": "2026-05-09T08:10:48+00:00"
}, },
{ {
"name": "phpstan/phpstan-phpunit", "name": "phpstan/phpstan-phpunit",
@@ -9655,16 +9733,16 @@
}, },
{ {
"name": "phpstan/phpstan-symfony", "name": "phpstan/phpstan-symfony",
"version": "2.0.15", "version": "2.0.18",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan-symfony.git", "url": "https://github.com/phpstan/phpstan-symfony.git",
"reference": "9b85ab476969b87bbe2253b69e265a9359b2f395" "reference": "a12176b639dec54e8bfd0a5ebf5fc36ffe003b5d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/9b85ab476969b87bbe2253b69e265a9359b2f395", "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/a12176b639dec54e8bfd0a5ebf5fc36ffe003b5d",
"reference": "9b85ab476969b87bbe2253b69e265a9359b2f395", "reference": "a12176b639dec54e8bfd0a5ebf5fc36ffe003b5d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -9723,27 +9801,28 @@
], ],
"support": { "support": {
"issues": "https://github.com/phpstan/phpstan-symfony/issues", "issues": "https://github.com/phpstan/phpstan-symfony/issues",
"source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.15" "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.18"
}, },
"time": "2026-02-26T10:15:59+00:00" "time": "2026-05-18T14:51:49+00:00"
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "14.1.2", "version": "14.1.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "c9023486f88a48dd870361591bd7caef6d2406c3" "reference": "655533a65696bbc4231cd8027af150dadc40ec88"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c9023486f88a48dd870361591bd7caef6d2406c3", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/655533a65696bbc4231cd8027af150dadc40ec88",
"reference": "c9023486f88a48dd870361591bd7caef6d2406c3", "reference": "655533a65696bbc4231cd8027af150dadc40ec88",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-mbstring": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"nikic/php-parser": "^5.7.0", "nikic/php-parser": "^5.7.0",
"php": ">=8.4", "php": ">=8.4",
@@ -9794,7 +9873,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.1.2" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.1.9"
}, },
"funding": [ "funding": [
{ {
@@ -9814,7 +9893,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-04-15T08:27:13+00:00" "time": "2026-05-16T05:16:14+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@@ -10111,16 +10190,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "13.1.6", "version": "13.1.11",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "c3c414ea438e5a37d00697eaea43e6e05e201a42" "reference": "0f540976373361d1b4549adcb87913ce2116e904"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c3c414ea438e5a37d00697eaea43e6e05e201a42", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0f540976373361d1b4549adcb87913ce2116e904",
"reference": "c3c414ea438e5a37d00697eaea43e6e05e201a42", "reference": "0f540976373361d1b4549adcb87913ce2116e904",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10134,21 +10213,21 @@
"phar-io/manifest": "^2.0.4", "phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1", "phar-io/version": "^3.2.1",
"php": ">=8.4.1", "php": ">=8.4.1",
"phpunit/php-code-coverage": "^14.1.2", "phpunit/php-code-coverage": "^14.1.9",
"phpunit/php-file-iterator": "^7.0.0", "phpunit/php-file-iterator": "^7.0.0",
"phpunit/php-invoker": "^7.0.0", "phpunit/php-invoker": "^7.0.0",
"phpunit/php-text-template": "^6.0.0", "phpunit/php-text-template": "^6.0.0",
"phpunit/php-timer": "^9.0.0", "phpunit/php-timer": "^9.0.0",
"sebastian/cli-parser": "^5.0.0", "sebastian/cli-parser": "^5.0.0",
"sebastian/comparator": "^8.1.2", "sebastian/comparator": "^8.2.1",
"sebastian/diff": "^8.1.0", "sebastian/diff": "^8.3.0",
"sebastian/environment": "^9.3.0", "sebastian/environment": "^9.3.1",
"sebastian/exporter": "^8.0.2", "sebastian/exporter": "^8.1.0",
"sebastian/git-state": "^1.0", "sebastian/git-state": "^1.0",
"sebastian/global-state": "^9.0.0", "sebastian/global-state": "^9.0.0",
"sebastian/object-enumerator": "^8.0.0", "sebastian/object-enumerator": "^8.0.0",
"sebastian/recursion-context": "^8.0.0", "sebastian/recursion-context": "^8.0.0",
"sebastian/type": "^7.0.0", "sebastian/type": "^7.0.1",
"sebastian/version": "^7.0.0", "sebastian/version": "^7.0.0",
"staabm/side-effects-detector": "^1.0.5" "staabm/side-effects-detector": "^1.0.5"
}, },
@@ -10190,7 +10269,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/13.1.6" "source": "https://github.com/sebastianbergmann/phpunit/tree/13.1.11"
}, },
"funding": [ "funding": [
{ {
@@ -10198,7 +10277,7 @@
"type": "other" "type": "other"
} }
], ],
"time": "2026-04-17T12:52:50+00:00" "time": "2026-05-21T12:38:47+00:00"
}, },
{ {
"name": "react/cache", "name": "react/cache",
@@ -10728,21 +10807,21 @@
}, },
{ {
"name": "rector/rector", "name": "rector/rector",
"version": "2.4.0", "version": "2.4.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/rectorphp/rector.git", "url": "https://github.com/rectorphp/rector.git",
"reference": "a51dfddbf6a29ed9fbf6e8410fc90c1608df1b5d" "reference": "4661c582a20f03df585d2e3fdc4af1b83d67a091"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/a51dfddbf6a29ed9fbf6e8410fc90c1608df1b5d", "url": "https://api.github.com/repos/rectorphp/rector/zipball/4661c582a20f03df585d2e3fdc4af1b83d67a091",
"reference": "a51dfddbf6a29ed9fbf6e8410fc90c1608df1b5d", "reference": "4661c582a20f03df585d2e3fdc4af1b83d67a091",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.4|^8.0", "php": "^7.4|^8.0",
"phpstan/phpstan": "^2.1.41" "phpstan/phpstan": "^2.1.48"
}, },
"conflict": { "conflict": {
"rector/rector-doctrine": "*", "rector/rector-doctrine": "*",
@@ -10776,7 +10855,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/rectorphp/rector/issues", "issues": "https://github.com/rectorphp/rector/issues",
"source": "https://github.com/rectorphp/rector/tree/2.4.0" "source": "https://github.com/rectorphp/rector/tree/2.4.4"
}, },
"funding": [ "funding": [
{ {
@@ -10784,7 +10863,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-04-04T07:37:45+00:00" "time": "2026-05-20T19:30:21+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@@ -10857,27 +10936,27 @@
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "8.1.2", "version": "8.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "b3d09f4360ad97dcad8f82d1c047ad16ff38b7e1" "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b3d09f4360ad97dcad8f82d1c047ad16ff38b7e1", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ce999bf08b2c387a5423fe56961c32eed3f88089",
"reference": "b3d09f4360ad97dcad8f82d1c047ad16ff38b7e1", "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-mbstring": "*", "ext-mbstring": "*",
"php": ">=8.4", "php": ">=8.4",
"sebastian/diff": "^8.1", "sebastian/diff": "^8.3",
"sebastian/exporter": "^8.0" "sebastian/exporter": "^8.0.3"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^13.0" "phpunit/phpunit": "^13.1.10"
}, },
"suggest": { "suggest": {
"ext-bcmath": "For comparing BcMath\\Number objects" "ext-bcmath": "For comparing BcMath\\Number objects"
@@ -10885,7 +10964,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "8.1-dev" "dev-main": "8.2-dev"
} }
}, },
"autoload": { "autoload": {
@@ -10925,7 +11004,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy", "security": "https://github.com/sebastianbergmann/comparator/security/policy",
"source": "https://github.com/sebastianbergmann/comparator/tree/8.1.2" "source": "https://github.com/sebastianbergmann/comparator/tree/8.2.1"
}, },
"funding": [ "funding": [
{ {
@@ -10945,7 +11024,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-04-14T08:24:42+00:00" "time": "2026-05-21T04:46:40+00:00"
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",
@@ -11019,16 +11098,16 @@
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
"version": "8.1.0", "version": "8.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/diff.git", "url": "https://github.com/sebastianbergmann/diff.git",
"reference": "9c957d730257f49c873f3761674559bd90098a7d" "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/9c957d730257f49c873f3761674559bd90098a7d", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b36d33b6e796513de7cb7df053afb3f55eefcd47",
"reference": "9c957d730257f49c873f3761674559bd90098a7d", "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -11041,7 +11120,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "8.1-dev" "dev-main": "8.3-dev"
} }
}, },
"autoload": { "autoload": {
@@ -11074,7 +11153,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/diff/issues", "issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy", "security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/8.1.0" "source": "https://github.com/sebastianbergmann/diff/tree/8.3.0"
}, },
"funding": [ "funding": [
{ {
@@ -11094,27 +11173,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-04-05T12:02:33+00:00" "time": "2026-05-15T04:58:09+00:00"
}, },
{ {
"name": "sebastian/environment", "name": "sebastian/environment",
"version": "9.3.0", "version": "9.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/environment.git", "url": "https://github.com/sebastianbergmann/environment.git",
"reference": "6767059a30e4277ac95ee034809e793528464768" "reference": "a15fa79a5f5cfd0e9f6817dbcdb0048e99efa146"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6767059a30e4277ac95ee034809e793528464768", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a15fa79a5f5cfd0e9f6817dbcdb0048e99efa146",
"reference": "6767059a30e4277ac95ee034809e793528464768", "reference": "a15fa79a5f5cfd0e9f6817dbcdb0048e99efa146",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.4" "php": ">=8.4"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^13.0" "phpunit/phpunit": "^13.1.10"
}, },
"suggest": { "suggest": {
"ext-posix": "*" "ext-posix": "*"
@@ -11150,7 +11229,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/environment/issues", "issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy", "security": "https://github.com/sebastianbergmann/environment/security/policy",
"source": "https://github.com/sebastianbergmann/environment/tree/9.3.0" "source": "https://github.com/sebastianbergmann/environment/tree/9.3.1"
}, },
"funding": [ "funding": [
{ {
@@ -11170,20 +11249,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-04-15T12:14:03+00:00" "time": "2026-05-21T08:47:00+00:00"
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
"version": "8.0.2", "version": "8.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git", "url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "9cee180ebe62259e3ed48df2212d1fc8cfd971bb" "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/9cee180ebe62259e3ed48df2212d1fc8cfd971bb", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c0d29a945f8cf82f300a05e69874508e307ca4c6",
"reference": "9cee180ebe62259e3ed48df2212d1fc8cfd971bb", "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -11192,12 +11271,12 @@
"sebastian/recursion-context": "^8.0" "sebastian/recursion-context": "^8.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^13.0" "phpunit/phpunit": "^13.1.10"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "8.0-dev" "dev-main": "8.1-dev"
} }
}, },
"autoload": { "autoload": {
@@ -11240,7 +11319,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues", "issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy", "security": "https://github.com/sebastianbergmann/exporter/security/policy",
"source": "https://github.com/sebastianbergmann/exporter/tree/8.0.2" "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.0"
}, },
"funding": [ "funding": [
{ {
@@ -11260,7 +11339,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-04-15T12:38:05+00:00" "time": "2026-05-21T11:50:56+00:00"
}, },
{ {
"name": "sebastian/git-state", "name": "sebastian/git-state",
@@ -11407,24 +11486,24 @@
}, },
{ {
"name": "sebastian/lines-of-code", "name": "sebastian/lines-of-code",
"version": "5.0.0", "version": "5.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git", "url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "4f21bb7768e1c997722ccc7efb1d6b5c11bfd471" "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/4f21bb7768e1c997722ccc7efb1d6b5c11bfd471", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
"reference": "4f21bb7768e1c997722ccc7efb1d6b5c11bfd471", "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^5.0", "nikic/php-parser": "^5.7.0",
"php": ">=8.4" "php": ">=8.4"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^13.0" "phpunit/phpunit": "^13.1.10"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -11453,7 +11532,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.0" "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -11473,7 +11552,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-02-06T04:45:54+00:00" "time": "2026-05-19T16:23:37+00:00"
}, },
{ {
"name": "sebastian/object-enumerator", "name": "sebastian/object-enumerator",
@@ -11691,23 +11770,23 @@
}, },
{ {
"name": "sebastian/type", "name": "sebastian/type",
"version": "7.0.0", "version": "7.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/type.git", "url": "https://github.com/sebastianbergmann/type.git",
"reference": "42412224607bd3931241bbd17f38e0f972f5a916" "reference": "fee0309275847fefd7636167085e379c1dbf6990"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/42412224607bd3931241bbd17f38e0f972f5a916", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990",
"reference": "42412224607bd3931241bbd17f38e0f972f5a916", "reference": "fee0309275847fefd7636167085e379c1dbf6990",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.4" "php": ">=8.4"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^13.0" "phpunit/phpunit": "^13.1.10"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -11736,7 +11815,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/type/issues", "issues": "https://github.com/sebastianbergmann/type/issues",
"security": "https://github.com/sebastianbergmann/type/security/policy", "security": "https://github.com/sebastianbergmann/type/security/policy",
"source": "https://github.com/sebastianbergmann/type/tree/7.0.0" "source": "https://github.com/sebastianbergmann/type/tree/7.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -11756,7 +11835,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-02-06T04:52:09+00:00" "time": "2026-05-20T06:49:11+00:00"
}, },
{ {
"name": "sebastian/version", "name": "sebastian/version",
+4
View File
@@ -22,6 +22,10 @@ doctrine:
identity_generation_preferences: identity_generation_preferences:
Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity
auto_mapping: true auto_mapping: true
filters:
softdeleteable:
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
enabled: true
mappings: mappings:
Tvdt: Tvdt:
type: attribute type: attribute
+3
View File
@@ -24,6 +24,9 @@ security:
default_target_path: tvdt_backoffice_index default_target_path: tvdt_backoffice_index
logout: logout:
path: tvdt_login_logout path: tvdt_login_logout
remember_me:
secret: '%kernel.secret%'
lifetime: 604800 # 1 week in seconds
access_control: access_control:
- { path: ^/admin, roles: ROLE_ADMIN } - { path: ^/admin, roles: ROLE_ADMIN }
@@ -5,3 +5,4 @@ stof_doctrine_extensions:
orm: orm:
default: default:
timestampable: true timestampable: true
softdeleteable: true
+34
View File
@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20260523095205 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add soft-delete support (deleted_at columns) and rename elimination.created to created_at';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE elimination ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
$this->addSql('ALTER TABLE elimination RENAME COLUMN created TO created_at');
$this->addSql('ALTER TABLE given_answer ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
$this->addSql('ALTER TABLE quiz_candidate ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE elimination DROP deleted_at');
$this->addSql('ALTER TABLE elimination RENAME COLUMN created_at TO created');
$this->addSql('ALTER TABLE given_answer DROP deleted_at');
$this->addSql('ALTER TABLE quiz_candidate DROP deleted_at');
}
}
+32
View File
@@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20260523095302 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add updated_at column to elimination table and set it to created_at';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE elimination ADD updated_at TIMESTAMP(0) WITHOUT TIME ZONE');
$this->addSql('ALTER TABLE elimination ALTER created_at TYPE TIMESTAMP(0) WITHOUT TIME ZONE');
$this->addSql('UPDATE elimination SET updated_at = created_at');
$this->addSql('ALTER TABLE elimination ALTER updated_at SET NOT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE elimination DROP updated_at');
$this->addSql('ALTER TABLE elimination ALTER created_at TYPE TIMESTAMP(0) WITH TIME ZONE');
}
}
@@ -40,6 +40,10 @@ final class PrepareEliminationController extends AbstractController
public function viewElimination(Elimination $elimination, Request $request): Response public function viewElimination(Elimination $elimination, Request $request): Response
{ {
if ('POST' === $request->getMethod()) { if ('POST' === $request->getMethod()) {
if (!$this->isCsrfTokenValid('prepare_elimination', $request->request->get('_token'))) {
throw $this->createAccessDeniedException();
}
$elimination->updateFromInputBag($request->request); $elimination->updateFromInputBag($request->request);
$this->em->flush(); $this->em->flush();
@@ -193,6 +193,10 @@ class QuizController extends AbstractController
)] )]
public function saveCandidateAnswers(Season $season, Quiz $quiz, Question $question, Request $request): RedirectResponse public function saveCandidateAnswers(Season $season, Quiz $quiz, Question $question, Request $request): RedirectResponse
{ {
if (!$this->isCsrfTokenValid('candidate_answer', $request->request->get('_token'))) {
throw $this->createAccessDeniedException();
}
if (false === $season->quizzes->contains($quiz) if (false === $season->quizzes->contains($quiz)
|| false === $quiz->questions->contains($question)) { || false === $quiz->questions->contains($question)) {
throw new BadRequestHttpException('Invalid quiz or question'); throw new BadRequestHttpException('Invalid quiz or question');
@@ -304,6 +308,10 @@ class QuizController extends AbstractController
throw new MethodNotAllowedHttpException(['POST']); throw new MethodNotAllowedHttpException(['POST']);
} }
if (!$this->isCsrfTokenValid('candidate_correction', $request->request->get('_token'))) {
throw $this->createAccessDeniedException();
}
$corrections = (float) $request->request->get('corrections'); $corrections = (float) $request->request->get('corrections');
$this->quizCandidateRepository->setCorrectionsForCandidate($quiz, $candidate, $corrections); $this->quizCandidateRepository->setCorrectionsForCandidate($quiz, $candidate, $corrections);
@@ -323,6 +331,10 @@ class QuizController extends AbstractController
throw new MethodNotAllowedHttpException(['POST']); throw new MethodNotAllowedHttpException(['POST']);
} }
if (!$this->isCsrfTokenValid('candidate_penalty', $request->request->get('_token'))) {
throw $this->createAccessDeniedException();
}
$penalty = (int) $request->request->get('penalty'); $penalty = (int) $request->request->get('penalty');
$this->quizCandidateRepository->setPenaltyForCandidate($quiz, $candidate, $penalty); $this->quizCandidateRepository->setPenaltyForCandidate($quiz, $candidate, $penalty);
+2 -2
View File
@@ -55,7 +55,7 @@ final class EliminationController extends AbstractController
$candidate = $this->candidateRepository->getCandidateByHash($elimination->quiz->season, $candidateHash); $candidate = $this->candidateRepository->getCandidateByHash($elimination->quiz->season, $candidateHash);
if (!$candidate instanceof Candidate) { if (!$candidate instanceof Candidate) {
$this->addFlash(FlashType::Warning, $this->addFlash(FlashType::Warning,
t('Cound not find candidate with name %name%', ['%name%' => Base64::base64UrlDecode($candidateHash)])->trans($this->translator), t('Could not find candidate with name {name}', ['name' => Base64::base64UrlDecode($candidateHash)])->trans($this->translator),
); );
return $this->redirectToRoute('tvdt_elimination', ['elimination' => $elimination->id]); return $this->redirectToRoute('tvdt_elimination', ['elimination' => $elimination->id]);
@@ -64,7 +64,7 @@ final class EliminationController extends AbstractController
$screenColour = $elimination->getScreenColour($candidate->name); $screenColour = $elimination->getScreenColour($candidate->name);
if (null === $screenColour) { if (null === $screenColour) {
$this->addFlash(FlashType::Warning, $this->translator->trans('Cound not find candidate with name %name% in elimination.', ['%name%' => $candidate->name])); $this->addFlash(FlashType::Warning, $this->translator->trans('Could not find candidate with name {name} in elimination.', ['name' => $candidate->name]));
return $this->redirectToRoute('tvdt_elimination', ['elimination' => $elimination->id]); return $this->redirectToRoute('tvdt_elimination', ['elimination' => $elimination->id]);
} }
+4
View File
@@ -97,6 +97,10 @@ final class QuizController extends AbstractController
} }
if ('POST' === $request->getMethod()) { if ('POST' === $request->getMethod()) {
if (!$this->isCsrfTokenValid('question', $request->request->get('token'))) {
throw $this->createAccessDeniedException();
}
// TODO: Extract saving answer logic to a service // TODO: Extract saving answer logic to a service
// Check if candidate is inactive for this quiz // Check if candidate is inactive for this quiz
$quizCandidate = $this->quizCandidateRepository->findOneBy(['quiz' => $quiz, 'candidate' => $candidate]); $quizCandidate = $this->quizCandidateRepository->findOneBy(['quiz' => $quiz, 'candidate' => $candidate]);
+5 -5
View File
@@ -7,15 +7,19 @@ namespace Tvdt\Entity;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo; use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\HttpFoundation\InputBag; use Symfony\Component\HttpFoundation\InputBag;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;
use Tvdt\Repository\EliminationRepository; use Tvdt\Repository\EliminationRepository;
#[Gedmo\SoftDeleteable]
#[ORM\Entity(repositoryClass: EliminationRepository::class)] #[ORM\Entity(repositoryClass: EliminationRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Elimination class Elimination
{ {
use SoftDeleteableEntity;
use TimestampableEntity;
public const string SCREEN_GREEN = 'green'; public const string SCREEN_GREEN = 'green';
public const string SCREEN_RED = 'red'; public const string SCREEN_RED = 'red';
@@ -30,10 +34,6 @@ class Elimination
#[ORM\Column(type: Types::JSONB)] #[ORM\Column(type: Types::JSONB)]
public array $data = []; public array $data = [];
#[Gedmo\Timestampable(on: 'create')]
#[ORM\Column(type: Types::DATETIMETZ_IMMUTABLE, nullable: false)]
public private(set) \DateTimeImmutable $created;
public function __construct( public function __construct(
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')] #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
#[ORM\ManyToOne(inversedBy: 'eliminations')] #[ORM\ManyToOne(inversedBy: 'eliminations')]
+4
View File
@@ -7,13 +7,17 @@ namespace Tvdt\Entity;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo; use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;
use Tvdt\Repository\GivenAnswerRepository; use Tvdt\Repository\GivenAnswerRepository;
#[Gedmo\SoftDeleteable]
#[ORM\Entity(repositoryClass: GivenAnswerRepository::class)] #[ORM\Entity(repositoryClass: GivenAnswerRepository::class)]
class GivenAnswer class GivenAnswer
{ {
use SoftDeleteableEntity;
#[ORM\Column(type: UuidType::NAME, unique: true)] #[ORM\Column(type: UuidType::NAME, unique: true)]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')] #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
#[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\GeneratedValue(strategy: 'CUSTOM')]
+1 -1
View File
@@ -42,7 +42,7 @@ class Quiz
/** @var Collection<int, Elimination> */ /** @var Collection<int, Elimination> */
#[ORM\OneToMany(targetEntity: Elimination::class, mappedBy: 'quiz', cascade: ['persist'], orphanRemoval: true)] #[ORM\OneToMany(targetEntity: Elimination::class, mappedBy: 'quiz', cascade: ['persist'], orphanRemoval: true)]
#[ORM\OrderBy(['created' => 'DESC'])] #[ORM\OrderBy(['createdAt' => 'DESC'])]
public private(set) Collection $eliminations; public private(set) Collection $eliminations;
public function __construct() public function __construct()
+3
View File
@@ -7,14 +7,17 @@ namespace Tvdt\Entity;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo; use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;
use Tvdt\Repository\QuizCandidateRepository; use Tvdt\Repository\QuizCandidateRepository;
#[Gedmo\SoftDeleteable]
#[ORM\Entity(repositoryClass: QuizCandidateRepository::class)] #[ORM\Entity(repositoryClass: QuizCandidateRepository::class)]
#[ORM\UniqueConstraint(columns: ['candidate_id', 'quiz_id'])] #[ORM\UniqueConstraint(columns: ['candidate_id', 'quiz_id'])]
class QuizCandidate class QuizCandidate
{ {
use SoftDeleteableEntity;
#[ORM\Column(type: UuidType::NAME, unique: true)] #[ORM\Column(type: UuidType::NAME, unique: true)]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')] #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
#[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\GeneratedValue(strategy: 'CUSTOM')]
-7
View File
@@ -89,13 +89,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this->password; return $this->password;
} }
/** @see UserInterface */
public function eraseCredentials(): void
{
// If you store any temporary, sensitive data on the user, clear it here
// $this->plainPassword = null;
}
public function addSeason(Season $season): static public function addSeason(Season $season): static
{ {
if (!$this->seasons->contains($season)) { if (!$this->seasons->contains($season)) {
+23 -29
View File
@@ -3,39 +3,33 @@
{% block title %}Log in{% endblock %} {% block title %}Log in{% endblock %}
{% block body %} {% block body %}
{% if app.user %} <form method="post">
<h1 class="py-2 h3 mb-3 font-weight-normal">{{ 'Please sign in'|trans }}</h1>
<div class="mb-3"> <div class="mb-3">
You are logged in as {{ app.user.userIdentifier }}, <a href="{{ path('tvdt_login_logout') }}">Logout</a> <label for="username" class="form-label">{{ 'Email'|trans }}</label>
<input type="email" value="{{ last_username }}" name="_username" id="username" class="form-control"
autocomplete="email" required autofocus>
</div> </div>
{% else %}
<form method="post">
<h1 class="py-2 h3 mb-3 font-weight-normal">{{ 'Please sign in'|trans }}</h1>
<div class="mb-3">
<label for="username" class="form-label">{{ 'Email'|trans }}</label>
<input type="email" value="{{ last_username }}" name="_username" id="username" class="form-control"
autocomplete="email" required autofocus>
</div>
<div class="mb-3"> <div class="mb-3">
<label for="password" class="form-label">{{ 'Password'|trans }}</label> <label for="password" class="form-label">{{ 'Password'|trans }}</label>
<input type="password" name="_password" id="password" class="form-control" <input type="password" name="_password" id="password" class="form-control"
autocomplete="current-password" autocomplete="current-password"
required> required>
</div> </div>
<input type="hidden" name="_csrf_token" data-controller="csrf-protection" <input type="hidden" name="_csrf_token" data-controller="csrf-protection"
value="{{ csrf_token('authenticate') }}"> value="{{ csrf_token('authenticate') }}">
<div class="mb-3 form-check"> <div class="mb-3 form-check">
<input type="checkbox" name="_remember_me" id="_remember_me" class="form-check-input"> <input type="checkbox" name="_remember_me" id="_remember_me" class="form-check-input" checked>
<label for="_remember_me" class="form-check-label">{{ 'Remember me'|trans }}</label> <label for="_remember_me" class="form-check-label">{{ 'Remember me'|trans }}</label>
</div> </div>
<button class="btn btn-lg btn-primary" type="submit"> <button class="btn btn-lg btn-primary" type="submit">
{{ 'Sign in'|trans }} {{ 'Sign in'|trans }}
</button> </button>
<a href="{{ path('tvdt_register') }}" <a href="{{ path('tvdt_register') }}"
class="btn btn-link">{{ 'Create an account'|trans }}</a> class="btn btn-link">{{ 'Create an account'|trans }}</a>
</form> </form>
{% endif %}
{% endblock %} {% endblock %}
@@ -15,6 +15,7 @@
<div class="row"> <div class="row">
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<form method="post"> <form method="post">
<input type="hidden" name="_token" value="{{ csrf_token('prepare_elimination') }}">
{%~ for candidate, colour in elimination.data %} {%~ for candidate, colour in elimination.data %}
<div class="row mb-3"> <div class="row mb-3">
<label for="colour-{{ candidate|lower }}" class="col-4 col-form-label">{{ candidate }}</label> <label for="colour-{{ candidate|lower }}" class="col-4 col-form-label">{{ candidate }}</label>
@@ -1,5 +1,5 @@
<div data-controller="bo--quiz"> <div data-controller="bo--quiz">
<h4 class="mb-3">Quick actions</h4> <h4 class="mb-3">{{ 'Quick actions'|trans }}</h4>
<div class="mb-3 btn-group"> <div class="mb-3 btn-group">
{% if quiz is same as (season.activeQuiz) %} {% if quiz is same as (season.activeQuiz) %}
@@ -28,7 +28,8 @@
data-bs-target="#question-{{ loop.index0 }}" data-bs-target="#question-{{ loop.index0 }}"
aria-controls="question-{{ loop.index0 }}"> aria-controls="question-{{ loop.index0 }}">
{% set questionError = questionErrors[question.id.toString] ?? null %} {% set questionError = questionErrors[question.id.toString] ?? null %}
<span class="badge rounded-pill me-2{% if questionError %} text-bg-danger{% else %} invisible{% endif %}"{% if questionError %} data-bs-toggle="tooltip" title="{{ questionError }}"{% endif %}>!</span> <span
class="badge rounded-pill me-2{% if questionError %} text-bg-danger{% else %} invisible{% endif %}"{% if questionError %} data-bs-toggle="tooltip" title="{{ questionError }}"{% endif %}>!</span>
{{~ loop.index -}}. {{ question.question -}} {{~ loop.index -}}. {{ question.question -}}
</button> </button>
</h2> </h2>
+75 -74
View File
@@ -1,77 +1,78 @@
<h4 class="mb-3">{{ 'Score'|trans }}</h4> <h4 class="mb-3">{{ 'Score'|trans }}</h4>
<div class="btn-toolbar mb-3" role="toolbar"> <div class="btn-toolbar mb-3" role="toolbar">
<div class="btn-group me-2"> <div class="btn-group me-2">
{# <a class="btn btn-primary">{{ 'Start Elimination'|trans }}</a> #} {# <a class="btn btn-primary">{{ 'Start Elimination'|trans }}</a> #}
<a href="{{ path('tvdt_prepare_elimination', {seasonCode: season.seasonCode, quiz: quiz.id}) }}" <a href="{{ path('tvdt_prepare_elimination', {seasonCode: season.seasonCode, quiz: quiz.id}) }}"
class="btn btn-secondary">{{ 'Prepare Custom Elimination'|trans }}</a> class="btn btn-secondary">{{ 'Prepare Custom Elimination'|trans }}</a>
{%~ if not quiz.eliminations.empty %} {%~ if not quiz.eliminations.empty %}
<button class="btn btn-secondary dropdown-toggle" <button class="btn btn-secondary dropdown-toggle"
data-bs-toggle="dropdown">{{ 'Load Prepared Elimination'|trans }}</button> data-bs-toggle="dropdown">{{ 'Load Prepared Elimination'|trans }}</button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{%~ for elimination in quiz.eliminations %} {%~ for elimination in quiz.eliminations %}
<li><a class="dropdown-item" <li><a class="dropdown-item"
href="{{ path('tvdt_prepare_elimination_view', {elimination: elimination.id}) }}">{{ elimination.created|format_datetime() }}</a> href="{{ path('tvdt_prepare_elimination_view', {elimination: elimination.id}) }}">{{ elimination.createdAt|format_datetime() }}</a>
</li> </li>
{%~ endfor %} {%~ endfor %}
</ul> </ul>
{% endif %} {% endif %}
</div>
</div> </div>
<p class="mb-3">{{ 'Number of dropouts:'|trans }} {{ quiz.dropouts }} </p> </div>
<table class="table table-hover mb-3"> <p class="mb-3">{{ 'Number of dropouts:'|trans }} {{ quiz.dropouts }} </p>
<thead> <table class="table table-hover mb-3">
<tr> <thead>
<th scope="col">{{ 'Candidate'|trans }}</th> <tr>
<th style="width: 15%" scope="col">{{ 'Correct Answers'|trans }}</th> <th scope="col">{{ 'Candidate'|trans }}</th>
<th style="width: 20%" scope="col">{{ 'Corrections'|trans }}</th> <th style="width: 15%" scope="col">{{ 'Correct Answers'|trans }}</th>
<th style="width: 20%" scope="col">{{ 'Penalty'|trans }}</th> <th style="width: 20%" scope="col">{{ 'Corrections'|trans }}</th>
<th style="width: 10%" scope="col">{{ 'Score'|trans }}</th> <th style="width: 20%" scope="col">{{ 'Penalty'|trans }}</th>
<th style="width: 20%" scope="col">{{ 'Time'|trans }}</th> <th style="width: 10%" scope="col">{{ 'Score'|trans }}</th>
<th style="width: 20%" scope="col">{{ 'Time'|trans }}</th>
</tr>
</thead>
<tbody>
{%~ for candidate in result ~%}
<tr class="table-{% if loop.revindex > quiz.dropouts %}success{% else %}danger{% endif %}">
<td>{{ candidate.name }}</td>
<td>{{ candidate.correct|default('0') }}</td>
<td>
<form method="post"
action="{{ path('tvdt_backoffice_modify_correction', {quiz: quiz.id, candidate: candidate.id}) }}">
<input type="hidden" name="_token" value="{{ csrf_token('candidate_correction') }}">
<div class="row">
<div class="col-8">
<input class="form-control form-control-sm" type="number"
value="{{ candidate.corrections }}" step="0.5"
name="corrections">
</div>
<div class="col-2">
<button class="btn btn-sm btn-primary" type="submit">{{ 'Save'|trans }}</button>
</div>
</div>
</form>
</td>
<td>
<form method="post"
action="{{ path('tvdt_backoffice_modify_penalty', {quiz: quiz.id, candidate: candidate.id}) }}">
<input type="hidden" name="_token" value="{{ csrf_token('candidate_penalty') }}">
<div class="row">
<div class="col-8">
<input class="form-control form-control-sm" type="number"
value="{{ candidate.penaltySeconds }}" step="1"
name="penalty">
</div>
<div class="col-2">
<button class="btn btn-sm btn-primary" type="submit">{{ 'Save'|trans }}</button>
</div>
</div>
</form>
</td>
<td>{{ candidate.score|default('x') }}</td>
<td>{{ candidate.time.format('%i:%S') }}</td>
</tr> </tr>
</thead> {% else %}
<tbody> <tr>
{%~ for candidate in result ~%} <td colspan="6">{{ 'No results'|trans }}</td>
<tr class="table-{% if loop.revindex > quiz.dropouts %}success{% else %}danger{% endif %}"> </tr>
<td>{{ candidate.name }}</td> {% endfor %}
<td>{{ candidate.correct|default('0') }}</td> </tbody>
<td> </table>
<form method="post"
action="{{ path('tvdt_backoffice_modify_correction', {quiz: quiz.id, candidate: candidate.id}) }}">
<div class="row">
<div class="col-8">
<input class="form-control form-control-sm" type="number"
value="{{ candidate.corrections }}" step="0.5"
name="corrections">
</div>
<div class="col-2">
<button class="btn btn-sm btn-primary" type="submit">{{ 'Save'|trans }}</button>
</div>
</div>
</form>
</td>
<td>
<form method="post"
action="{{ path('tvdt_backoffice_modify_penalty', {quiz: quiz.id, candidate: candidate.id}) }}">
<input type="hidden" name="_token" value="{{ csrf_token('candidate_answer') }}">
<div class="row">
<div class="col-8">
<input class="form-control form-control-sm" type="number"
value="{{ candidate.penaltySeconds }}" step="1"
name="penalty">
</div>
<div class="col-2">
<button class="btn btn-sm btn-primary" type="submit">{{ 'Save'|trans }}</button>
</div>
</div>
</form>
</td>
<td>{{ candidate.score|default('x') }}</td>
<td>{{ candidate.time.format('%i:%S') }}</td>
</tr>
{% else %}
<tr>
<td colspan="5">{{ 'No results'|trans }}</td>
</tr>
{% endfor %}
</tbody>
</table>
+1 -1
View File
@@ -13,7 +13,7 @@
{% block body %} {% block body %}
<div class="row"> <div class="row">
<div class="col-md-6 col-12"> <div class="col-md-6 col-12">
<h2 class="mb-3">{{ t('Add a quiz to %name%', {'%name%': season.name})|trans }} </h2> <h2 class="mb-3">{{ t('Add a quiz to {name}', {name: season.name})|trans }} </h2>
{{ form_start(form) }} {{ form_start(form) }}
{{ form_row(form.name) }} {{ form_row(form.name) }}
{{ form_row(form.sheet) }} {{ form_row(form.sheet) }}
+1 -1
View File
@@ -4,7 +4,7 @@
{% for label, messages in flashes %} {% for label, messages in flashes %}
{% for message in messages %} {% for message in messages %}
<div class="alert alert-{{ label }} alert-dismissible " role="alert"> <div class="alert alert-{{ label }} alert-dismissible " role="alert">
{{ message }} {{ message|trans }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div> </div>
{% endfor %} {% endfor %}
+13 -9
View File
@@ -37,9 +37,9 @@
<source>Add Quiz</source> <source>Add Quiz</source>
<target>Test toevoegen</target> <target>Test toevoegen</target>
</trans-unit> </trans-unit>
<trans-unit id="ehB6pAw" resname="Add a quiz to %name%"> <trans-unit id="apgpM9w" resname="Add a quiz to {name}">
<source>Add a quiz to %name%</source> <source>Add a quiz to {name}</source>
<target>Voeg een test toe aan %name%</target> <target>Voeg een test toe aan {name}</target>
</trans-unit> </trans-unit>
<trans-unit id="qiXD5ve" resname="All Seasons"> <trans-unit id="qiXD5ve" resname="All Seasons">
<source>All Seasons</source> <source>All Seasons</source>
@@ -109,13 +109,13 @@
<source>Corrections</source> <source>Corrections</source>
<target>Jokers</target> <target>Jokers</target>
</trans-unit> </trans-unit>
<trans-unit id="Lu7u8U2" resname="Cound not find candidate with name %name%"> <trans-unit id="9JHLsoe" resname="Could not find candidate with name {name}">
<source>Cound not find candidate with name %name%</source> <source>Could not find candidate with name {name}</source>
<target>Kon kandidaat met naam %name% niet vinden</target> <target>Kon kandidaat met naam {name} niet vinden</target>
</trans-unit> </trans-unit>
<trans-unit id="YQUiB4T" resname="Cound not find candidate with name %name% in elimination."> <trans-unit id="h589jDz" resname="Could not find candidate with name {name} in elimination.">
<source>Cound not find candidate with name %name% in elimination.</source> <source>Could not find candidate with name {name} in elimination.</source>
<target>Kon geen kandidaat vinden met de naam %name% in de eliminatie</target> <target>Kon geen kandidaat vinden met de naam {name} in de eliminatie</target>
</trans-unit> </trans-unit>
<trans-unit id="0DvmToq" resname="Create a season"> <trans-unit id="0DvmToq" resname="Create a season">
<source>Create a season</source> <source>Create a season</source>
@@ -301,6 +301,10 @@
<source>Questions</source> <source>Questions</source>
<target>Vragen</target> <target>Vragen</target>
</trans-unit> </trans-unit>
<trans-unit id="1jiUI_8" resname="Quick actions">
<source>Quick actions</source>
<target>Snelle acties</target>
</trans-unit>
<trans-unit id="0tv0gq." resname="Quiz"> <trans-unit id="0tv0gq." resname="Quiz">
<source>Quiz</source> <source>Quiz</source>
<target>Test</target> <target>Test</target>