diff --git a/src/Controller/AdminPages/AttachmentTypeController.php b/src/Controller/AdminPages/AttachmentTypeController.php index 3318837a..73a66b91 100644 --- a/src/Controller/AdminPages/AttachmentTypeController.php +++ b/src/Controller/AdminPages/AttachmentTypeController.php @@ -79,7 +79,7 @@ class AttachmentTypeController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="attachment_type_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="attachment_type_edit") * @Route("/{id}", requirements={"id"="\d+"}) * * @param AttachmentType $entity @@ -87,9 +87,9 @@ class AttachmentTypeController extends BaseAdminController * @param EntityManagerInterface $em * @return Response */ - public function edit(AttachmentType $entity, Request $request, EntityManagerInterface $em): Response + public function edit(AttachmentType $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null): Response { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/BaseAdminController.php b/src/Controller/AdminPages/BaseAdminController.php index c83e699d..ec728b38 100644 --- a/src/Controller/AdminPages/BaseAdminController.php +++ b/src/Controller/AdminPages/BaseAdminController.php @@ -112,11 +112,23 @@ abstract class BaseAdminController extends AbstractController } - protected function _edit(AbstractNamedDBElement $entity, Request $request, EntityManagerInterface $em) : Response + protected function _edit(AbstractNamedDBElement $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null) : Response { $this->denyAccessUnlessGranted('read', $entity); + $timeTravel_timestamp = null; + if ($timestamp !== null) { + //If the timestamp only contains numbers interpret it as unix timestamp + if (ctype_digit($timestamp)) { + $timeTravel_timestamp = new \DateTime(); + $timeTravel_timestamp->setTimestamp((int) $timestamp); + } else { //Try to parse it via DateTime + $timeTravel_timestamp = new \DateTime($timestamp); + } + $this->timeTravel->revertEntityToTimestamp($entity, $timeTravel_timestamp); + } + $table = $this->dataTableFactory->createFromType(LogDataTable::class, [ 'filter_elements' => $this->historyHelper->getAssociatedElements($entity), 'mode' => 'element_history' @@ -127,7 +139,10 @@ abstract class BaseAdminController extends AbstractController return $table->getResponse(); } - $form = $this->createForm($this->form_class, $entity, ['attachment_class' => $this->attachment_class]); + $form = $this->createForm($this->form_class, $entity, [ + 'attachment_class' => $this->attachment_class, + 'disabled' => $timeTravel_timestamp !== null ? true : null + ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { @@ -176,7 +191,8 @@ abstract class BaseAdminController extends AbstractController 'form' => $form->createView(), 'attachment_helper' => $this->attachmentHelper, 'route_base' => $this->route_base, - 'datatable' => $table + 'datatable' => $table, + 'timeTravel' => $timeTravel_timestamp ]); } diff --git a/src/Controller/AdminPages/CategoryController.php b/src/Controller/AdminPages/CategoryController.php index 79030d84..6bbde77d 100644 --- a/src/Controller/AdminPages/CategoryController.php +++ b/src/Controller/AdminPages/CategoryController.php @@ -79,7 +79,7 @@ class CategoryController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="category_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="category_edit") * @Route("/{id}", requirements={"id"="\d+"}) * * @param Category $entity @@ -87,9 +87,9 @@ class CategoryController extends BaseAdminController * @param EntityManagerInterface $em * @return Response */ - public function edit(Category $entity, Request $request, EntityManagerInterface $em): Response + public function edit(Category $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null): Response { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/CurrencyController.php b/src/Controller/AdminPages/CurrencyController.php index 60813d52..35a72ee3 100644 --- a/src/Controller/AdminPages/CurrencyController.php +++ b/src/Controller/AdminPages/CurrencyController.php @@ -81,7 +81,7 @@ class CurrencyController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="currency_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="currency_edit") * @Route("/{id}", requirements={"id"="\d+"}) * * @param Currency $entity @@ -89,9 +89,9 @@ class CurrencyController extends BaseAdminController * @param EntityManagerInterface $em * @return Response */ - public function edit(Currency $entity, Request $request, EntityManagerInterface $em): Response + public function edit(Currency $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null): Response { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/DeviceController.php b/src/Controller/AdminPages/DeviceController.php index 1f70b5ca..e643612e 100644 --- a/src/Controller/AdminPages/DeviceController.php +++ b/src/Controller/AdminPages/DeviceController.php @@ -79,7 +79,7 @@ class DeviceController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="device_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="device_edit") * @Route("/{id}", requirements={"id"="\d+"}) * * @param Device $entity @@ -87,9 +87,9 @@ class DeviceController extends BaseAdminController * @param EntityManagerInterface $em * @return Response */ - public function edit(Device $entity, Request $request, EntityManagerInterface $em): Response + public function edit(Device $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null): Response { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/FootprintController.php b/src/Controller/AdminPages/FootprintController.php index b00860a5..ed786b89 100644 --- a/src/Controller/AdminPages/FootprintController.php +++ b/src/Controller/AdminPages/FootprintController.php @@ -78,16 +78,16 @@ class FootprintController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="footprint_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="footprint_edit") * @Route("/{id}", requirements={"id"="\d+"}) * @param Footprint $entity * @param Request $request * @param EntityManagerInterface $em * @return Response */ - public function edit(Footprint $entity, Request $request, EntityManagerInterface $em) + public function edit(Footprint $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null) { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/ManufacturerController.php b/src/Controller/AdminPages/ManufacturerController.php index 7beb6005..672eb1b7 100644 --- a/src/Controller/AdminPages/ManufacturerController.php +++ b/src/Controller/AdminPages/ManufacturerController.php @@ -77,16 +77,16 @@ class ManufacturerController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="manufacturer_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="manufacturer_edit") * @Route("/{id}", requirements={"id"="\d+"}) * @param Manufacturer $entity * @param Request $request * @param EntityManagerInterface $em * @return Response */ - public function edit(Manufacturer $entity, Request $request, EntityManagerInterface $em) + public function edit(Manufacturer $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null) { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/MeasurementUnitController.php b/src/Controller/AdminPages/MeasurementUnitController.php index 5d4bf750..dd29d7ff 100644 --- a/src/Controller/AdminPages/MeasurementUnitController.php +++ b/src/Controller/AdminPages/MeasurementUnitController.php @@ -78,16 +78,16 @@ class MeasurementUnitController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="measurement_unit_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="measurement_unit_edit") * @Route("/{id}", requirements={"id"="\d+"}) * @param MeasurementUnit $entity * @param Request $request * @param EntityManagerInterface $em * @return Response */ - public function edit(MeasurementUnit $entity, Request $request, EntityManagerInterface $em) + public function edit(MeasurementUnit $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null) { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/StorelocationController.php b/src/Controller/AdminPages/StorelocationController.php index d36f69a9..cddfdcc4 100644 --- a/src/Controller/AdminPages/StorelocationController.php +++ b/src/Controller/AdminPages/StorelocationController.php @@ -76,16 +76,16 @@ class StorelocationController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="store_location_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="store_location_edit") * @Route("/{id}", requirements={"id"="\d+"}) * @param Storelocation $entity * @param Request $request * @param EntityManagerInterface $em * @return Response */ - public function edit(Storelocation $entity, Request $request, EntityManagerInterface $em) + public function edit(Storelocation $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null) { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/AdminPages/SupplierController.php b/src/Controller/AdminPages/SupplierController.php index cef77aa4..339da87e 100644 --- a/src/Controller/AdminPages/SupplierController.php +++ b/src/Controller/AdminPages/SupplierController.php @@ -77,16 +77,16 @@ class SupplierController extends BaseAdminController } /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="supplier_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="supplier_edit") * @Route("/{id}", requirements={"id"="\d+"}) * @param Supplier $entity * @param Request $request * @param EntityManagerInterface $em * @return Response */ - public function edit(Supplier $entity, Request $request, EntityManagerInterface $em) + public function edit(Supplier $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null) { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/GroupController.php b/src/Controller/GroupController.php index 710bb0b8..cdcdd6b9 100644 --- a/src/Controller/GroupController.php +++ b/src/Controller/GroupController.php @@ -67,7 +67,7 @@ class GroupController extends BaseAdminController protected $attachment_class = GroupAttachment::class; /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="group_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="group_edit") * @Route("/{id}/", requirements={"id"="\d+"}) * * @param Group $entity @@ -75,9 +75,9 @@ class GroupController extends BaseAdminController * @param EntityManagerInterface $em * @return Response */ - public function edit(Group $entity, Request $request, EntityManagerInterface $em): Response + public function edit(Group $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null): Response { - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index d4b75dfc..68532c12 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -69,7 +69,7 @@ class UserController extends AdminPages\BaseAdminController protected $attachment_class = UserAttachment::class; /** - * @Route("/{id}/edit", requirements={"id"="\d+"}, name="user_edit") + * @Route("/{id}/edit/{timestamp}", requirements={"id"="\d+"}, name="user_edit") * @Route("/{id}/", requirements={"id"="\d+"}) * @param User $entity * @param Request $request @@ -77,7 +77,7 @@ class UserController extends AdminPages\BaseAdminController * @return Response * @throws \Exception */ - public function edit(User $entity, Request $request, EntityManagerInterface $em) + public function edit(User $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null) { //Handle 2FA disabling @@ -102,7 +102,7 @@ class UserController extends AdminPages\BaseAdminController } } - return $this->_edit($entity, $request, $em); + return $this->_edit($entity, $request, $em, $timestamp); } /** diff --git a/src/Form/UserAdminForm.php b/src/Form/UserAdminForm.php index a4af2f81..ec356710 100644 --- a/src/Form/UserAdminForm.php +++ b/src/Form/UserAdminForm.php @@ -250,6 +250,13 @@ class UserAdminForm extends AbstractType 'disabled' => ! $this->security->isGranted($is_new ? 'create' : 'edit', $entity), ]); + $builder->add('log_comment', TextType::class, [ + 'label' => 'edit.log_comment', + 'mapped' => false, + 'required' => false, + 'empty_data' => null, + ]); + //Buttons $builder->add('save', SubmitType::class, [ 'label' => $is_new ? 'user.create' : 'user.edit.save', diff --git a/src/Services/EntityURLGenerator.php b/src/Services/EntityURLGenerator.php index 2e3d26c2..28d691e6 100644 --- a/src/Services/EntityURLGenerator.php +++ b/src/Services/EntityURLGenerator.php @@ -132,35 +132,56 @@ class EntityURLGenerator */ public function timeTravelURL(AbstractDBElement $entity, \DateTime $dateTime): string { - if ($entity instanceof Part) { - return $this->urlGenerator->generate('part_info', [ - 'id' => $entity->getID(), - 'timestamp' => $dateTime->getTimestamp() - ]); - } - if ($entity instanceof PartLot) { - return $this->urlGenerator->generate('part_info', [ - 'id' => $entity->getPart()->getID(), - 'timestamp' => $dateTime->getTimestamp() - ]); - } - if ($entity instanceof PartAttachment) { - return $this->urlGenerator->generate('part_info', [ - 'id' => $entity->getElement()->getID(), - 'timestamp' => $dateTime->getTimestamp() - ]); - } - if ($entity instanceof Orderdetail) { - return $this->urlGenerator->generate('part_info', [ - 'id' => $entity->getPart()->getID(), - 'timestamp' => $dateTime->getTimestamp() - ]); - } - if ($entity instanceof Pricedetail) { - return $this->urlGenerator->generate('part_info', [ - 'id' => $entity->getOrderdetail()->getPart()->getID(), - 'timestamp' => $dateTime->getTimestamp() - ]); + $map = [ + Part::class => 'part_info', + + //As long we does not have own things for it use edit page + AttachmentType::class => 'attachment_type_edit', + Category::class => 'category_edit', + Device::class => 'device_edit', + Supplier::class => 'supplier_edit', + Manufacturer::class => 'manufacturer_edit', + Storelocation::class => 'store_location_edit', + Footprint::class => 'footprint_edit', + User::class => 'user_edit', + Currency::class => 'currency_edit', + MeasurementUnit::class => 'measurement_unit_edit', + Group::class => 'group_edit', + ]; + + try { + return $this->urlGenerator->generate( + $this->mapToController($map, $entity), + [ + 'id' => $entity->getID(), + 'timestamp' => $dateTime->getTimestamp() + ] + ); + } catch (EntityNotSupportedException $exception) { + if ($entity instanceof PartLot) { + return $this->urlGenerator->generate('part_info', [ + 'id' => $entity->getPart()->getID(), + 'timestamp' => $dateTime->getTimestamp() + ]); + } + if ($entity instanceof PartAttachment) { + return $this->urlGenerator->generate('part_info', [ + 'id' => $entity->getElement()->getID(), + 'timestamp' => $dateTime->getTimestamp() + ]); + } + if ($entity instanceof Orderdetail) { + return $this->urlGenerator->generate('part_info', [ + 'id' => $entity->getPart()->getID(), + 'timestamp' => $dateTime->getTimestamp() + ]); + } + if ($entity instanceof Pricedetail) { + return $this->urlGenerator->generate('part_info', [ + 'id' => $entity->getOrderdetail()->getPart()->getID(), + 'timestamp' => $dateTime->getTimestamp() + ]); + } } //Otherwise throw an error diff --git a/templates/AdminPages/EntityAdminBase.html.twig b/templates/AdminPages/EntityAdminBase.html.twig index 41d551ac..ce2ef29d 100644 --- a/templates/AdminPages/EntityAdminBase.html.twig +++ b/templates/AdminPages/EntityAdminBase.html.twig @@ -1,5 +1,13 @@ {% extends "main_card.html.twig" %} +{% block card_type %} + {% if timeTravel is defined and timeTravel is not null %} + bg-primary-striped text-white + {% else %} + bg-primary text-white + {% endif %} +{% endblock %} + {% form_theme form.log_comment 'bootstrap_4_layout.html.twig' %} {% block card_content %} @@ -35,10 +43,16 @@ + {% if timeTravel is defined and timeTravel is not null %} + {% trans with {'%timestamp%': timeTravel|format_datetime('short')} %}part.info.timetravel_hint{% endtrans %} + {% endif %} {{ form_errors(form) }} @@ -78,7 +92,7 @@