From 7300cc3a1d7359a996b3d3925e21a046e2437057 Mon Sep 17 00:00:00 2001 From: Ambroise Maupate Date: Wed, 28 Jun 2023 17:54:43 +0200 Subject: [PATCH] feat(Log): Added entityClass and entityId to remove hard relationship with NodesSources BREAKING CHANGE: Log entity requires a Migration that may be destructive on `log` table. --- lib/Documents/src/DownscaleImageManager.php | 2 +- .../src/Controller/AppController.php | 19 +-- .../migrations/Version20230628143106.php | 75 +++++++++++ .../src/Controller/CustomFormController.php | 4 +- .../SettingLifeCycleSubscriber.php | 2 + lib/RoadizCoreBundle/src/Entity/Log.php | 90 +++++++++++--- .../src/Entity/NodesSources.php | 51 +++----- .../src/Logger/DoctrineHandler.php | 116 +++++++++++++----- lib/RoadizCoreBundle/src/Node/NodeMover.php | 2 +- .../src/Node/NodeTranstyper.php | 25 ---- .../src/Repository/LogRepository.php | 26 +--- .../src/Repository/NodesSourcesRepository.php | 14 ++- .../src/Security/User/UserViewer.php | 1 + .../Controllers/AbstractAdminController.php | 6 +- .../CustomFormAnswersController.php | 2 +- .../CustomFormFieldsController.php | 8 +- .../CustomFormsUtilsController.php | 7 +- .../DocumentTranslationsController.php | 6 +- .../Documents/DocumentsController.php | 29 ++--- .../src/Controllers/FoldersController.php | 16 +-- .../src/Controllers/GroupsController.php | 8 +- .../Controllers/NodeTypeFieldsController.php | 6 +- .../NodeTypes/NodeTypesController.php | 6 +- .../Nodes/NodesAttributesController.php | 8 +- .../src/Controllers/Nodes/NodesController.php | 14 +-- .../Nodes/NodesSourcesController.php | 2 +- .../Nodes/NodesUtilsController.php | 5 +- .../Controllers/Nodes/TranstypeController.php | 2 +- .../src/Controllers/SettingsController.php | 8 +- .../Tags/TagMultiCreationController.php | 2 +- .../src/Controllers/Tags/TagsController.php | 12 +- .../Controllers/TranslationsController.php | 8 +- .../src/Controllers/Users/UsersController.php | 8 +- .../Users/UsersGroupsController.php | 4 +- .../Users/UsersRolesController.php | 4 +- .../Users/UsersSecurityController.php | 2 +- .../src/Controllers/WebhookController.php | 2 +- .../Resources/translations/messages.en.xlf | 4 + .../Resources/translations/messages.fr.xlf | 4 + .../src/Resources/translations/messages.xlf | 1 + .../Resources/views/dashboard/index.html.twig | 46 ++++--- .../views/modules/history-item.html.twig | 57 ++++----- .../widgets/nodeTree/singleNode.html.twig | 2 +- 43 files changed, 433 insertions(+), 283 deletions(-) create mode 100644 lib/RoadizCoreBundle/migrations/Version20230628143106.php diff --git a/lib/Documents/src/DownscaleImageManager.php b/lib/Documents/src/DownscaleImageManager.php index 28078402..aea311cf 100644 --- a/lib/Documents/src/DownscaleImageManager.php +++ b/lib/Documents/src/DownscaleImageManager.php @@ -97,7 +97,7 @@ public function processDocumentFromExistingRaw(?DocumentInterface $document = nu null !== $this->createDocumentFromImage($document, $processImage, true) && null !== $this->logger ) { - $this->logger->info('Document has been downscaled.', ['path' => $documentPath]); + $this->logger->info('Document has been downscaled.', ['path' => $documentPath, 'entity' => $document]); } } } diff --git a/lib/RoadizCompatBundle/src/Controller/AppController.php b/lib/RoadizCompatBundle/src/Controller/AppController.php index 240d6f0f..40e9efb2 100644 --- a/lib/RoadizCompatBundle/src/Controller/AppController.php +++ b/lib/RoadizCompatBundle/src/Controller/AppController.php @@ -8,6 +8,7 @@ use ReflectionClass; use ReflectionException; use RZ\Roadiz\CompatBundle\Theme\ThemeResolverInterface; +use RZ\Roadiz\Core\AbstractEntities\PersistableInterface; use RZ\Roadiz\Core\AbstractEntities\TranslationInterface; use RZ\Roadiz\CoreBundle\Entity\Node; use RZ\Roadiz\CoreBundle\Entity\NodesSources; @@ -390,9 +391,9 @@ public function getTheme(): ?Theme * * @param Request $request * @param string $msg - * @param NodesSources|null $source + * @param object|null $source */ - public function publishConfirmMessage(Request $request, string $msg, ?NodesSources $source = null): void + public function publishConfirmMessage(Request $request, string $msg, ?object $source = null): void { $this->publishMessage($request, $msg, 'confirm', $source); } @@ -404,13 +405,13 @@ public function publishConfirmMessage(Request $request, string $msg, ?NodesSourc * @param Request $request * @param string $msg * @param string $level - * @param NodesSources|null $source + * @param object|null $source */ protected function publishMessage( Request $request, string $msg, string $level = "confirm", - ?NodesSources $source = null + ?object $source = null ): void { $session = $this->getSession(); if ($session instanceof Session) { @@ -419,10 +420,12 @@ protected function publishMessage( switch ($level) { case 'error': - $this->getLogger()->error($msg, ['source' => $source]); + case 'danger': + case 'fail': + $this->getLogger()->error($msg, ['entity' => $source]); break; default: - $this->getLogger()->info($msg, ['source' => $source]); + $this->getLogger()->info($msg, ['entity' => $source]); break; } } @@ -444,10 +447,10 @@ public function getSession(): ?SessionInterface * * @param Request $request * @param string $msg - * @param NodesSources|null $source + * @param object|null $source * @return void */ - public function publishErrorMessage(Request $request, string $msg, NodesSources $source = null): void + public function publishErrorMessage(Request $request, string $msg, ?object $source = null): void { $this->publishMessage($request, $msg, 'error', $source); } diff --git a/lib/RoadizCoreBundle/migrations/Version20230628143106.php b/lib/RoadizCoreBundle/migrations/Version20230628143106.php new file mode 100644 index 00000000..624ccf42 --- /dev/null +++ b/lib/RoadizCoreBundle/migrations/Version20230628143106.php @@ -0,0 +1,75 @@ +addSql('ALTER TABLE log ADD entity_class VARCHAR(255) DEFAULT NULL, ADD entity_id VARCHAR(36) DEFAULT NULL'); + $this->addSql('CREATE INDEX IDX_8F3F68C541BF2C66 ON log (entity_class)'); + $this->addSql('CREATE INDEX IDX_8F3F68C541BF2C6681257D5D ON log (entity_class, entity_id)'); + $this->addSql('CREATE INDEX log_entity_class_datetime ON log (entity_class, datetime)'); + $this->addSql('CREATE INDEX log_entity_class_id_datetime ON log (entity_class, entity_id, datetime)'); + + // Move node_source_id to entity_class and entity_id + $nodeSourceClass = NodesSources::class; + $this->addSql(<<addSql('ALTER TABLE log DROP FOREIGN KEY FK_8F3F68C58E831402'); + $this->addSql('ALTER TABLE log DROP node_source_id'); + $this->addSql('DROP INDEX log_ns_datetime ON log'); + $this->addSql('DROP INDEX IDX_8F3F68C58E831402 ON log'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE log ADD node_source_id INT DEFAULT NULL'); + + // Move entity_class and entity_id to node_source_id + $nodeSourceClass = NodesSources::class; + $this->addSql(<<addSql('DROP INDEX IDX_8F3F68C541BF2C66 ON log'); + $this->addSql('DROP INDEX IDX_8F3F68C541BF2C6681257D5D ON log'); + $this->addSql('DROP INDEX log_entity_class_datetime ON log'); + $this->addSql('DROP INDEX log_entity_class_id_datetime ON log'); + $this->addSql('ALTER TABLE log DROP entity_class, DROP entity_id'); + $this->addSql('ALTER TABLE log ADD CONSTRAINT FK_8F3F68C58E831402 FOREIGN KEY (node_source_id) REFERENCES nodes_sources (id) ON UPDATE NO ACTION ON DELETE SET NULL'); + $this->addSql('CREATE INDEX log_ns_datetime ON log (node_source_id, datetime)'); + $this->addSql('CREATE INDEX IDX_8F3F68C58E831402 ON log (node_source_id)'); + } + + public function isTransactional(): bool + { + return false; + } +} diff --git a/lib/RoadizCoreBundle/src/Controller/CustomFormController.php b/lib/RoadizCoreBundle/src/Controller/CustomFormController.php index 16ed7f98..eefdcd57 100644 --- a/lib/RoadizCoreBundle/src/Controller/CustomFormController.php +++ b/lib/RoadizCoreBundle/src/Controller/CustomFormController.php @@ -303,7 +303,9 @@ public function sendAnswer( } } } catch (FilesystemException $exception) { - $this->logger->error($exception->getMessage()); + $this->logger->error($exception->getMessage(), [ + 'entity' => $answer + ]); } if (empty($receiver)) { diff --git a/lib/RoadizCoreBundle/src/Doctrine/EventSubscriber/SettingLifeCycleSubscriber.php b/lib/RoadizCoreBundle/src/Doctrine/EventSubscriber/SettingLifeCycleSubscriber.php index 96e5a485..acc18d84 100644 --- a/lib/RoadizCoreBundle/src/Doctrine/EventSubscriber/SettingLifeCycleSubscriber.php +++ b/lib/RoadizCoreBundle/src/Doctrine/EventSubscriber/SettingLifeCycleSubscriber.php @@ -99,6 +99,7 @@ public function postLoad(LifecycleEventArgs $event): void [ 'exception_message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString(), + 'entity' => $setting ] ); } catch (InvalidMessage $exception) { @@ -107,6 +108,7 @@ public function postLoad(LifecycleEventArgs $event): void [ 'exception_message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString(), + 'entity' => $setting ] ); } diff --git a/lib/RoadizCoreBundle/src/Entity/Log.php b/lib/RoadizCoreBundle/src/Entity/Log.php index 04654145..cc08549b 100644 --- a/lib/RoadizCoreBundle/src/Entity/Log.php +++ b/lib/RoadizCoreBundle/src/Entity/Log.php @@ -16,7 +16,10 @@ ORM\Entity(repositoryClass: LogRepository::class), ORM\Table(name: "log"), ORM\Index(columns: ["datetime"]), - ORM\Index(columns: ["node_source_id", "datetime"], name: "log_ns_datetime"), + ORM\Index(columns: ["entity_class"]), + ORM\Index(columns: ["entity_class", "entity_id"]), + ORM\Index(columns: ["entity_class", "datetime"], name: "log_entity_class_datetime"), + ORM\Index(columns: ["entity_class", "entity_id", "datetime"], name: "log_entity_class_id_datetime"), ORM\Index(columns: ["username", "datetime"], name: "log_username_datetime"), ORM\Index(columns: ["user_id", "datetime"], name: "log_user_datetime"), ORM\Index(columns: ["level", "datetime"], name: "log_level_datetime"), @@ -65,12 +68,6 @@ class Log extends AbstractEntity #[Serializer\Groups(['log'])] protected \DateTime $datetime; - #[ORM\ManyToOne(targetEntity: NodesSources::class, inversedBy: 'logs')] - #[ORM\JoinColumn(name: 'node_source_id', referencedColumnName: 'id', onDelete: 'SET NULL')] - #[SymfonySerializer\Groups(['log_sources'])] - #[Serializer\Groups(['log_sources'])] - protected ?NodesSources $nodeSource = null; - #[ORM\Column(name: 'client_ip', type: 'string', length: 46, unique: false, nullable: true)] #[SymfonySerializer\Groups(['log'])] #[Serializer\Groups(['log'])] @@ -83,6 +80,26 @@ class Log extends AbstractEntity #[Assert\Length(max: 64)] protected ?string $channel = null; + /** + * @var class-string|null + */ + #[ORM\Column(name: 'entity_class', type: 'string', length: 255, unique: false, nullable: true)] + #[SymfonySerializer\Groups(['log'])] + #[Serializer\Groups(['log'])] + #[Assert\Length(max: 255)] + // @phpstan-ignore-next-line + protected ?string $entityClass = null; + + /** + * @var string|int|null + */ + #[ORM\Column(name: 'entity_id', type: 'string', length: 36, unique: false, nullable: true)] + #[SymfonySerializer\Groups(['log'])] + #[Serializer\Groups(['log'])] + #[Assert\Length(max: 36)] + // @phpstan-ignore-next-line + protected string|int|null $entityId = null; + #[ORM\Column(name: 'additional_data', type: 'json', unique: false, nullable: true)] #[SymfonySerializer\Groups(['log'])] #[Serializer\Groups(['log'])] @@ -101,6 +118,10 @@ public function __construct(int $level, string $message) $this->datetime = new \DateTime("now"); } + /** + * @return User|null + * @deprecated Use additionalData or username instead + */ public function getUser(): ?User { return $this->user; @@ -163,27 +184,22 @@ public function getDatetime(): \DateTime } /** - * Get log related node-source. + * BC setter. * - * @return NodesSources|null - */ - public function getNodeSource(): ?NodesSources - { - return $this->nodeSource; - } - - /** * @param NodesSources|null $nodeSource * @return $this */ public function setNodeSource(?NodesSources $nodeSource): Log { - $this->nodeSource = $nodeSource; + if (null !== $nodeSource) { + $this->entityClass = NodesSources::class; + $this->entityId = $nodeSource->getId(); + } return $this; } /** - * @return string + * @return string|null */ public function getClientIp(): ?string { @@ -191,7 +207,7 @@ public function getClientIp(): ?string } /** - * @param string $clientIp + * @param string|null $clientIp * @return Log */ public function setClientIp(?string $clientIp): Log @@ -240,6 +256,42 @@ public function setChannel(?string $channel): Log return $this; } + /** + * @return class-string|null + */ + public function getEntityClass(): ?string + { + return $this->entityClass; + } + + /** + * @param class-string|null $entityClass + * @return Log + */ + public function setEntityClass(?string $entityClass): Log + { + $this->entityClass = $entityClass; + return $this; + } + + /** + * @return int|string|null + */ + public function getEntityId(): int|string|null + { + return $this->entityId; + } + + /** + * @param int|string|null $entityId + * @return Log + */ + public function setEntityId(int|string|null $entityId): Log + { + $this->entityId = $entityId; + return $this; + } + #[ORM\PrePersist] public function prePersist(): void { diff --git a/lib/RoadizCoreBundle/src/Entity/NodesSources.php b/lib/RoadizCoreBundle/src/Entity/NodesSources.php index 983d4771..7cda5c45 100644 --- a/lib/RoadizCoreBundle/src/Entity/NodesSources.php +++ b/lib/RoadizCoreBundle/src/Entity/NodesSources.php @@ -20,6 +20,7 @@ use RZ\Roadiz\Core\AbstractEntities\TranslationInterface; use RZ\Roadiz\CoreBundle\Api\Filter as RoadizFilter; use RZ\Roadiz\CoreBundle\Repository\NodesSourcesRepository; +use RZ\Roadiz\Documents\Models\DocumentInterface; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Serializer\Annotation as SymfonySerializer; use Symfony\Component\Validator\Constraints as Assert; @@ -58,15 +59,6 @@ class NodesSources extends AbstractEntity implements Loggable #[Serializer\Exclude] protected ?ObjectManager $objectManager = null; - /** - * @var Collection - */ - #[ORM\OneToMany(mappedBy: 'nodeSource', targetEntity: Log::class)] - #[ORM\OrderBy(['datetime' => 'DESC'])] - #[SymfonySerializer\Ignore] - #[Serializer\Exclude] - protected Collection $logs; - /** * @var Collection */ @@ -208,7 +200,6 @@ public function __construct(Node $node, TranslationInterface $translation) $this->translation = $translation; $this->urlAliases = new ArrayCollection(); $this->documentsByFields = new ArrayCollection(); - $this->logs = new ArrayCollection(); $this->redirections = new ArrayCollection(); } @@ -289,6 +280,23 @@ public function getDocumentsByFields(): Collection return $this->documentsByFields; } + /** + * Get at least one document to represent this node-source as image. + * + * @return DocumentInterface|null + */ + #[SymfonySerializer\Ignore] + public function getOneDisplayableDocument(): ?DocumentInterface + { + return $this->getDocumentsByFields()->filter(function (NodesSourcesDocuments $nsd) { + return null !== $nsd->getDocument() && + $nsd->getDocument()->isImage() && + $nsd->getDocument()->isProcessable(); + })->map(function (NodesSourcesDocuments $nsd) { + return $nsd->getDocument(); + })->first() ?: null; + } + /** * @param Collection $documentsByFields * @@ -382,27 +390,6 @@ public function getDocumentsByFieldsWithName(string $fieldName): array ; } - /** - * Logs related to this node-source. - * - * @return Collection - */ - public function getLogs(): Collection - { - return $this->logs; - } - - /** - * @param Collection $logs - * @return $this - */ - public function setLogs(Collection $logs): NodesSources - { - $this->logs = $logs; - - return $this; - } - /** * @return Collection */ @@ -663,8 +650,6 @@ public function __clone() } // Clear url-aliases before cloning. $this->urlAliases->clear(); - // Clear logs before cloning. - $this->logs->clear(); } } } diff --git a/lib/RoadizCoreBundle/src/Logger/DoctrineHandler.php b/lib/RoadizCoreBundle/src/Logger/DoctrineHandler.php index 330dea02..94a2f40c 100644 --- a/lib/RoadizCoreBundle/src/Logger/DoctrineHandler.php +++ b/lib/RoadizCoreBundle/src/Logger/DoctrineHandler.php @@ -7,9 +7,12 @@ use Doctrine\Persistence\ManagerRegistry; use Monolog\Handler\AbstractProcessingHandler; use Monolog\Logger; +use RZ\Roadiz\Core\AbstractEntities\PersistableInterface; use RZ\Roadiz\CoreBundle\Entity\Log; use RZ\Roadiz\CoreBundle\Entity\NodesSources; use RZ\Roadiz\CoreBundle\Entity\User; +use RZ\Roadiz\Documents\UrlGenerators\DocumentUrlGeneratorInterface; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\User\UserInterface; @@ -22,11 +25,13 @@ final class DoctrineHandler extends AbstractProcessingHandler protected ManagerRegistry $managerRegistry; protected TokenStorageInterface $tokenStorage; protected RequestStack $requestStack; + private DocumentUrlGeneratorInterface $documentUrlGenerator; public function __construct( ManagerRegistry $managerRegistry, TokenStorageInterface $tokenStorage, RequestStack $requestStack, + DocumentUrlGeneratorInterface $documentUrlGenerator, $level = Logger::INFO, $bubble = true ) { @@ -35,6 +40,7 @@ public function __construct( $this->managerRegistry = $managerRegistry; parent::__construct($level, $bubble); + $this->documentUrlGenerator = $documentUrlGenerator; } /** @@ -73,27 +79,78 @@ public function write(array $record): void $log->setChannel((string) $record['channel']); $data = $record['extra']; - if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) { - $data = array_merge( - $data, - [ - get_class($record['context']['exception']) => $record['context']['exception']->getMessage() - ] - ); - } - if (isset($record['context']['request'])) { - $data = array_merge( - $data, - $record['context']['request'] - ); - } - if (isset($record['context']['username'])) { - $data = array_merge( - $data, - ['username' => $record['context']['username']] - ); + $context = $record['context']; + + if (\is_array($context)) { + foreach ($context as $key => $value) { + if ($value instanceof NodesSources) { + $log->setEntityClass(NodesSources::class); + $log->setEntityId($value->getId()); + $data = array_merge( + $data, + [ + 'node_source_id' => $value->getId(), + 'node_id' => $value->getNode()->getId(), + 'translation_id' => $value->getTranslation()->getId(), + 'entity_title' => $value->getTitle(), + ] + ); + + $thumbnail = $value->getOneDisplayableDocument(); + if (null !== $thumbnail) { + $thumbnailSrc = $this->documentUrlGenerator + ->setDocument($thumbnail) + ->setOptions([ + "fit" => "150x150", + "quality" => 70, + ]) + ->getUrl(); + + $data = array_merge( + $data, + [ + 'entity_thumbnail_src' => $thumbnailSrc, + ] + ); + } + } elseif ($key === 'entity' && $value instanceof PersistableInterface) { + $log->setEntityClass(get_class($value)); + $log->setEntityId($value->getId()); + } + if ($value instanceof \Exception) { + $data = array_merge( + $data, + [ + get_class($value) => $value->getMessage() + ] + ); + } + if ($value instanceof Request) { + $data = array_merge( + $data, + [ + 'uri' => $value->getUri(), + 'schemeHost' => $value->getSchemeAndHttpHost(), + ] + ); + } + if ($key === 'request' && \is_array($value)) { + $data = array_merge( + $data, + $value + ); + } + if (\is_string($value) && !empty($value) && !\is_numeric($key)) { + $data = array_merge( + $data, + [$key => $value] + ); + } + if (\is_string($value) && !empty($value) && \in_array($key, ['user', 'username'])) { + $log->setUsername($value); + } + } } - $log->setAdditionalData($data); /* * Use available securityAuthorizationChecker to provide a valid user @@ -106,6 +163,15 @@ public function write(array $record): void if ($user instanceof UserInterface) { if ($user instanceof User) { $log->setUser($user); + $data = array_merge( + $data, + [ + 'user_email' => $user->getEmail(), + 'user_public_name' => $user->getPublicName(), + 'user_picture_url' => $user->getPictureUrl(), + 'user_id' => $user->getId() + ] + ); } else { $log->setUsername($user->getUsername()); } @@ -121,15 +187,7 @@ public function write(array $record): void $log->setClientIp($this->requestStack->getMainRequest()->getClientIp()); } - /* - * Add a related node-source entity - */ - if ( - isset($record['context']['source']) && - $record['context']['source'] instanceof NodesSources - ) { - $log->setNodeSource($record['context']['source']); - } + $log->setAdditionalData($data); $manager->persist($log); $manager->flush(); diff --git a/lib/RoadizCoreBundle/src/Node/NodeMover.php b/lib/RoadizCoreBundle/src/Node/NodeMover.php index b82d8204..8deaff0d 100644 --- a/lib/RoadizCoreBundle/src/Node/NodeMover.php +++ b/lib/RoadizCoreBundle/src/Node/NodeMover.php @@ -213,7 +213,7 @@ protected function redirect(NodesSources $nodeSource, string $previousPath, bool $existingRedirection->setQuery($previousPath); $this->logger->info('New redirection created', [ 'oldPath' => $previousPath, - 'nodeSource' => $nodeSource->getId(), + 'nodeSource' => $nodeSource, ]); } $existingRedirection->setRedirectNodeSource($nodeSource); diff --git a/lib/RoadizCoreBundle/src/Node/NodeTranstyper.php b/lib/RoadizCoreBundle/src/Node/NodeTranstyper.php index da9d545e..ee44da07 100644 --- a/lib/RoadizCoreBundle/src/Node/NodeTranstyper.php +++ b/lib/RoadizCoreBundle/src/Node/NodeTranstyper.php @@ -113,14 +113,6 @@ public function transtype(Node $node, NodeTypeInterface $destinationNodeType, bo * Perform actual trans-typing */ $existingSources = $node->getNodeSources()->toArray(); - $existingLogs = []; - /** @var NodesSources $existingSource */ - foreach ($existingSources as $existingSource) { - $existingLogs[$existingSource->getTranslation()->getLocale()] = array_map(function (Log $log) { - $this->managerRegistry->getManager()->detach($log); - return $log; - }, $existingSource->getLogs()->toArray()); - } $existingRedirections = []; /** @var NodesSources $existingSource */ foreach ($existingSources as $existingSource) { @@ -141,7 +133,6 @@ public function transtype(Node $node, NodeTypeInterface $destinationNodeType, bo $existingSource->getTranslation(), $sourceClass, $fieldAssociations, - $existingLogs, $existingRedirections ); $this->logger->debug('Transtyped: ' . $existingSource->getTranslation()->getLocale()); @@ -176,7 +167,6 @@ protected function removeOldSources(Node $node, array &$sources): void * @param TranslationInterface $translation * @param string $sourceClass * @param array $fieldAssociations - * @param array $existingLogs * @param array $existingRedirections * @return NodesSources */ @@ -186,7 +176,6 @@ protected function doTranstypeSingleSource( TranslationInterface $translation, string $sourceClass, array &$fieldAssociations, - array &$existingLogs, array &$existingRedirections ): NodesSources { /** @var NodesSources $source */ @@ -221,20 +210,6 @@ protected function doTranstypeSingleSource( } $this->logger->debug('Fill existing data'); - - /** @var Log $log */ - foreach ($existingLogs[$translation->getLocale()] as $log) { - $newLog = clone $log; - $newLog->setAdditionalData($log->getAdditionalData()); - $newLog->setChannel($log->getChannel()); - $newLog->setClientIp($log->getClientIp()); - $newLog->setUser($log->getUser()); - $newLog->setUsername($log->getUsername()); - $this->getManager()->persist($newLog); - $newLog->setNodeSource($source); - } - $this->logger->debug('Recreate logs'); - /* * Recreate url-aliases too. */ diff --git a/lib/RoadizCoreBundle/src/Repository/LogRepository.php b/lib/RoadizCoreBundle/src/Repository/LogRepository.php index ac633d1f..264ccbbe 100644 --- a/lib/RoadizCoreBundle/src/Repository/LogRepository.php +++ b/lib/RoadizCoreBundle/src/Repository/LogRepository.php @@ -8,6 +8,7 @@ use Doctrine\ORM\Tools\Pagination\Paginator; use Doctrine\Persistence\ManagerRegistry; use RZ\Roadiz\CoreBundle\Entity\Log; +use RZ\Roadiz\CoreBundle\Entity\NodesSources; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; /** @@ -30,30 +31,17 @@ public function __construct( */ public function findLatestByNodesSources(int $maxResult = 5): Paginator { - /* - * We need to split this query in 2 for performance matter. - * - * SELECT l1_.id, l1_.datetime, n0_.id - * FROM log AS l1_ - * INNER JOIN nodes_sources n0_ ON l1_.node_source_id = n0_.id - * WHERE l1_.id IN ( - * SELECT MAX(id) - * FROM log - * GROUP BY node_source_id - * ) - * ORDER BY l1_.datetime DESC - * LIMIT 8 - */ $subQb = $this->createQueryBuilder('slog'); $subQb->select($subQb->expr()->max('slog.id')) - ->addGroupBy('slog.nodeSource'); + ->andWhere($subQb->expr()->eq('slog.entityClass', ':entityClass')) + ->addGroupBy('slog.entityId'); $qb = $this->createQueryBuilder('log'); $qb->select('log.id as id') - ->innerJoin('log.nodeSource', 'ns') ->andWhere($qb->expr()->in('log.id', $subQb->getQuery()->getDQL())) ->orderBy('log.datetime', 'DESC') + ->setParameter(':entityClass', NodesSources::class) ->setMaxResults($maxResult) ; $ids = $qb->getQuery() @@ -61,11 +49,7 @@ public function findLatestByNodesSources(int $maxResult = 5): Paginator ->getScalarResult(); $qb2 = $this->createQueryBuilder('log'); - $qb2->addSelect('ns, n, dbf') - ->andWhere($qb2->expr()->in('log.id', ':id')) - ->innerJoin('log.nodeSource', 'ns') - ->leftJoin('ns.documentsByFields', 'dbf') - ->innerJoin('ns.node', 'n') + $qb2->andWhere($qb2->expr()->in('log.id', ':id')) ->orderBy('log.datetime', 'DESC') ->setParameter(':id', array_map(function (array $item) { return $item['id']; diff --git a/lib/RoadizCoreBundle/src/Repository/NodesSourcesRepository.php b/lib/RoadizCoreBundle/src/Repository/NodesSourcesRepository.php index e1fe39e0..afc9c42e 100644 --- a/lib/RoadizCoreBundle/src/Repository/NodesSourcesRepository.php +++ b/lib/RoadizCoreBundle/src/Repository/NodesSourcesRepository.php @@ -568,18 +568,20 @@ public function findByTextQuery( * @param int $maxResult * @return Paginator */ - public function findByLatestUpdated($maxResult = 5) + public function findByLatestUpdated(int $maxResult = 5): Paginator { $subQuery = $this->_em->createQueryBuilder(); - $subQuery->select('sns.id') + $subQuery->select('slog.entityId') ->from(Log::class, 'slog') - ->innerJoin(NodesSources::class, 'sns') - ->andWhere($subQuery->expr()->isNotNull('slog.nodeSource')) + ->andWhere($subQuery->expr()->eq('slog.entityClass', ':entityClass')) ->orderBy('slog.datetime', 'DESC'); $query = $this->createQueryBuilder(static::NODESSOURCES_ALIAS); - $query->andWhere($query->expr()->in(static::NODESSOURCES_ALIAS . '.id', $subQuery->getQuery()->getDQL())); - $query->setMaxResults($maxResult); + $query + ->andWhere($query->expr()->in(static::NODESSOURCES_ALIAS . '.id', $subQuery->getQuery()->getDQL())) + ->setParameter(':entityClass', NodesSources::class) + ->setMaxResults($maxResult) + ; return new Paginator($query->getQuery()); } diff --git a/lib/RoadizCoreBundle/src/Security/User/UserViewer.php b/lib/RoadizCoreBundle/src/Security/User/UserViewer.php index 86caaf40..c6c07db9 100644 --- a/lib/RoadizCoreBundle/src/Security/User/UserViewer.php +++ b/lib/RoadizCoreBundle/src/Security/User/UserViewer.php @@ -97,6 +97,7 @@ public function sendPasswordResetLink( $this->logger->error('Unable to send password reset link', [ 'exception' => get_class($e), 'message' => $e->getMessage(), + 'entity' => $user, ]); return false; } diff --git a/lib/Rozier/src/Controllers/AbstractAdminController.php b/lib/Rozier/src/Controllers/AbstractAdminController.php index bde312ae..4318f1c1 100644 --- a/lib/Rozier/src/Controllers/AbstractAdminController.php +++ b/lib/Rozier/src/Controllers/AbstractAdminController.php @@ -132,7 +132,7 @@ public function addAction(Request $request) '%namespace%' => $this->getTranslator()->trans($this->getNamespace()) ] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $item); return $this->getPostSubmitResponse($item, true, $request); } @@ -193,7 +193,7 @@ public function editAction(Request $request, $id) '%namespace%' => $this->getTranslator()->trans($this->getNamespace()) ] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $item); return $this->getPostSubmitResponse($item, false, $request); } @@ -278,7 +278,7 @@ public function deleteAction(Request $request, $id) '%namespace%' => $this->getTranslator()->trans($this->getNamespace()) ] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $item); return $this->getPostDeleteResponse($item); } diff --git a/lib/Rozier/src/Controllers/CustomForms/CustomFormAnswersController.php b/lib/Rozier/src/Controllers/CustomForms/CustomFormAnswersController.php index 092bf1fb..facf91bd 100644 --- a/lib/Rozier/src/Controllers/CustomForms/CustomFormAnswersController.php +++ b/lib/Rozier/src/Controllers/CustomForms/CustomFormAnswersController.php @@ -83,7 +83,7 @@ public function deleteAction(Request $request, int $customFormAnswerId) $this->em()->remove($customFormAnswer); $msg = $this->getTranslator()->trans('customFormAnswer.%id%.deleted', ['%id%' => $customFormAnswer->getId()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $customFormAnswer); /* * Redirect to update schema page */ diff --git a/lib/Rozier/src/Controllers/CustomForms/CustomFormFieldsController.php b/lib/Rozier/src/Controllers/CustomForms/CustomFormFieldsController.php index d0a203bd..03189690 100644 --- a/lib/Rozier/src/Controllers/CustomForms/CustomFormFieldsController.php +++ b/lib/Rozier/src/Controllers/CustomForms/CustomFormFieldsController.php @@ -73,7 +73,7 @@ public function editAction(Request $request, int $customFormFieldId) $this->em()->flush(); $msg = $this->getTranslator()->trans('customFormField.%name%.updated', ['%name%' => $field->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $field); /* * Redirect to update schema page @@ -128,7 +128,7 @@ public function addAction(Request $request, int $customFormId) 'customFormField.%name%.created', ['%name%' => $field->getName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $field); /* * Redirect to update schema page @@ -141,7 +141,7 @@ public function addAction(Request $request, int $customFormId) ); } catch (Exception $e) { $msg = $e->getMessage(); - $this->publishErrorMessage($request, $msg); + $this->publishErrorMessage($request, $msg, $field); /* * Redirect to add page */ @@ -196,7 +196,7 @@ public function deleteAction(Request $request, int $customFormFieldId) 'customFormField.%name%.deleted', ['%name%' => $field->getName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $field); /* * Redirect to update schema page diff --git a/lib/Rozier/src/Controllers/CustomForms/CustomFormsUtilsController.php b/lib/Rozier/src/Controllers/CustomForms/CustomFormsUtilsController.php index fc014c56..2c99caf7 100644 --- a/lib/Rozier/src/Controllers/CustomForms/CustomFormsUtilsController.php +++ b/lib/Rozier/src/Controllers/CustomForms/CustomFormsUtilsController.php @@ -120,7 +120,7 @@ public function duplicateAction(Request $request, int $id) '%name%' => $existingCustomForm->getDisplayName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $newCustomForm); return $this->redirectToRoute( 'customFormsEditPage', @@ -131,9 +131,10 @@ public function duplicateAction(Request $request, int $id) $request, $this->getTranslator()->trans("impossible.duplicate.custom.form.%name%", [ '%name%' => $existingCustomForm->getDisplayName(), - ]) + ]), + $newCustomForm ); - $this->publishErrorMessage($request, $e->getMessage()); + $this->publishErrorMessage($request, $e->getMessage(), $existingCustomForm); return $this->redirectToRoute( 'customFormsEditPage', diff --git a/lib/Rozier/src/Controllers/Documents/DocumentTranslationsController.php b/lib/Rozier/src/Controllers/Documents/DocumentTranslationsController.php index 70e81f4d..6fd79e4e 100644 --- a/lib/Rozier/src/Controllers/Documents/DocumentTranslationsController.php +++ b/lib/Rozier/src/Controllers/Documents/DocumentTranslationsController.php @@ -179,13 +179,13 @@ public function deleteAction(Request $request, int $documentId, int $translation 'document.translation.%name%.deleted', ['%name%' => (string) $document] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); } catch (Exception $e) { $msg = $this->getTranslator()->trans( 'document.translation.%name%.cannot_delete', ['%name%' => (string) $document] ); - $this->publishErrorMessage($request, $msg); + $this->publishErrorMessage($request, $msg, $document); } /* * Force redirect to avoid resending form when refreshing page @@ -239,7 +239,7 @@ protected function onPostUpdate(PersistableInterface $entity, Request $request): $msg = $this->getTranslator()->trans('document.translation.%name%.updated', [ '%name%' => (string) $entity->getDocument(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $entity); } } diff --git a/lib/Rozier/src/Controllers/Documents/DocumentsController.php b/lib/Rozier/src/Controllers/Documents/DocumentsController.php index ac433723..89607971 100644 --- a/lib/Rozier/src/Controllers/Documents/DocumentsController.php +++ b/lib/Rozier/src/Controllers/Documents/DocumentsController.php @@ -48,6 +48,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\String\UnicodeString; use Symfony\Component\Validator\Constraints\File; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotNull; @@ -335,13 +336,13 @@ public function editAction(Request $request, int $documentId): Response $this->dispatchEvent( new DocumentFileUpdatedEvent($document) ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); } $msg = $this->getTranslator()->trans('document.%name%.updated', [ '%name%' => (string) $document, ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); $this->em()->flush(); // Event must be dispatched AFTER flush for async concurrency matters $this->dispatchEvent( @@ -414,13 +415,13 @@ public function deleteAction(Request $request, int $documentId): Response $msg = $this->getTranslator()->trans('document.%name%.deleted', [ '%name%' => (string) $document ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); } catch (\Exception $e) { $msg = $this->getTranslator()->trans('document.%name%.cannot_delete', [ '%name%' => (string) $document ]); $this->logger->error($e->getMessage()); - $this->publishErrorMessage($request, $msg); + $this->publishErrorMessage($request, $msg, $document); } /* * Force redirect to avoid resending form when refreshing page @@ -472,7 +473,7 @@ public function bulkDeleteAction(Request $request): Response 'document.%name%.deleted', ['%name%' => (string) $document] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); } $this->em()->flush(); @@ -518,18 +519,18 @@ public function embedAction(Request $request, ?int $folderId = null): Response if (is_iterable($document)) { foreach ($document as $singleDocument) { $msg = $this->getTranslator()->trans('document.%name%.uploaded', [ - '%name%' => (string) $singleDocument, + '%name%' => (new UnicodeString((string) $singleDocument))->truncate(50, '...')->toString(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $singleDocument); $this->dispatchEvent( new DocumentCreatedEvent($singleDocument) ); } } else { $msg = $this->getTranslator()->trans('document.%name%.uploaded', [ - '%name%' => (string) $document, + '%name%' => (new UnicodeString((string) $document))->truncate(50, '...')->toString(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); $this->dispatchEvent( new DocumentCreatedEvent($document) ); @@ -577,9 +578,9 @@ public function randomAction(Request $request, ?int $folderId = null): Response $document = $this->randomDocument($folderId); $msg = $this->getTranslator()->trans('document.%name%.uploaded', [ - '%name%' => (string) $document, + '%name%' => (new UnicodeString((string) $document))->truncate(50, '...')->toString(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); $this->dispatchEvent( new DocumentCreatedEvent($document) @@ -650,9 +651,9 @@ public function uploadAction(Request $request, ?int $folderId = null, string $_f if (null !== $document) { $msg = $this->getTranslator()->trans('document.%name%.uploaded', [ - '%name%' => (string) $document, + '%name%' => (new UnicodeString((string) $document))->truncate(50, '...')->toString(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $document); // Event must be dispatched AFTER flush for async concurrency matters $this->dispatchEvent( @@ -676,7 +677,7 @@ public function uploadAction(Request $request, ?int $folderId = null, string $_f } } else { $msg = $this->getTranslator()->trans('document.cannot_persist'); - $this->publishErrorMessage($request, $msg); + $this->publishErrorMessage($request, $msg, $document); if ($_format === 'json' || $request->isXmlHttpRequest()) { throw $this->createNotFoundException($msg); diff --git a/lib/Rozier/src/Controllers/FoldersController.php b/lib/Rozier/src/Controllers/FoldersController.php index 44f671d1..92b122db 100644 --- a/lib/Rozier/src/Controllers/FoldersController.php +++ b/lib/Rozier/src/Controllers/FoldersController.php @@ -86,7 +86,7 @@ public function addAction(Request $request, ?int $parentFolderId = null): Respon 'folder.%name%.created', ['%name%' => $folder->getFolderName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $folder); /* * Dispatch event @@ -95,7 +95,7 @@ public function addAction(Request $request, ?int $parentFolderId = null): Respon new FolderCreatedEvent($folder) ); } catch (\RuntimeException $e) { - $this->publishErrorMessage($request, $e->getMessage()); + $this->publishErrorMessage($request, $e->getMessage(), $folder); } return $this->redirectToRoute('foldersHomePage'); @@ -137,7 +137,7 @@ public function deleteAction(Request $request, int $folderId): Response 'folder.%name%.deleted', ['%name%' => $folder->getFolderName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $folder); /* * Dispatch event @@ -146,7 +146,7 @@ public function deleteAction(Request $request, int $folderId): Response new FolderDeletedEvent($folder) ); } catch (\RuntimeException $e) { - $this->publishErrorMessage($request, $e->getMessage()); + $this->publishErrorMessage($request, $e->getMessage(), $folder); } return $this->redirectToRoute('foldersHomePage'); @@ -193,7 +193,7 @@ public function editAction(Request $request, int $folderId): Response 'folder.%name%.updated', ['%name%' => $folder->getFolderName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $folder); /* * Dispatch event */ @@ -201,7 +201,7 @@ public function editAction(Request $request, int $folderId): Response new FolderUpdatedEvent($folder) ); } catch (\RuntimeException $e) { - $this->publishErrorMessage($request, $e->getMessage()); + $this->publishErrorMessage($request, $e->getMessage(), $folder); } return $this->redirectToRoute('foldersEditPage', ['folderId' => $folderId]); @@ -277,7 +277,7 @@ public function editTranslationAction(Request $request, int $folderId, int $tran 'folder.%name%.updated', ['%name%' => $folder->getFolderName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $folder); /* * Dispatch event */ @@ -285,7 +285,7 @@ public function editTranslationAction(Request $request, int $folderId, int $tran new FolderUpdatedEvent($folder) ); } catch (\RuntimeException $e) { - $this->publishErrorMessage($request, $e->getMessage()); + $this->publishErrorMessage($request, $e->getMessage(), $folder); } return $this->redirectToRoute('foldersEditTranslationPage', [ diff --git a/lib/Rozier/src/Controllers/GroupsController.php b/lib/Rozier/src/Controllers/GroupsController.php index 61cbc768..79d5282c 100644 --- a/lib/Rozier/src/Controllers/GroupsController.php +++ b/lib/Rozier/src/Controllers/GroupsController.php @@ -150,7 +150,7 @@ public function editRolesAction(Request $request, int $id): Response '%group%' => $item->getName(), '%role%' => $role->getRole(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $role); return $this->redirectToRoute( 'groupsEditRolesPage', @@ -206,7 +206,7 @@ public function removeRolesAction(Request $request, int $id, int $roleId): Respo '%role%' => $role->getRole(), '%group%' => $item->getName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $role); return $this->redirectToRoute( 'groupsEditRolesPage', @@ -254,7 +254,7 @@ public function editUsersAction(Request $request, int $id): Response '%group%' => $item->getName(), '%user%' => $user->getUserName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); return $this->redirectToRoute( 'groupsEditUsersPage', @@ -309,7 +309,7 @@ public function removeUsersAction(Request $request, int $id, int $userId): Respo '%user%' => $user->getUserName(), '%group%' => $item->getName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); return $this->redirectToRoute( 'groupsEditUsersPage', diff --git a/lib/Rozier/src/Controllers/NodeTypeFieldsController.php b/lib/Rozier/src/Controllers/NodeTypeFieldsController.php index 5596ab58..4e86547d 100644 --- a/lib/Rozier/src/Controllers/NodeTypeFieldsController.php +++ b/lib/Rozier/src/Controllers/NodeTypeFieldsController.php @@ -86,7 +86,7 @@ public function editAction(Request $request, int $nodeTypeFieldId): Response $this->messageBus->dispatch(new Envelope(new UpdateNodeTypeSchemaMessage($nodeType->getId()))); $msg = $this->getTranslator()->trans('nodeTypeField.%name%.updated', ['%name%' => $field->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $field); return $this->redirectToRoute( 'nodeTypeFieldsEditPage', @@ -145,7 +145,7 @@ public function addAction(Request $request, int $nodeTypeId): Response 'nodeTypeField.%name%.created', ['%name%' => $field->getName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $field); return $this->redirectToRoute( 'nodeTypeFieldsListPage', @@ -197,7 +197,7 @@ public function deleteAction(Request $request, int $nodeTypeFieldId): Response 'nodeTypeField.%name%.deleted', ['%name%' => $field->getName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $field); return $this->redirectToRoute( 'nodeTypeFieldsListPage', diff --git a/lib/Rozier/src/Controllers/NodeTypes/NodeTypesController.php b/lib/Rozier/src/Controllers/NodeTypes/NodeTypesController.php index c4de8822..372bb2e8 100644 --- a/lib/Rozier/src/Controllers/NodeTypes/NodeTypesController.php +++ b/lib/Rozier/src/Controllers/NodeTypes/NodeTypesController.php @@ -86,7 +86,7 @@ public function editAction(Request $request, int $nodeTypeId): Response $this->messageBus->dispatch(new Envelope(new UpdateNodeTypeSchemaMessage($nodeType->getId()))); $msg = $this->getTranslator()->trans('nodeType.%name%.updated', ['%name%' => $nodeType->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $nodeType); return $this->redirectToRoute('nodeTypesEditPage', [ 'nodeTypeId' => $nodeTypeId @@ -125,7 +125,7 @@ public function addAction(Request $request): Response $this->messageBus->dispatch(new Envelope(new UpdateNodeTypeSchemaMessage($nodeType->getId()))); $msg = $this->getTranslator()->trans('nodeType.%name%.created', ['%name%' => $nodeType->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $nodeType); return $this->redirectToRoute('nodeTypesEditPage', [ 'nodeTypeId' => $nodeType->getId() @@ -165,7 +165,7 @@ public function deleteAction(Request $request, int $nodeTypeId): Response $this->messageBus->dispatch(new Envelope(new DeleteNodeTypeMessage($nodeType->getId()))); $msg = $this->getTranslator()->trans('nodeType.%name%.deleted', ['%name%' => $nodeType->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $nodeType); return $this->redirectToRoute('nodeTypesHomePage'); } diff --git a/lib/Rozier/src/Controllers/Nodes/NodesAttributesController.php b/lib/Rozier/src/Controllers/Nodes/NodesAttributesController.php index a5c5af2d..da17040a 100644 --- a/lib/Rozier/src/Controllers/Nodes/NodesAttributesController.php +++ b/lib/Rozier/src/Controllers/Nodes/NodesAttributesController.php @@ -231,9 +231,9 @@ public function deleteAction(Request $request, $nodeId, $translationId, $attribu '%nodeName%' => $nodeSource->getTitle(), ] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $item); } catch (\RuntimeException $e) { - $this->publishErrorMessage($request, $e->getMessage()); + $this->publishErrorMessage($request, $e->getMessage(), $item); } return $this->redirectToRoute('nodesEditAttributesPage', [ @@ -307,9 +307,9 @@ public function resetAction(Request $request, int $nodeId, int $translationId, i '%nodeName%' => $nodeSource->getTitle(), ] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $item); } catch (\RuntimeException $e) { - $this->publishErrorMessage($request, $e->getMessage()); + $this->publishErrorMessage($request, $e->getMessage(), $item); } return $this->redirectToRoute('nodesEditAttributesPage', [ diff --git a/lib/Rozier/src/Controllers/Nodes/NodesController.php b/lib/Rozier/src/Controllers/Nodes/NodesController.php index cc850ff9..bacdb43a 100644 --- a/lib/Rozier/src/Controllers/Nodes/NodesController.php +++ b/lib/Rozier/src/Controllers/Nodes/NodesController.php @@ -213,7 +213,7 @@ public function editAction(Request $request, int $nodeId, ?int $translationId = '%type%' => $type->getDisplayName(), ] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $node); return $this->redirectToRoute( 'nodesEditPage', ['nodeId' => $node->getId()] @@ -509,7 +509,7 @@ public function deleteAction(Request $request, int $nodeId): Response $workflow = $this->workflowRegistry->get($node); if (!$workflow->can($node, 'delete')) { - $this->publishErrorMessage($request, sprintf('Node #%s cannot be deleted.', $nodeId)); + $this->publishErrorMessage($request, sprintf('Node #%s cannot be deleted.', $nodeId), $node); return $this->redirectToRoute( 'nodesEditSourcePage', [ @@ -544,7 +544,7 @@ public function deleteAction(Request $request, int $nodeId): Response 'node.%name%.deleted', ['%name%' => $node->getNodeName()] ); - $this->publishConfirmMessage($request, $msg, $node->getNodeSources()->first() ?: null); + $this->publishConfirmMessage($request, $msg, $node->getNodeSources()->first() ?: $node); $referrer = $request->query->get('referer'); if ( @@ -644,7 +644,7 @@ public function undeleteAction(Request $request, int $nodeId): Response $workflow = $this->workflowRegistry->get($node); if (!$workflow->can($node, 'undelete')) { - $this->publishErrorMessage($request, sprintf('Node #%s cannot be undeleted.', $nodeId)); + $this->publishErrorMessage($request, sprintf('Node #%s cannot be undeleted.', $nodeId), $node); return $this->redirectToRoute( 'nodesEditSourcePage', [ @@ -670,7 +670,7 @@ public function undeleteAction(Request $request, int $nodeId): Response 'node.%name%.undeleted', ['%name%' => $node->getNodeName()] ); - $this->publishConfirmMessage($request, $msg, $node->getNodeSources()->first() ?: null); + $this->publishConfirmMessage($request, $msg, $node->getNodeSources()->first() ?: $node); /* * Force redirect to avoid resending form when refreshing page */ @@ -730,7 +730,7 @@ public function publishAllAction(Request $request, int $nodeId): Response $workflow = $this->workflowRegistry->get($node); if (!$workflow->can($node, 'publish')) { - $this->publishErrorMessage($request, sprintf('Node #%s cannot be published.', $nodeId)); + $this->publishErrorMessage($request, sprintf('Node #%s cannot be published.', $nodeId), $node); return $this->redirectToRoute( 'nodesEditSourcePage', [ @@ -749,7 +749,7 @@ public function publishAllAction(Request $request, int $nodeId): Response $this->em()->flush(); $msg = $this->getTranslator()->trans('node.offspring.published'); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $node); return $this->redirectToRoute('nodesEditSourcePage', [ 'nodeId' => $nodeId, diff --git a/lib/Rozier/src/Controllers/Nodes/NodesSourcesController.php b/lib/Rozier/src/Controllers/Nodes/NodesSourcesController.php index 03409dcb..a7da8394 100644 --- a/lib/Rozier/src/Controllers/Nodes/NodesSourcesController.php +++ b/lib/Rozier/src/Controllers/Nodes/NodesSourcesController.php @@ -259,7 +259,7 @@ public function removeAction(Request $request, int $nodeSourceId): Response '%translation%' => $ns->getTranslation()->getName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $node); return $this->redirectToRoute( 'nodesEditSourcePage', diff --git a/lib/Rozier/src/Controllers/Nodes/NodesUtilsController.php b/lib/Rozier/src/Controllers/Nodes/NodesUtilsController.php index d59a2acf..536decbd 100644 --- a/lib/Rozier/src/Controllers/Nodes/NodesUtilsController.php +++ b/lib/Rozier/src/Controllers/Nodes/NodesUtilsController.php @@ -61,7 +61,7 @@ public function duplicateAction(Request $request, int $nodeId) '%name%' => $existingNode->getNodeName(), ]); - $this->publishConfirmMessage($request, $msg, $newNode->getNodeSources()->first() ?: null); + $this->publishConfirmMessage($request, $msg, $newNode->getNodeSources()->first() ?: $newNode); return $this->redirectToRoute( 'nodesEditPage', @@ -72,7 +72,8 @@ public function duplicateAction(Request $request, int $nodeId) $request, $this->getTranslator()->trans("impossible.duplicate.node.%name%", [ '%name%' => $existingNode->getNodeName(), - ]) + ]), + $existingNode ); return $this->redirectToRoute( diff --git a/lib/Rozier/src/Controllers/Nodes/TranstypeController.php b/lib/Rozier/src/Controllers/Nodes/TranstypeController.php index c57cbc40..595402df 100644 --- a/lib/Rozier/src/Controllers/Nodes/TranstypeController.php +++ b/lib/Rozier/src/Controllers/Nodes/TranstypeController.php @@ -91,7 +91,7 @@ public function transtypeAction(Request $request, int $nodeId) '%node%' => $node->getNodeName(), '%type%' => $newNodeType->getName(), ]); - $this->publishConfirmMessage($request, $msg, $node->getNodeSources()->first() ?: null); + $this->publishConfirmMessage($request, $msg, $node->getNodeSources()->first() ?: $node); return $this->redirectToRoute( 'nodesEditSourcePage', diff --git a/lib/Rozier/src/Controllers/SettingsController.php b/lib/Rozier/src/Controllers/SettingsController.php index 81284ef6..f4970292 100644 --- a/lib/Rozier/src/Controllers/SettingsController.php +++ b/lib/Rozier/src/Controllers/SettingsController.php @@ -133,7 +133,7 @@ protected function commonSettingList(Request $request, SettingGroup $settingGrou 'setting.%name%.updated', ['%name%' => $setting->getName()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $setting); if ($request->isXmlHttpRequest() || $request->getRequestFormat('html') === 'json') { return new JsonResponse([ @@ -218,7 +218,7 @@ public function editAction(Request $request, int $settingId): Response $this->dispatchEvent(new SettingUpdatedEvent($setting)); $this->em()->flush(); $msg = $this->getTranslator()->trans('setting.%name%.updated', ['%name%' => $setting->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $setting); /* * Force redirect to avoid resending form when refreshing page */ @@ -273,7 +273,7 @@ public function addAction(Request $request): Response $this->em()->persist($setting); $this->em()->flush(); $msg = $this->getTranslator()->trans('setting.%name%.created', ['%name%' => $setting->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $setting); return $this->redirectToRoute('settingsHomePage'); } catch (EntityAlreadyExistsException $e) { @@ -319,7 +319,7 @@ public function deleteAction(Request $request, int $settingId): Response $this->em()->flush(); $msg = $this->getTranslator()->trans('setting.%name%.deleted', ['%name%' => $setting->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $setting); /* * Force redirect to avoid resending form when refreshing page diff --git a/lib/Rozier/src/Controllers/Tags/TagMultiCreationController.php b/lib/Rozier/src/Controllers/Tags/TagMultiCreationController.php index 630fba1c..8c24b583 100644 --- a/lib/Rozier/src/Controllers/Tags/TagMultiCreationController.php +++ b/lib/Rozier/src/Controllers/Tags/TagMultiCreationController.php @@ -78,7 +78,7 @@ public function addChildAction(Request $request, int $parentTagId) */ $this->dispatchEvent(new TagCreatedEvent($tag)); $msg = $this->getTranslator()->trans('child.tag.%name%.created', ['%name%' => $tag->getTagName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $tag); } return $this->redirectToRoute('tagsTreePage', ['tagId' => $parentTagId]); diff --git a/lib/Rozier/src/Controllers/Tags/TagsController.php b/lib/Rozier/src/Controllers/Tags/TagsController.php index 1c2cb442..3e29b662 100644 --- a/lib/Rozier/src/Controllers/Tags/TagsController.php +++ b/lib/Rozier/src/Controllers/Tags/TagsController.php @@ -194,7 +194,7 @@ public function editTranslatedAction(Request $request, int $tagId, ?int $transla $msg = $this->getTranslator()->trans('tag.%name%.updated', [ '%name%' => $tagTranslation->getName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $tag); /* * Force redirect to avoid resending form when refreshing page @@ -333,7 +333,7 @@ public function addAction(Request $request) $this->dispatchEvent(new TagCreatedEvent($tag)); $msg = $this->getTranslator()->trans('tag.%name%.created', ['%name%' => $tag->getTagName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $tag); /* * Force redirect to avoid resending form when refreshing page */ @@ -382,7 +382,7 @@ public function editSettingsAction(Request $request, int $tagId) $this->dispatchEvent(new TagUpdatedEvent($tag)); $msg = $this->getTranslator()->trans('tag.%name%.updated', ['%name%' => $tag->getTagName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $tag); /* * Force redirect to avoid resending form when refreshing page @@ -487,7 +487,7 @@ public function deleteAction(Request $request, int $tagId) $tag->getTranslatedTags()->first()->getName() : $tag->getTagName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $tag); /* * Force redirect to avoid resending form when refreshing page @@ -554,7 +554,7 @@ public function addChildAction(Request $request, int $tagId, ?int $translationId $this->dispatchEvent(new TagCreatedEvent($tag)); $msg = $this->getTranslator()->trans('child.tag.%name%.created', ['%name%' => $tag->getTagName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $tag); return $this->redirectToRoute( 'tagsEditPage', @@ -715,7 +715,7 @@ protected function onPostUpdate(PersistableInterface $entity, Request $request): $msg = $this->getTranslator()->trans('tag.%name%.updated', [ '%name%' => $entity->getName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $entity); } } diff --git a/lib/Rozier/src/Controllers/TranslationsController.php b/lib/Rozier/src/Controllers/TranslationsController.php index 94aacc18..968a268e 100644 --- a/lib/Rozier/src/Controllers/TranslationsController.php +++ b/lib/Rozier/src/Controllers/TranslationsController.php @@ -61,7 +61,7 @@ public function indexAction(Request $request): Response $handler = $this->handlerFactory->getHandler($translation); $handler->makeDefault(); $msg = $this->getTranslator()->trans('translation.%name%.made_default', ['%name%' => $translation->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $translation); $this->dispatchEvent(new TranslationUpdatedEvent($translation)); /* * Force redirect to avoid resending form when refreshing page @@ -106,7 +106,7 @@ public function editAction(Request $request, int $translationId): Response if ($form->isSubmitted() && $form->isValid()) { $this->em()->flush(); $msg = $this->getTranslator()->trans('translation.%name%.updated', ['%name%' => $translation->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $translation); $this->dispatchEvent(new TranslationUpdatedEvent($translation)); /* @@ -144,7 +144,7 @@ public function addAction(Request $request): Response $this->em()->flush(); $msg = $this->getTranslator()->trans('translation.%name%.created', ['%name%' => $translation->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $translation); $this->dispatchEvent(new TranslationCreatedEvent($translation)); /* @@ -184,7 +184,7 @@ public function deleteAction(Request $request, int $translationId): Response $this->em()->remove($translation); $this->em()->flush(); $msg = $this->getTranslator()->trans('translation.%name%.deleted', ['%name%' => $translation->getName()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $translation); $this->dispatchEvent(new TranslationDeletedEvent($translation)); return $this->redirectToRoute('translationsHomePage'); diff --git a/lib/Rozier/src/Controllers/Users/UsersController.php b/lib/Rozier/src/Controllers/Users/UsersController.php index 62732744..3c43fe0f 100644 --- a/lib/Rozier/src/Controllers/Users/UsersController.php +++ b/lib/Rozier/src/Controllers/Users/UsersController.php @@ -87,7 +87,7 @@ public function editAction(Request $request, int $userId): Response 'user.%name%.updated', ['%name%' => $user->getUsername()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page */ @@ -148,7 +148,7 @@ public function editDetailsAction(Request $request, int $userId): Response 'user.%name%.updated', ['%name%' => $user->getUsername()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page @@ -187,7 +187,7 @@ public function addAction(Request $request): Response $this->em()->flush(); $msg = $this->getTranslator()->trans('user.%name%.created', ['%name%' => $user->getUsername()]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); return $this->redirectToRoute('usersHomePage'); } @@ -227,7 +227,7 @@ public function deleteAction(Request $request, int $userId): Response 'user.%name%.deleted', ['%name%' => $user->getUsername()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page */ diff --git a/lib/Rozier/src/Controllers/Users/UsersGroupsController.php b/lib/Rozier/src/Controllers/Users/UsersGroupsController.php index 4c5ba264..c8f2c35c 100644 --- a/lib/Rozier/src/Controllers/Users/UsersGroupsController.php +++ b/lib/Rozier/src/Controllers/Users/UsersGroupsController.php @@ -55,7 +55,7 @@ public function editGroupsAction(Request $request, int $userId): Response '%user%' => $user->getUserName(), '%group%' => $group->getName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page @@ -106,7 +106,7 @@ public function removeGroupAction(Request $request, int $userId, int $groupId): '%user%' => $user->getUserName(), '%group%' => $group->getName(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page diff --git a/lib/Rozier/src/Controllers/Users/UsersRolesController.php b/lib/Rozier/src/Controllers/Users/UsersRolesController.php index 04b0a57a..ba80f0af 100644 --- a/lib/Rozier/src/Controllers/Users/UsersRolesController.php +++ b/lib/Rozier/src/Controllers/Users/UsersRolesController.php @@ -53,7 +53,7 @@ public function editRolesAction(Request $request, int $userId): Response '%role%' => $role->getRole(), ]); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page @@ -114,7 +114,7 @@ public function removeRoleAction(Request $request, int $userId, int $roleId): Re 'user.%name%.role_removed', ['%name%' => $role->getRole()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page diff --git a/lib/Rozier/src/Controllers/Users/UsersSecurityController.php b/lib/Rozier/src/Controllers/Users/UsersSecurityController.php index 27c178c4..35949690 100644 --- a/lib/Rozier/src/Controllers/Users/UsersSecurityController.php +++ b/lib/Rozier/src/Controllers/Users/UsersSecurityController.php @@ -45,7 +45,7 @@ public function securityAction(Request $request, int $userId): Response ['%name%' => $user->getUsername()] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $user); /* * Force redirect to avoid resending form when refreshing page diff --git a/lib/Rozier/src/Controllers/WebhookController.php b/lib/Rozier/src/Controllers/WebhookController.php index 807ba1bc..605d1e61 100644 --- a/lib/Rozier/src/Controllers/WebhookController.php +++ b/lib/Rozier/src/Controllers/WebhookController.php @@ -57,7 +57,7 @@ public function triggerAction(Request $request, string $id): Response '%seconds%' => $item->getThrottleSeconds(), ] ); - $this->publishConfirmMessage($request, $msg); + $this->publishConfirmMessage($request, $msg, $item); return $this->redirect($this->urlGenerator->generate($this->getDefaultRouteName())); } catch (TooManyWebhookTriggeredException $e) { diff --git a/lib/Rozier/src/Resources/translations/messages.en.xlf b/lib/Rozier/src/Resources/translations/messages.en.xlf index 7a9aecab..bc33be1b 100644 --- a/lib/Rozier/src/Resources/translations/messages.en.xlf +++ b/lib/Rozier/src/Resources/translations/messages.en.xlf @@ -3787,6 +3787,10 @@ folder.%name%.updated Folder “%name%” has been updated. + + folder.%name%.created + Folder “%name%” has been created. + folder.alreadyExists Folder already exists. diff --git a/lib/Rozier/src/Resources/translations/messages.fr.xlf b/lib/Rozier/src/Resources/translations/messages.fr.xlf index 72faf892..d8ba5e4d 100644 --- a/lib/Rozier/src/Resources/translations/messages.fr.xlf +++ b/lib/Rozier/src/Resources/translations/messages.fr.xlf @@ -3787,6 +3787,10 @@ folder.%name%.updated Le dossier « %name% » a été mis à jour. + + folder.%name%.created + Le dossier « %name% » a été créé. + folder.alreadyExists Le dossier existe déjà. diff --git a/lib/Rozier/src/Resources/translations/messages.xlf b/lib/Rozier/src/Resources/translations/messages.xlf index 17584989..55b1b2ac 100644 --- a/lib/Rozier/src/Resources/translations/messages.xlf +++ b/lib/Rozier/src/Resources/translations/messages.xlf @@ -607,6 +607,7 @@ add.folder add.child.folder add.folder.%name%.child + folder.%name%.created edit.folder delete.folder back_to.folders diff --git a/lib/Rozier/src/Resources/views/dashboard/index.html.twig b/lib/Rozier/src/Resources/views/dashboard/index.html.twig index 0f030156..d38be5e0 100644 --- a/lib/Rozier/src/Resources/views/dashboard/index.html.twig +++ b/lib/Rozier/src/Resources/views/dashboard/index.html.twig @@ -1,7 +1,7 @@ {% extends '@RoadizRozier/layout.html.twig' %} {% if app.user %} - {% set displayName = app.user.firstName|default(app.user.nickname|default(app.user.givenName|default(app.user.name|default(app.user.username)))) %} + {% set displayName = app.user.firstName|default(app.user.nickname|default(app.user.givenName|default(app.user.name|default(app.user.userIdentifier)))) %} {% else %} {% set displayName = '' %} {% endif %} @@ -26,43 +26,41 @@

{% trans %}latest.node-sources.updates{% endtrans %}

{% apply spaceless %} {% for log in latestLogs %} - {% set source = log.nodeSource %} diff --git a/lib/Rozier/src/Resources/views/modules/history-item.html.twig b/lib/Rozier/src/Resources/views/modules/history-item.html.twig index 91cc2ef0..79869173 100644 --- a/lib/Rozier/src/Resources/views/modules/history-item.html.twig +++ b/lib/Rozier/src/Resources/views/modules/history-item.html.twig @@ -6,18 +6,18 @@ {% set icon = 'uk-icon-info-circle' %} {% endif %} -
+
{{ log.datetime|format_datetime('short', 'short', locale=app.request.locale) }}
- {% if log.user %} + {% if log.additionalData.user_id %}
- {% if is_granted('ROLE_ACCESS_USERS') %} - {% set userPath = path("usersEditPage", { userId: log.user.id }) %} - {% elseif is_granted('ROLE_ACCESS_LOGS') %} - {% set userPath = path('historyUserPage', { userId: log.user.id }) %} + {% if is_granted('ROLE_ACCESS_USERS') and log.additionalData.user_id %} + {% set userPath = path("usersEditPage", { userId: log.additionalData.user_id }) %} + {% elseif is_granted('ROLE_ACCESS_LOGS') and log.additionalData.user_id %} + {% set userPath = path('historyUserPage', { userId: log.additionalData.user_id }) %} {% else %} {% set userPath = '#' %} {% endif %} @@ -25,9 +25,9 @@ {{ log.user.identifier }}
@@ -42,29 +42,28 @@ {% endif %}
- {% if log.nodeSource %} + {% if log.additionalData.entity_title %}
- {% if is_granted('ROLE_ACCESS_NODES') %} - {% set nodePath = path("nodesEditSourcePage", {"nodeId":log.nodeSource.node.id, "translationId":log.nodeSource.translation.id }) %} - {% elseif is_granted('ROLE_ACCESS_LOGS') %} - {% set nodePath = path("nodesHistoryPage", {"nodeId":log.nodeSource.node.id }) %} + {% if log.additionalData.node_id %} + {% if is_granted('ROLE_ACCESS_NODES') and log.additionalData.node_id and log.additionalData.translation_id %} + {% set entityPath = path("nodesEditSourcePage", { "nodeId":log.additionalData.node_id, "translationId":log.additionalData.translation_id }) %} + {% elseif is_granted('ROLE_ACCESS_LOGS') and log.additionalData.node_id %} + {% set entityPath = path("nodesHistoryPage", {"nodeId":log.additionalData.node_id }) %} + {% else %} + {% set entityPath = '#' %} + {% endif %} {% else %} - {% set nodePath = '#' %} + {% set entityPath = '#' %} {% endif %} - - {% set thumbnail = log.nodeSource.getDocumentsByFields.first.getDocument %} - {% if thumbnail and thumbnail.image %} -
- {{ thumbnail|display({ - "fit":"60x60", - "quality":80, - "picture": true, - "alt": log.nodeSource.title, - }) }} + + {% set thumbnail = log.additionalData.entity_thumbnail_src %} + {% if thumbnail %} +
+ {{ log.additionalData.entity_title }}
{% else %} {% endif %}
@@ -85,8 +84,10 @@
{{ log.username }}
{% endif %} {% for key, data in log.additionalData %} -
{{ key|trans }}
-
{{ data }}
+ {% if data is not iterable %} +
{{ key|trans }}
+
{{ data|u.truncate(140, '[…]') }}
+ {% endif %} {% endfor %}
diff --git a/lib/Rozier/src/Resources/views/widgets/nodeTree/singleNode.html.twig b/lib/Rozier/src/Resources/views/widgets/nodeTree/singleNode.html.twig index 8b4d651b..7974a296 100644 --- a/lib/Rozier/src/Resources/views/widgets/nodeTree/singleNode.html.twig +++ b/lib/Rozier/src/Resources/views/widgets/nodeTree/singleNode.html.twig @@ -65,7 +65,7 @@ type|lower, title="{{ node.nodeType.displayName }}" data-uk-tooltip="{animation:true}"{%- endif -%}> {% if not mainNodeTree and not nodeTree.isStackTree %} - {% set thumbnail = source.documentsByFields.first.document %} + {% set thumbnail = source.getOneDisplayableDocument %} {% if thumbnail and (thumbnail.image or thumbnail.svg) and not thumbnail.private %}
{{ thumbnail|display({"fit":"60x60", "quality":80}) }}