diff --git a/.github/workflows/testing.yaml b/.github/workflows/testing.yaml index 5e8004be..b726e52a 100644 --- a/.github/workflows/testing.yaml +++ b/.github/workflows/testing.yaml @@ -19,7 +19,7 @@ jobs: options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 strategy: matrix: - php: ['8.1', '8.2'] + php: ['8.1', '8.2', '8.3'] name: Integration (${{ matrix.php }}) steps: @@ -92,7 +92,7 @@ jobs: TEST_WITH_BUNDLES: 1 - name: Upload code coverage - if: matrix.php == '8.1' + if: matrix.php == '8.2' uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/README.md b/README.md index 59a2b03a..b96dab2d 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,13 @@ Do **NOT** use Version 1, it won't get any more updates! ### Requirements -- PHP 8.1 minimum +- PHP 8.1.3 minimum - MariaDB or MySQL - A webserver and subdomain (subdirectory is not supported) - PHP extensions: `gd`, `intl`, `json`, `mbstring`, `pdo`, `tokenizer`, `xml`, `xsl`, `zip` +Support for PHP 8.2 and 8.3. + ## Installation - [Recommended setup](https://www.kimai.org/documentation/installation.html#recommended-setup) — with Git and Composer diff --git a/composer.json b/composer.json index f3c804b7..ac5fc0a2 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ } ], "require": { - "php": "8.1.*||8.2.*", + "php": "8.1.*||8.2.*||8.3.*", "ext-gd": "*", "ext-intl": "*", "ext-json": "*", diff --git a/composer.lock b/composer.lock index 901cb412..340304e2 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": "0a45772bb5617dc0e021b6b24120468e", + "content-hash": "3573d958deb04f566945c3dbd7414fa3", "packages": [ { "name": "azuyalabs/yasumi", @@ -5488,16 +5488,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.3.8", + "version": "v6.3.10", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "1f30f545c4151f611148fc19e28d54d39e0a00bc" + "reference": "51383a1d9d7e93d5c3c76ddc32672de1b3e82c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1f30f545c4151f611148fc19e28d54d39e0a00bc", - "reference": "1f30f545c4151f611148fc19e28d54d39e0a00bc", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51383a1d9d7e93d5c3c76ddc32672de1b3e82c77", + "reference": "51383a1d9d7e93d5c3c76ddc32672de1b3e82c77", "shasum": "" }, "require": { @@ -5549,7 +5549,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.3.8" + "source": "https://github.com/symfony/dependency-injection/tree/v6.3.10" }, "funding": [ { @@ -5565,7 +5565,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:07:48+00:00" + "time": "2023-12-01T14:25:58+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6306,16 +6306,16 @@ }, { "name": "symfony/form", - "version": "v6.3.8", + "version": "v6.3.10", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "b7a8098163cce87c0b6ce05d0f361dc12d5a2788" + "reference": "5afc7334b9d60dd0799612faf3d103b25bc60ae4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/b7a8098163cce87c0b6ce05d0f361dc12d5a2788", - "reference": "b7a8098163cce87c0b6ce05d0f361dc12d5a2788", + "url": "https://api.github.com/repos/symfony/form/zipball/5afc7334b9d60dd0799612faf3d103b25bc60ae4", + "reference": "5afc7334b9d60dd0799612faf3d103b25bc60ae4", "shasum": "" }, "require": { @@ -6383,7 +6383,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.3.8" + "source": "https://github.com/symfony/form/tree/v6.3.10" }, "funding": [ { @@ -6399,7 +6399,7 @@ "type": "tidelift" } ], - "time": "2023-11-06T10:58:05+00:00" + "time": "2023-11-30T11:08:22+00:00" }, { "name": "symfony/framework-bundle", @@ -6794,16 +6794,16 @@ }, { "name": "symfony/http-kernel", - "version": "v6.3.9", + "version": "v6.3.10", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d63fe6b1e3ad2f037f6f000a6fc867fa8934f35c" + "reference": "8d8e7aa60593fd0a2e3c1cea08cc687314841b61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d63fe6b1e3ad2f037f6f000a6fc867fa8934f35c", - "reference": "d63fe6b1e3ad2f037f6f000a6fc867fa8934f35c", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8d8e7aa60593fd0a2e3c1cea08cc687314841b61", + "reference": "8d8e7aa60593fd0a2e3c1cea08cc687314841b61", "shasum": "" }, "require": { @@ -6887,7 +6887,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.3.9" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.10" }, "funding": [ { @@ -6903,7 +6903,7 @@ "type": "tidelift" } ], - "time": "2023-11-29T10:24:27+00:00" + "time": "2023-12-01T16:57:27+00:00" }, { "name": "symfony/intl", @@ -8100,16 +8100,16 @@ }, { "name": "symfony/routing", - "version": "v6.3.5", + "version": "v6.3.10", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31" + "reference": "cb7404232d49dd11cc971b832fcbd49e7c22b049" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/82616e59acd3e3d9c916bba798326cb7796d7d31", - "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31", + "url": "https://api.github.com/repos/symfony/routing/zipball/cb7404232d49dd11cc971b832fcbd49e7c22b049", + "reference": "cb7404232d49dd11cc971b832fcbd49e7c22b049", "shasum": "" }, "require": { @@ -8163,7 +8163,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.3.5" + "source": "https://github.com/symfony/routing/tree/v6.3.10" }, "funding": [ { @@ -8179,7 +8179,7 @@ "type": "tidelift" } ], - "time": "2023-09-20T16:05:51+00:00" + "time": "2023-12-01T14:25:58+00:00" }, { "name": "symfony/runtime", @@ -8614,16 +8614,16 @@ }, { "name": "symfony/serializer", - "version": "v6.3.9", + "version": "v6.3.10", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "87faafcc88ace143b30fdc34b240d9a3603bc95e" + "reference": "6eee0fd95f5caa1e77cab29552620ebf8e5b1a5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/87faafcc88ace143b30fdc34b240d9a3603bc95e", - "reference": "87faafcc88ace143b30fdc34b240d9a3603bc95e", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6eee0fd95f5caa1e77cab29552620ebf8e5b1a5f", + "reference": "6eee0fd95f5caa1e77cab29552620ebf8e5b1a5f", "shasum": "" }, "require": { @@ -8688,7 +8688,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.3.9" + "source": "https://github.com/symfony/serializer/tree/v6.3.10" }, "funding": [ { @@ -8704,7 +8704,7 @@ "type": "tidelift" } ], - "time": "2023-11-29T10:00:30+00:00" + "time": "2023-12-01T14:25:58+00:00" }, { "name": "symfony/service-contracts", @@ -9484,16 +9484,16 @@ }, { "name": "symfony/var-exporter", - "version": "v6.3.9", + "version": "v6.3.10", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "a00fd2d47af5c95e95e8e371a74be2e79b95dfae" + "reference": "7bfcf232a9c7e4acad00e96774e340eb86d10bf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/a00fd2d47af5c95e95e8e371a74be2e79b95dfae", - "reference": "a00fd2d47af5c95e95e8e371a74be2e79b95dfae", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7bfcf232a9c7e4acad00e96774e340eb86d10bf0", + "reference": "7bfcf232a9c7e4acad00e96774e340eb86d10bf0", "shasum": "" }, "require": { @@ -9538,7 +9538,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.3.9" + "source": "https://github.com/symfony/var-exporter/tree/v6.3.10" }, "funding": [ { @@ -9554,7 +9554,7 @@ "type": "tidelift" } ], - "time": "2023-11-28T20:34:48+00:00" + "time": "2023-11-29T16:00:50+00:00" }, { "name": "symfony/webpack-encore-bundle", @@ -13068,16 +13068,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.4.0", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "36bc5bc71fff1f6ca9c7c7fe1e7e23f4c1ca2aa3" + "reference": "cca5373a41d45edbeaf38b7b67f376da2205ff95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/36bc5bc71fff1f6ca9c7c7fe1e7e23f4c1ca2aa3", - "reference": "36bc5bc71fff1f6ca9c7c7fe1e7e23f4c1ca2aa3", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/cca5373a41d45edbeaf38b7b67f376da2205ff95", + "reference": "cca5373a41d45edbeaf38b7b67f376da2205ff95", "shasum": "" }, "require": { @@ -13129,7 +13129,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.4.1" }, "funding": [ { @@ -13145,7 +13145,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:18:17+00:00" + "time": "2023-12-01T09:25:07+00:00" }, { "name": "symfony/process", @@ -13346,7 +13346,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "8.1.*||8.2.*", + "php": "8.1.*||8.2.*||8.3.*", "ext-gd": "*", "ext-intl": "*", "ext-json": "*", diff --git a/src/Export/Base/XlsxRenderer.php b/src/Export/Base/XlsxRenderer.php index 10a749cf..41c25f75 100644 --- a/src/Export/Base/XlsxRenderer.php +++ b/src/Export/Base/XlsxRenderer.php @@ -66,12 +66,11 @@ class XlsxRenderer extends AbstractSpreadsheetRenderer // Freeze first row and date & time columns for easier navigation $sheet->freezePane('D2'); - /** @var string $column */ - foreach (range('A', $highestColumn) as $column) { + foreach ($sheet->getColumnIterator() as $columnName => $column) { // We default to a reasonable auto-width decided by the client, // sadly ->getDefaultColumnDimension() is not supported so it needs // to be specific about what column should be auto sized. - $col = $sheet->getColumnDimension($column); + $col = $sheet->getColumnDimension($columnName); // If no other width is specified (which defaults to -1) if ((int) $col->getWidth() === -1) { diff --git a/src/Export/Spreadsheet/Writer/XlsxWriter.php b/src/Export/Spreadsheet/Writer/XlsxWriter.php index 8ed18a4a..807327d0 100644 --- a/src/Export/Spreadsheet/Writer/XlsxWriter.php +++ b/src/Export/Spreadsheet/Writer/XlsxWriter.php @@ -59,12 +59,11 @@ final class XlsxWriter implements WriterInterface $sheet->freezePane($options['freeze']); } - /** @var string $column */ - foreach (range('A', $highestColumn) as $column) { + foreach ($sheet->getColumnIterator() as $columnName => $column) { // We default to a reasonable auto-width decided by the client, // sadly ->getDefaultColumnDimension() is not supported so it needs // to be specific about what column should be auto sized. - $col = $sheet->getColumnDimension($column); + $col = $sheet->getColumnDimension($columnName); // If no other width is specified (which defaults to -1) if ((int) $col->getWidth() === -1) {