From 14cdcd3f634cd6789455bfeb5486bcafee4980f7 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Thu, 27 Feb 2025 17:41:25 +0100 Subject: [PATCH] Release 2.31 (#5372) * simplify translation * bump version * deprecate translations * pass date-range as argument to export and timesheet filter URL from monthly overview report * added class for use in responsive screens * show technical role name * simplify multi-update title * more statistic models * bump composer packages --- UPGRADING-3.md | 6 + assets/sass/content.scss | 7 + composer.lock | 443 +++++++++--------- src/Constants.php | 4 +- src/Controller/DashboardController.php | 6 +- .../Reporting/ProjectDateRangeController.php | 5 +- .../Actions/ProjectSubscriber.php | 9 +- src/Model/Statistic/DateRange.php | 54 +++ src/Model/Statistic/StatisticDate.php | 11 + src/Twig/Extensions.php | 7 + templates/macros/datatables.html.twig | 2 +- templates/permission/permissions.html.twig | 2 +- templates/project/actions.html.twig | 4 +- .../daterange.html.twig} | 2 +- templates/timesheet/multi-update.html.twig | 2 +- .../AbstractUserPeriodControllerTestCase.php | 4 +- .../AbstractUsersPeriodControllerTestCase.php | 2 +- tests/Twig/ExtensionsTest.php | 21 +- translations/messages.de.xlf | 12 +- translations/messages.en.xlf | 12 +- 20 files changed, 364 insertions(+), 251 deletions(-) create mode 100644 src/Model/Statistic/DateRange.php rename templates/reporting/{project_daterange.html.twig => project/daterange.html.twig} (98%) diff --git a/UPGRADING-3.md b/UPGRADING-3.md index 0a79d1d4..5e20a4c4 100644 --- a/UPGRADING-3.md +++ b/UPGRADING-3.md @@ -16,3 +16,9 @@ Perform EACH version specific task between your version and the new one, otherwi Removed translations: - `action.edit`: use `edit` instead - `my.profile`: use `user_profile` instead +- `stats.userAmountToday`: use `` instead +- `stats.userAmountWeek`: use `` instead +- `stats.userAmountMonth`: use `` instead +- `stats.userAmountYear`: use `` instead +- `stats.userAmountTotal`: use `` instead +- `update_multiple` \ No newline at end of file diff --git a/assets/sass/content.scss b/assets/sass/content.scss index 6b76dfc4..e3a57120 100644 --- a/assets/sass/content.scss +++ b/assets/sass/content.scss @@ -52,6 +52,13 @@ table.dataTable thead > tr > th.hw-min { width: 1%; white-space: normal; } +@include media-breakpoint-up(sm) { + th.w-sm-min, + td.w-sm-min { + width: 1%; + white-space: nowrap; + } +} /* If a table column contains ONLY avatar it will collapse, so make it a defined width */ .w-avatar { width: 40px; diff --git a/composer.lock b/composer.lock index 78cbc916..7fba77aa 100644 --- a/composer.lock +++ b/composer.lock @@ -2009,16 +2009,16 @@ }, { "name": "gedmo/doctrine-extensions", - "version": "v3.18.0", + "version": "v3.19.0", "source": { "type": "git", "url": "https://github.com/doctrine-extensions/DoctrineExtensions.git", - "reference": "964db6c4fb5b0fc8aa25cc31b17471b4963460c6" + "reference": "5b0b8a442d19e6701ae64535dc08f7944e2895d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/964db6c4fb5b0fc8aa25cc31b17471b4963460c6", - "reference": "964db6c4fb5b0fc8aa25cc31b17471b4963460c6", + "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/5b0b8a442d19e6701ae64535dc08f7944e2895d2", + "reference": "5b0b8a442d19e6701ae64535dc08f7944e2895d2", "shasum": "" }, "require": { @@ -2037,7 +2037,7 @@ "doctrine/common": "<2.13 || >=4.0", "doctrine/dbal": "<3.7 || >=5.0", "doctrine/mongodb-odm": "<2.3 || >=3.0", - "doctrine/orm": "<2.14.0 || 2.16.0 || 2.16.1 || >=4.0" + "doctrine/orm": "<2.20 || >=3.0 <3.3 || >=4.0" }, "require-dev": { "doctrine/annotations": "^1.13 || ^2.0", @@ -2046,8 +2046,8 @@ "doctrine/dbal": "^3.7 || ^4.0", "doctrine/doctrine-bundle": "^2.3", "doctrine/mongodb-odm": "^2.3", - "doctrine/orm": "^2.14.0 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.14.0", + "doctrine/orm": "^2.20 || ^3.3", + "friendsofphp/php-cs-fixer": "^3.70", "nesbot/carbon": "^2.71 || ^3.0", "phpstan/phpstan": "^2.1.1", "phpstan/phpstan-doctrine": "^2.0.1", @@ -2115,7 +2115,7 @@ "support": { "email": "gediminas.morkevicius@gmail.com", "issues": "https://github.com/doctrine-extensions/DoctrineExtensions/issues", - "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.18.0", + "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.19.0", "wiki": "https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc" }, "funding": [ @@ -2136,7 +2136,7 @@ "type": "github" } ], - "time": "2025-02-01T22:28:13+00:00" + "time": "2025-02-24T22:12:57+00:00" }, { "name": "jms/metadata", @@ -2204,16 +2204,16 @@ }, { "name": "jms/serializer", - "version": "3.32.2", + "version": "3.32.3", "source": { "type": "git", "url": "https://github.com/schmittjoh/serializer.git", - "reference": "fa7ab39504c24d76107ba16c00aafa5da3605971" + "reference": "033c9beab9eb708509a3d400e9f0ffeb2d440e71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/fa7ab39504c24d76107ba16c00aafa5da3605971", - "reference": "fa7ab39504c24d76107ba16c00aafa5da3605971", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/033c9beab9eb708509a3d400e9f0ffeb2d440e71", + "reference": "033c9beab9eb708509a3d400e9f0ffeb2d440e71", "shasum": "" }, "require": { @@ -2290,7 +2290,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/serializer/issues", - "source": "https://github.com/schmittjoh/serializer/tree/3.32.2" + "source": "https://github.com/schmittjoh/serializer/tree/3.32.3" }, "funding": [ { @@ -2298,7 +2298,7 @@ "type": "github" } ], - "time": "2025-01-03T22:43:29+00:00" + "time": "2025-02-11T23:16:25+00:00" }, { "name": "jms/serializer-bundle", @@ -2391,16 +2391,16 @@ }, { "name": "kevinpapst/tabler-bundle", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/kevinpapst/TablerBundle.git", - "reference": "d6e4ce78e8228402a2e419835913c4b1b29d0838" + "reference": "39b5e2946c0d4fea5ad05be9b1cdad686d7035b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kevinpapst/TablerBundle/zipball/d6e4ce78e8228402a2e419835913c4b1b29d0838", - "reference": "d6e4ce78e8228402a2e419835913c4b1b29d0838", + "url": "https://api.github.com/repos/kevinpapst/TablerBundle/zipball/39b5e2946c0d4fea5ad05be9b1cdad686d7035b3", + "reference": "39b5e2946c0d4fea5ad05be9b1cdad686d7035b3", "shasum": "" }, "require": { @@ -2450,7 +2450,7 @@ "description": "Admin/Backend theme bundle for Symfony based on Tabler.io", "support": { "issues": "https://github.com/kevinpapst/TablerBundle/issues", - "source": "https://github.com/kevinpapst/TablerBundle/tree/1.6.1" + "source": "https://github.com/kevinpapst/TablerBundle/tree/1.7.0" }, "funding": [ { @@ -2462,7 +2462,7 @@ "type": "github" } ], - "time": "2024-12-19T21:09:30+00:00" + "time": "2025-02-13T08:14:16+00:00" }, { "name": "league/csv", @@ -3066,16 +3066,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", "shasum": "" }, "require": { @@ -3114,7 +3114,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" }, "funding": [ { @@ -3122,20 +3122,20 @@ "type": "tidelift" } ], - "time": "2024-11-08T17:47:46+00:00" + "time": "2025-02-12T12:17:51+00:00" }, { "name": "nelmio/api-doc-bundle", - "version": "v4.36.1", + "version": "v4.37.1", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioApiDocBundle.git", - "reference": "cdc855ef8e6a811336c3a6c72fe99fbe13a78e37" + "reference": "1497977f82d396f1dda8120434c6d29f3de683e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/cdc855ef8e6a811336c3a6c72fe99fbe13a78e37", - "reference": "cdc855ef8e6a811336c3a6c72fe99fbe13a78e37", + "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/1497977f82d396f1dda8120434c6d29f3de683e6", + "reference": "1497977f82d396f1dda8120434c6d29f3de683e6", "shasum": "" }, "require": { @@ -3236,7 +3236,7 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioApiDocBundle/issues", - "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.36.1" + "source": "https://github.com/nelmio/NelmioApiDocBundle/tree/v4.37.1" }, "funding": [ { @@ -3244,7 +3244,7 @@ "type": "github" } ], - "time": "2025-01-19T17:01:30+00:00" + "time": "2025-02-14T12:47:20+00:00" }, { "name": "nelmio/cors-bundle", @@ -4186,16 +4186,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299" + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299", - "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", "shasum": "" }, "require": { @@ -4227,9 +4227,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" }, - "time": "2024-10-13T11:29:49+00:00" + "time": "2025-02-19T13:28:12+00:00" }, { "name": "psr/cache", @@ -5127,16 +5127,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "b209751ed25f735ea90ca4c9c969d9413a17dfee" + "reference": "342e87b15ac02e4b4f0924ddc368e75d5262aab3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/b209751ed25f735ea90ca4c9c969d9413a17dfee", - "reference": "b209751ed25f735ea90ca4c9c969d9413a17dfee", + "url": "https://api.github.com/repos/symfony/cache/zipball/342e87b15ac02e4b4f0924ddc368e75d5262aab3", + "reference": "342e87b15ac02e4b4f0924ddc368e75d5262aab3", "shasum": "" }, "require": { @@ -5203,7 +5203,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.18" + "source": "https://github.com/symfony/cache/tree/v6.4.19" }, "funding": [ { @@ -5219,7 +5219,7 @@ "type": "tidelift" } ], - "time": "2025-01-22T14:13:52+00:00" + "time": "2025-02-26T09:12:57+00:00" }, { "name": "symfony/cache-contracts", @@ -5607,16 +5607,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.16", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8" + "reference": "b343c3b2f1539fe41331657b37d5c96c1d1ea842" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/7a379d8871f6a36f01559c14e11141cc02eb8dc8", - "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b343c3b2f1539fe41331657b37d5c96c1d1ea842", + "reference": "b343c3b2f1539fe41331657b37d5c96c1d1ea842", "shasum": "" }, "require": { @@ -5668,7 +5668,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/v6.4.16" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.19" }, "funding": [ { @@ -5684,7 +5684,7 @@ "type": "tidelift" } ], - "time": "2024-11-25T14:52:46+00:00" + "time": "2025-02-20T10:02:49+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5755,16 +5755,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "fd0094d4648bf6bbdafcd1f0c8aafb6e93d735e6" + "reference": "22df1e858b8b00647c67fc201dfbea65c0fdab15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/fd0094d4648bf6bbdafcd1f0c8aafb6e93d735e6", - "reference": "fd0094d4648bf6bbdafcd1f0c8aafb6e93d735e6", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/22df1e858b8b00647c67fc201dfbea65c0fdab15", + "reference": "22df1e858b8b00647c67fc201dfbea65c0fdab15", "shasum": "" }, "require": { @@ -5843,7 +5843,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.18" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.19" }, "funding": [ { @@ -5859,7 +5859,7 @@ "type": "tidelift" } ], - "time": "2025-01-25T08:04:58+00:00" + "time": "2025-02-18T08:43:25+00:00" }, { "name": "symfony/dotenv", @@ -5937,16 +5937,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e" + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", - "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3d4e55cd2b8f1979a65eba9ab749d6466c316f71", + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71", "shasum": "" }, "require": { @@ -5992,7 +5992,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.18" + "source": "https://github.com/symfony/error-handler/tree/v6.4.19" }, "funding": [ { @@ -6008,7 +6008,7 @@ "type": "tidelift" } ], - "time": "2025-01-06T09:38:16+00:00" + "time": "2025-02-02T20:16:33+00:00" }, { "name": "symfony/event-dispatcher", @@ -6527,16 +6527,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "91df8ee37543ebc01756c9e5eaf94d1878ff1ccd" + "reference": "078a6f11cb34d208d6efc74003d77f66a09fa3c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/91df8ee37543ebc01756c9e5eaf94d1878ff1ccd", - "reference": "91df8ee37543ebc01756c9e5eaf94d1878ff1ccd", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/078a6f11cb34d208d6efc74003d77f66a09fa3c2", + "reference": "078a6f11cb34d208d6efc74003d77f66a09fa3c2", "shasum": "" }, "require": { @@ -6656,7 +6656,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.18" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.19" }, "funding": [ { @@ -6672,20 +6672,20 @@ "type": "tidelift" } ], - "time": "2025-01-28T18:47:02+00:00" + "time": "2025-02-26T07:27:07+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "394b440934056b8d9d6ba250001458e9d7998b7f" + "reference": "3294a433fc9d12ae58128174896b5b1822c28dad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/394b440934056b8d9d6ba250001458e9d7998b7f", - "reference": "394b440934056b8d9d6ba250001458e9d7998b7f", + "url": "https://api.github.com/repos/symfony/http-client/zipball/3294a433fc9d12ae58128174896b5b1822c28dad", + "reference": "3294a433fc9d12ae58128174896b5b1822c28dad", "shasum": "" }, "require": { @@ -6749,7 +6749,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.18" + "source": "https://github.com/symfony/http-client/tree/v6.4.19" }, "funding": [ { @@ -6765,7 +6765,7 @@ "type": "tidelift" } ], - "time": "2025-01-28T15:49:13+00:00" + "time": "2025-02-13T09:55:13+00:00" }, { "name": "symfony/http-client-contracts", @@ -6924,16 +6924,16 @@ }, { "name": "symfony/http-kernel", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7" + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", - "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", "shasum": "" }, "require": { @@ -7018,7 +7018,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/v6.4.18" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.19" }, "funding": [ { @@ -7034,7 +7034,7 @@ "type": "tidelift" } ], - "time": "2025-01-29T07:25:58+00:00" + "time": "2025-02-26T10:51:37+00:00" }, { "name": "symfony/intl", @@ -7201,16 +7201,16 @@ }, { "name": "symfony/mime", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e" + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/917d77981eb1ea963608d5cda4d9c0cf72eaa68e", - "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e", + "url": "https://api.github.com/repos/symfony/mime/zipball/ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", "shasum": "" }, "require": { @@ -7266,7 +7266,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.18" + "source": "https://github.com/symfony/mime/tree/v6.4.19" }, "funding": [ { @@ -7282,7 +7282,7 @@ "type": "tidelift" } ], - "time": "2025-01-23T13:10:52+00:00" + "time": "2025-02-17T21:23:52+00:00" }, { "name": "symfony/monolog-bridge", @@ -7661,16 +7661,16 @@ }, { "name": "symfony/process", - "version": "v6.4.15", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", + "url": "https://api.github.com/repos/symfony/process/zipball/7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", "shasum": "" }, "require": { @@ -7702,7 +7702,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.15" + "source": "https://github.com/symfony/process/tree/v6.4.19" }, "funding": [ { @@ -7718,7 +7718,7 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:19:14+00:00" + "time": "2025-02-04T13:35:48+00:00" }, { "name": "symfony/property-access", @@ -8384,16 +8384,16 @@ }, { "name": "symfony/security-http", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "54f2ccce1f3822eee3fb3a85debd9a67d12762b8" + "reference": "a57bb00b01036865e6c08d0c8540df429534df19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/54f2ccce1f3822eee3fb3a85debd9a67d12762b8", - "reference": "54f2ccce1f3822eee3fb3a85debd9a67d12762b8", + "url": "https://api.github.com/repos/symfony/security-http/zipball/a57bb00b01036865e6c08d0c8540df429534df19", + "reference": "a57bb00b01036865e6c08d0c8540df429534df19", "shasum": "" }, "require": { @@ -8452,7 +8452,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.18" + "source": "https://github.com/symfony/security-http/tree/v6.4.19" }, "funding": [ { @@ -8468,20 +8468,20 @@ "type": "tidelift" } ], - "time": "2025-01-28T14:53:52+00:00" + "time": "2025-01-28T19:24:43+00:00" }, { "name": "symfony/serializer", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "6ad986f62276da4c8c69754decfaa445a89cb6e3" + "reference": "a221b2f6066af304d760cff7a26f201b4fab4aef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/6ad986f62276da4c8c69754decfaa445a89cb6e3", - "reference": "6ad986f62276da4c8c69754decfaa445a89cb6e3", + "url": "https://api.github.com/repos/symfony/serializer/zipball/a221b2f6066af304d760cff7a26f201b4fab4aef", + "reference": "a221b2f6066af304d760cff7a26f201b4fab4aef", "shasum": "" }, "require": { @@ -8550,7 +8550,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/v6.4.18" + "source": "https://github.com/symfony/serializer/tree/v6.4.19" }, "funding": [ { @@ -8566,7 +8566,7 @@ "type": "tidelift" } ], - "time": "2025-01-28T18:47:02+00:00" + "time": "2025-02-24T08:42:36+00:00" }, { "name": "symfony/service-contracts", @@ -8653,16 +8653,16 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.13", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" + "reference": "dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", - "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c", + "reference": "dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c", "shasum": "" }, "require": { @@ -8695,7 +8695,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.19" }, "funding": [ { @@ -8711,7 +8711,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-02-21T10:06:30+00:00" }, { "name": "symfony/string", @@ -8801,16 +8801,16 @@ }, { "name": "symfony/translation", - "version": "v6.4.13", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "url": "https://api.github.com/repos/symfony/translation/zipball/3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e", "shasum": "" }, "require": { @@ -8876,7 +8876,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.13" + "source": "https://github.com/symfony/translation/tree/v6.4.19" }, "funding": [ { @@ -8892,7 +8892,7 @@ "type": "tidelift" } ], - "time": "2024-09-27T18:14:25+00:00" + "time": "2025-02-13T10:18:43+00:00" }, { "name": "symfony/translation-contracts", @@ -8974,16 +8974,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.17", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "238e1aac992b5231c66faf10131ace7bdba97065" + "reference": "d6aecb7196bf610e63ebb64f937c33878d5d03b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/238e1aac992b5231c66faf10131ace7bdba97065", - "reference": "238e1aac992b5231c66faf10131ace7bdba97065", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d6aecb7196bf610e63ebb64f937c33878d5d03b1", + "reference": "d6aecb7196bf610e63ebb64f937c33878d5d03b1", "shasum": "" }, "require": { @@ -9063,7 +9063,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.17" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.19" }, "funding": [ { @@ -9079,7 +9079,7 @@ "type": "tidelift" } ], - "time": "2024-12-19T14:08:41+00:00" + "time": "2025-02-14T09:54:06+00:00" }, { "name": "symfony/twig-bundle", @@ -9167,16 +9167,16 @@ }, { "name": "symfony/validator", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "ce20367d07b2592202e9c266b16a93fa50145207" + "reference": "f3e853dffe7c5db675686b8216d6d890dad8c885" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/ce20367d07b2592202e9c266b16a93fa50145207", - "reference": "ce20367d07b2592202e9c266b16a93fa50145207", + "url": "https://api.github.com/repos/symfony/validator/zipball/f3e853dffe7c5db675686b8216d6d890dad8c885", + "reference": "f3e853dffe7c5db675686b8216d6d890dad8c885", "shasum": "" }, "require": { @@ -9244,7 +9244,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.18" + "source": "https://github.com/symfony/validator/tree/v6.4.19" }, "funding": [ { @@ -9260,7 +9260,7 @@ "type": "tidelift" } ], - "time": "2025-01-27T16:05:44+00:00" + "time": "2025-02-19T13:12:02+00:00" }, { "name": "symfony/var-dumper", @@ -9349,16 +9349,16 @@ }, { "name": "symfony/var-exporter", - "version": "v6.4.13", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0f605f72a363f8743001038a176eeb2a11223b51" + "reference": "be6e71b0c257884c1107313de5d247741cfea172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", - "reference": "0f605f72a363f8743001038a176eeb2a11223b51", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/be6e71b0c257884c1107313de5d247741cfea172", + "reference": "be6e71b0c257884c1107313de5d247741cfea172", "shasum": "" }, "require": { @@ -9406,7 +9406,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.19" }, "funding": [ { @@ -9422,7 +9422,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-02-13T09:33:32+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -9625,20 +9625,20 @@ }, { "name": "twig/cssinliner-extra", - "version": "v3.19.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/cssinliner-extra.git", - "reference": "cef36c444b1cce4c0978d7aebd20427671a918f4" + "reference": "378d29b61d6406c456e3a4afbd15bbeea0b72ea8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/cef36c444b1cce4c0978d7aebd20427671a918f4", - "reference": "cef36c444b1cce4c0978d7aebd20427671a918f4", + "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/378d29b61d6406c456e3a4afbd15bbeea0b72ea8", + "reference": "378d29b61d6406c456e3a4afbd15bbeea0b72ea8", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/deprecation-contracts": "^2.5|^3", "tijsverkoyen/css-to-inline-styles": "^2.0", "twig/twig": "^3.13|^4.0" @@ -9678,7 +9678,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.19.0" + "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.20.0" }, "funding": [ { @@ -9690,24 +9690,24 @@ "type": "tidelift" } ], - "time": "2024-09-03T13:08:40+00:00" + "time": "2025-01-31T20:45:36+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.19.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa" + "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9746573ca4bc1cd03a767a183faadaf84e0c31fa", - "reference": "9746573ca4bc1cd03a767a183faadaf84e0c31fa", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/9df5e1dbb6a68c0665ae5603f6f2c20815647876", + "reference": "9df5e1dbb6a68c0665ae5603f6f2c20815647876", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/framework-bundle": "^5.4|^6.4|^7.0", "symfony/twig-bundle": "^5.4|^6.4|^7.0", "twig/twig": "^3.2|^4.0" @@ -9752,7 +9752,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.19.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.20.0" }, "funding": [ { @@ -9764,25 +9764,25 @@ "type": "tidelift" } ], - "time": "2024-09-26T19:22:23+00:00" + "time": "2025-02-08T09:47:15+00:00" }, { "name": "twig/inky-extra", - "version": "v3.19.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/inky-extra.git", - "reference": "60c92c2a435ccd95d7a852229f01098aaf7fbced" + "reference": "aacd79d94534b4a7fd6533cb5c33c4ee97239a0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/60c92c2a435ccd95d7a852229f01098aaf7fbced", - "reference": "60c92c2a435ccd95d7a852229f01098aaf7fbced", + "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/aacd79d94534b4a7fd6533cb5c33c4ee97239a0d", + "reference": "aacd79d94534b4a7fd6533cb5c33c4ee97239a0d", "shasum": "" }, "require": { "lorenzo/pinky": "^1.0.5", - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/deprecation-contracts": "^2.5|^3", "twig/twig": "^3.13|^4.0" }, @@ -9822,7 +9822,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/inky-extra/tree/v3.19.0" + "source": "https://github.com/twigphp/inky-extra/tree/v3.20.0" }, "funding": [ { @@ -9834,24 +9834,24 @@ "type": "tidelift" } ], - "time": "2024-09-03T13:08:40+00:00" + "time": "2025-01-31T20:45:36+00:00" }, { "name": "twig/intl-extra", - "version": "v3.19.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "79a1bea7254783b540d51de10dc5e9f310110794" + "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/79a1bea7254783b540d51de10dc5e9f310110794", - "reference": "79a1bea7254783b540d51de10dc5e9f310110794", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146", + "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/intl": "^5.4|^6.4|^7.0", "twig/twig": "^3.13|^4.0" }, @@ -9886,7 +9886,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.19.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.20.0" }, "funding": [ { @@ -9898,24 +9898,24 @@ "type": "tidelift" } ], - "time": "2025-01-24T20:20:33+00:00" + "time": "2025-01-31T20:45:36+00:00" }, { "name": "twig/string-extra", - "version": "v3.19.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", - "reference": "cb4eec11de02f63ad8ea9d065a1f27752d0bf752" + "reference": "4b3337544ac8f76c280def94e32b53acfaec0589" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/string-extra/zipball/cb4eec11de02f63ad8ea9d065a1f27752d0bf752", - "reference": "cb4eec11de02f63ad8ea9d065a1f27752d0bf752", + "url": "https://api.github.com/repos/twigphp/string-extra/zipball/4b3337544ac8f76c280def94e32b53acfaec0589", + "reference": "4b3337544ac8f76c280def94e32b53acfaec0589", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/string": "^5.4|^6.4|^7.0", "symfony/translation-contracts": "^1.1|^2|^3", "twig/twig": "^3.13|^4.0" @@ -9953,7 +9953,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.19.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.20.0" }, "funding": [ { @@ -9965,28 +9965,27 @@ "type": "tidelift" } ], - "time": "2024-11-30T08:42:13+00:00" + "time": "2025-01-31T20:45:36+00:00" }, { "name": "twig/twig", - "version": "v3.19.0", + "version": "v3.20.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e" + "reference": "3468920399451a384bef53cf7996965f7cd40183" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e", - "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183", + "reference": "3468920399451a384bef53cf7996965f7cd40183", "shasum": "" }, "require": { - "php": ">=8.0.2", + "php": ">=8.1.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php81": "^1.29" + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "phpstan/phpstan": "^2.0", @@ -10033,7 +10032,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.19.0" + "source": "https://github.com/twigphp/Twig/tree/v3.20.0" }, "funding": [ { @@ -10045,7 +10044,7 @@ "type": "tidelift" } ], - "time": "2025-01-29T07:06:14+00:00" + "time": "2025-02-13T08:34:43+00:00" }, { "name": "webmozart/assert", @@ -10206,16 +10205,16 @@ }, { "name": "zircote/swagger-php", - "version": "5.0.3", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "7708510b17502a416214148edaa8c9958b23b6cd" + "reference": "2eb4005840058d8844a0bcc14403932331331068" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/7708510b17502a416214148edaa8c9958b23b6cd", - "reference": "7708510b17502a416214148edaa8c9958b23b6cd", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/2eb4005840058d8844a0bcc14403932331331068", + "reference": "2eb4005840058d8844a0bcc14403932331331068", "shasum": "" }, "require": { @@ -10286,9 +10285,9 @@ ], "support": { "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/5.0.3" + "source": "https://github.com/zircote/swagger-php/tree/5.0.5" }, - "time": "2025-01-15T21:02:43+00:00" + "time": "2025-02-24T00:48:00+00:00" } ], "packages-dev": [ @@ -10832,16 +10831,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.68.5", + "version": "v3.70.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "7bedb718b633355272428c60736dc97fb96daf27" + "reference": "2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7bedb718b633355272428c60736dc97fb96daf27", - "reference": "7bedb718b633355272428c60736dc97fb96daf27", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e", + "reference": "2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e", "shasum": "" }, "require": { @@ -10858,7 +10857,7 @@ "react/promise": "^2.0 || ^3.0", "react/socket": "^1.0", "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.1 || ^6.0", + "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", "symfony/console": "^5.4 || ^6.4 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", @@ -10871,18 +10870,18 @@ "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.4", - "infection/infection": "^0.29.8", + "facile-it/paraunit": "^1.3.1 || ^2.5", + "infection/infection": "^0.29.10", "justinrainbow/json-schema": "^5.3 || ^6.0", "keradus/cli-executor": "^2.1", "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", - "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2", - "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0", - "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", + "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.7", + "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.0", + "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.0" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -10923,7 +10922,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.5" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.70.0" }, "funding": [ { @@ -10931,7 +10930,7 @@ "type": "github" } ], - "time": "2025-01-30T17:00:50+00:00" + "time": "2025-02-22T23:30:51+00:00" }, { "name": "masterminds/html5", @@ -11120,16 +11119,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.3", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9" + "reference": "6eaec7c6c9e90dcfe46ad1e1ffa5171e2dab641c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/64ae44e48214f3deebdaeebf2694297a10a2bea9", - "reference": "64ae44e48214f3deebdaeebf2694297a10a2bea9", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6eaec7c6c9e90dcfe46ad1e1ffa5171e2dab641c", + "reference": "6eaec7c6c9e90dcfe46ad1e1ffa5171e2dab641c", "shasum": "" }, "require": { @@ -11174,7 +11173,7 @@ "type": "github" } ], - "time": "2025-02-07T15:05:24+00:00" + "time": "2025-02-19T15:46:42+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -13330,16 +13329,16 @@ }, { "name": "symfony/browser-kit", - "version": "v6.4.13", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "65d4b3fd9556e4b5b41287bef93c671f8f9f86ab" + "reference": "ce95f3e3239159e7fa3be7690c6ce95a4714637f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/65d4b3fd9556e4b5b41287bef93c671f8f9f86ab", - "reference": "65d4b3fd9556e4b5b41287bef93c671f8f9f86ab", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/ce95f3e3239159e7fa3be7690c6ce95a4714637f", + "reference": "ce95f3e3239159e7fa3be7690c6ce95a4714637f", "shasum": "" }, "require": { @@ -13378,7 +13377,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.4.13" + "source": "https://github.com/symfony/browser-kit/tree/v6.4.19" }, "funding": [ { @@ -13394,7 +13393,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:07:50+00:00" + "time": "2025-02-14T11:23:16+00:00" }, { "name": "symfony/debug-bundle", @@ -13472,16 +13471,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "fd07959d3e8992795029bdab3605c2e8e895034e" + "reference": "19073e3e0bb50cbc1cb286077069b3107085206f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/fd07959d3e8992795029bdab3605c2e8e895034e", - "reference": "fd07959d3e8992795029bdab3605c2e8e895034e", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/19073e3e0bb50cbc1cb286077069b3107085206f", + "reference": "19073e3e0bb50cbc1cb286077069b3107085206f", "shasum": "" }, "require": { @@ -13519,7 +13518,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.18" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.19" }, "funding": [ { @@ -13535,7 +13534,7 @@ "type": "tidelift" } ], - "time": "2025-01-09T15:35:00+00:00" + "time": "2025-02-14T17:58:34+00:00" }, { "name": "symfony/phpunit-bridge", @@ -13621,16 +13620,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "979b623f12d1eb4f6f8f24fd321dfe1dee2444a2" + "reference": "7d1026a8e950d416cb5148ae88ac23db5d264839" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/979b623f12d1eb4f6f8f24fd321dfe1dee2444a2", - "reference": "979b623f12d1eb4f6f8f24fd321dfe1dee2444a2", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/7d1026a8e950d416cb5148ae88ac23db5d264839", + "reference": "7d1026a8e950d416cb5148ae88ac23db5d264839", "shasum": "" }, "require": { @@ -13683,7 +13682,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.18" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.19" }, "funding": [ { @@ -13699,7 +13698,7 @@ "type": "tidelift" } ], - "time": "2024-12-23T18:38:04+00:00" + "time": "2025-02-14T12:21:59+00:00" }, { "name": "theseer/tokenizer", diff --git a/src/Constants.php b/src/Constants.php index 3d094805..3970ee93 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ final class Constants /** * The current release version */ - public const VERSION = '2.30.0'; + public const VERSION = '2.31.0'; /** * The current release: major * 10000 + minor * 100 + patch */ - public const VERSION_ID = 23000; + public const VERSION_ID = 23100; /** * The software name */ diff --git a/src/Controller/DashboardController.php b/src/Controller/DashboardController.php index 54af6c35..6212ddef 100644 --- a/src/Controller/DashboardController.php +++ b/src/Controller/DashboardController.php @@ -38,7 +38,11 @@ final class DashboardController extends AbstractController */ private ?array $widgets = null; - public function __construct(private EventDispatcherInterface $eventDispatcher, private WidgetService $service, private BookmarkRepository $repository) + public function __construct( + private readonly EventDispatcherInterface $eventDispatcher, + private readonly WidgetService $service, + private readonly BookmarkRepository $repository + ) { } diff --git a/src/Controller/Reporting/ProjectDateRangeController.php b/src/Controller/Reporting/ProjectDateRangeController.php index 042eaf1c..1e5fd17f 100644 --- a/src/Controller/Reporting/ProjectDateRangeController.php +++ b/src/Controller/Reporting/ProjectDateRangeController.php @@ -59,11 +59,12 @@ final class ProjectDateRangeController extends AbstractController $byCustomer[$customer->getId()]['projects'][] = $entry; } - return $this->render('reporting/project_daterange.html.twig', [ + return $this->render('reporting/project/daterange.html.twig', [ 'report_title' => 'report_project_daterange', 'entries' => $byCustomer, 'form' => $form->createView(), - 'queryEnd' => $dateRange->getEnd(), + 'queryBegin' => $begin, + 'queryEnd' => $end, ]); } } diff --git a/src/EventSubscriber/Actions/ProjectSubscriber.php b/src/EventSubscriber/Actions/ProjectSubscriber.php index 9ef3f0a6..5d3eb2be 100644 --- a/src/EventSubscriber/Actions/ProjectSubscriber.php +++ b/src/EventSubscriber/Actions/ProjectSubscriber.php @@ -50,16 +50,21 @@ final class ProjectSubscriber extends AbstractActionsSubscriber $event->addDivider(); } + $dateRange = ''; + if (isset($payload['daterange']) && \is_string($payload['daterange'])) { + $dateRange = $payload['daterange']; + } + if ($this->isGranted('view_activity')) { $event->addActionToSubmenu('filter', 'activity', ['title' => 'activities', 'url' => $this->path('admin_activity', ['customers[]' => $customer->getId(), 'projects[]' => $project->getId()])]); } if ($this->isGranted('view_other_timesheet')) { - $event->addActionToSubmenu('filter', 'timesheet', ['title' => 'timesheet.filter', 'url' => $this->path('admin_timesheet', ['customers[]' => $customer->getId(), 'projects[]' => $project->getId()])]); + $event->addActionToSubmenu('filter', 'timesheet', ['title' => 'timesheet.filter', 'url' => $this->path('admin_timesheet', ['customers[]' => $customer->getId(), 'projects[]' => $project->getId(), 'daterange' => $dateRange])]); } if ($this->isGranted('create_export')) { - $event->addActionToSubmenu('filter', 'export', ['title' => 'export', 'url' => $this->path('export', ['customers[]' => $customer->getId(), 'projects[]' => $project->getId(), 'exported' => 1, 'daterange' => ''])]); + $event->addActionToSubmenu('filter', 'export', ['title' => 'export', 'url' => $this->path('export', ['customers[]' => $customer->getId(), 'projects[]' => $project->getId(), 'exported' => 1, 'daterange' => $dateRange])]); } if ($event->hasSubmenu('filter')) { diff --git a/src/Model/Statistic/DateRange.php b/src/Model/Statistic/DateRange.php new file mode 100644 index 00000000..054c49cb --- /dev/null +++ b/src/Model/Statistic/DateRange.php @@ -0,0 +1,54 @@ + + */ + private array $days = []; + + public function __construct(\DateTimeInterface $begin, \DateTimeInterface $end) + { + if ($end < $begin) { + throw new \InvalidArgumentException('End must be later than begin'); + } + + $begin = \DateTimeImmutable::createFromInterface($begin); + $begin = $begin->setTime(0, 0, 0); + + $end = \DateTimeImmutable::createFromInterface($end); + $end = $end->setTime(23, 59, 59); + + do { + $this->days[$begin->format('Y-m-d')] = new StatisticDate($begin); + $begin = $begin->modify('+1 day'); + } while ($begin <= $end); + } + + /** + * @return array + */ + public function getDays(): array + { + return array_values($this->days); + } + + public function setDate(StatisticDate $date): void + { + $key = $date->getDate()->format('Y-m-d'); + if (!\array_key_exists($key, $this->days)) { + throw new \InvalidArgumentException('Unknown date given'); + } + + $this->days[$key] = $date; + } +} diff --git a/src/Model/Statistic/StatisticDate.php b/src/Model/Statistic/StatisticDate.php index d4688519..81224073 100644 --- a/src/Model/Statistic/StatisticDate.php +++ b/src/Model/Statistic/StatisticDate.php @@ -14,6 +14,7 @@ final class StatisticDate extends Timesheet private \DateTimeInterface $date; private int $billableDuration = 0; private float $billableRate = 0.00; + private int $amount = 0; public function __construct(\DateTimeInterface $date) { @@ -44,4 +45,14 @@ final class StatisticDate extends Timesheet { $this->billableRate = $billableRate; } + + public function getAmount(): int + { + return $this->amount; + } + + public function setAmount(int $amount): void + { + $this->amount = $amount; + } } diff --git a/src/Twig/Extensions.php b/src/Twig/Extensions.php index 5a2c23dd..360f37c0 100644 --- a/src/Twig/Extensions.php +++ b/src/Twig/Extensions.php @@ -11,6 +11,7 @@ namespace App\Twig; use App\Constants; use App\Entity\EntityWithMetaFields; +use App\Form\Type\DateRangeType; use App\Utils\Color; use Twig\Extension\AbstractExtension; use Twig\TwigFilter; @@ -37,6 +38,7 @@ final class Extensions extends AbstractExtension public function getFunctions(): array { return [ + new TwigFunction('date_range', [$this, 'buildDateRange']), new TwigFunction('report_date', [$this, 'buildReportDate']), new TwigFunction('class_name', [$this, 'getClassName']), new TwigFunction('iso_day_by_name', [$this, 'getIsoDayByName']), @@ -90,6 +92,11 @@ final class Extensions extends AbstractExtension return $dateTime->format(self::REPORT_DATE); } + public function buildDateRange(\DateTimeInterface $begin, \DateTimeInterface $end): string + { + return $begin->format(self::REPORT_DATE) . DateRangeType::DATE_SPACER . $end->format(self::REPORT_DATE); + } + public function getIsoDayByName(string $weekDay): int { $key = array_search( diff --git a/templates/macros/datatables.html.twig b/templates/macros/datatables.html.twig index f6f61b6d..80f2e41d 100644 --- a/templates/macros/datatables.html.twig +++ b/templates/macros/datatables.html.twig @@ -250,7 +250,7 @@ {% if (route is not empty and entries is not null) or multi_update_form is not null %}