diff --git a/src/Entity/Parts/InfoProviderReference.php b/src/Entity/Parts/InfoProviderReference.php index 810aef0c..0ba04c25 100644 --- a/src/Entity/Parts/InfoProviderReference.php +++ b/src/Entity/Parts/InfoProviderReference.php @@ -30,7 +30,7 @@ use Doctrine\ORM\Mapping\Embeddable; use Symfony\Component\Serializer\Annotation\Groups; /** - * This class represents a reference to a info provider inside a part. + * This class represents a reference to an info provider inside a part. * @see \App\Tests\Entity\Parts\InfoProviderReferenceTest */ #[Embeddable] @@ -131,6 +131,7 @@ class InfoProviderReference * @param string $provider_key * @param string $provider_id * @param string|null $provider_url + * @param \DateTimeImmutable|null $last_updated * @return self */ public static function providerReference(string $provider_key, string $provider_id, ?string $provider_url = null): self @@ -157,4 +158,15 @@ class InfoProviderReference $ref->last_updated = new \DateTimeImmutable(); return $ref; } + + + public static function create(?string $provider_key, ?string $provider_id, ?string $provider_url, ?\DateTimeImmutable $last_updated): self + { + $ref = new InfoProviderReference(); + $ref->provider_key = $provider_key; + $ref->provider_id = $provider_id; + $ref->provider_url = $provider_url; + $ref->last_updated = $last_updated; + return $ref; + } } diff --git a/src/Form/InfoProviderSystem/InfoProviderReferenceType.php b/src/Form/InfoProviderSystem/InfoProviderReferenceType.php new file mode 100644 index 00000000..4a173a04 --- /dev/null +++ b/src/Form/InfoProviderSystem/InfoProviderReferenceType.php @@ -0,0 +1,106 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Form\InfoProviderSystem; + +use App\Entity\Parts\InfoProviderReference; +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\DataMapperInterface; +use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\Extension\Core\Type\UrlType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\OptionsResolver\OptionsResolver; + +class InfoProviderReferenceType extends AbstractType implements DataMapperInterface +{ + public function buildForm(FormBuilderInterface $builder, array $options): void + { + $builder + ->setDataMapper($this) + ->add('provider_key', ProviderSelectType::class, [ + 'label' => 'info_providers.provider_key', + 'input' => 'string', + 'multiple' => false, + 'required' => false, + 'only_active' => false, + ]) + ->add('provider_id', TextType::class, [ + 'label' => 'info_providers.provider_id', + 'required' => false, + ]) + ->add('provider_url', UrlType::class, [ + 'label' => 'info_providers.provider_url', + 'required' => false, + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => InfoProviderReference::class, + ]); + } + + + public function mapDataToForms(mixed $viewData, \Traversable $forms): void + { + if ($viewData === null) { + return; + } + + if (!$viewData instanceof InfoProviderReference) { + return; + } + + /** @var FormInterface[] $forms */ + $forms = iterator_to_array($forms); + + $forms['provider_key']->setData($viewData->getProviderKey()); + $forms['provider_id']->setData($viewData->getProviderId()); + $forms['provider_url']->setData($viewData->getProviderUrl()); + } + + public function mapFormsToData(\Traversable $forms, mixed &$viewData): void + { + /** @var FormInterface[] $forms */ + $forms = iterator_to_array($forms); + + $providerKey = $forms['provider_key']->getData(); + $providerId = $forms['provider_id']->getData(); + $providerUrl = $forms['provider_url']->getData(); + + if ($viewData === null) { + $viewData = InfoProviderReference::noProvider(); + } + + if (!$viewData instanceof InfoProviderReference) { + return; + } + + $oldDate = $viewData->getLastUpdated(); + $viewData = InfoProviderReference::create($providerKey, $providerId, $providerUrl, $oldDate); + + } +} diff --git a/src/Form/InfoProviderSystem/ProviderSelectType.php b/src/Form/InfoProviderSystem/ProviderSelectType.php index bad3edaa..e59dc85f 100644 --- a/src/Form/InfoProviderSystem/ProviderSelectType.php +++ b/src/Form/InfoProviderSystem/ProviderSelectType.php @@ -31,12 +31,12 @@ use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Translation\StaticMessage; +use Symfony\Component\Translation\TranslatableMessage; class ProviderSelectType extends AbstractType { public function __construct(private readonly ProviderRegistry $providerRegistry) { - } public function getParent(): string @@ -46,17 +46,22 @@ class ProviderSelectType extends AbstractType public function configureOptions(OptionsResolver $resolver): void { - $providers = $this->providerRegistry->getActiveProviders(); - $resolver->setDefault('input', 'object'); $resolver->setAllowedTypes('input', 'string'); //Either the form returns the provider objects or their keys $resolver->setAllowedValues('input', ['object', 'string']); $resolver->setDefault('multiple', true); - $resolver->setDefault('choices', function (Options $options) use ($providers) { + //Only show active providers in the list, or also inactive ones + $resolver->setDefault('only_active', true); + $resolver->setAllowedTypes('only_active', 'bool'); + + + $resolver->setDefault('choices', function (Options $options) { + $providers = $options['only_active'] ? $this->providerRegistry->getActiveProviders() : $this->providerRegistry->getProviders(); + if ('object' === $options['input']) { - return $this->providerRegistry->getActiveProviders(); + return $providers; } $tmp = []; @@ -69,20 +74,35 @@ class ProviderSelectType extends AbstractType }); //The choice_label and choice_value only needs to be set if we want the objects - $resolver->setDefault('choice_label', function (Options $options){ + $resolver->setDefault('choice_label', function (Options $options) { if ('object' === $options['input']) { - return ChoiceList::label($this, static fn (?InfoProviderInterface $choice) => new StaticMessage($choice?->getProviderInfo()['name'])); + return ChoiceList::label($this, static fn(?InfoProviderInterface $choice + ) => new StaticMessage($choice?->getProviderInfo()['name'])); } - return static fn ($choice, $key, $value) => new StaticMessage($key); + return static fn($choice, $key, $value) => new StaticMessage($key); }); $resolver->setDefault('choice_value', function (Options $options) { if ('object' === $options['input']) { - return ChoiceList::value($this, static fn(?InfoProviderInterface $choice) => $choice?->getProviderKey()); + return ChoiceList::value($this, + static fn(?InfoProviderInterface $choice) => $choice?->getProviderKey()); } return null; }); + $resolver->setDefault('group_by', function (Options $options) { + //Do not show groups when only active providers are shown, because then all providers are active and the group would be useless + if ($options['only_active']) { + return null; + } + + return function ($choice, $key, string $value) { + if ($this->providerRegistry->getProviderByKey($value)->isActive()) { + return new TranslatableMessage('info_providers.providers_list.active'); + } + return new TranslatableMessage('info_providers.providers_list.disabled'); + }; + }); } } diff --git a/src/Form/Part/PartBaseType.php b/src/Form/Part/PartBaseType.php index a31f2469..afef8fdb 100644 --- a/src/Form/Part/PartBaseType.php +++ b/src/Form/Part/PartBaseType.php @@ -33,6 +33,7 @@ use App\Entity\Parts\Part; use App\Entity\Parts\PartCustomState; use App\Entity\PriceInformations\Orderdetail; use App\Form\AttachmentFormType; +use App\Form\InfoProviderSystem\InfoProviderReferenceType; use App\Form\ParameterType; use App\Form\Part\EDA\EDAPartInfoType; use App\Form\Type\MasterPictureAttachmentType; @@ -225,6 +226,10 @@ class PartBaseType extends AbstractType 'empty_data' => null, 'label' => 'part.gtin', ]) + ->add('providerReference', InfoProviderReferenceType::class, [ + 'label' => false, + 'required' => false, + ]) ; //Comment section diff --git a/templates/parts/edit/_advanced.html.twig b/templates/parts/edit/_advanced.html.twig index 30479d11..f18dba58 100644 --- a/templates/parts/edit/_advanced.html.twig +++ b/templates/parts/edit/_advanced.html.twig @@ -15,3 +15,24 @@ {{ form_row(form.partUnit) }} {{ form_row(form.partCustomState) }} {{ form_row(form.gtin) }} + +