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 %} - +
+ {% if fullname is not null %} + {{ fullname }} + {% else %} + {{ nickname }} + {% endif %} +
+
{{ nickname }} {% endblock note_author %} @@ -90,6 +90,17 @@ {% endblock note_sidebar %} +{% block note_info %} +
+ {{ block('note_author') }} + + {{ 'in conversation' | trans }} {{ note.getModified() | ago }} + + + {{ block('note_actions') }} +
+{% endblock note_info %} + {% macro macro_note(note, replies) %} {% set nickname = note.getActorNickname() %} {% set fullname = note.getActorFullname() %} @@ -100,12 +111,9 @@
{{ block('note_sidebar') }}
-
- {{ block('note_author') }} - {{ block('note_actions') }} -
+ {{ block('note_info') }} -