From d3e5cb0569a5fe3a67ba1e0086b82e8a89fe761b Mon Sep 17 00:00:00 2001 From: Marijn Doeve Date: Fri, 30 May 2025 20:38:20 +0200 Subject: [PATCH] Refactor elimination feature and improve backoffice usability 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. --- .github/workflows/ci.yml | 4 +- .gitignore | 5 + .idea/TijdVoorDeTest.iml | 5 + .idea/php.xml | 305 ++-- Dockerfile | 5 +- assets/backoffice.js | 4 + {public => assets}/img/background.png | Bin assets/styles/quiz.scss | 12 + compose.override.yaml | 11 + composer.json | 40 +- composer.lock | 1331 +++++++++++------ config/bundles.php | 2 + .../Backoffice/BackofficeController.php | 79 + src/Controller/Backoffice/QuizController.php | 50 + .../Backoffice/SeasonController.php | 88 ++ src/Controller/BackofficeController.php | 167 --- src/Controller/LoginController.php | 12 +- .../PrepareEliminationController.php | 17 +- src/Controller/RegistrationController.php | 4 +- src/Entity/Elimination.php | 38 +- src/Entity/Quiz.php | 9 +- src/Factory/EliminationFactory.php | 38 + src/Form/AddCandidatesFormType.php | 2 +- src/Form/CreateSeasonFormType.php | 1 + src/Form/EnterNameType.php | 6 +- src/Form/RegistrationFormType.php | 13 +- src/Form/SelectSeasonType.php | 2 +- src/Form/UploadQuizFormType.php | 2 + src/Repository/CandidateRepository.php | 9 +- src/Service/QuizSpreadsheetService.php | 4 +- symfony.lock | 18 + templates/backoffice/base.html.twig | 52 +- .../{ => backoffice}/login/login.html.twig | 0 .../prepare_elimination/index.html.twig | 37 + templates/backoffice/quiz.html.twig | 39 +- templates/backoffice/quiz_add.html.twig | 2 +- .../registration/confirmation_email.html.twig | 0 .../registration/register.html.twig | 0 templates/base.html.twig | 29 + templates/flashes.html.twig | 13 + templates/prepare_elimination/index.html.twig | 26 - templates/quiz/base.html.twig | 57 +- .../elimination/candidate.html.twig | 0 .../{ => quiz}/elimination/index.html.twig | 0 translations/messages+intl-icu.nl.yaml | 9 +- 45 files changed, 1569 insertions(+), 978 deletions(-) create mode 100644 assets/backoffice.js rename {public => assets}/img/background.png (100%) create mode 100644 assets/styles/quiz.scss create mode 100644 src/Controller/Backoffice/BackofficeController.php create mode 100644 src/Controller/Backoffice/QuizController.php create mode 100644 src/Controller/Backoffice/SeasonController.php delete mode 100644 src/Controller/BackofficeController.php create mode 100644 src/Factory/EliminationFactory.php rename templates/{ => backoffice}/login/login.html.twig (100%) rename templates/{ => backoffice}/registration/confirmation_email.html.twig (100%) rename templates/{ => backoffice}/registration/register.html.twig (100%) create mode 100644 templates/base.html.twig create mode 100644 templates/flashes.html.twig delete mode 100644 templates/prepare_elimination/index.html.twig rename templates/{ => quiz}/elimination/candidate.html.twig (100%) rename templates/{ => quiz}/elimination/index.html.twig (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 96dd4aa..4d56b58 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,7 +33,9 @@ jobs: *.cache-from=type=gha,scope=refs/heads/main *.cache-to=type=gha,scope=${{github.ref}},mode=max - name: Start services - run: docker compose up --wait --no-build + run: docker compose up php --wait --no-build + - name: Lint Twig templates + run: php bin/console lint:twig --format=github templates - name: Coding Style run: docker compose exec -T php vendor/bin/php-cs-fixer check --diff --show-progress=none - name: Twig Coding Style diff --git a/.gitignore b/.gitignore index 7c932e2..845ecd4 100644 --- a/.gitignore +++ b/.gitignore @@ -114,3 +114,8 @@ phpstan.neon .phpunit.result.cache /phpunit.xml ###< symfony/phpunit-bridge ### + +###> symfony/asset-mapper ### +/public/assets/ +/assets/vendor/ +###< symfony/asset-mapper ### diff --git a/.idea/TijdVoorDeTest.iml b/.idea/TijdVoorDeTest.iml index 3d04ddc..2922a68 100644 --- a/.idea/TijdVoorDeTest.iml +++ b/.idea/TijdVoorDeTest.iml @@ -159,6 +159,11 @@ + + + + + diff --git a/.idea/php.xml b/.idea/php.xml index 19ac489..f2c155a 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -1,5 +1,17 @@ + + + + + + + + + + + @@ -29,159 +41,164 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dockerfile b/Dockerfile index 41c34c3..11f5f13 100644 --- a/Dockerfile +++ b/Dockerfile @@ -99,4 +99,7 @@ RUN set -eux; \ composer dump-autoload --classmap-authoritative --no-dev; \ composer dump-env prod; \ composer run-script --no-dev post-install-cmd; \ - chmod +x bin/console; sync; + chmod +x bin/console; \ + bin/console sass:build \ + bin/console asset-map:compile --no-debug --quiet --no-ansi; \ + sync; diff --git a/assets/backoffice.js b/assets/backoffice.js new file mode 100644 index 0000000..ac508f3 --- /dev/null +++ b/assets/backoffice.js @@ -0,0 +1,4 @@ +import 'bootstrap/dist/css/bootstrap.min.css' +import * as bootstrap from 'bootstrap' + +import './styles/app.scss'; diff --git a/public/img/background.png b/assets/img/background.png similarity index 100% rename from public/img/background.png rename to assets/img/background.png diff --git a/assets/styles/quiz.scss b/assets/styles/quiz.scss new file mode 100644 index 0000000..61c451c --- /dev/null +++ b/assets/styles/quiz.scss @@ -0,0 +1,12 @@ +html, body { + height: 100%; + background-image: url("../img/background.png"); + background-position: center center; + background-repeat: no-repeat; + background-color: black; + color: white; + + display: grid; + align-items: center; + justify-self: center; +} diff --git a/compose.override.yaml b/compose.override.yaml index 63c48db..fe5b7c5 100644 --- a/compose.override.yaml +++ b/compose.override.yaml @@ -31,6 +31,17 @@ services: - target: 443 published: ${HTTP3_PORT:-443} protocol: udp + sass: + image: ${IMAGES_PREFIX:-}app-php + volumes: + - ./:/app + entrypoint: '' + depends_on: + - php + command: + - bin/console + - sass:build + - --watch ###> symfony/mercure-bundle ### ###< symfony/mercure-bundle ### diff --git a/composer.json b/composer.json index 0a01d1d..f3eb576 100644 --- a/composer.json +++ b/composer.json @@ -11,18 +11,19 @@ "ext-iconv": "*", "doctrine/dbal": "^4.2.3", "doctrine/doctrine-bundle": "^2.14.0", - "doctrine/doctrine-migrations-bundle": "^3.4.1", - "doctrine/orm": "^3.3.2", - "easycorp/easyadmin-bundle": "^4.24.6", - "phpdocumentor/reflection-docblock": "^5.6", - "phpoffice/phpspreadsheet": "*", + "doctrine/doctrine-migrations-bundle": "^3.4.2", + "doctrine/orm": "^3.3.3", + "easycorp/easyadmin-bundle": "^4.24.7", + "phpdocumentor/reflection-docblock": "^5.6.2", + "phpoffice/phpspreadsheet": "^4.2.0", "phpstan/phpdoc-parser": "^2.1", "runtime/frankenphp-symfony": "^0.2.0", "sentry/sentry-symfony": "^5.2", "symfony/asset": "7.2.*", + "symfony/asset-mapper": "7.2.*", "symfony/console": "7.2.*", "symfony/dotenv": "7.2.*", - "symfony/flex": "^2.5.0", + "symfony/flex": "^2.7.0", "symfony/form": "7.2.*", "symfony/framework-bundle": "7.2.*", "symfony/mailer": "7.2.*", @@ -35,28 +36,32 @@ "symfony/twig-bundle": "7.2.*", "symfony/uid": "7.2.*", "symfony/yaml": "7.2.*", + "symfonycasts/sass-bundle": "^0.8.2", "symfonycasts/verify-email-bundle": "^1.17.3", - "thecodingmachine/safe": "^3.1.0" + "thecodingmachine/safe": "^3.3.0", + "twig/extra-bundle": "^3.21", + "twig/intl-extra": "^3.21", + "twig/twig": "^3.21.1" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^4.1", "friendsofphp/php-cs-fixer": "^3.75.0", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.1.12", - "phpstan/phpstan-doctrine": "^2.0.2", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-doctrine": "^2.0.3", "phpstan/phpstan-phpunit": "^2.0.6", - "phpstan/phpstan-symfony": "^2.0.4", - "phpunit/phpunit": "^12.1.3", - "rector/rector": "^2.0.12", + "phpstan/phpstan-symfony": "^2.0.6", + "phpunit/phpunit": "^12.1.6", + "rector/rector": "^2.0.16", "roave/security-advisories": "dev-latest", "symfony/browser-kit": "7.2.*", "symfony/css-selector": "7.2.*", - "symfony/maker-bundle": "^1.62.1", - "symfony/phpunit-bridge": "^7.2", + "symfony/maker-bundle": "^1.63.0", + "symfony/phpunit-bridge": "7.2.*", "symfony/stopwatch": "7.2.*", "symfony/web-profiler-bundle": "7.2.*", - "thecodingmachine/phpstan-safe-rule": "^1.4", - "vincentlanglet/twig-cs-fixer": "^3.5.1" + "thecodingmachine/phpstan-safe-rule": "^1.4.1", + "vincentlanglet/twig-cs-fixer": "^3.7.1" }, "config": { "allow-plugins": { @@ -94,7 +99,8 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd" + "assets:install %PUBLIC_DIR%": "symfony-cmd", + "importmap:install": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" diff --git a/composer.lock b/composer.lock index 3fc64ec..9176628 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "eeae1ea54653efd8d35df74995953ea0", + "content-hash": "a42d81785aafd03b84dac3f6d813d5c2", "packages": [ { "name": "composer/pcre", @@ -85,6 +85,87 @@ ], "time": "2024-11-12T16:29:46+00:00" }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, { "name": "doctrine/collections", "version": "2.3.0", @@ -449,16 +530,16 @@ }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.4.1", + "version": "3.4.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "e858ce0f5c12b266dce7dce24834448355155da7" + "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/e858ce0f5c12b266dce7dce24834448355155da7", - "reference": "e858ce0f5c12b266dce7dce24834448355155da7", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9", + "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9", "shasum": "" }, "require": { @@ -472,7 +553,6 @@ "composer/semver": "^3.0", "doctrine/coding-standard": "^12", "doctrine/orm": "^2.6 || ^3", - "doctrine/persistence": "^2.0 || ^3", "phpstan/phpstan": "^1.4 || ^2", "phpstan/phpstan-deprecation-rules": "^1 || ^2", "phpstan/phpstan-phpunit": "^1 || ^2", @@ -515,7 +595,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2" }, "funding": [ { @@ -531,7 +611,7 @@ "type": "tidelift" } ], - "time": "2025-01-27T22:48:22+00:00" + "time": "2025-03-11T17:36:26+00:00" }, { "name": "doctrine/event-manager", @@ -967,16 +1047,16 @@ }, { "name": "doctrine/orm", - "version": "3.3.2", + "version": "3.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "c9557c588b3a70ed93caff069d0aa75737f25609" + "reference": "1f1891d3e20ef9881e81c2f32c53e9dc88dfc9a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/c9557c588b3a70ed93caff069d0aa75737f25609", - "reference": "c9557c588b3a70ed93caff069d0aa75737f25609", + "url": "https://api.github.com/repos/doctrine/orm/zipball/1f1891d3e20ef9881e81c2f32c53e9dc88dfc9a7", + "reference": "1f1891d3e20ef9881e81c2f32c53e9dc88dfc9a7", "shasum": "" }, "require": { @@ -996,7 +1076,7 @@ "symfony/var-exporter": "^6.3.9 || ^7.0" }, "require-dev": { - "doctrine/coding-standard": "^12.0", + "doctrine/coding-standard": "^13.0", "phpbench/phpbench": "^1.0", "phpdocumentor/guides-cli": "^1.4", "phpstan/extension-installer": "^1.4", @@ -1004,7 +1084,7 @@ "phpstan/phpstan-deprecation-rules": "^2", "phpunit/phpunit": "^10.4.0", "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.7.2", + "squizlabs/php_codesniffer": "3.12.0", "symfony/cache": "^5.4 || ^6.2 || ^7.0" }, "suggest": { @@ -1051,9 +1131,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.3.2" + "source": "https://github.com/doctrine/orm/tree/3.3.3" }, - "time": "2025-02-04T19:43:15+00:00" + "time": "2025-05-02T17:42:51+00:00" }, { "name": "doctrine/persistence", @@ -1207,16 +1287,16 @@ }, { "name": "easycorp/easyadmin-bundle", - "version": "v4.24.6", + "version": "v4.24.7", "source": { "type": "git", "url": "https://github.com/EasyCorp/EasyAdminBundle.git", - "reference": "c5e4496c4c96d67385c48e285c463e0f5a8947e7" + "reference": "b61cd46c454d853438ded3ca21eac1ad537589aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/c5e4496c4c96d67385c48e285c463e0f5a8947e7", - "reference": "c5e4496c4c96d67385c48e285c463e0f5a8947e7", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/b61cd46c454d853438ded3ca21eac1ad537589aa", + "reference": "b61cd46c454d853438ded3ca21eac1ad537589aa", "shasum": "" }, "require": { @@ -1297,7 +1377,7 @@ ], "support": { "issues": "https://github.com/EasyCorp/EasyAdminBundle/issues", - "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.24.6" + "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.24.7" }, "funding": [ { @@ -1305,7 +1385,7 @@ "type": "github" } ], - "time": "2025-04-12T13:53:15+00:00" + "time": "2025-05-14T17:55:05+00:00" }, { "name": "egulias/email-validator", @@ -2622,16 +2702,16 @@ }, { "name": "sentry/sentry", - "version": "4.11.0", + "version": "4.11.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "ebf67deb9902b6da58a4b3383cbd12fed3f4f555" + "reference": "53dc0bcb6a667cac5b760b46f98d5380e63e02ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/ebf67deb9902b6da58a4b3383cbd12fed3f4f555", - "reference": "ebf67deb9902b6da58a4b3383cbd12fed3f4f555", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/53dc0bcb6a667cac5b760b46f98d5380e63e02ca", + "reference": "53dc0bcb6a667cac5b760b46f98d5380e63e02ca", "shasum": "" }, "require": { @@ -2695,7 +2775,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.11.0" + "source": "https://github.com/getsentry/sentry-php/tree/4.11.1" }, "funding": [ { @@ -2707,7 +2787,7 @@ "type": "custom" } ], - "time": "2025-04-14T09:04:23+00:00" + "time": "2025-05-12T11:30:33+00:00" }, { "name": "sentry/sentry-symfony", @@ -2881,17 +2961,96 @@ "time": "2024-10-25T15:15:23+00:00" }, { - "name": "symfony/cache", + "name": "symfony/asset-mapper", "version": "v7.2.5", "source": { "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c" + "url": "https://github.com/symfony/asset-mapper.git", + "reference": "6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/9131e3018872d2ebb6fe8a9a4d6631273513d42c", - "reference": "9131e3018872d2ebb6fe8a9a4d6631273513d42c", + "url": "https://api.github.com/repos/symfony/asset-mapper/zipball/6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8", + "reference": "6428e4b6d8cff9c5fe6f40ddbee4c9f6bfdaa0b8", + "shasum": "" + }, + "require": { + "composer/semver": "^3.0", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^7.1", + "symfony/http-client": "^6.4|^7.0" + }, + "conflict": { + "symfony/framework-bundle": "<6.4" + }, + "require-dev": { + "symfony/asset": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/event-dispatcher-contracts": "^3.0", + "symfony/finder": "^6.4|^7.0", + "symfony/framework-bundle": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\AssetMapper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps directories of assets & makes them available in a public directory with versioned filenames.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/asset-mapper/tree/v7.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-03-26T11:29:07+00:00" + }, + { + "name": "symfony/cache", + "version": "v7.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "8b49dde3f5a5e9867595a3a269977f78418d75ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/8b49dde3f5a5e9867595a3a269977f78418d75ee", + "reference": "8b49dde3f5a5e9867595a3a269977f78418d75ee", "shasum": "" }, "require": { @@ -2960,7 +3119,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.2.5" + "source": "https://github.com/symfony/cache/tree/v7.2.6" }, "funding": [ { @@ -2976,7 +3135,7 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-04-08T09:06:23+00:00" }, { "name": "symfony/cache-contracts", @@ -3130,16 +3289,16 @@ }, { "name": "symfony/config", - "version": "v7.2.3", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7716594aaae91d9141be080240172a92ecca4d44" + "reference": "e0b050b83ba999aa77a3736cb6d5b206d65b9d0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7716594aaae91d9141be080240172a92ecca4d44", - "reference": "7716594aaae91d9141be080240172a92ecca4d44", + "url": "https://api.github.com/repos/symfony/config/zipball/e0b050b83ba999aa77a3736cb6d5b206d65b9d0d", + "reference": "e0b050b83ba999aa77a3736cb6d5b206d65b9d0d", "shasum": "" }, "require": { @@ -3185,7 +3344,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.2.3" + "source": "https://github.com/symfony/config/tree/v7.2.6" }, "funding": [ { @@ -3201,20 +3360,20 @@ "type": "tidelift" } ], - "time": "2025-01-22T12:07:01+00:00" + "time": "2025-04-03T21:14:15+00:00" }, { "name": "symfony/console", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88" + "reference": "0e2e3f38c192e93e622e41ec37f4ca70cfedf218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88", + "url": "https://api.github.com/repos/symfony/console/zipball/0e2e3f38c192e93e622e41ec37f4ca70cfedf218", + "reference": "0e2e3f38c192e93e622e41ec37f4ca70cfedf218", "shasum": "" }, "require": { @@ -3278,7 +3437,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.5" + "source": "https://github.com/symfony/console/tree/v7.2.6" }, "funding": [ { @@ -3294,20 +3453,20 @@ "type": "tidelift" } ], - "time": "2025-03-12T08:11:12+00:00" + "time": "2025-04-07T19:09:28+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "58ab71379f14a741755717cece2868bf41ed45d8" + "reference": "2ca85496cde37f825bd14f7e3548e2793ca90712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/58ab71379f14a741755717cece2868bf41ed45d8", - "reference": "58ab71379f14a741755717cece2868bf41ed45d8", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ca85496cde37f825bd14f7e3548e2793ca90712", + "reference": "2ca85496cde37f825bd14f7e3548e2793ca90712", "shasum": "" }, "require": { @@ -3358,7 +3517,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.2.5" + "source": "https://github.com/symfony/dependency-injection/tree/v7.2.6" }, "funding": [ { @@ -3374,7 +3533,7 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-04-27T13:37:55+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3445,16 +3604,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "f8a298bbb8eaca08d787bf4d4c74728f1cf98922" + "reference": "d030ea0d45746bf58d7905402bd45e9c35d412dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/f8a298bbb8eaca08d787bf4d4c74728f1cf98922", - "reference": "f8a298bbb8eaca08d787bf4d4c74728f1cf98922", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d030ea0d45746bf58d7905402bd45e9c35d412dd", + "reference": "d030ea0d45746bf58d7905402bd45e9c35d412dd", "shasum": "" }, "require": { @@ -3534,7 +3693,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.2.6" }, "funding": [ { @@ -3550,7 +3709,7 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-04-27T13:34:41+00:00" }, { "name": "symfony/dotenv", @@ -3989,16 +4148,16 @@ }, { "name": "symfony/flex", - "version": "v2.5.0", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018" + "reference": "5d743b3b78fabe9f3146586d77b0a1f9292851fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/8ce1acd9842abe0e9b4c4a0bd3f259859516c018", - "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018", + "url": "https://api.github.com/repos/symfony/flex/zipball/5d743b3b78fabe9f3146586d77b0a1f9292851fc", + "reference": "5d743b3b78fabe9f3146586d77b0a1f9292851fc", "shasum": "" }, "require": { @@ -4037,7 +4196,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.5.0" + "source": "https://github.com/symfony/flex/tree/v2.7.0" }, "funding": [ { @@ -4053,20 +4212,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:50:46+00:00" + "time": "2025-05-23T11:41:40+00:00" }, { "name": "symfony/form", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "81c5d4630d58a5ca3cfa7ac6f44070ed02568009" + "reference": "e4e75b930d7a1ccd47bd3273c859c28e13d89b08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/81c5d4630d58a5ca3cfa7ac6f44070ed02568009", - "reference": "81c5d4630d58a5ca3cfa7ac6f44070ed02568009", + "url": "https://api.github.com/repos/symfony/form/zipball/e4e75b930d7a1ccd47bd3273c859c28e13d89b08", + "reference": "e4e75b930d7a1ccd47bd3273c859c28e13d89b08", "shasum": "" }, "require": { @@ -4134,7 +4293,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.2.5" + "source": "https://github.com/symfony/form/tree/v7.2.6" }, "funding": [ { @@ -4150,7 +4309,7 @@ "type": "tidelift" } ], - "time": "2025-03-28T12:59:59+00:00" + "time": "2025-04-30T07:52:47+00:00" }, { "name": "symfony/framework-bundle", @@ -4303,17 +4462,190 @@ "time": "2025-03-24T12:37:32+00:00" }, { - "name": "symfony/http-foundation", - "version": "v7.2.5", + "name": "symfony/http-client", + "version": "v7.2.4", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" + "url": "https://github.com/symfony/http-client.git", + "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", + "url": "https://api.github.com/repos/symfony/http-client/zipball/78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", + "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-13T10:27:23+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645", + "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-07T08:49:48+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "6023ec7607254c87c5e69fb3558255aca440d72b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6023ec7607254c87c5e69fb3558255aca440d72b", + "reference": "6023ec7607254c87c5e69fb3558255aca440d72b", "shasum": "" }, "require": { @@ -4362,7 +4694,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.6" }, "funding": [ { @@ -4378,20 +4710,20 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-04-09T08:14:01+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" + "reference": "f9dec01e6094a063e738f8945ef69c0cfcf792ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9dec01e6094a063e738f8945ef69c0cfcf792ec", + "reference": "f9dec01e6094a063e738f8945ef69c0cfcf792ec", "shasum": "" }, "require": { @@ -4476,7 +4808,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.6" }, "funding": [ { @@ -4492,20 +4824,20 @@ "type": "tidelift" } ], - "time": "2025-03-28T13:32:50+00:00" + "time": "2025-05-02T09:04:03+00:00" }, { "name": "symfony/intl", - "version": "v7.2.0", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "76bb3462c6c308f8bd97d3c178c2626ae44d4dea" + "reference": "f8a603f978b035d3a1dc23977fc8ae57558177ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/76bb3462c6c308f8bd97d3c178c2626ae44d4dea", - "reference": "76bb3462c6c308f8bd97d3c178c2626ae44d4dea", + "url": "https://api.github.com/repos/symfony/intl/zipball/f8a603f978b035d3a1dc23977fc8ae57558177ad", + "reference": "f8a603f978b035d3a1dc23977fc8ae57558177ad", "shasum": "" }, "require": { @@ -4562,7 +4894,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.2.0" + "source": "https://github.com/symfony/intl/tree/v7.2.6" }, "funding": [ { @@ -4578,20 +4910,20 @@ "type": "tidelift" } ], - "time": "2024-11-25T14:26:33+00:00" + "time": "2025-04-07T19:09:28+00:00" }, { "name": "symfony/mailer", - "version": "v7.2.3", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3" + "reference": "998692469d6e698c6eadc7ef37a6530a9eabb356" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3", + "url": "https://api.github.com/repos/symfony/mailer/zipball/998692469d6e698c6eadc7ef37a6530a9eabb356", + "reference": "998692469d6e698c6eadc7ef37a6530a9eabb356", "shasum": "" }, "require": { @@ -4642,7 +4974,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.3" + "source": "https://github.com/symfony/mailer/tree/v7.2.6" }, "funding": [ { @@ -4658,20 +4990,20 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2025-04-04T09:50:51+00:00" }, { "name": "symfony/mime", - "version": "v7.2.4", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b" + "reference": "706e65c72d402539a072d0d6ad105fff6c161ef1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b", + "url": "https://api.github.com/repos/symfony/mime/zipball/706e65c72d402539a072d0d6ad105fff6c161ef1", + "reference": "706e65c72d402539a072d0d6ad105fff6c161ef1", "shasum": "" }, "require": { @@ -4726,7 +5058,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.4" + "source": "https://github.com/symfony/mime/tree/v7.2.6" }, "funding": [ { @@ -4742,7 +5074,7 @@ "type": "tidelift" } ], - "time": "2025-02-19T08:51:20+00:00" + "time": "2025-04-27T13:34:41+00:00" }, { "name": "symfony/options-resolver", @@ -4885,7 +5217,7 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -4943,7 +5275,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" }, "funding": [ { @@ -4963,16 +5295,16 @@ }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78" + "reference": "763d2a91fea5681509ca01acbc1c5e450d127811" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", - "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811", + "reference": "763d2a91fea5681509ca01acbc1c5e450d127811", "shasum": "" }, "require": { @@ -5027,7 +5359,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0" }, "funding": [ { @@ -5043,20 +5375,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-21T18:38:29+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { @@ -5110,7 +5442,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" }, "funding": [ { @@ -5126,11 +5458,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -5191,7 +5523,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" }, "funding": [ { @@ -5211,16 +5543,16 @@ }, { "name": "symfony/polyfill-php84", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd" + "reference": "000df7860439609837bbe28670b0be15783b7fbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/e5493eb51311ab0b1cc2243416613f06ed8f18bd", - "reference": "e5493eb51311ab0b1cc2243416613f06ed8f18bd", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", + "reference": "000df7860439609837bbe28670b0be15783b7fbf", "shasum": "" }, "require": { @@ -5267,7 +5599,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0" }, "funding": [ { @@ -5283,7 +5615,68 @@ "type": "tidelift" } ], - "time": "2024-09-09T12:04:04+00:00" + "time": "2025-02-20T12:04:08+00:00" + }, + { + "name": "symfony/process", + "version": "v7.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", + "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-03-13T12:21:46+00:00" }, { "name": "symfony/property-access", @@ -5797,16 +6190,16 @@ }, { "name": "symfony/security-core", - "version": "v7.2.3", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "466784ffcd0b5a16e05394335897f790b17d07e4" + "reference": "340e120d26b3bf5eee5cea0782aebaa2f36b6722" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/466784ffcd0b5a16e05394335897f790b17d07e4", - "reference": "466784ffcd0b5a16e05394335897f790b17d07e4", + "url": "https://api.github.com/repos/symfony/security-core/zipball/340e120d26b3bf5eee5cea0782aebaa2f36b6722", + "reference": "340e120d26b3bf5eee5cea0782aebaa2f36b6722", "shasum": "" }, "require": { @@ -5864,7 +6257,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.2.3" + "source": "https://github.com/symfony/security-core/tree/v7.2.6" }, "funding": [ { @@ -5880,7 +6273,7 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2025-04-17T08:47:02+00:00" }, { "name": "symfony/security-csrf", @@ -5954,16 +6347,16 @@ }, { "name": "symfony/security-http", - "version": "v7.2.4", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722" + "reference": "324425deb859c6a59a2c2414ae60f742976a193b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/8478e95e273f8daa23bf4860dbad2a09d3fb3722", - "reference": "8478e95e273f8daa23bf4860dbad2a09d3fb3722", + "url": "https://api.github.com/repos/symfony/security-http/zipball/324425deb859c6a59a2c2414ae60f742976a193b", + "reference": "324425deb859c6a59a2c2414ae60f742976a193b", "shasum": "" }, "require": { @@ -6022,7 +6415,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.2.4" + "source": "https://github.com/symfony/security-http/tree/v7.2.6" }, "funding": [ { @@ -6038,20 +6431,20 @@ "type": "tidelift" } ], - "time": "2025-02-11T16:46:20+00:00" + "time": "2025-04-07T19:09:28+00:00" }, { "name": "symfony/serializer", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d" + "reference": "be549655b034edc1a16ed23d8164aa04318c5ec1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/d8b75b2c8144c29ac43b235738411f7cca6d584d", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/be549655b034edc1a16ed23d8164aa04318c5ec1", + "reference": "be549655b034edc1a16ed23d8164aa04318c5ec1", "shasum": "" }, "require": { @@ -6120,7 +6513,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.2.5" + "source": "https://github.com/symfony/serializer/tree/v7.2.6" }, "funding": [ { @@ -6136,7 +6529,7 @@ "type": "tidelift" } ], - "time": "2025-03-24T12:37:32+00:00" + "time": "2025-04-27T13:34:41+00:00" }, { "name": "symfony/service-contracts", @@ -6285,16 +6678,16 @@ }, { "name": "symfony/string", - "version": "v7.2.0", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "reference": "a214fe7d62bd4df2a76447c67c6b26e1d5e74931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/symfony/string/zipball/a214fe7d62bd4df2a76447c67c6b26e1d5e74931", + "reference": "a214fe7d62bd4df2a76447c67c6b26e1d5e74931", "shasum": "" }, "require": { @@ -6352,7 +6745,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "source": "https://github.com/symfony/string/tree/v7.2.6" }, "funding": [ { @@ -6368,20 +6761,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2025-04-20T20:18:16+00:00" }, { "name": "symfony/translation", - "version": "v7.2.4", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" + "reference": "e7fd8e2a4239b79a0fd9fb1fef3e0e7f969c6dc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", + "url": "https://api.github.com/repos/symfony/translation/zipball/e7fd8e2a4239b79a0fd9fb1fef3e0e7f969c6dc6", + "reference": "e7fd8e2a4239b79a0fd9fb1fef3e0e7f969c6dc6", "shasum": "" }, "require": { @@ -6447,7 +6840,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.4" + "source": "https://github.com/symfony/translation/tree/v7.2.6" }, "funding": [ { @@ -6463,7 +6856,7 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-04-07T19:09:28+00:00" }, { "name": "symfony/translation-contracts", @@ -6888,16 +7281,16 @@ }, { "name": "symfony/ux-twig-component", - "version": "v2.24.0", + "version": "v2.25.2", "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "48a46e4c6215d41cc97ba8dff0cff21ea9b255a8" + "reference": "d20da25517fc09d147897d02819a046f0a0f6735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/48a46e4c6215d41cc97ba8dff0cff21ea9b255a8", - "reference": "48a46e4c6215d41cc97ba8dff0cff21ea9b255a8", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/d20da25517fc09d147897d02819a046f0a0f6735", + "reference": "d20da25517fc09d147897d02819a046f0a0f6735", "shasum": "" }, "require": { @@ -6906,7 +7299,7 @@ "symfony/deprecation-contracts": "^2.2|^3.0", "symfony/event-dispatcher": "^5.4|^6.0|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", - "twig/twig": "^3.8" + "twig/twig": "^3.10.3" }, "conflict": { "symfony/config": "<5.4.0" @@ -6951,7 +7344,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.24.0" + "source": "https://github.com/symfony/ux-twig-component/tree/v2.25.2" }, "funding": [ { @@ -6967,20 +7360,20 @@ "type": "tidelift" } ], - "time": "2025-03-21T20:14:36+00:00" + "time": "2025-05-20T13:06:01+00:00" }, { "name": "symfony/validator", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "d7edd7f44defbc4e0230512f929b5f4c067bb93e" + "reference": "f7c32e309885a97fc9572335e22c2c2d31f328c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/d7edd7f44defbc4e0230512f929b5f4c067bb93e", - "reference": "d7edd7f44defbc4e0230512f929b5f4c067bb93e", + "url": "https://api.github.com/repos/symfony/validator/zipball/f7c32e309885a97fc9572335e22c2c2d31f328c4", + "reference": "f7c32e309885a97fc9572335e22c2c2d31f328c4", "shasum": "" }, "require": { @@ -7048,7 +7441,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.2.5" + "source": "https://github.com/symfony/validator/tree/v7.2.6" }, "funding": [ { @@ -7064,20 +7457,20 @@ "type": "tidelift" } ], - "time": "2025-03-21T15:05:21+00:00" + "time": "2025-05-02T08:36:00+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.3", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + "reference": "9c46038cd4ed68952166cf7001b54eb539184ccb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9c46038cd4ed68952166cf7001b54eb539184ccb", + "reference": "9c46038cd4ed68952166cf7001b54eb539184ccb", "shasum": "" }, "require": { @@ -7131,7 +7524,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.6" }, "funding": [ { @@ -7147,20 +7540,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T11:39:41+00:00" + "time": "2025-04-09T08:14:01+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "c37b301818bd7288715d40de634f05781b686ace" + "reference": "422b8de94c738830a1e071f59ad14d67417d7007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c37b301818bd7288715d40de634f05781b686ace", - "reference": "c37b301818bd7288715d40de634f05781b686ace", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/422b8de94c738830a1e071f59ad14d67417d7007", + "reference": "422b8de94c738830a1e071f59ad14d67417d7007", "shasum": "" }, "require": { @@ -7207,7 +7600,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.5" + "source": "https://github.com/symfony/var-exporter/tree/v7.2.6" }, "funding": [ { @@ -7223,20 +7616,20 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-05-02T08:36:00+00:00" }, { "name": "symfony/yaml", - "version": "v7.2.5", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912" + "reference": "0feafffb843860624ddfd13478f481f4c3cd8b23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0feafffb843860624ddfd13478f481f4c3cd8b23", + "reference": "0feafffb843860624ddfd13478f481f4c3cd8b23", "shasum": "" }, "require": { @@ -7279,7 +7672,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.5" + "source": "https://github.com/symfony/yaml/tree/v7.2.6" }, "funding": [ { @@ -7295,7 +7688,62 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-04-04T10:10:11+00:00" + }, + { + "name": "symfonycasts/sass-bundle", + "version": "v0.8.2", + "source": { + "type": "git", + "url": "https://github.com/SymfonyCasts/sass-bundle.git", + "reference": "99d9b3ec1b436c7038ded6a3e38f2b1d65240e21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SymfonyCasts/sass-bundle/zipball/99d9b3ec1b436c7038ded6a3e38f2b1d65240e21", + "reference": "99d9b3ec1b436c7038ded6a3e38f2b1d65240e21", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/asset-mapper": "^6.3|^7.0", + "symfony/console": "^5.4|^6.3|^7.0", + "symfony/filesystem": "^5.4|^6.3|^7.0", + "symfony/http-client": "^5.4|^6.3|^7.0", + "symfony/process": "^5.4|^6.3|^7.0" + }, + "require-dev": { + "matthiasnoback/symfony-config-test": "^5.0", + "phpunit/phpunit": "^9.6", + "symfony/framework-bundle": "^6.3|^7.0", + "symfony/phpunit-bridge": "^6.3.9|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfonycasts\\SassBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathéo Daninos", + "homepage": "https://github.com/WebMamba" + } + ], + "description": "Delightful Sass Support for Symfony + AssetMapper", + "keywords": [ + "asset-mapper", + "sass" + ], + "support": { + "issues": "https://github.com/SymfonyCasts/sass-bundle/issues", + "source": "https://github.com/SymfonyCasts/sass-bundle/tree/v0.8.2" + }, + "time": "2024-10-22T16:58:17+00:00" }, { "name": "symfonycasts/verify-email-bundle", @@ -7345,16 +7793,16 @@ }, { "name": "thecodingmachine/safe", - "version": "v3.1.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "e14ac96126e6c19ea9d1f4029abb51487f4cf2cf" + "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/e14ac96126e6c19ea9d1f4029abb51487f4cf2cf", - "reference": "e14ac96126e6c19ea9d1f4029abb51487f4cf2cf", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/2cdd579eeaa2e78e51c7509b50cc9fb89a956236", + "reference": "2cdd579eeaa2e78e51c7509b50cc9fb89a956236", "shasum": "" }, "require": { @@ -7464,7 +7912,7 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v3.1.0" + "source": "https://github.com/thecodingmachine/safe/tree/v3.3.0" }, "funding": [ { @@ -7480,20 +7928,20 @@ "type": "github" } ], - "time": "2025-04-12T06:41:26+00:00" + "time": "2025-05-14T06:15:44+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.20.0", + "version": "v3.21.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876" + "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9df5e1dbb6a68c0665ae5603f6f2c20815647876", - "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896", + "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896", "shasum": "" }, "require": { @@ -7542,7 +7990,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.20.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0" }, "funding": [ { @@ -7554,20 +8002,20 @@ "type": "tidelift" } ], - "time": "2025-02-08T09:47:15+00:00" + "time": "2025-02-19T14:29:33+00:00" }, { "name": "twig/html-extra", - "version": "v3.20.0", + "version": "v3.21.0", "source": { "type": "git", "url": "https://github.com/twigphp/html-extra.git", - "reference": "f7d54d4de1b64182af745cfb66777f699b599734" + "reference": "5442dd707601c83b8cd4233e37bb10ab8489a90f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/html-extra/zipball/f7d54d4de1b64182af745cfb66777f699b599734", - "reference": "f7d54d4de1b64182af745cfb66777f699b599734", + "url": "https://api.github.com/repos/twigphp/html-extra/zipball/5442dd707601c83b8cd4233e37bb10ab8489a90f", + "reference": "5442dd707601c83b8cd4233e37bb10ab8489a90f", "shasum": "" }, "require": { @@ -7610,7 +8058,71 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.20.0" + "source": "https://github.com/twigphp/html-extra/tree/v3.21.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2025-02-19T14:29:33+00:00" + }, + { + "name": "twig/intl-extra", + "version": "v3.21.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/intl-extra.git", + "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146", + "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146", + "shasum": "" + }, + "require": { + "php": ">=8.1.0", + "symfony/intl": "^5.4|^6.4|^7.0", + "twig/twig": "^3.13|^4.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Twig\\Extra\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Intl", + "homepage": "https://twig.symfony.com", + "keywords": [ + "intl", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0" }, "funding": [ { @@ -7626,16 +8138,16 @@ }, { "name": "twig/twig", - "version": "v3.20.0", + "version": "v3.21.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "3468920399451a384bef53cf7996965f7cd40183" + "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183", - "reference": "3468920399451a384bef53cf7996965f7cd40183", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", "shasum": "" }, "require": { @@ -7689,7 +8201,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.20.0" + "source": "https://github.com/twigphp/Twig/tree/v3.21.1" }, "funding": [ { @@ -7701,7 +8213,7 @@ "type": "tidelift" } ], - "time": "2025-02-13T08:34:43+00:00" + "time": "2025-05-03T07:21:55+00:00" }, { "name": "webmozart/assert", @@ -7827,87 +8339,6 @@ ], "time": "2022-12-23T10:58:28+00:00" }, - { - "name": "composer/semver", - "version": "3.4.3", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-09-19T14:15:21+00:00" - }, { "name": "composer/xdebug-handler", "version": "3.0.5", @@ -8424,16 +8855,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", "shasum": "" }, "require": { @@ -8472,7 +8903,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" }, "funding": [ { @@ -8480,7 +8911,7 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-04-29T12:36:36+00:00" }, { "name": "nikic/php-parser", @@ -8708,16 +9139,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.12", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c" + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", - "reference": "96dde49e967c0c22812bcfa7bda4ff82c09f3b0c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", "shasum": "" }, "require": { @@ -8762,25 +9193,25 @@ "type": "github" } ], - "time": "2025-04-16T13:19:18+00:00" + "time": "2025-05-21T20:55:28+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "a61a04a361b60014ec04881ccb87252d3bf02e94" + "reference": "4497663eb17b9d29211830df5aceaa3a4d256a35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/a61a04a361b60014ec04881ccb87252d3bf02e94", - "reference": "a61a04a361b60014ec04881ccb87252d3bf02e94", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/4497663eb17b9d29211830df5aceaa3a4d256a35", + "reference": "4497663eb17b9d29211830df5aceaa3a4d256a35", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.3" + "phpstan/phpstan": "^2.1.13" }, "conflict": { "doctrine/collections": "<1.0", @@ -8804,6 +9235,7 @@ "gedmo/doctrine-extensions": "^3.8", "nesbot/carbon": "^2.49", "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^2.0.2", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6.20", @@ -8831,9 +9263,9 @@ "description": "Doctrine extensions for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.2" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.3" }, - "time": "2025-03-03T09:29:16+00:00" + "time": "2025-05-05T15:28:52+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -8890,22 +9322,22 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.4", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "648087fb4dd865a09b1828a3b0396eb447665f2e" + "reference": "5005288e07583546ea00b52de4a9ac412eb869d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/648087fb4dd865a09b1828a3b0396eb447665f2e", - "reference": "648087fb4dd865a09b1828a3b0396eb447665f2e", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/5005288e07583546ea00b52de4a9ac412eb869d7", + "reference": "5005288e07583546ea00b52de4a9ac412eb869d7", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.2" + "phpstan/phpstan": "^2.1.13" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -8915,7 +9347,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6", - "psr/container": "1.0 || 1.1.1", + "psr/container": "1.1.2", "symfony/config": "^5.4 || ^6.1", "symfony/console": "^5.4 || ^6.1", "symfony/dependency-injection": "^5.4 || ^6.1", @@ -8955,22 +9387,22 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.4" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.6" }, - "time": "2025-03-28T12:02:03+00:00" + "time": "2025-05-14T07:00:05+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "12.1.2", + "version": "12.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "05c33d01a856f9f62488d144bafddc3d7b7a4ebb" + "reference": "9075a8efc66e11bc55c319062e147bdb06777267" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/05c33d01a856f9f62488d144bafddc3d7b7a4ebb", - "reference": "05c33d01a856f9f62488d144bafddc3d7b7a4ebb", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9075a8efc66e11bc55c319062e147bdb06777267", + "reference": "9075a8efc66e11bc55c319062e147bdb06777267", "shasum": "" }, "require": { @@ -8988,7 +9420,7 @@ "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -8997,7 +9429,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.1.x-dev" + "dev-main": "12.3.x-dev" } }, "autoload": { @@ -9026,15 +9458,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.1.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2025-04-03T14:34:39+00:00" + "time": "2025-05-23T15:49:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -9283,16 +9727,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.1.3", + "version": "12.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "72ca50e817dd7d65356c16772c30f06c01a6fae2" + "reference": "2fdf0056c673c8f0f1eed00030be5f8243c1e6e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/72ca50e817dd7d65356c16772c30f06c01a6fae2", - "reference": "72ca50e817dd7d65356c16772c30f06c01a6fae2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2fdf0056c673c8f0f1eed00030be5f8243c1e6e0", + "reference": "2fdf0056c673c8f0f1eed00030be5f8243c1e6e0", "shasum": "" }, "require": { @@ -9302,11 +9746,11 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.0", + "myclabs/deep-copy": "^1.13.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.1.2", + "phpunit/php-code-coverage": "^12.2.1", "phpunit/php-file-iterator": "^6.0.0", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", @@ -9314,7 +9758,7 @@ "sebastian/cli-parser": "^4.0.0", "sebastian/comparator": "^7.0.1", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.0", + "sebastian/environment": "^8.0.1", "sebastian/exporter": "^7.0.0", "sebastian/global-state": "^8.0.0", "sebastian/object-enumerator": "^7.0.0", @@ -9360,7 +9804,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.1.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.1.6" }, "funding": [ { @@ -9384,7 +9828,7 @@ "type": "tidelift" } ], - "time": "2025-04-22T06:11:09+00:00" + "time": "2025-05-21T12:36:31+00:00" }, { "name": "react/cache", @@ -9914,21 +10358,21 @@ }, { "name": "rector/rector", - "version": "2.0.12", + "version": "2.0.16", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "a7f9b968f6c15abfd0d2a1442c9dcd9ade677192" + "reference": "f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/a7f9b968f6c15abfd0d2a1442c9dcd9ade677192", - "reference": "a7f9b968f6c15abfd0d2a1442c9dcd9ade677192", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2", + "reference": "f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.12" + "phpstan/phpstan": "^2.1.14" }, "conflict": { "rector/rector-doctrine": "*", @@ -9961,7 +10405,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.0.12" + "source": "https://github.com/rectorphp/rector/tree/2.0.16" }, "funding": [ { @@ -9969,7 +10413,7 @@ "type": "github" } ], - "time": "2025-04-22T12:47:33+00:00" + "time": "2025-05-12T16:37:16+00:00" }, { "name": "roave/security-advisories", @@ -9977,19 +10421,19 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "38570c96303a807d5e530e00a1a238132ca5d84a" + "reference": "2145fcfdd72e389dce5082df4fb02d58fe32c5ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/38570c96303a807d5e530e00a1a238132ca5d84a", - "reference": "38570c96303a807d5e530e00a1a238132ca5d84a", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/2145fcfdd72e389dce5082df4fb02d58fe32c5ca", + "reference": "2145fcfdd72e389dce5082df4fb02d58fe32c5ca", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "adaptcms/adaptcms": "<=1.3", "admidio/admidio": "<4.3.12", - "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "adodb/adodb-php": "<=5.22.8", "aheinze/cockpit": "<2.2", "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.07.2", "aimeos/ai-admin-jsonadm": "<2020.10.13|>=2021.04.1,<2021.10.6|>=2022.04.1,<2022.10.3|>=2023.04.1,<2023.10.4|==2024.04.1", @@ -10000,7 +10444,7 @@ "airesvsg/acf-to-rest-api": "<=3.1", "akaunting/akaunting": "<2.1.13", "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<=1.5", + "alextselegidis/easyappointments": "<=1.5.1", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "ameos/ameos_tarteaucitron": "<1.2.23", @@ -10010,6 +10454,7 @@ "anchorcms/anchor-cms": "<=0.12.7", "andreapollastri/cipi": "<=3.1.15", "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "aoe/restler": "<1.7.1", "apache-solr-for-typo3/solr": "<2.8.3", "apereo/phpcas": "<1.6", "api-platform/core": "<3.4.17|>=4.0.0.0-alpha1,<4.0.22", @@ -10023,7 +10468,10 @@ "athlon1600/php-proxy-app": "<=3", "athlon1600/youtube-downloader": "<=4", "austintoddj/canvas": "<=3.4.2", - "auth0/wordpress": "<=4.6", + "auth0/auth0-php": ">=8.0.0.0-beta1,<8.14", + "auth0/login": "<7.17", + "auth0/symfony": "<5.4", + "auth0/wordpress": "<5.3", "automad/automad": "<2.0.0.0-alpha5", "automattic/jetpack": "<9.8", "awesome-support/awesome-support": "<=6.0.7", @@ -10080,7 +10528,7 @@ "chriskacerguis/codeigniter-restserver": "<=2.7.1", "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", "ckeditor/ckeditor": "<4.25", - "clickstorm/cs-seo": ">=6,<6.7|>=7,<7.4|>=8,<8.3|>=9,<9.2", + "clickstorm/cs-seo": ">=6,<6.8|>=7,<7.5|>=8,<8.4|>=9,<9.3", "co-stack/fal_sftp": "<0.2.6", "cockpit-hq/cockpit": "<2.7|==2.7", "codeception/codeception": "<3.1.3|>=4,<4.1.22", @@ -10103,7 +10551,8 @@ "contao/managed-edition": "<=1.5", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", - "craftcms/cms": "<4.13.8|>=5,<5.5.5", + "couleurcitron/tarteaucitron-wp": "<0.3", + "craftcms/cms": "<4.15.3|>=5,<5.7.5", "croogo/croogo": "<4", "cuyz/valinor": "<0.12", "czim/file-handling": "<1.5|>=2,<2.3", @@ -10244,8 +10693,8 @@ "geshi/geshi": "<1.0.8.11-dev", "getformwork/formwork": "<1.13.1|>=2.0.0.0-beta1,<2.0.0.0-beta4", "getgrav/grav": "<1.7.46", - "getkirby/cms": "<=3.6.6.5|>=3.7,<=3.7.5.4|>=3.8,<=3.8.4.3|>=3.9,<=3.9.8.1|>=3.10,<=3.10.1|>=4,<=4.3", - "getkirby/kirby": "<=2.5.12", + "getkirby/cms": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", + "getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", "gilacms/gila": "<=1.15.4", @@ -10291,7 +10740,7 @@ "imdbphp/imdbphp": "<=5.1.1", "impresscms/impresscms": "<=1.4.5", "impresspages/impresspages": "<1.0.13", - "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.3", + "in2code/femanager": "<5.5.5|>=6,<6.4.1|>=7,<7.4.2|>=8,<8.2.2", "in2code/ipandlanguageredirect": "<5.1.2", "in2code/lux": "<17.6.1|>=18,<24.0.2", "in2code/powermail": "<7.5.1|>=8,<8.5.1|>=9,<10.9.1|>=11,<12.4.1", @@ -10336,6 +10785,7 @@ "klaviyo/magento2-extension": ">=1,<3", "knplabs/knp-snappy": "<=1.4.2", "kohana/core": "<3.3.3", + "koillection/koillection": "<1.6.12", "krayin/laravel-crm": "<=1.3", "kreait/firebase-php": ">=3.2,<3.8.1", "kumbiaphp/kumbiapp": "<=1.1.1", @@ -10354,7 +10804,7 @@ "latte/latte": "<2.10.8", "lavalite/cms": "<=9|==10.1", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", - "league/commonmark": "<2.6", + "league/commonmark": "<2.7", "league/flysystem": "<1.1.4|>=2,<2.1.1", "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", "leantime/leantime": "<3.3", @@ -10369,10 +10819,11 @@ "livewire/volt": "<1.7", "lms/routes": "<2.1.1", "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luracast/restler": "<3.1", "luyadev/yii-helpers": "<1.2.1", "macropay-solutions/laravel-crud-wizard-free": "<3.4.17", "maestroerror/php-heic-to-jpg": "<1.0.5", - "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch11|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch9|>=2.4.7.0-beta1,<2.4.7.0-patch4|>=2.4.8.0-beta1,<2.4.8.0-beta2", + "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch12|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch10|>=2.4.7.0-beta1,<2.4.7.0-patch5|>=2.4.8.0-beta1,<2.4.8.0-beta2", "magento/core": "<=1.9.4.5", "magento/magento1ce": "<1.9.4.3-dev", "magento/magento1ee": ">=1,<1.14.4.3-dev", @@ -10413,7 +10864,7 @@ "mojo42/jirafeau": "<4.4", "mongodb/mongodb": ">=1,<1.9.2", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.3.10|>=4.4,<4.4.6|>=4.5.0.0-beta,<4.5.2", + "moodle/moodle": "<4.3.12|>=4.4,<4.4.8|>=4.5.0.0-beta,<4.5.4", "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", "movingbytes/social-network": "<=1.2.1", @@ -10427,6 +10878,7 @@ "mustache/mustache": ">=2,<2.14.1", "mwdelaney/wp-enable-svg": "<=0.2", "namshi/jose": "<2.2", + "nasirkhan/laravel-starter": "<11.11", "nategood/httpful": "<1", "neoan3-apps/template": "<1.1.1", "neorazorx/facturascripts": "<2022.04", @@ -10441,6 +10893,7 @@ "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nilsteampassnet/teampass": "<3.1.3.1-dev", + "nitsan/ns-backup": "<13.0.1", "nonfiction/nterchange": "<4.1.1", "notrinos/notrinos-erp": "<=0.7", "noumo/easyii": "<=0.9", @@ -10452,9 +10905,9 @@ "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", - "october/october": "<=3.6.4", + "october/october": "<3.7.5", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.5.15", + "october/system": "<3.7.5", "oliverklee/phpunit": "<3.5.15", "omeka/omeka-s": "<4.0.3", "onelogin/php-saml": "<2.10.4", @@ -10473,7 +10926,7 @@ "oro/customer-portal": ">=4.1,<=4.1.13|>=4.2,<=4.2.10|>=5,<=5.0.11|>=5.1,<=5.1.3", "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<=4.2.10|>=5,<=5.0.12|>=5.1,<=5.1.3", "oveleon/contao-cookiebar": "<1.16.3|>=2,<2.1.3", - "oxid-esales/oxideshop-ce": "<4.5", + "oxid-esales/oxideshop-ce": "<=7.0.5", "oxid-esales/paymorrow-module": ">=1,<1.0.2|>=2,<2.0.1", "packbackbooks/lti-1-3-php-library": "<5", "padraic/humbug_get_contents": "<1.1.2", @@ -10565,6 +11018,7 @@ "really-simple-plugins/complianz-gdpr": "<6.4.2", "redaxo/source": "<5.18.3", "remdex/livehelperchat": "<4.29", + "renolit/reint-downloadmanager": "<4.0.2|>=5,<5.0.1", "reportico-web/reportico": "<=8.1", "rhukster/dom-sanitizer": "<1.0.7", "rmccue/requests": ">=1.6,<1.8", @@ -10582,8 +11036,8 @@ "serluck/phpwhois": "<=4.2.6", "sfroemken/url_redirect": "<=1.2.1", "sheng/yiicms": "<1.2.1", - "shopware/core": "<6.5.8.17-dev|>=6.6,<6.6.10.3-dev|>=6.7.0.0-RC1-dev,<6.7.0.0-RC2-dev", - "shopware/platform": "<6.5.8.17-dev|>=6.6,<6.6.10.3-dev|>=6.7.0.0-RC1-dev,<6.7.0.0-RC2-dev", + "shopware/core": "<6.5.8.18-dev|>=6.6,<6.6.10.3-dev|>=6.7.0.0-RC1-dev,<6.7.0.0-RC2-dev", + "shopware/platform": "<6.5.8.18-dev|>=6.6,<6.6.10.3-dev|>=6.7.0.0-RC1-dev,<6.7.0.0-RC2-dev", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<=5.7.17", "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", @@ -10619,14 +11073,14 @@ "simplesamlphp/xml-security": "==1.6.11", "simplito/elliptic-php": "<1.0.6", "sitegeist/fluid-components": "<3.5", - "sjbr/sr-feuser-register": "<2.6.2", + "sjbr/sr-feuser-register": "<2.6.2|>=5.1,<12.5", "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", "sjbr/static-info-tables": "<2.3.1", "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", "slim/slim": "<2.6", "slub/slub-events": "<3.0.3", "smarty/smarty": "<4.5.3|>=5,<5.1.1", - "snipe/snipe-it": "<=7.0.13", + "snipe/snipe-it": "<8.1", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", "spatie/browsershot": "<5.0.5", @@ -10646,7 +11100,7 @@ "subhh/libconnect": "<7.0.8|>=8,<8.1", "sukohi/surpass": "<1", "sulu/form-bundle": ">=2,<2.5.3", - "sulu/sulu": "<1.6.44|>=2,<2.5.21|>=2.6,<2.6.5", + "sulu/sulu": "<1.6.44|>=2,<2.5.25|>=2.6,<2.6.9|>=3.0.0.0-alpha1,<3.0.0.0-alpha3", "sumocoders/framework-user-bundle": "<1.4", "superbig/craft-audit": "<3.0.2", "svewap/a21glossary": "<=0.4.10", @@ -10693,6 +11147,8 @@ "symfony/translation": ">=2,<2.0.17", "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8", "symfony/ux-autocomplete": "<2.11.2", + "symfony/ux-live-component": "<2.25.1", + "symfony/ux-twig-component": "<2.25.1", "symfony/validator": "<5.4.43|>=6,<6.4.11|>=7,<7.1.4", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", @@ -10730,10 +11186,10 @@ "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", "twig/twig": "<3.11.2|>=3.12,<3.14.1|>=3.16,<3.19", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", - "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<10.4.46|>=11,<11.5.40|>=12,<12.4.21|>=13,<13.3.1", + "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<10.4.46|>=11,<11.5.40|>=12,<=12.4.30|>=13,<=13.4.11", "typo3/cms-belog": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", "typo3/cms-beuser": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", - "typo3/cms-core": "<=8.7.56|>=9,<=9.5.48|>=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", + "typo3/cms-core": "<=8.7.56|>=9,<=9.5.50|>=10,<=10.4.49|>=11,<=11.5.43|>=12,<=12.4.30|>=13,<=13.4.11", "typo3/cms-dashboard": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", "typo3/cms-extensionmanager": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", @@ -10746,6 +11202,8 @@ "typo3/cms-lowlevel": ">=11,<=11.5.41", "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", "typo3/cms-scheduler": ">=11,<=11.5.41", + "typo3/cms-setup": ">=9,<=9.5.50|>=10,<=10.4.49|>=11,<=11.5.43|>=12,<=12.4.30|>=13,<=13.4.11", + "typo3/cms-webhooks": ">=12,<=12.4.30|>=13,<=13.4.11", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", @@ -10805,7 +11263,7 @@ "xataface/xataface": "<3", "xpressengine/xpressengine": "<3.0.15", "yab/quarx": "<2.4.5", - "yeswiki/yeswiki": "<4.5.2", + "yeswiki/yeswiki": "<4.5.4", "yetiforce/yetiforce-crm": "<6.5", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", @@ -10896,7 +11354,7 @@ "type": "tidelift" } ], - "time": "2025-04-22T16:06:15+00:00" + "time": "2025-05-20T20:06:01+00:00" }, { "name": "sebastian/cli-parser", @@ -11162,16 +11620,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.0", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8afe311eca49171bf95405cc0078be9a3821f9f2" + "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8afe311eca49171bf95405cc0078be9a3821f9f2", - "reference": "8afe311eca49171bf95405cc0078be9a3821f9f2", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d364b9e5d0d3b18a2573351a1786fbf96b7e0792", + "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792", "shasum": "" }, "require": { @@ -11214,15 +11672,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2025-02-07T04:56:08+00:00" + "time": "2025-05-21T15:05:44+00:00" }, { "name": "sebastian/exporter", @@ -11965,21 +12435,21 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.62.1", + "version": "v1.63.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590" + "reference": "69478ab39bc303abfbe3293006a78b09a8512425" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/468ff2708200c95ebc0d85d3174b6c6711b8a590", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/69478ab39bc303abfbe3293006a78b09a8512425", + "reference": "69478ab39bc303abfbe3293006a78b09a8512425", "shasum": "" }, "require": { "doctrine/inflector": "^2.0", - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "php": ">=8.1", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -12037,7 +12507,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.62.1" + "source": "https://github.com/symfony/maker-bundle/tree/v1.63.0" }, "funding": [ { @@ -12053,20 +12523,20 @@ "type": "tidelift" } ], - "time": "2025-01-15T00:21:40+00:00" + "time": "2025-04-26T01:41:37+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v7.2.0", + "version": "v7.2.6", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145" + "reference": "6106ae85a0e3ed509d339b7f924788c9cc4e7cfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2bbde92ab25a0e2c88160857af7be9db5da0d145", - "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/6106ae85a0e3ed509d339b7f924788c9cc4e7cfb", + "reference": "6106ae85a0e3ed509d339b7f924788c9cc4e7cfb", "shasum": "" }, "require": { @@ -12119,7 +12589,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.6" }, "funding": [ { @@ -12135,68 +12605,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T16:15:23+00:00" - }, - { - "name": "symfony/process", - "version": "v7.2.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v7.2.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-04-09T08:35:42+00:00" }, { "name": "symfony/web-profiler-bundle", @@ -12282,22 +12691,22 @@ }, { "name": "thecodingmachine/phpstan-safe-rule", - "version": "v1.4.0", + "version": "v1.4.1", "source": { "type": "git", "url": "https://github.com/thecodingmachine/phpstan-safe-rule.git", - "reference": "33dcbc3228c55ea4c364ecf74a3661cf7b7f168d" + "reference": "5f9795eae8891dffa475965463a4281633651768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/33dcbc3228c55ea4c364ecf74a3661cf7b7f168d", - "reference": "33dcbc3228c55ea4c364ecf74a3661cf7b7f168d", + "url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/5f9795eae8891dffa475965463a4281633651768", + "reference": "5f9795eae8891dffa475965463a4281633651768", "shasum": "" }, "require": { "nikic/php-parser": "^5", "php": "^8.1", - "phpstan/phpstan": "^2.0", + "phpstan/phpstan": "^2.1.11", "thecodingmachine/safe": "^1.2 || ^2.0 || ^3.0" }, "require-dev": { @@ -12334,9 +12743,9 @@ "description": "A PHPStan rule to detect safety issues. Must be used in conjunction with thecodingmachine/safe", "support": { "issues": "https://github.com/thecodingmachine/phpstan-safe-rule/issues", - "source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.4.0" + "source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.4.1" }, - "time": "2025-02-11T12:41:29+00:00" + "time": "2025-04-09T20:30:35+00:00" }, { "name": "theseer/tokenizer", @@ -12390,16 +12799,16 @@ }, { "name": "vincentlanglet/twig-cs-fixer", - "version": "3.5.1", + "version": "3.7.1", "source": { "type": "git", "url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git", - "reference": "0ab7a8154f7b3a6a42cbe3a467074a47bc32dcf5" + "reference": "d216db67b63d78cfdefca6a9a7acef4fd0d304bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/0ab7a8154f7b3a6a42cbe3a467074a47bc32dcf5", - "reference": "0ab7a8154f7b3a6a42cbe3a467074a47bc32dcf5", + "url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/d216db67b63d78cfdefca6a9a7acef4fd0d304bb", + "reference": "d216db67b63d78cfdefca6a9a7acef4fd0d304bb", "shasum": "" }, "require": { @@ -12419,13 +12828,13 @@ "dereuromark/composer-prefer-lowest": "^0.1.10", "ergebnis/composer-normalize": "^2.29", "friendsofphp/php-cs-fixer": "^3.13.0", - "infection/infection": "^0.26.16 || ^0.27.0", + "infection/infection": "^0.26.16 || ^0.29.14", "phpstan/phpstan": "^2.0", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpstan/phpstan-symfony": "^2.0", "phpstan/phpstan-webmozart-assert": "^2.0", - "phpunit/phpunit": "^9.5.26 || ^10.0.9", + "phpunit/phpunit": "^9.5.26 || ^11.5.18 || ^12.1.3", "rector/rector": "^2.0.0", "shipmonk/composer-dependency-analyser": "^1.6", "symfony/process": "^5.4 || ^6.4 || ^7.0", @@ -12455,7 +12864,7 @@ "homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer", "support": { "issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues", - "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.5.1" + "source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/3.7.1" }, "funding": [ { @@ -12463,7 +12872,7 @@ "type": "github" } ], - "time": "2025-01-16T18:36:36+00:00" + "time": "2025-05-19T12:24:50+00:00" } ], "aliases": [], diff --git a/config/bundles.php b/config/bundles.php index 4e50234..9fcc9db 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -14,6 +14,7 @@ use Symfony\Bundle\TwigBundle\TwigBundle; use Symfony\Bundle\WebProfilerBundle\WebProfilerBundle; use Symfony\UX\TwigComponent\TwigComponentBundle; use SymfonyCasts\Bundle\VerifyEmail\SymfonyCastsVerifyEmailBundle; +use Symfonycasts\SassBundle\SymfonycastsSassBundle; use Twig\Extra\TwigExtraBundle\TwigExtraBundle; return [ @@ -30,4 +31,5 @@ return [ DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], SymfonyCastsVerifyEmailBundle::class => ['all' => true], SentryBundle::class => ['prod' => true], + SymfonycastsSassBundle::class => ['all' => true], ]; diff --git a/src/Controller/Backoffice/BackofficeController.php b/src/Controller/Backoffice/BackofficeController.php new file mode 100644 index 0000000..f4e4042 --- /dev/null +++ b/src/Controller/Backoffice/BackofficeController.php @@ -0,0 +1,79 @@ +getUser(); + \assert($user instanceof User); + + $seasons = $this->security->isGranted('ROLE_ADMIN') + ? $this->seasonRepository->findAll() + : $this->seasonRepository->getSeasonsForUser($user); + + return $this->render('backoffice/index.html.twig', [ + 'seasons' => $seasons, + ]); + } + + #[Route('/backoffice/add', name: 'app_backoffice_season_add', priority: 10)] + public function addSeason(Request $request, EntityManagerInterface $em): Response + { + $season = new Season(); + $form = $this->createForm(CreateSeasonFormType::class, $season); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $user = $this->getUser(); + \assert($user instanceof User); + + $season->addOwner($user); + $season->generateSeasonCode(); + + $em->persist($season); + $em->flush(); + + return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); + } + + return $this->render('backoffice/season_add.html.twig', ['form' => $form]); + } + + #[Route('/backoffice/template', name: 'app_backoffice_template', priority: 10)] + public function getTemplate(QuizSpreadsheetService $excel): Response + { + $response = new StreamedResponse($excel->generateTemplate()); + $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + $response->headers->set('Content-Disposition', 'attachment; filename="template.xlsx"'); + + return $response; + } +} diff --git a/src/Controller/Backoffice/QuizController.php b/src/Controller/Backoffice/QuizController.php new file mode 100644 index 0000000..047ac6c --- /dev/null +++ b/src/Controller/Backoffice/QuizController.php @@ -0,0 +1,50 @@ +render('backoffice/quiz.html.twig', [ + 'season' => $season, + 'quiz' => $quiz, + 'result' => $this->candidateRepository->getScores($quiz), + ]); + } + + #[Route('/backoffice/season/{seasonCode}/quiz/{quiz}/enable', name: 'app_backoffice_enable')] + #[IsGranted(SeasonVoter::EDIT, subject: 'season')] + public function enableQuiz(Season $season, ?Quiz $quiz, EntityManagerInterface $em): Response + { + $season->setActiveQuiz($quiz); + $em->flush(); + + if ($quiz instanceof Quiz) { + return $this->redirectToRoute('app_backoffice_quiz', ['seasonCode' => $season->getSeasonCode(), 'quiz' => $quiz->getId()]); + } + + return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); + } +} diff --git a/src/Controller/Backoffice/SeasonController.php b/src/Controller/Backoffice/SeasonController.php new file mode 100644 index 0000000..055f811 --- /dev/null +++ b/src/Controller/Backoffice/SeasonController.php @@ -0,0 +1,88 @@ +render('backoffice/season.html.twig', [ + 'season' => $season, + ]); + } + + #[Route('/backoffice/season/{seasonCode}/add_candidate', name: 'app_backoffice_add_candidates', priority: 10)] + #[IsGranted(SeasonVoter::EDIT, subject: 'season')] + public function addCandidates(Season $season, Request $request): Response + { + $form = $this->createForm(AddCandidatesFormType::class); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $candidates = $form->get('candidates')->getData(); + foreach (explode("\r\n", (string) $candidates) as $candidate) { + $season->addCandidate(new Candidate($candidate)); + } + + $this->em->flush(); + + return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); + } + + return $this->render('backoffice/season_add_candidates.html.twig', ['form' => $form]); + } + + #[Route('/backoffice/season/{seasonCode}/add', name: 'app_backoffice_quiz_add', priority: 10)] + #[IsGranted(SeasonVoter::EDIT, subject: 'season')] + public function addQuiz(Request $request, Season $season, QuizSpreadsheetService $quizSpreadsheet): Response + { + $quiz = new Quiz(); + $form = $this->createForm(UploadQuizFormType::class, $quiz); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + /* @var UploadedFile $sheet */ + $sheet = $form->get('sheet')->getData(); + + $quizSpreadsheet->xlsxToQuiz($quiz, $sheet); + + $quiz->setSeason($season); + $this->em->persist($quiz); + $this->em->flush(); + + $this->addFlash(FlashType::Success, $this->translator->trans('Quiz Added!')); + + return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); + } + + return $this->render('/backoffice/quiz_add.html.twig', ['form' => $form, 'season' => $season]); + } +} diff --git a/src/Controller/BackofficeController.php b/src/Controller/BackofficeController.php deleted file mode 100644 index 370c0da..0000000 --- a/src/Controller/BackofficeController.php +++ /dev/null @@ -1,167 +0,0 @@ -getUser(); - \assert($user instanceof User); - - $seasons = $this->security->isGranted('ROLE_ADMIN') - ? $this->seasonRepository->findAll() - : $this->seasonRepository->getSeasonsForUser($user); - - return $this->render('backoffice/index.html.twig', [ - 'seasons' => $seasons, - ]); - } - - #[Route('/backoffice/add', name: 'app_backoffice_season_add', priority: 10)] - public function seasonAdd(Request $request, EntityManagerInterface $em): Response - { - $season = new Season(); - $form = $this->createForm(CreateSeasonFormType::class, $season); - - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $user = $this->getUser(); - \assert($user instanceof User); - - $season->addOwner($user); - $season->generateSeasonCode(); - - $em->persist($season); - $em->flush(); - - return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); - } - - return $this->render('backoffice/season_add.html.twig', ['form' => $form]); - } - - #[Route('/backoffice/{seasonCode}', name: 'app_backoffice_season')] - #[IsGranted(SeasonVoter::EDIT, subject: 'season')] - public function season(Season $season): Response - { - return $this->render('backoffice/season.html.twig', [ - 'season' => $season, - ]); - } - - #[Route('/backoffice/{seasonCode}/{quiz}', name: 'app_backoffice_quiz')] - #[IsGranted(SeasonVoter::EDIT, subject: 'season')] - public function quiz(Season $season, Quiz $quiz): Response - { - return $this->render('backoffice/quiz.html.twig', [ - 'season' => $season, - 'quiz' => $quiz, - 'result' => $this->candidateRepository->getScores($quiz), - ]); - } - - #[Route('/backoffice/{seasonCode}/{quiz}/enable', name: 'app_backoffice_enable')] - #[IsGranted(SeasonVoter::EDIT, subject: 'season')] - public function enableQuiz(Season $season, ?Quiz $quiz, EntityManagerInterface $em): Response - { - $season->setActiveQuiz($quiz); - $em->flush(); - - return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); - } - - #[Route('/backoffice/{seasonCode}/add_candidate', name: 'app_backoffice_add_candidates', priority: 10)] - #[IsGranted(SeasonVoter::EDIT, subject: 'season')] - public function addCandidates(Season $season, Request $request, EntityManagerInterface $em): Response - { - $form = $this->createForm(AddCandidatesFormType::class); - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - $candidates = $form->get('candidates')->getData(); - foreach (explode("\r\n", (string) $candidates) as $candidate) { - $season->addCandidate(new Candidate($candidate)); - } - - $em->flush(); - - return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); - } - - return $this->render('backoffice/season_add_candidates.html.twig', ['form' => $form]); - } - - #[Route('/backoffice/{seasonCode}/add', name: 'app_backoffice_quiz_add', priority: 10)] - #[IsGranted(SeasonVoter::EDIT, subject: 'season')] - public function addQuiz(Request $request, Season $season, QuizSpreadsheetService $quizSpreadsheet, EntityManagerInterface $em): Response - { - $quiz = new Quiz(); - $form = $this->createForm(UploadQuizFormType::class, $quiz); - - $form->handleRequest($request); - - if ($form->isSubmitted() && $form->isValid()) { - /* @var UploadedFile $sheet */ - $sheet = $form->get('sheet')->getData(); - - $quizSpreadsheet->xlsxToQuiz($quiz, $sheet); - - $quiz->setSeason($season); - $em->persist($quiz); - $em->flush(); - - $this->addFlash(FlashType::Success, $this->translator->trans('Quiz Added!')); - - return $this->redirectToRoute('app_backoffice_season', ['seasonCode' => $season->getSeasonCode()]); - } - - return $this->render('/backoffice/quiz_add.html.twig', ['form' => $form, 'season' => $season]); - } - - #[Route('/backoffice/template', name: 'app_backoffice_template', priority: 10)] - public function getTemplate(QuizSpreadsheetService $excel): Response - { - $response = new StreamedResponse($excel->generateTemplate()); - $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); - $response->headers->set('Content-Disposition', 'attachment; filename="template.xlsx"'); - - return $response; - } -} diff --git a/src/Controller/LoginController.php b/src/Controller/LoginController.php index cf4e3df..a9a9057 100644 --- a/src/Controller/LoginController.php +++ b/src/Controller/LoginController.php @@ -4,17 +4,19 @@ declare(strict_types=1); namespace App\Controller; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use App\Enum\FlashType; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Attribute\AsController; use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; +use Symfony\Contracts\Translation\TranslatorInterface; #[AsController] final class LoginController extends AbstractController { #[Route(path: '/login', name: 'app_login_login')] - public function login(AuthenticationUtils $authenticationUtils): Response + public function login(AuthenticationUtils $authenticationUtils, TranslatorInterface $translator): Response { // get the login error if there is one $error = $authenticationUtils->getLastAuthenticationError(); @@ -22,7 +24,11 @@ final class LoginController extends AbstractController // last username entered by the user $lastUsername = $authenticationUtils->getLastUsername(); - return $this->render('login/login.html.twig', [ + if ($error instanceof AuthenticationException) { + $this->addFlash(FlashType::Danger, $translator->trans($error->getMessageKey(), $error->getMessageData(), 'security')); + } + + return $this->render('backoffice/login/login.html.twig', [ 'last_username' => $lastUsername, 'error' => $error, ]); diff --git a/src/Controller/PrepareEliminationController.php b/src/Controller/PrepareEliminationController.php index 1e68c03..1286a70 100644 --- a/src/Controller/PrepareEliminationController.php +++ b/src/Controller/PrepareEliminationController.php @@ -4,8 +4,10 @@ declare(strict_types=1); namespace App\Controller; +use App\Entity\Elimination; use App\Entity\Quiz; use App\Entity\Season; +use App\Factory\EliminationFactory; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; @@ -13,12 +15,19 @@ use Symfony\Component\Routing\Attribute\Route; final class PrepareEliminationController extends AbstractController { #[Route('/backoffice/elimination/{seasonCode}/{quiz}/prepare', name: 'app_prepare_elimination')] - public function index(Season $season, Quiz $quiz): Response + public function index(Season $season, Quiz $quiz, EliminationFactory $eliminationFactory): Response { - return $this->render('prepare_elimination/index.html.twig', [ + $elimination = $eliminationFactory->createEliminationFromQuiz($quiz); + + return $this->redirectToRoute('app_prepare_elimination_view', ['elimination' => $elimination->getId()]); + } + + #[Route('/backoffice/elimination/{elimination}', name: 'app_prepare_elimination_view')] + public function viewElimination(Elimination $elimination): Response + { + return $this->render('backoffice/prepare_elimination/index.html.twig', [ 'controller_name' => 'PrepareEliminationController', - 'season' => $season, - 'quiz' => $quiz, + 'elimination' => $elimination, ]); } } diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index 212eea4..58d3380 100644 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -48,7 +48,7 @@ final class RegistrationController extends AbstractController (new TemplatedEmail()) ->to((string) $user->getEmail()) ->subject($this->translator->trans('Please Confirm your Email')) - ->htmlTemplate('registration/confirmation_email.html.twig') + ->htmlTemplate('backoffice/registration/confirmation_email.html.twig') ); $response = $security->login($user, 'form_login', 'main'); @@ -57,7 +57,7 @@ final class RegistrationController extends AbstractController return $response; } - return $this->render('registration/register.html.twig', [ + return $this->render('backoffice/registration/register.html.twig', [ 'registrationForm' => $form, ]); } diff --git a/src/Entity/Elimination.php b/src/Entity/Elimination.php index 7f5b271..34bdf81 100644 --- a/src/Entity/Elimination.php +++ b/src/Entity/Elimination.php @@ -7,27 +7,37 @@ namespace App\Entity; use App\Repository\EliminationRepository; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; +use Safe\DateTimeImmutable; use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator; use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Component\Uid\Uuid; #[ORM\Entity(repositoryClass: EliminationRepository::class)] +#[ORM\HasLifecycleCallbacks] class Elimination { + public const string SCREEN_GREEN = 'green'; + public const string SCREEN_RED = 'red'; + #[ORM\Id] #[ORM\Column(type: UuidType::NAME, unique: true)] #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\CustomIdGenerator(class: UuidGenerator::class)] private Uuid $id; - #[ORM\ManyToOne(inversedBy: 'eliminations')] - #[ORM\JoinColumn(nullable: false)] - private Quiz $quiz; - /** @var array */ #[ORM\Column(type: Types::JSON)] private array $data = []; + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: false)] + private \DateTimeImmutable $created; + + public function __construct( + #[ORM\ManyToOne(inversedBy: 'eliminations')] + #[ORM\JoinColumn(nullable: false)] + private Quiz $quiz, + ) {} + public function getId(): Uuid { return $this->id; @@ -40,22 +50,26 @@ class Elimination } /** @param array $data */ - public function setData(array $data): static + public function setData(array $data): self { $this->data = $data; return $this; } - public function setQuiz(Quiz $quiz): self - { - $this->quiz = $quiz; - - return $this; - } - public function getQuiz(): Quiz { return $this->quiz; } + + #[ORM\PrePersist] + public function setCreatedAtValue(): void + { + $this->created = new DateTimeImmutable(); + } + + public function getCreated(): \DateTimeInterface + { + return $this->created; + } } diff --git a/src/Entity/Quiz.php b/src/Entity/Quiz.php index 547406b..1f3981f 100644 --- a/src/Entity/Quiz.php +++ b/src/Entity/Quiz.php @@ -38,11 +38,12 @@ class Quiz #[ORM\OneToMany(targetEntity: Correction::class, mappedBy: 'quiz', orphanRemoval: true)] private Collection $corrections; - #[ORM\Column(nullable: true)] - private ?int $dropouts = null; + #[ORM\Column(nullable: false, options: ['default' => 1])] + private int $dropouts = 1; /** @var Collection */ #[ORM\OneToMany(targetEntity: Elimination::class, mappedBy: 'quiz', cascade: ['persist'], orphanRemoval: true)] + #[ORM\OrderBy(['created' => 'DESC'])] private Collection $eliminations; public function __construct() @@ -113,12 +114,12 @@ class Quiz return $this; } - public function getDropouts(): ?int + public function getDropouts(): int { return $this->dropouts; } - public function setDropouts(?int $dropouts): static + public function setDropouts(int $dropouts): static { $this->dropouts = $dropouts; diff --git a/src/Factory/EliminationFactory.php b/src/Factory/EliminationFactory.php new file mode 100644 index 0000000..773fad3 --- /dev/null +++ b/src/Factory/EliminationFactory.php @@ -0,0 +1,38 @@ +em->persist($elimination); + + $scores = $this->candidateRepository->getScores($quiz); + + $simpleScores = []; + + foreach (array_reverse($scores) as $i => $score) { + $simpleScores[$score['name']] = $i < $quiz->getDropouts() ? Elimination::SCREEN_RED : Elimination::SCREEN_GREEN; + } + + $elimination->setData($simpleScores); + + $this->em->flush(); + + return $elimination; + } +} diff --git a/src/Form/AddCandidatesFormType.php b/src/Form/AddCandidatesFormType.php index 22a02f4..dbb952b 100644 --- a/src/Form/AddCandidatesFormType.php +++ b/src/Form/AddCandidatesFormType.php @@ -19,7 +19,7 @@ class AddCandidatesFormType extends AbstractType { $builder ->add('candidates', TextareaType::class, [ - 'label' => $this->translator->trans('Candidates'), + 'label' => $this->translator->trans('Candidates'), 'translation_domain' => false, ]) ; } diff --git a/src/Form/CreateSeasonFormType.php b/src/Form/CreateSeasonFormType.php index 573546e..7a0ca2e 100644 --- a/src/Form/CreateSeasonFormType.php +++ b/src/Form/CreateSeasonFormType.php @@ -21,6 +21,7 @@ class CreateSeasonFormType extends AbstractType $builder ->add('name', TextType::class, [ 'label' => $this->translator->trans('Season Name'), + 'translation_domain' => false, ]) ; } diff --git a/src/Form/EnterNameType.php b/src/Form/EnterNameType.php index 840418f..e5e9c09 100644 --- a/src/Form/EnterNameType.php +++ b/src/Form/EnterNameType.php @@ -18,7 +18,11 @@ class EnterNameType extends AbstractType { $builder ->add('name', TextType::class, - ['required' => true, 'label' => $this->translator->trans('Enter your name')], + [ + 'required' => true, + 'label' => $this->translator->trans('Enter your name'), + 'translation_domain' => false, + ], ) ; } diff --git a/src/Form/RegistrationFormType.php b/src/Form/RegistrationFormType.php index 1d82609..bf26c0b 100644 --- a/src/Form/RegistrationFormType.php +++ b/src/Form/RegistrationFormType.php @@ -8,6 +8,7 @@ use App\Entity\User; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\PasswordType; +use Symfony\Component\Form\Extension\Core\Type\RepeatedType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\Length; @@ -27,11 +28,16 @@ class RegistrationFormType extends AbstractType ->add('email', EmailType::class, [ 'label' => $this->translator->trans('Email'), 'attr' => ['autocomplete' => 'email'], + 'translation_domain' => false, ]) - ->add('plainPassword', PasswordType::class, [ - 'label' => $this->translator->trans('Password'), + ->add('plainPassword', RepeatedType::class, [ + 'type' => PasswordType::class, + 'invalid_message' => $this->translator->trans('The password fields must match.'), + 'options' => ['attr' => ['class' => 'password-field']], + 'required' => true, + 'first_options' => ['label' => $this->translator->trans('Password')], + 'second_options' => ['label' => $this->translator->trans('Repeat Password')], 'mapped' => false, - 'attr' => ['autocomplete' => 'new-password'], 'constraints' => [ new NotBlank([ 'message' => 'Please enter a password', @@ -43,6 +49,7 @@ class RegistrationFormType extends AbstractType 'max' => 4096, ]), ], + 'translation_domain' => false, ]) ; } diff --git a/src/Form/SelectSeasonType.php b/src/Form/SelectSeasonType.php index 48db112..53020af 100644 --- a/src/Form/SelectSeasonType.php +++ b/src/Form/SelectSeasonType.php @@ -20,7 +20,7 @@ class SelectSeasonType extends AbstractType { $builder ->add('season_code', TextType::class, - ['required' => true, 'constraints' => new Regex(pattern: "/^[A-Za-z\d]{5}$/"), 'label' => $this->translator->trans('Season Code')] + ['required' => true, 'constraints' => new Regex(pattern: "/^[A-Za-z\d]{5}$/"), 'label' => $this->translator->trans('Season Code'), 'translation_domain' => false] ) ; } diff --git a/src/Form/UploadQuizFormType.php b/src/Form/UploadQuizFormType.php index 2fe7615..3fbe161 100644 --- a/src/Form/UploadQuizFormType.php +++ b/src/Form/UploadQuizFormType.php @@ -23,11 +23,13 @@ class UploadQuizFormType extends AbstractType $builder ->add('name', TextType::class, [ 'label' => $this->translator->trans('Quiz name'), + 'translation_domain' => false, ]) ->add('sheet', FileType::class, [ 'label' => $this->translator->trans('Quiz (xlsx)'), 'mapped' => false, 'required' => true, + 'translation_domain' => false, 'constraints' => [ new File([ 'maxSize' => '1024k', diff --git a/src/Repository/CandidateRepository.php b/src/Repository/CandidateRepository.php index 4b69d52..ce61c02 100644 --- a/src/Repository/CandidateRepository.php +++ b/src/Repository/CandidateRepository.php @@ -13,11 +13,12 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\ORM\Query\Expr\Join; use Doctrine\Persistence\ManagerRegistry; use Safe\Exceptions\UrlException; +use Symfony\Component\Uid\Uuid; /** * @extends ServiceEntityRepository * - * @phpstan-type Result array{0: Candidate, correct: int, time: \DateInterval, corrections?: float, score: float} + * @phpstan-type Result array{id: Uuid, name: string, correct: int, time: \DateInterval, corrections?: float, score: float} * @phpstan-type ResultList list */ class CandidateRepository extends ServiceEntityRepository @@ -56,7 +57,7 @@ class CandidateRepository extends ServiceEntityRepository public function getScores(Quiz $quiz): array { $scoreTimeQb = $this->createQueryBuilder('c', 'c.id') - ->select('c', 'sum(case when a.isRightAnswer = true then 1 else 0 end) as correct', 'max(ga.created) - min(ga.created) as time') + ->select('c.id', 'c.name', 'sum(case when a.isRightAnswer = true then 1 else 0 end) as correct', 'max(ga.created) - min(ga.created) as time') ->join('c.givenAnswers', 'ga') ->join('ga.answer', 'a') ->where('ga.quiz = :quiz') @@ -64,7 +65,7 @@ class CandidateRepository extends ServiceEntityRepository ->setParameter('quiz', $quiz); $correctionsQb = $this->createQueryBuilder('c', 'c.id') - ->select('c', 'cor.amount as corrections') + ->select('c.id', 'cor.amount as corrections') ->innerJoin(Correction::class, 'cor', Join::WITH, 'cor.candidate = c and cor.quiz = :quiz') ->setParameter('quiz', $quiz); @@ -74,7 +75,7 @@ class CandidateRepository extends ServiceEntityRepository } /** - * @param array $in + * @param array $in * * @return array * */ diff --git a/src/Service/QuizSpreadsheetService.php b/src/Service/QuizSpreadsheetService.php index d0a884b..430de90 100644 --- a/src/Service/QuizSpreadsheetService.php +++ b/src/Service/QuizSpreadsheetService.php @@ -52,14 +52,14 @@ class QuizSpreadsheetService } /** @throws SpreadsheetDataException */ - public function xlsxToQuiz(Quiz $quiz, File $file): Quiz + public function xlsxToQuiz(Quiz $quiz, File $file): void { $spreadsheet = $this->readSheet($file); $sheet = $spreadsheet->getSheet($spreadsheet->getFirstSheetIndex()); $answerLines = \array_slice($sheet->toArray(formatData: false), 1); - return $this->fillQuizFromArray($quiz, $answerLines); + $this->fillQuizFromArray($quiz, $answerLines); } private function readSheet(File $file): Spreadsheet diff --git a/symfony.lock b/symfony.lock index 5814c40..6cb1ce2 100644 --- a/symfony.lock +++ b/symfony.lock @@ -97,6 +97,21 @@ "config/packages/sentry.yaml" ] }, + "symfony/asset-mapper": { + "version": "7.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.4", + "ref": "5ad1308aa756d58f999ffbe1540d1189f5d7d14a" + }, + "files": [ + "assets/quiz.js", + "assets/styles/app.css", + "config/packages/asset_mapper.yaml", + "importmap.php" + ] + }, "symfony/console": { "version": "7.2", "recipe": { @@ -287,6 +302,9 @@ "config/routes/web_profiler.yaml" ] }, + "symfonycasts/sass-bundle": { + "version": "v0.8.2" + }, "symfonycasts/verify-email-bundle": { "version": "v1.17.3" }, diff --git a/templates/backoffice/base.html.twig b/templates/backoffice/base.html.twig index 8f06354..46f59d8 100644 --- a/templates/backoffice/base.html.twig +++ b/templates/backoffice/base.html.twig @@ -1,49 +1,3 @@ - - - - - - - - - - - - {% block title %}Tijd voor de test{% endblock title %} - - {% block stylesheets %} - {% endblock %} - - {% block javascripts %} - {% endblock %} - - -{% block nav %} - {{ include('backoffice/nav.html.twig') }} -{% endblock nav %} -
-
- {% for label, messages in app.flashes() %} - {% for message in messages %} - - {% endfor %} - {% endfor %} - {% block body %} - {% endblock body %} -
-
- - +{% extends 'base.html.twig' %} +{% block importmap %}{{ importmap('backoffice') }}{% endblock %} +{% block nav %}{{ include('backoffice/nav.html.twig') }}{% endblock %} diff --git a/templates/login/login.html.twig b/templates/backoffice/login/login.html.twig similarity index 100% rename from templates/login/login.html.twig rename to templates/backoffice/login/login.html.twig diff --git a/templates/backoffice/prepare_elimination/index.html.twig b/templates/backoffice/prepare_elimination/index.html.twig index 8dff5b5..16e47ff 100644 --- a/templates/backoffice/prepare_elimination/index.html.twig +++ b/templates/backoffice/prepare_elimination/index.html.twig @@ -1,3 +1,40 @@ {% extends 'backoffice/base.html.twig' %} {% block body %} +
+ +
+
+
+
+ {%~ for candidate, colour in elimination.data %} +
+ +
+ +
+
+ {% endfor %} + +
+
+
+

Hier kan dus weer wat uitleg komen

+
+
{% endblock %} diff --git a/templates/backoffice/quiz.html.twig b/templates/backoffice/quiz.html.twig index 9579599..33b54fe 100644 --- a/templates/backoffice/quiz.html.twig +++ b/templates/backoffice/quiz.html.twig @@ -14,7 +14,7 @@

{{ 'Questions'|trans }}

- {% for question in quiz.questions %} + {%~ for question in quiz.questions ~%}

    - {% for answer in question.answers %} -
  • {{ answer.text }}
  • - {% else %} - {{ 'There are no answers for this question'|trans }} - {% endfor %} + {%~ for answer in question.answers %} + {{ answer.text -}} + {%~ else %} + {{ 'There are no answers for this question'|trans -}} + {%~ endfor %}
@@ -50,17 +50,23 @@
-

-

{{ 'Score'|trans }}

-

+

{{ 'Score'|trans }}

{{ 'Number of dropouts:'|trans }} {{ quiz.dropouts }}

@@ -75,9 +81,9 @@ - {% for candidate in result %} + {%~ for candidate in result ~%} - {{ candidate.0.name }} + {{ candidate.name }} {{ candidate.correct|default('0') }} {{ candidate.corrections|default('0') }} {{ candidate.score|default('x') }} @@ -93,6 +99,7 @@
{% endblock %} {% block javascripts %} + {{ parent() }} + + {% block title %}Tijd voor de test{% endblock title %} + + {% block stylesheets %}{% endblock %} + {% block javascripts %}{% block importmap %}{% endblock %}{% endblock %} + + +{% block nav %} +{% endblock nav %} +
+ {% block main %} +
+ {{ include('flashes.html.twig') }} + {% block body %} + {% endblock body %} +
+ {% endblock %} +
+ + diff --git a/templates/flashes.html.twig b/templates/flashes.html.twig new file mode 100644 index 0000000..5bde08c --- /dev/null +++ b/templates/flashes.html.twig @@ -0,0 +1,13 @@ +{% set flashes=app.flashes() %} +{% if flashes is not empty %} +
+ {% for label, messages in flashes %} + {% for message in messages %} + + {% endfor %} + {% endfor %} +
+{% endif %} diff --git a/templates/prepare_elimination/index.html.twig b/templates/prepare_elimination/index.html.twig deleted file mode 100644 index 97195ce..0000000 --- a/templates/prepare_elimination/index.html.twig +++ /dev/null @@ -1,26 +0,0 @@ -{% extends 'backoffice/base.html.twig' %} -{% block body %} -
- -
-
-
- -
-
-

Hier kan dus weer wat uitleg komen

-
-
-{% endblock %} diff --git a/templates/quiz/base.html.twig b/templates/quiz/base.html.twig index 1f13b23..ed13ec7 100644 --- a/templates/quiz/base.html.twig +++ b/templates/quiz/base.html.twig @@ -1,55 +1,2 @@ - - - - - - - - - - {% block title %} - Tijd voor de test - {% endblock title %} - - - - -
-
- {% for label, messages in app.flashes() %} - {% for message in messages %} - - {% endfor %} - {% endfor %} - {% block body %} - {% endblock body %} -
- {% block script %} - {% endblock script %} -
- - +{% extends 'base.html.twig' %} +{% block importmap %}{{ importmap('quiz') }}{% endblock %} diff --git a/templates/elimination/candidate.html.twig b/templates/quiz/elimination/candidate.html.twig similarity index 100% rename from templates/elimination/candidate.html.twig rename to templates/quiz/elimination/candidate.html.twig diff --git a/templates/elimination/index.html.twig b/templates/quiz/elimination/index.html.twig similarity index 100% rename from templates/elimination/index.html.twig rename to templates/quiz/elimination/index.html.twig diff --git a/translations/messages+intl-icu.nl.yaml b/translations/messages+intl-icu.nl.yaml index 26f16da..76bfc89 100644 --- a/translations/messages+intl-icu.nl.yaml +++ b/translations/messages+intl-icu.nl.yaml @@ -17,7 +17,7 @@ Corrections: Jokers 'Download Template': 'Download sjabloon' Email: E-mail 'Enter your name': 'Voor je naam in' -'Invalid season code': 'Ongeldige seizoenscode' +'Invalid season code': 'Ongeldige seizoencode' 'Load Prepared Elimination': 'Laad voorbereide eliminatie' Logout: Uitloggen 'Make active': 'Maak actief' @@ -42,14 +42,17 @@ Quiz: Test Quizzes: Tests Register: Registreren 'Remember me': 'Onthoud mij' +'Repeat Password': 'Herhaal wachtwoord' +Save: Opslaan Score: Score Season: Seizoen -'Season Code': Seizoenscode -'Season Name': Seizoensnaam +'Season Code': Seizoencode +'Season Name': Seizoennaam Seasons: Seizoenen 'Sign in': 'Log in' 'Start Elimination': 'Start eliminatie' Submit: Verstuur +'The password fields must match.': 'De wachtwoorden moeten overeen komen.' 'There are no answers for this question': 'Er zijn geen antwoorden voor deze vraag' Time: Tijd 'Your Seasons': 'Jouw seizoenen'