diff --git a/src/Controller/InfoProviderController.php b/src/Controller/InfoProviderController.php
index a6e886e6..dae8213e 100644
--- a/src/Controller/InfoProviderController.php
+++ b/src/Controller/InfoProviderController.php
@@ -30,6 +30,7 @@ use App\Services\InfoProviderSystem\ExistingPartFinder;
use App\Services\InfoProviderSystem\PartInfoRetriever;
use App\Services\InfoProviderSystem\ProviderRegistry;
use App\Settings\AppSettings;
+use App\Settings\InfoProviderSystem\InfoProviderGeneralSettings;
use Doctrine\ORM\EntityManagerInterface;
use Jbtronics\SettingsBundle\Form\SettingsFormFactoryInterface;
use Jbtronics\SettingsBundle\Manager\SettingsManagerInterface;
@@ -113,7 +114,7 @@ class InfoProviderController extends AbstractController
#[Route('/search', name: 'info_providers_search')]
#[Route('/update/{target}', name: 'info_providers_update_part_search')]
- public function search(Request $request, #[MapEntity(id: 'target')] ?Part $update_target, LoggerInterface $exceptionLogger): Response
+ public function search(Request $request, #[MapEntity(id: 'target')] ?Part $update_target, LoggerInterface $exceptionLogger, InfoProviderGeneralSettings $infoProviderSettings): Response
{
$this->denyAccessUnlessGranted('@info_providers.create_parts');
@@ -144,6 +145,23 @@ class InfoProviderController extends AbstractController
}
}
+ //If the providers form is still empty, use our default value from the settings
+ if (count($form->get('providers')->getData() ?? []) === 0) {
+ $default_providers = $infoProviderSettings->defaultSearchProviders;
+ $provider_objects = [];
+ foreach ($default_providers as $provider_key) {
+ try {
+ $tmp = $this->providerRegistry->getProviderByKey($provider_key);
+ if ($tmp->isActive()) {
+ $provider_objects[] = $tmp;
+ }
+ } catch (\InvalidArgumentException $e) {
+ //If the provider is not found, just ignore it
+ }
+ }
+ $form->get('providers')->setData($provider_objects);
+ }
+
if ($form->isSubmitted() && $form->isValid()) {
$keyword = $form->get('keyword')->getData();
$providers = $form->get('providers')->getData();
diff --git a/src/Form/InfoProviderSystem/ProviderSelectType.php b/src/Form/InfoProviderSystem/ProviderSelectType.php
index a9373390..95e10791 100644
--- a/src/Form/InfoProviderSystem/ProviderSelectType.php
+++ b/src/Form/InfoProviderSystem/ProviderSelectType.php
@@ -28,6 +28,7 @@ use App\Services\InfoProviderSystem\Providers\InfoProviderInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ChoiceList\ChoiceList;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ProviderSelectType extends AbstractType
@@ -44,13 +45,43 @@ class ProviderSelectType extends AbstractType
public function configureOptions(OptionsResolver $resolver): void
{
- $resolver->setDefaults([
- 'choices' => $this->providerRegistry->getActiveProviders(),
- 'choice_label' => ChoiceList::label($this, static fn (?InfoProviderInterface $choice) => $choice?->getProviderInfo()['name']),
- 'choice_value' => ChoiceList::value($this, static fn(?InfoProviderInterface $choice) => $choice?->getProviderKey()),
+ $providers = $this->providerRegistry->getActiveProviders();
- 'multiple' => true,
- ]);
+ $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) {
+ if ('object' === $options['input']) {
+ return $this->providerRegistry->getActiveProviders();
+ }
+
+ $tmp = [];
+ foreach ($providers as $provider) {
+ $name = $provider->getProviderInfo()['name'];
+ $tmp[$name] = $provider->getProviderKey();
+ }
+
+ return $tmp;
+ });
+
+ //The choice_label and choice_value only needs to be set if we want the objects
+ $resolver->setDefault('choice_label', function (Options $options){
+ if ('object' === $options['input']) {
+ return ChoiceList::label($this, static fn (?InfoProviderInterface $choice) => $choice?->getProviderInfo()['name']);
+ }
+
+ return null;
+ });
+ $resolver->setDefault('choice_value', function (Options $options) {
+ if ('object' === $options['input']) {
+ return ChoiceList::value($this, static fn(?InfoProviderInterface $choice) => $choice?->getProviderKey());
+ }
+
+ return null;
+ });
}
-}
\ No newline at end of file
+}
diff --git a/src/Settings/InfoProviderSystem/InfoProviderGeneralSettings.php b/src/Settings/InfoProviderSystem/InfoProviderGeneralSettings.php
new file mode 100644
index 00000000..03fff0bf
--- /dev/null
+++ b/src/Settings/InfoProviderSystem/InfoProviderGeneralSettings.php
@@ -0,0 +1,45 @@
+.
+ */
+
+declare(strict_types=1);
+
+
+namespace App\Settings\InfoProviderSystem;
+
+use App\Form\InfoProviderSystem\ProviderSelectType;
+use App\Settings\SettingsIcon;
+use Jbtronics\SettingsBundle\ParameterTypes\ArrayType;
+use Jbtronics\SettingsBundle\ParameterTypes\StringType;
+use Jbtronics\SettingsBundle\Settings\Settings;
+use Jbtronics\SettingsBundle\Settings\SettingsParameter;
+use Symfony\Component\Translation\TranslatableMessage as TM;
+
+#[Settings(label: new TM("settings.ips.general"))]
+#[SettingsIcon("fa-magnifying-glass")]
+class InfoProviderGeneralSettings
+{
+ /**
+ * @var string[]
+ */
+ #[SettingsParameter(type: ArrayType::class, label: new TM("settings.ips.default_providers"),
+ description: new TM("settings.ips.default_providers.help"), options: ['type' => StringType::class],
+ formType: ProviderSelectType::class, formOptions: ['input' => 'string'])]
+ public array $defaultSearchProviders = [];
+}
diff --git a/src/Settings/InfoProviderSystem/InfoProviderSettings.php b/src/Settings/InfoProviderSystem/InfoProviderSettings.php
index 3c7159cb..c223bd88 100644
--- a/src/Settings/InfoProviderSystem/InfoProviderSettings.php
+++ b/src/Settings/InfoProviderSystem/InfoProviderSettings.php
@@ -25,6 +25,7 @@ namespace App\Settings\InfoProviderSystem;
use Jbtronics\SettingsBundle\Settings\EmbeddedSettings;
use Jbtronics\SettingsBundle\Settings\Settings;
+use Jbtronics\SettingsBundle\Settings\SettingsParameter;
use Jbtronics\SettingsBundle\Settings\SettingsTrait;
#[Settings()]
@@ -32,6 +33,9 @@ class InfoProviderSettings
{
use SettingsTrait;
+ #[EmbeddedSettings]
+ public ?InfoProviderGeneralSettings $general = null;
+
#[EmbeddedSettings]
public ?DigikeySettings $digikey = null;
@@ -58,4 +62,4 @@ class InfoProviderSettings
#[EmbeddedSettings]
public ?PollinSettings $pollin = null;
-}
\ No newline at end of file
+}
diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf
index 6680521b..68bbb653 100644
--- a/translations/messages.en.xlf
+++ b/translations/messages.en.xlf
@@ -13471,5 +13471,23 @@ Please note, that you can not impersonate a disabled user. If you try you will g
Extract parameters from part notes
+
+
+ settings.ips.default_providers
+ Default search providers
+
+
+
+
+ settings.ips.general
+ General settings
+
+
+
+
+ settings.ips.default_providers.help
+ These providers will be preselected for searches in part providers.
+
+