diff --git a/src/Controller/AdminPages/BaseAdminController.php b/src/Controller/AdminPages/BaseAdminController.php index 43fb8e6e..ceda1e12 100644 --- a/src/Controller/AdminPages/BaseAdminController.php +++ b/src/Controller/AdminPages/BaseAdminController.php @@ -45,6 +45,8 @@ namespace App\Controller\AdminPages; use App\DataTables\LogDataTable; use App\Entity\Base\AbstractNamedDBElement; use App\Entity\Base\AbstractStructuralDBElement; +use App\Entity\LabelSystem\LabelProfile; +use App\Entity\Parts\PartLot; use App\Entity\UserSystem\User; use App\Events\SecurityEvent; use App\Events\SecurityEvents; @@ -54,6 +56,8 @@ use App\Form\AdminPages\MassCreationForm; use App\Services\Attachments\AttachmentSubmitHandler; use App\Services\EntityExporter; use App\Services\EntityImporter; +use App\Services\LabelSystem\BarcodeExampleElementsGenerator; +use App\Services\LabelSystem\LabelGenerator; use App\Services\LogSystem\EventCommentHelper; use App\Services\LogSystem\HistoryHelper; use App\Services\LogSystem\TimeTravel; @@ -92,11 +96,14 @@ abstract class BaseAdminController extends AbstractController protected $dataTableFactory; /** @var EventDispatcher */ protected $eventDispatcher; + protected $labelGenerator; + protected $barcodeExampleGenerator; public function __construct(TranslatorInterface $translator, UserPasswordEncoderInterface $passwordEncoder, AttachmentSubmitHandler $attachmentSubmitHandler, EventCommentHelper $commentHelper, HistoryHelper $historyHelper, TimeTravel $timeTravel, - DataTableFactory $dataTableFactory, EventDispatcherInterface $eventDispatcher) + DataTableFactory $dataTableFactory, EventDispatcherInterface $eventDispatcher, BarcodeExampleElementsGenerator $barcodeExampleGenerator, + LabelGenerator $labelGenerator) { if ('' === $this->entity_class || '' === $this->form_class || '' === $this->twig_template || '' === $this->route_base) { throw new InvalidArgumentException('You have to override the $entity_class, $form_class, $route_base and $twig_template value in your subclasss!'); @@ -118,6 +125,8 @@ abstract class BaseAdminController extends AbstractController $this->timeTravel = $timeTravel; $this->dataTableFactory = $dataTableFactory; $this->eventDispatcher = $eventDispatcher; + $this->barcodeExampleGenerator = $barcodeExampleGenerator; + $this->labelGenerator = $labelGenerator; } protected function _edit(AbstractNamedDBElement $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null): Response @@ -210,11 +219,18 @@ abstract class BaseAdminController extends AbstractController $this->addFlash('error', 'entity.edit_flash.invalid'); } + //Show preview for LabelProfile if needed. + if ($entity instanceof LabelProfile) { + $example = $this->barcodeExampleGenerator->getElement($entity->getOptions()->getSupportedElement()); + $pdf_data = $this->labelGenerator->generateLabel($entity->getOptions(), $example); + } + return $this->render($this->twig_template, [ 'entity' => $entity, 'form' => $form->createView(), 'route_base' => $this->route_base, 'datatable' => $table, + 'pdf_data' => $pdf_data ?? null, 'timeTravel' => $timeTravel_timestamp, ]); } diff --git a/src/Services/LabelSystem/BarcodeExampleElementsGenerator.php b/src/Services/LabelSystem/BarcodeExampleElementsGenerator.php new file mode 100644 index 00000000..e5e8f0d5 --- /dev/null +++ b/src/Services/LabelSystem/BarcodeExampleElementsGenerator.php @@ -0,0 +1,101 @@ +. + */ + +namespace App\Services\LabelSystem; + +use App\Entity\Base\AbstractStructuralDBElement; +use App\Entity\Parts\Category; +use App\Entity\Parts\Footprint; +use App\Entity\Parts\Manufacturer; +use App\Entity\Parts\Part; +use App\Entity\Parts\PartLot; +use App\Entity\Parts\Storelocation; + +class BarcodeExampleElementsGenerator +{ + public function getElement(string $type): object + { + switch ($type) { + case 'part': + return $this->getExamplePart(); + case 'part_lot': + return $this->getExamplePartLot(); + default: + throw new \InvalidArgumentException('Unknown $type.'); + } + } + + protected function getStructuralData(string $class): AbstractStructuralDBElement + { + if (!is_a($class, AbstractStructuralDBElement::class, true)) { + throw new \InvalidArgumentException('$class must be an child of AbstractStructuralDBElement'); + } + + /** @var AbstractStructuralDBElement $parent */ + $parent = new $class(); + $parent->setName('Example'); + + /** @var AbstractStructuralDBElement $child */ + $child = new $class(); + $child->setName((new \ReflectionClass($class))->getShortName()); + $child->setParent($parent); + + return $child; + } + + public function getExamplePart(): Part + { + $part = new Part(); + $part->setName('Example Part'); + $part->setDescription('Part description'); + $part->setComment('Part comment'); + + $part->setCategory($this->getStructuralData(Category::class)); + $part->setFootprint($this->getStructuralData(Footprint::class)); + $part->setManufacturer($this->getStructuralData(Manufacturer::class)); + + $part->setMass(123.4); + $part->setManufacturerProductNumber('CUSTOM MPN'); + $part->setTags('Tag1, Tag2, Tag3'); + $part->setManufacturingStatus('active'); + $part->updatedTimestamps(); + + $part->setFavorite(true); + $part->setMinAmount(100); + $part->setNeedsReview(true); + + + return $part; + } + + public function getExamplePartLot(): PartLot + { + $lot = new PartLot(); + $lot->setPart($this->getExamplePart()); + + $lot->setDescription('Example Lot'); + $lot->setComment('Lot comment'); + $lot->setExpirationDate(new \DateTime('+1 days')); + $lot->setStorageLocation($this->getStructuralData(Storelocation::class)); + $lot->setAmount(123); + + return $lot; + } +} \ No newline at end of file diff --git a/templates/AdminPages/LabelProfileAdmin.html.twig b/templates/AdminPages/LabelProfileAdmin.html.twig index 5b943fd8..0c2244dd 100644 --- a/templates/AdminPages/LabelProfileAdmin.html.twig +++ b/templates/AdminPages/LabelProfileAdmin.html.twig @@ -12,4 +12,13 @@
{{ form_widget(form.options) }}
+{% endblock %} + +{% block additional_content %} + {% if pdf_data is defined and pdf_data is not empty %} +
+ + +
+ {% endif %} {% endblock %} \ No newline at end of file