diff --git a/composer.json b/composer.json
index 2d4d4f288f..45008f0c89 100644
--- a/composer.json
+++ b/composer.json
@@ -16,6 +16,7 @@
"doctrine/doctrine-migrations-bundle": "^3.1",
"doctrine/orm": "^2.9",
"erusev/parsedown": "^1.7",
+ "knplabs/knp-time-bundle": "^1.17",
"lstrojny/functional-php": "^1.11",
"nyholm/psr7": "^1.4",
"odolbeau/phone-number-bundle": "^3.1",
diff --git a/composer.lock b/composer.lock
index 679e94a37e..cf5c643c43 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": "cfe3754cd98ed2727891879332443136",
+ "content-hash": "225d1cb7ac81b749a522ffd4d0c344fb",
"packages": [
{
"name": "alchemy/binary-driver",
@@ -1533,16 +1533,16 @@
},
{
"name": "doctrine/orm",
- "version": "2.10.2",
+ "version": "2.10.3",
"source": {
"type": "git",
"url": "https://github.com/doctrine/orm.git",
- "reference": "81d472f6f96b8b571cafefe8d2fef89ed9446a62"
+ "reference": "7b242753466508e1dd10f67c1baee95785f845c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/orm/zipball/81d472f6f96b8b571cafefe8d2fef89ed9446a62",
- "reference": "81d472f6f96b8b571cafefe8d2fef89ed9446a62",
+ "url": "https://api.github.com/repos/doctrine/orm/zipball/7b242753466508e1dd10f67c1baee95785f845c1",
+ "reference": "7b242753466508e1dd10f67c1baee95785f845c1",
"shasum": ""
},
"require": {
@@ -1572,12 +1572,12 @@
"doctrine/annotations": "^1.13",
"doctrine/coding-standard": "^9.0",
"phpbench/phpbench": "^0.16.10 || ^1.0",
- "phpstan/phpstan": "0.12.99",
+ "phpstan/phpstan": "1.2.0",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
"squizlabs/php_codesniffer": "3.6.1",
"symfony/cache": "^4.4 || ^5.2",
"symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0",
- "vimeo/psalm": "4.10.0"
+ "vimeo/psalm": "4.13.1"
},
"suggest": {
"symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0",
@@ -1626,9 +1626,9 @@
],
"support": {
"issues": "https://github.com/doctrine/orm/issues",
- "source": "https://github.com/doctrine/orm/tree/2.10.2"
+ "source": "https://github.com/doctrine/orm/tree/2.10.3"
},
- "time": "2021-10-21T17:57:02+00:00"
+ "time": "2021-12-03T12:27:05+00:00"
},
{
"name": "doctrine/persistence",
@@ -2093,16 +2093,16 @@
},
{
"name": "giggsey/libphonenumber-for-php",
- "version": "8.12.38",
+ "version": "8.12.39",
"source": {
"type": "git",
"url": "https://github.com/giggsey/libphonenumber-for-php.git",
- "reference": "0a6293c57de9256f4bd0d673280fbfbfd1e47533"
+ "reference": "6ae517989e96f069141ffeb56ccbbd849520f6ff"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/0a6293c57de9256f4bd0d673280fbfbfd1e47533",
- "reference": "0a6293c57de9256f4bd0d673280fbfbfd1e47533",
+ "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/6ae517989e96f069141ffeb56ccbbd849520f6ff",
+ "reference": "6ae517989e96f069141ffeb56ccbbd849520f6ff",
"shasum": ""
},
"require": {
@@ -2162,7 +2162,7 @@
"issues": "https://github.com/giggsey/libphonenumber-for-php/issues",
"source": "https://github.com/giggsey/libphonenumber-for-php"
},
- "time": "2021-11-26T08:32:55+00:00"
+ "time": "2021-12-07T08:51:54+00:00"
},
{
"name": "giggsey/locale",
@@ -2220,16 +2220,16 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "7.4.0",
+ "version": "7.4.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94"
+ "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94",
- "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee0a041b1760e6a53d2a39c8c34115adc2af2c79",
+ "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79",
"shasum": ""
},
"require": {
@@ -2238,7 +2238,7 @@
"guzzlehttp/psr7": "^1.8.3 || ^2.1",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
- "symfony/deprecation-contracts": "^2.2"
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
},
"provide": {
"psr/http-client-implementation": "1.0"
@@ -2324,7 +2324,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.4.0"
+ "source": "https://github.com/guzzle/guzzle/tree/7.4.1"
},
"funding": [
{
@@ -2340,7 +2340,7 @@
"type": "tidelift"
}
],
- "time": "2021-10-18T09:52:00+00:00"
+ "time": "2021-12-06T18:43:05+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -2603,44 +2603,116 @@
"time": "2020-08-29T13:10:03+00:00"
},
{
- "name": "laminas/laminas-code",
- "version": "4.4.3",
+ "name": "knplabs/knp-time-bundle",
+ "version": "1.17.0",
"source": {
"type": "git",
- "url": "https://github.com/laminas/laminas-code.git",
- "reference": "bb324850d09dd437b6acb142c13e64fdc725b0e1"
+ "url": "https://github.com/KnpLabs/KnpTimeBundle.git",
+ "reference": "bbb2c841b5e04b1290bee8173cbfa9c325ea3e9d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laminas/laminas-code/zipball/bb324850d09dd437b6acb142c13e64fdc725b0e1",
- "reference": "bb324850d09dd437b6acb142c13e64fdc725b0e1",
+ "url": "https://api.github.com/repos/KnpLabs/KnpTimeBundle/zipball/bbb2c841b5e04b1290bee8173cbfa9c325ea3e9d",
+ "reference": "bbb2c841b5e04b1290bee8173cbfa9c325ea3e9d",
"shasum": ""
},
"require": {
- "php": "^7.4 || ~8.0.0"
+ "php": ">=7.2.5",
+ "symfony/config": "^4.3|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.3|^5.0|^6.0",
+ "symfony/translation": "^4.3|^5.0|^6.0"
},
"conflict": {
- "phpspec/prophecy": "<1.9.0"
+ "phpunit/phpunit": "<8.0"
},
"require-dev": {
- "doctrine/annotations": "^1.10.4",
+ "symfony/framework-bundle": "^4.3|^5.0|^6.0",
+ "symfony/phpunit-bridge": "^5.2|^6.0",
+ "symfony/templating": "^4.3|^5.0|^6.0",
+ "symfony/twig-bundle": "^4.3|^5.0|^6.0"
+ },
+ "suggest": {
+ "symfony/twig-bundle": "to use the Twig `time_diff()` function or `|ago` filter"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Knp\\Bundle\\TimeBundle\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KnpLabs Team",
+ "homepage": "http://knplabs.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "http://github.com/KnpLabs/KnpTimeBundle/contributors"
+ }
+ ],
+ "description": "Making your dates look sensible and descriptive",
+ "homepage": "http://github.com/KnpLabs/KnpTimeBundle",
+ "keywords": [
+ "bundle",
+ "date",
+ "descriptive time",
+ "knp",
+ "knplabs",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/KnpLabs/KnpTimeBundle/issues",
+ "source": "https://github.com/KnpLabs/KnpTimeBundle/tree/1.17.0"
+ },
+ "time": "2021-10-28T18:40:18+00:00"
+ },
+ {
+ "name": "laminas/laminas-code",
+ "version": "4.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-code.git",
+ "reference": "c99ef8e5629c33bfaa3a8f1df773e916af564cd6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-code/zipball/c99ef8e5629c33bfaa3a8f1df773e916af564cd6",
+ "reference": "c99ef8e5629c33bfaa3a8f1df773e916af564cd6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4, <8.2"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.13.2",
"ext-phar": "*",
- "laminas/laminas-coding-standard": "^2.1.4",
- "laminas/laminas-stdlib": "^3.3.0",
- "phpunit/phpunit": "^9.4.2",
- "psalm/plugin-phpunit": "^0.14.0",
- "vimeo/psalm": "^4.3.1"
+ "laminas/laminas-coding-standard": "^2.3.0",
+ "laminas/laminas-stdlib": "^3.6.1",
+ "phpunit/phpunit": "^9.5.10",
+ "psalm/plugin-phpunit": "^0.16.1",
+ "vimeo/psalm": "^4.13.1"
},
"suggest": {
"doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
- "laminas/laminas-stdlib": "Laminas\\Stdlib component",
- "laminas/laminas-zendframework-bridge": "A bridge with Zend Framework"
+ "laminas/laminas-stdlib": "Laminas\\Stdlib component"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Code\\": "src/"
- }
+ },
+ "files": [
+ "polyfill/ReflectionEnumPolyfill.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2667,7 +2739,7 @@
"type": "community_bridge"
}
],
- "time": "2021-09-21T13:40:23+00:00"
+ "time": "2021-12-07T06:00:32+00:00"
},
{
"name": "landrok/activitypub",
@@ -3396,35 +3468,39 @@
},
{
"name": "odolbeau/phone-number-bundle",
- "version": "v3.5.0",
+ "version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/odolbeau/phone-number-bundle.git",
- "reference": "c30c6629b6fe78cba7f9032e580f0d5e1e71c2ed"
+ "reference": "0e9428c2252b2b8c5864c58dd6629cb548aa4695"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/odolbeau/phone-number-bundle/zipball/c30c6629b6fe78cba7f9032e580f0d5e1e71c2ed",
- "reference": "c30c6629b6fe78cba7f9032e580f0d5e1e71c2ed",
+ "url": "https://api.github.com/repos/odolbeau/phone-number-bundle/zipball/0e9428c2252b2b8c5864c58dd6629cb548aa4695",
+ "reference": "0e9428c2252b2b8c5864c58dd6629cb548aa4695",
"shasum": ""
},
"require": {
"giggsey/libphonenumber-for-php": "^8.0",
"php": ">=7.4",
- "symfony/framework-bundle": "^4.4|^5.3",
- "symfony/intl": "^4.4|^5.3"
+ "symfony/framework-bundle": "^4.4|^5.3|^6.0",
+ "symfony/intl": "^4.4|^5.3|^6.0"
+ },
+ "conflict": {
+ "symfony/serializer": "6.0.0"
},
"replace": {
"misd/phone-number-bundle": "self.version"
},
"require-dev": {
"doctrine/doctrine-bundle": "^1.12|^2.0",
- "phpunit/phpunit": "^8.4",
- "symfony/form": "^4.4|^5.3",
- "symfony/property-access": "^4.4|^5.3",
- "symfony/serializer": "^4.4|^5.3",
- "symfony/twig-bundle": "^4.4|^5.3",
- "symfony/validator": "^4.4|^5.3"
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.5",
+ "symfony/form": "^4.4|^5.3|^6.0",
+ "symfony/property-access": "^4.4|^5.3|^6.0",
+ "symfony/serializer": "^4.4|^5.3|^6.0.1",
+ "symfony/twig-bundle": "^4.4|^5.3|^6.0",
+ "symfony/validator": "^4.4|^5.3|^6.0"
},
"suggest": {
"doctrine/doctrine-bundle": "Add a DBAL mapping type",
@@ -3437,7 +3513,7 @@
"type": "symfony-bundle",
"extra": {
"branch-alias": {
- "dev-master": "3.5.x-dev"
+ "dev-master": "3.6.x-dev"
}
},
"autoload": {
@@ -3460,9 +3536,9 @@
],
"support": {
"issues": "https://github.com/odolbeau/phone-number-bundle/issues",
- "source": "https://github.com/odolbeau/phone-number-bundle/tree/v3.5.0"
+ "source": "https://github.com/odolbeau/phone-number-bundle/tree/v3.6.0"
},
- "time": "2021-10-27T11:58:46+00:00"
+ "time": "2021-12-07T09:07:46+00:00"
},
{
"name": "oro/doctrine-extensions",
@@ -11019,6 +11095,77 @@
}
],
"packages-dev": [
+ {
+ "name": "composer/pcre",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "3d322d715c43a1ac36c7fe215fa59336265500f2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/3d322d715c43a1ac36c7fe215fa59336265500f2",
+ "reference": "3d322d715c43a1ac36c7fe215fa59336265500f2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/1.0.0"
+ },
+ "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": "2021-12-06T15:17:27+00:00"
+ },
{
"name": "composer/semver",
"version": "3.2.6",
@@ -11102,25 +11249,27 @@
},
{
"name": "composer/xdebug-handler",
- "version": "2.0.2",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/composer/xdebug-handler.git",
- "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339"
+ "reference": "6555461e76962fd0379c444c46fd558a0fcfb65e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339",
- "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6555461e76962fd0379c444c46fd558a0fcfb65e",
+ "reference": "6555461e76962fd0379c444c46fd558a0fcfb65e",
"shasum": ""
},
"require": {
+ "composer/pcre": "^1",
"php": "^5.3.2 || ^7.0 || ^8.0",
"psr/log": "^1 || ^2 || ^3"
},
"require-dev": {
- "phpstan/phpstan": "^0.12.55",
- "symfony/phpunit-bridge": "^4.2 || ^5"
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0"
},
"type": "library",
"autoload": {
@@ -11146,7 +11295,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/xdebug-handler/issues",
- "source": "https://github.com/composer/xdebug-handler/tree/2.0.2"
+ "source": "https://github.com/composer/xdebug-handler/tree/2.0.3"
},
"funding": [
{
@@ -11162,7 +11311,7 @@
"type": "tidelift"
}
],
- "time": "2021-07-31T17:03:58+00:00"
+ "time": "2021-12-08T13:07:32+00:00"
},
{
"name": "doctrine/data-fixtures",
@@ -11789,16 +11938,16 @@
},
{
"name": "phpspec/prophecy",
- "version": "1.14.0",
+ "version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e"
+ "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
- "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
+ "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"shasum": ""
},
"require": {
@@ -11850,9 +11999,9 @@
],
"support": {
"issues": "https://github.com/phpspec/prophecy/issues",
- "source": "https://github.com/phpspec/prophecy/tree/1.14.0"
+ "source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
},
- "time": "2021-09-10T09:02:12+00:00"
+ "time": "2021-12-08T12:19:24+00:00"
},
{
"name": "phpstan/phpstan",
@@ -11920,16 +12069,16 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "9.2.9",
+ "version": "9.2.10",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b"
+ "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f301eb1453c9e7a1bc912ee8b0ea9db22c60223b",
- "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687",
+ "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687",
"shasum": ""
},
"require": {
@@ -11985,7 +12134,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.9"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.10"
},
"funding": [
{
@@ -11993,7 +12142,7 @@
"type": "github"
}
],
- "time": "2021-11-19T15:21:02+00:00"
+ "time": "2021-12-05T09:12:13+00:00"
},
{
"name": "phpunit/php-file-iterator",
diff --git a/config/bundles.php b/config/bundles.php
index 9c1d45ebc3..86423500be 100644
--- a/config/bundles.php
+++ b/config/bundles.php
@@ -1,23 +1,22 @@
['all' => true],
- Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
- Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
- Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
- Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
- Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true],
- Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
- Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
- Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
- Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
- Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
- SymfonyCasts\Bundle\VerifyEmail\SymfonyCastsVerifyEmailBundle::class => ['all' => true],
- Misd\PhoneNumberBundle\MisdPhoneNumberBundle::class => ['all' => true],
- HtmlSanitizer\Bundle\HtmlSanitizerBundle::class => ['all' => true],
- Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true],
+ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
+ Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
+ Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
+ Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
+ Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
+ Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true],
+ Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
+ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
+ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
+ Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
+ Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
+ SymfonyCasts\Bundle\VerifyEmail\SymfonyCastsVerifyEmailBundle::class => ['all' => true],
+ Misd\PhoneNumberBundle\MisdPhoneNumberBundle::class => ['all' => true],
+ HtmlSanitizer\Bundle\HtmlSanitizerBundle::class => ['all' => true],
+ Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true],
SymfonyCasts\Bundle\ResetPassword\SymfonyCastsResetPasswordBundle::class => ['all' => true],
- Fidry\PsyshBundle\PsyshBundle::class => ['dev' => true, 'test' => true],
+ Fidry\PsyshBundle\PsyshBundle::class => ['dev' => true, 'test' => true],
+ Knp\Bundle\TimeBundle\KnpTimeBundle::class => ['all' => true],
];
diff --git a/public/assets/default_theme/css/pages/feeds.css b/public/assets/default_theme/css/pages/feeds.css
index 45c9585237..4ec0165ebb 100644
--- a/public/assets/default_theme/css/pages/feeds.css
+++ b/public/assets/default_theme/css/pages/feeds.css
@@ -94,33 +94,39 @@
.note-info,
embed header {
display: flex;
- justify-content: space-between;
align-items: center;
max-height: var(--big);
border-bottom: unset;
border-radius: var(--smaller) var(--smaller) 0 0;
- font-size: var(--small);
- padding: 0 var(--smaller) 0 0;
+ padding: 4px var(--smaller) 4px 0;
}
.note-info {
background: var(--gradient-backwards);
}
-.note-author {
- font-size: var(--default);
- display: flex;
- align-items: center;
- align-self: center;
+.note-url {
+ opacity: 0.5;
+ font-size: 0.9em;
+ margin-left: var(--smaller);
+}
+embed header {
+ font-size: var(--small);
+ justify-content: space-between;
+}
+.note-author-url {
+ margin-left: 4px;
}
.note-author-fullname {
font-weight: bold;
}
.note-author-nickname {
opacity: 0.5;
- margin-left: var(--smaller);
}
.note-author-nickname::before {
content: '@';
}
+.note-actions {
+ margin-left: auto;
+}
.note-actions ul {
display: flex;
vertical-align: middle;
diff --git a/src/Entity/Note.php b/src/Entity/Note.php
index 1e3ace3a77..6d23d1bc0a 100644
--- a/src/Entity/Note.php
+++ b/src/Entity/Note.php
@@ -50,6 +50,7 @@ class Note extends Entity
private ?string $content_type = null;
private ?string $content = null;
private ?string $rendered = null;
+ private ?int $reply_to;
private bool $is_local;
private ?string $source;
private int $scope = VisibilityScope::PUBLIC;
@@ -113,6 +114,17 @@ class Note extends Entity
return $this->rendered;
}
+ public function setReplyTo(?int $reply_to): self
+ {
+ $this->reply_to = $reply_to;
+ return $this;
+ }
+
+ public function getReplyTo(): ?int
+ {
+ return $this->reply_to;
+ }
+
public function setIsLocal(bool $is_local): self
{
$this->is_local = $is_local;
@@ -300,6 +312,16 @@ class Note extends Entity
});
}
+ public function getReplyToNote(): ?Note
+ {
+ return self::getWithPK($this->getReplyTo());
+ }
+
+ public function getReplies(): array
+ {
+ return Cache::getList('note-replies-' . $this->id, fn () => DB::dql('select n from note n where n.reply_to = :id', ['id' => $this->id]));
+ }
+
/**
* Whether this note is visible to the given actor
*/
@@ -347,6 +369,7 @@ class Note extends Entity
'content' => ['type' => 'text', 'description' => 'note content'],
'content_type' => ['type' => 'varchar', 'not null' => true, 'default' => 'text/plain', 'length' => 129, 'description' => 'A note can be written in a multitude of formats such as text/plain, text/markdown, application/x-latex, and text/html'],
'rendered' => ['type' => 'text', 'description' => 'rendered note content, so we can keep the microtags (if not local)'],
+ 'reply_to' => ['type' => 'int', 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'description' => 'note replied to, null if root of a conversation'],
'is_local' => ['type' => 'bool', 'not null' => true, 'description' => 'was this note generated by a local actor'],
'source' => ['type' => 'varchar', 'foreign key' => true, 'length' => 32, 'target' => 'NoteSource.code', 'multiplicity' => 'many to one', 'description' => 'fkey to source of note, like "web", "im", or "clientname"'],
'scope' => ['type' => 'int', 'not null' => true, 'default' => VisibilityScope::PUBLIC, 'description' => 'bit map for distribution scope; 0 = everywhere; 1 = this server only; 2 = addressees; 4 = groups; 8 = subscribers; 16 = messages; null = default'],
@@ -360,6 +383,7 @@ class Note extends Entity
'note_created_id_is_local_idx' => ['created', 'is_local'],
'note_actor_created_idx' => ['actor_id', 'created'],
'note_is_local_created_actor_idx' => ['is_local', 'created', 'actor_id'],
+ 'note_reply_to_idx' => ['reply_to'],
],
'fulltext indexes' => ['notice_fulltext_idx' => ['content']], // TODO make this configurable
];
diff --git a/symfony.lock b/symfony.lock
index b885f0fd84..bd8849964e 100644
--- a/symfony.lock
+++ b/symfony.lock
@@ -14,6 +14,9 @@
"composer/ca-bundle": {
"version": "1.2.10"
},
+ "composer/pcre": {
+ "version": "1.0.0"
+ },
"composer/semver": {
"version": "3.2.4"
},
@@ -163,6 +166,9 @@
"jcupitt/vips": {
"version": "v1.0.8"
},
+ "knplabs/knp-time-bundle": {
+ "version": "1.17.0"
+ },
"laminas/laminas-code": {
"version": "4.1.0"
},
diff --git a/templates/cards/note/view.html.twig b/templates/cards/note/view.html.twig
index fab5a999f7..96aad8109d 100644
--- a/templates/cards/note/view.html.twig
+++ b/templates/cards/note/view.html.twig
@@ -72,14 +72,14 @@
{% block note_author %}
{# Microformat's h-card properties indicates a face icon is a "u-logo" #}
-
-
- {% if fullname is not null %}
- {{ fullname }}
- {% else %}
- {{ nickname }}
- {% endif %}
-
+