diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 8203eb8f..9a114dc0 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -15,3 +15,4 @@ twig: allow_email_pw_reset: '%allow_email_pw_reset%' locale_menu: '%locale_menu%' attachment_manager: '@App\Services\Attachments\AttachmentManager' + label_profile_dropdown_helper: '@App\Services\LabelSystem\LabelProfileDropdownHelper' diff --git a/src/Controller/LabelController.php b/src/Controller/LabelController.php index 53339b64..d13ab17b 100644 --- a/src/Controller/LabelController.php +++ b/src/Controller/LabelController.php @@ -76,7 +76,7 @@ class LabelController extends AbstractController /** * @Route("/dialog", name="label_dialog") - * @Route("/{profile}/dialog") + * @Route("/{profile}/dialog", name="label_dialog_profile") */ public function generator(Request $request, ?LabelProfile $profile = null) { @@ -91,6 +91,8 @@ class LabelController extends AbstractController //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); + $generate = $request->query->getBoolean('generate', false); + if ($profile === null && is_string($target_type)) { $label_options->setSupportedElement($target_type); } @@ -108,7 +110,8 @@ class LabelController extends AbstractController $pdf_data = null; $filename = 'invalid.pdf'; - if ($form->isSubmitted() && $form->isValid()) { + //Generate PDF either when the form is submitted and valid, or the form was not submit yet, and generate is set + if (($form->isSubmitted() && $form->isValid()) || ($generate && !$form->isSubmitted() && $profile !== null)) { $target_id = (string) $form->get('target_id')->getData(); $targets = $this->findObjects($form_options->getSupportedElement(), $target_id); $pdf_data = $this->labelGenerator->generateLabel($form_options, $targets); diff --git a/src/Repository/LabelProfileRepository.php b/src/Repository/LabelProfileRepository.php index 864eaba4..cb558a6d 100644 --- a/src/Repository/LabelProfileRepository.php +++ b/src/Repository/LabelProfileRepository.php @@ -27,6 +27,19 @@ use Symfony\Contracts\Translation\TranslatorInterface; class LabelProfileRepository extends NamedDBElementRepository { + + /** + * Find the profiles that are shown in the dropdown for the given type. + * You should maybe use the cached version of this in LabelProfileDropdownHelper + * @param string $type + * @return array + */ + public function getDropdownProfiles(string $type): array + { + //TODO: Improve this, when we have a 'showInDropdown' flag for profiles. + return $this->findForSupportedElement($type); + } + /** * Gets a tree of TreeViewNode elements. The root elements has $parent as parent. * The treeview is generic, that means the href are null and ID values are set. diff --git a/src/Services/LabelSystem/LabelProfileDropdownHelper.php b/src/Services/LabelSystem/LabelProfileDropdownHelper.php new file mode 100644 index 00000000..800772e9 --- /dev/null +++ b/src/Services/LabelSystem/LabelProfileDropdownHelper.php @@ -0,0 +1,57 @@ +. + */ + +namespace App\Services\LabelSystem; + + +use App\Entity\LabelSystem\LabelProfile; +use App\Services\UserCacheKeyGenerator; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Contracts\Cache\ItemInterface; +use Symfony\Contracts\Cache\TagAwareCacheInterface; + +class LabelProfileDropdownHelper +{ + private $cache; + private $entityManager; + private $keyGenerator; + + public function __construct(TagAwareCacheInterface $cache, EntityManagerInterface $entityManager, UserCacheKeyGenerator $keyGenerator) + { + $this->cache = $cache; + $this->entityManager = $entityManager; + $this->keyGenerator = $keyGenerator; + } + + public function getDropdownProfiles(string $type): array + { + $secure_class_name = str_replace('\\', '_', LabelProfile::class); + $key = 'profile_dropdown_'.$this->keyGenerator->generateKey().'_'.$secure_class_name . '_' . $type; + + $repo = $this->entityManager->getRepository(LabelProfile::class); + + return $this->cache->get($key, function (ItemInterface $item) use ($repo, $type, $secure_class_name) { + // Invalidate when groups, a element with the class or the user changes + $item->tag(['groups', 'tree_treeview', $this->keyGenerator->generateKey(), $secure_class_name]); + + return $repo->getDropdownProfiles($type); + }); + } +} \ No newline at end of file diff --git a/templates/LabelSystem/dropdown_macro.html.twig b/templates/LabelSystem/dropdown_macro.html.twig new file mode 100644 index 00000000..b014eaad --- /dev/null +++ b/templates/LabelSystem/dropdown_macro.html.twig @@ -0,0 +1,14 @@ +{% macro profile_dropdown(type, id = null, include_text = true, btn_type = 'btn-secondary') %} +
+ + +
+{% endmacro %} \ No newline at end of file diff --git a/templates/Parts/info/_part_lots.html.twig b/templates/Parts/info/_part_lots.html.twig index a53d49e6..c57c69f8 100644 --- a/templates/Parts/info/_part_lots.html.twig +++ b/templates/Parts/info/_part_lots.html.twig @@ -1,4 +1,5 @@ {% import "helper.twig" as helper %} +{% import "LabelSystem/dropdown_macro.html.twig" as dropdown %} @@ -7,6 +8,7 @@ {# Tags row #} + {# Button row #} @@ -55,6 +57,9 @@ {% endif %} + {% endfor %} diff --git a/templates/Parts/info/_tools.html.twig b/templates/Parts/info/_tools.html.twig index eb2cbe72..f6f424ed 100644 --- a/templates/Parts/info/_tools.html.twig +++ b/templates/Parts/info/_tools.html.twig @@ -1,3 +1,5 @@ +{% import "LabelSystem/dropdown_macro.html.twig" as dropdown %} + {% if is_granted('edit', part) %} @@ -46,4 +48,6 @@ - \ No newline at end of file + + +{{ dropdown.profile_dropdown('part', part.id) }} \ No newline at end of file diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 86c76622..fd627ef4 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -8370,5 +8370,23 @@ Element 3 Download + + + navbar.scanner.link + Scanner + + + + + label_generator.label_btn + Generate label + + + + + label_generator.label_empty + New empty label + +
{% trans %}part_lots.storage_location{% endtrans %} {% trans %}part_lots.amount{% endtrans %}
+ {{ dropdown.profile_dropdown('part_lot', lot.id, false) }} +