diff --git a/src/Controller/LabelController.php b/src/Controller/LabelController.php index 6f82304b..1f636cc2 100644 --- a/src/Controller/LabelController.php +++ b/src/Controller/LabelController.php @@ -21,12 +21,21 @@ namespace App\Controller; +use App\Entity\Base\AbstractDBElement; +use App\Entity\Contracts\NamedElementInterface; +use App\Entity\LabelSystem\LabelOptions; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parts\Part; +use App\Form\LabelOptionsType; +use App\Form\LabelSystem\LabelDialogType; use App\Helpers\LabelResponse; +use App\Services\ElementTypeNameGenerator; use App\Services\LabelSystem\LabelGenerator; +use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Form\SubmitButton; use Symfony\Component\HttpFoundation\BinaryFileResponse; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\Routing\Annotation\Route; @@ -38,10 +47,14 @@ use Symfony\Component\Routing\Annotation\Route; class LabelController extends AbstractController { protected $labelGenerator; + protected $em; + protected $elementTypeNameGenerator; - public function __construct(LabelGenerator $labelGenerator) + public function __construct(LabelGenerator $labelGenerator, EntityManagerInterface $em, ElementTypeNameGenerator $elementTypeNameGenerator) { $this->labelGenerator = $labelGenerator; + $this->em = $em; + $this->elementTypeNameGenerator = $elementTypeNameGenerator; } /** @@ -56,4 +69,68 @@ class LabelController extends AbstractController return $response; } + + /** + * @Route("/dialog", name="label_dialog") + * @Route("/{profile}/dialog") + */ + public function generator(Request $request, ?LabelProfile $profile = null) + { + if ($profile) { + $label_options = $profile->getOptions(); + } else { + $label_options = new LabelOptions(); + } + + $form = $this->createForm(LabelDialogType::class); + + //Try to parse given target_type and target_id + $target_type = $request->query->get('target_type', null); + $target_id = $request->query->get('target_id', null); + if ($profile === null && is_string($target_type)) { + $label_options->setSupportedElement($target_type); + } + if (is_numeric($target_id)) { + $form['target_id']->setData((int) $target_id); + } + + + $form['options']->setData($label_options); + $form->handleRequest($request); + + /** @var LabelOptions $form_options */ + $form_options = $form['options']->getData(); + + $pdf_data = null; + $filename = 'invalid.pdf'; + + if ($form->isSubmitted() && $form->isValid()) { + $target_id = (int) $form->get('target_id')->getData(); + $target = $this->findObject($form_options->getSupportedElement(), $target_id); + $pdf_data = $this->labelGenerator->generateLabel($form_options, $target); + $filename = $this->getLabelName($target, $profile); + } + + return $this->render('LabelSystem/dialog.html.twig', [ + 'form' => $form->createView(), + 'pdf_data' => $pdf_data, + 'filename' => $filename, + ]); + } + + protected function getLabelName(AbstractDBElement $element, ?LabelProfile $profile = null): string + { + $ret = 'label_' . $this->elementTypeNameGenerator->getLocalizedTypeLabel($element); + $ret .= $element->getID(); + + return $ret . '.pdf'; + } + + protected function findObject(string $type, int $id): object + { + if(!isset(LabelGenerator::CLASS_SUPPORT_MAPPING[$type])) { + throw new \InvalidArgumentException('The given type is not known and can not be mapped to a class!'); + } + return $this->em->find(LabelGenerator::CLASS_SUPPORT_MAPPING[$type], $id); + } } \ No newline at end of file diff --git a/src/Entity/LabelSystem/LabelOptions.php b/src/Entity/LabelSystem/LabelOptions.php index f22cf313..4d9323aa 100644 --- a/src/Entity/LabelSystem/LabelOptions.php +++ b/src/Entity/LabelSystem/LabelOptions.php @@ -29,7 +29,7 @@ use Symfony\Component\Validator\Constraints as Assert; class LabelOptions { public const BARCODE_TYPES = ['none', /*'ean8',*/ 'qr', 'code39']; - public const SUPPORTED_ELEMENTS = ['part']; + public const SUPPORTED_ELEMENTS = ['part', 'part_lot']; public const PICTURE_TYPES = ['none', 'element_picture', 'main_attachment']; public const POSITIONS = ['left', 'right', 'top', 'bottom']; public const FONTS = ['default']; diff --git a/src/Form/LabelOptionsType.php b/src/Form/LabelOptionsType.php index d3a052eb..307d9af5 100644 --- a/src/Form/LabelOptionsType.php +++ b/src/Form/LabelOptionsType.php @@ -52,6 +52,14 @@ class LabelOptionsType extends AbstractType ] ]); + $builder->add('supported_element', ChoiceType::class, [ + 'label' => 'label_options.supported_elements.label', + 'choices' => [ + 'part.label' => 'part', + 'part_lot.label' => 'part_lot' + ] + ]); + $builder->add('barcode_type', ChoiceType::class, [ 'label' => 'label_options.barcode_type.label', 'empty_data' => 'none', diff --git a/src/Form/LabelSystem/LabelDialogType.php b/src/Form/LabelSystem/LabelDialogType.php new file mode 100644 index 00000000..9333228c --- /dev/null +++ b/src/Form/LabelSystem/LabelDialogType.php @@ -0,0 +1,56 @@ +. + */ + +namespace App\Form\LabelSystem; + + +use App\Form\LabelOptionsType; +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\NumberType; +use Symfony\Component\Form\Extension\Core\Type\SubmitType; +use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Validator\Constraints\Type; + +class LabelDialogType extends AbstractType +{ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->add('target_id', NumberType::class, [ + 'html5' => true, + 'required' => true, + 'label' => 'label_generator.target_id.label' + ]); + + $builder->add('options', LabelOptionsType::class, [ + 'label' => false, + ]); + $builder->add('update', SubmitType::class, [ + + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + parent::configureOptions($resolver); + $resolver->setDefault('mapped', 'false'); + } +} \ No newline at end of file diff --git a/src/Services/LabelSystem/LabelGenerator.php b/src/Services/LabelSystem/LabelGenerator.php index 480b147d..e4ad77c7 100644 --- a/src/Services/LabelSystem/LabelGenerator.php +++ b/src/Services/LabelSystem/LabelGenerator.php @@ -24,14 +24,16 @@ namespace App\Services\LabelSystem; use App\Entity\Contracts\NamedElementInterface; use App\Entity\LabelSystem\LabelOptions; use App\Entity\Parts\Part; +use App\Entity\Parts\PartLot; use App\Services\ElementTypeNameGenerator; use Dompdf\Dompdf; use Twig\Environment; class LabelGenerator { - protected const CLASS_SUPPORT_MAPPING = [ + public const CLASS_SUPPORT_MAPPING = [ 'part' => Part::class, + 'part_lot' => PartLot::class, ]; public const MM_TO_POINTS_FACTOR = 2.83465; diff --git a/src/Services/LabelSystem/LabelHTMLGenerator.php b/src/Services/LabelSystem/LabelHTMLGenerator.php index 81788bb8..d7f6b480 100644 --- a/src/Services/LabelSystem/LabelHTMLGenerator.php +++ b/src/Services/LabelSystem/LabelHTMLGenerator.php @@ -40,7 +40,7 @@ class LabelHTMLGenerator public function getLabelHTML(LabelOptions $options, object $element): string { - return $this->twig->render('labels/base_label.html.twig', [ + return $this->twig->render('LabelSystem/labels/base_label.html.twig', [ 'meta_title' => $this->getPDFTitle($options, $element), 'lines' => $this->replacer->replace($options->getLines(), $element), ]); diff --git a/src/Services/Trees/ToolsTreeBuilder.php b/src/Services/Trees/ToolsTreeBuilder.php index 65c8ae2f..120a4874 100644 --- a/src/Services/Trees/ToolsTreeBuilder.php +++ b/src/Services/Trees/ToolsTreeBuilder.php @@ -104,6 +104,7 @@ class ToolsTreeBuilder $item->tag(['tree_tools', 'groups', $this->keyGenerator->generateKey()]); $tree = []; + $tree[] = new TreeViewNode($this->translator->trans('tree.tools.tools'), null, $this->getToolsNode()); $tree[] = new TreeViewNode($this->translator->trans('tree.tools.edit'), null, $this->getEditNodes()); $tree[] = new TreeViewNode($this->translator->trans('tree.tools.show'), null, $this->getShowNodes()); $tree[] = new TreeViewNode($this->translator->trans('tree.tools.system'), null, $this->getSystemNodes()); @@ -112,6 +113,18 @@ class ToolsTreeBuilder }); } + protected function getToolsNode(): array + { + $nodes = []; + + $nodes[] = new TreeViewNode( + $this->translator->trans('tree.tools.tools.label_dialog'), + $this->urlGenerator->generate('label_dialog') + ); + + return $nodes; + } + /** * This functions creates a tree entries for the "edit" node of the tool's tree. * diff --git a/src/Twig/DataInlinerExtension.php b/src/Twig/DataInlinerExtension.php new file mode 100644 index 00000000..0676abaf --- /dev/null +++ b/src/Twig/DataInlinerExtension.php @@ -0,0 +1,40 @@ +. + */ + +namespace App\Twig; + + +use Twig\Extension\AbstractExtension; +use Twig\TwigFunction; + +class DataInlinerExtension extends AbstractExtension +{ + public function getFunctions() + { + return [ + new TwigFunction('inlineData', [$this, 'inlineData']) + ]; + } + + public function inlineData(string $data, string $mime_type) + { + return 'data:' . $mime_type . ';base64,' . base64_encode($data); + } +} \ No newline at end of file diff --git a/templates/Form/extendedBootstrap4_layout.html.twig b/templates/Form/extendedBootstrap4_layout.html.twig index 5405a2ab..43a3b75d 100644 --- a/templates/Form/extendedBootstrap4_layout.html.twig +++ b/templates/Form/extendedBootstrap4_layout.html.twig @@ -47,6 +47,7 @@ {% endblock %} {% block label_options_widget %} + {{ form_row(form.supported_element) }}
{{ form_label(form.width) }}
diff --git a/templates/LabelSystem/dialog.html.twig b/templates/LabelSystem/dialog.html.twig new file mode 100644 index 00000000..efb62748 --- /dev/null +++ b/templates/LabelSystem/dialog.html.twig @@ -0,0 +1,28 @@ +{% extends 'main_card.html.twig' %} + +{% block card_title %} {% trans %}label_generator.title{% endtrans %}{% endblock %} + +{% block card_content %} + {{ form_start(form) }} + {{ form_row(form.target_id) }} + {{ form_widget(form.options) }} + {{ form_end(form) }} + {% if pdf_data %} + + {% endif %} +{% endblock %} + +{% block additional_content %} + {% if pdf_data %} +
+ + +
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/labels/base_label.html.twig b/templates/LabelSystem/labels/base_label.html.twig similarity index 85% rename from templates/labels/base_label.html.twig rename to templates/LabelSystem/labels/base_label.html.twig index fd4b4ee3..3eb3249d 100644 --- a/templates/labels/base_label.html.twig +++ b/templates/LabelSystem/labels/base_label.html.twig @@ -7,7 +7,7 @@ diff --git a/templates/labels/label_style.css.twig b/templates/LabelSystem/labels/label_style.css.twig similarity index 100% rename from templates/labels/label_style.css.twig rename to templates/LabelSystem/labels/label_style.css.twig