From 654c5bd59f31285d1d343a572dbb2e7da17b8cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 1 Mar 2020 20:30:23 +0100 Subject: [PATCH] Added button to revert part to a given timestamp. --- src/Controller/LogController.php | 58 +++++++++++++++++++--- src/DataTables/Column/RevertLogColumn.php | 27 ++++++++-- templates/LogSystem/_log_table.html.twig | 2 +- templates/Parts/info/_main_infos.html.twig | 2 +- 4 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/Controller/LogController.php b/src/Controller/LogController.php index 98823e15..09b3be2f 100644 --- a/src/Controller/LogController.php +++ b/src/Controller/LogController.php @@ -105,14 +105,61 @@ class LogController extends AbstractController * @Route("/undo", name="log_undo", methods={"POST"}) * @param Request $request */ - public function undoLog(Request $request, EventUndoHelper $eventUndoHelper) + public function undoRevertLog(Request $request, EventUndoHelper $eventUndoHelper) { + $mode = EventUndoHelper::MODE_UNDO; $id = $request->request->get('undo'); - $log_element = $this->entityManager->find(AbstractLogEntry::class, $id); - $eventUndoHelper->setMode(EventUndoHelper::MODE_UNDO); + //If no undo value was set check if a revert was set + if ($id === null) { + $id = $request->get('revert'); + $mode = EventUndoHelper::MODE_REVERT; + } + + $log_element = $this->entityManager->find(AbstractLogEntry::class, $id); + if ($log_element === null) { + throw new \InvalidArgumentException('No log entry with the given ID is existing!'); + } + + $eventUndoHelper->setMode($mode); $eventUndoHelper->setUndoneEvent($log_element); + if ($mode === EventUndoHelper::MODE_UNDO) { + $this->undoLog($log_element); + } elseif ($mode === EventUndoHelper::MODE_REVERT) { + $this->revertLog($log_element); + } + + $eventUndoHelper->clearUndoneEvent(); + + $redirect = $request->request->get('redirect_back'); + return $this->redirect($redirect); + } + + protected function revertLog(AbstractLogEntry $logEntry): void + { + $timestamp = $logEntry->getTimestamp(); + $element = $this->entityManager->find($logEntry->getTargetClass(), $logEntry->getTargetID()); + //If the element is not available in DB try to undelete it + if ($element === null) { + $element = $this->timeTravel->undeleteEntity($logEntry->getTargetClass(), $logEntry->getTargetID()); + $this->entityManager->persist($element); + $this->entityManager->flush(); + $this->dbRepository->changeID($element, $logEntry->getTargetID()); + } + + if (!$element instanceof AbstractDBElement) { + $this->addFlash('error', 'log.undo.target_not_found'); + return; + } + + $this->timeTravel->revertEntityToTimestamp($element, $timestamp); + $this->entityManager->flush(); + $this->addFlash('success', 'log.undo.revert_success'); + } + + protected function undoLog(AbstractLogEntry $log_element): void + { if ($log_element instanceof ElementDeletedLogEntry || $log_element instanceof CollectionElementDeleted) { if ($log_element instanceof ElementDeletedLogEntry) { $element_class = $log_element->getTargetClass(); @@ -153,10 +200,5 @@ class LogController extends AbstractController } else { $this->addFlash('error', 'log.undo.log_type_invalid'); } - - $eventUndoHelper->clearUndoneEvent(); - - $redirect = $request->request->get('redirect_back'); - return $this->redirect($redirect); } } diff --git a/src/DataTables/Column/RevertLogColumn.php b/src/DataTables/Column/RevertLogColumn.php index 18814d6b..1ea451e3 100644 --- a/src/DataTables/Column/RevertLogColumn.php +++ b/src/DataTables/Column/RevertLogColumn.php @@ -48,22 +48,39 @@ class RevertLogColumn extends AbstractColumn public function render($value, $context) { - if ($context instanceof ElementDeletedLogEntry || $context instanceof CollectionElementDeleted) { + $revertable = true; + if ( + $context instanceof CollectionElementDeleted + || ($context instanceof ElementDeletedLogEntry && $context->hasOldDataInformations()) + ) { $icon = 'fa-trash-restore'; $title = $this->translator->trans('log.undo.undelete'); - } elseif ($context instanceof ElementEditedLogEntry || $context instanceof ElementCreatedLogEntry) { + } elseif ( + $context instanceof ElementCreatedLogEntry + || ($context instanceof ElementEditedLogEntry && $context->hasOldDataInformations()) + ) { $icon = 'fa-undo'; $title = $this->translator->trans('log.undo.undo'); } else { return ''; } - - return sprintf( - '', + $tmp = '
'; + $tmp .= sprintf( + '', $context->getID(), $icon, $title ); + + $tmp .= sprintf( + '', + $context->getID(), + $this->translator->trans('log.undo.revert') + ); + + $tmp .= '
'; + + return $tmp; } } \ No newline at end of file diff --git a/templates/LogSystem/_log_table.html.twig b/templates/LogSystem/_log_table.html.twig index cd121bfb..0b432932 100644 --- a/templates/LogSystem/_log_table.html.twig +++ b/templates/LogSystem/_log_table.html.twig @@ -1,5 +1,5 @@
> + data-message="{% trans %}log.undo.confirm_message{% endtrans %}">
diff --git a/templates/Parts/info/_main_infos.html.twig b/templates/Parts/info/_main_infos.html.twig index 7433116c..ebe321a4 100644 --- a/templates/Parts/info/_main_infos.html.twig +++ b/templates/Parts/info/_main_infos.html.twig @@ -24,7 +24,7 @@

{{ part.name }} {# You need edit permission to use the edit button #} {% if timeTravel is not null %} - + {% elseif is_granted('edit', part) %} {% endif %}