From 8ff2fc5a82591a11c0c04c5ee823330538c24770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 19:55:47 +0200 Subject: [PATCH 1/9] Allow to disable the extraction of parameters out of part description and notes Fixes issue #747 --- src/Controller/PartController.php | 7 ++++--- src/Settings/BehaviorSettings/PartInfoSettings.php | 8 +++++++- translations/messages.en.xlf | 12 ++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/Controller/PartController.php b/src/Controller/PartController.php index b11a5c90..6708ed4c 100644 --- a/src/Controller/PartController.php +++ b/src/Controller/PartController.php @@ -46,6 +46,7 @@ use App\Services\Parameters\ParameterExtractor; use App\Services\Parts\PartLotWithdrawAddHelper; use App\Services\Parts\PricedetailHelper; use App\Services\ProjectSystem\ProjectBuildPartHelper; +use App\Settings\BehaviorSettings\PartInfoSettings; use DateTime; use Doctrine\ORM\EntityManagerInterface; use Exception; @@ -69,7 +70,7 @@ class PartController extends AbstractController protected PartPreviewGenerator $partPreviewGenerator, private readonly TranslatorInterface $translator, private readonly AttachmentSubmitHandler $attachmentSubmitHandler, private readonly EntityManagerInterface $em, - protected EventCommentHelper $commentHelper) + protected EventCommentHelper $commentHelper, private readonly PartInfoSettings $partInfoSettings) { } @@ -119,8 +120,8 @@ class PartController extends AbstractController 'pricedetail_helper' => $this->pricedetailHelper, 'pictures' => $this->partPreviewGenerator->getPreviewAttachments($part), 'timeTravel' => $timeTravel_timestamp, - 'description_params' => $parameterExtractor->extractParameters($part->getDescription()), - 'comment_params' => $parameterExtractor->extractParameters($part->getComment()), + 'description_params' => $this->partInfoSettings->extractParamsFromDescription ? $parameterExtractor->extractParameters($part->getDescription()) : [], + 'comment_params' => $this->partInfoSettings->extractParamsFromNotes ? $parameterExtractor->extractParameters($part->getComment()) : [], 'withdraw_add_helper' => $withdrawAddHelper, ] ); diff --git a/src/Settings/BehaviorSettings/PartInfoSettings.php b/src/Settings/BehaviorSettings/PartInfoSettings.php index 4c44b9bb..f017c846 100644 --- a/src/Settings/BehaviorSettings/PartInfoSettings.php +++ b/src/Settings/BehaviorSettings/PartInfoSettings.php @@ -40,4 +40,10 @@ class PartInfoSettings #[SettingsParameter(label: new TM("settings.behavior.part_info.show_part_image_overlay"), description: new TM("settings.behavior.part_info.show_part_image_overlay.help"), envVar: "bool:SHOW_PART_IMAGE_OVERLAY", envVarMode: EnvVarMode::OVERWRITE)] public bool $showPartImageOverlay = true; -} \ No newline at end of file + + #[SettingsParameter(label: new TM("settings.behavior.part_info.extract_params_from_description"))] + public bool $extractParamsFromDescription = true; + + #[SettingsParameter(label: new TM("settings.behavior.part_info.extract_params_from_notes"))] + public bool $extractParamsFromNotes = true; +} diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index b7710f0c..6680521b 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -13459,5 +13459,17 @@ Please note, that you can not impersonate a disabled user. If you try you will g Show Part-DB version on homepage + + + settings.behavior.part_info.extract_params_from_description + Extract parameters from part description + + + + + settings.behavior.part_info.extract_params_from_notes + Extract parameters from part notes + + From 1f669a9c5334b1d3f8302abb3f47e6489310da01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 20:04:48 +0200 Subject: [PATCH 2/9] Readded option to show all elements in a table --- src/Controller/AttachmentFileController.php | 3 ++- src/Controller/PartListsController.php | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Controller/AttachmentFileController.php b/src/Controller/AttachmentFileController.php index 7917e97f..81369e12 100644 --- a/src/Controller/AttachmentFileController.php +++ b/src/Controller/AttachmentFileController.php @@ -24,6 +24,7 @@ namespace App\Controller; use App\DataTables\AttachmentDataTable; use App\DataTables\Filters\AttachmentFilter; +use App\DataTables\PartsDataTable; use App\Entity\Attachments\Attachment; use App\Form\Filters\AttachmentFilterType; use App\Services\Attachments\AttachmentManager; @@ -112,7 +113,7 @@ class AttachmentFileController extends AbstractController $filterForm->handleRequest($formRequest); - $table = $dataTableFactory->createFromType(AttachmentDataTable::class, ['filter' => $filter], ['pageLength' => $tableSettings->fullDefaultPageSize]) + $table = $dataTableFactory->createFromType(AttachmentDataTable::class, ['filter' => $filter], ['pageLength' => $tableSettings->fullDefaultPageSize, 'lengthMenu' => PartsDataTable::LENGTH_MENU]) ->handleRequest($request); if ($table->isCallback()) { diff --git a/src/Controller/PartListsController.php b/src/Controller/PartListsController.php index f6836ddc..b2df18c1 100644 --- a/src/Controller/PartListsController.php +++ b/src/Controller/PartListsController.php @@ -161,7 +161,9 @@ class PartListsController extends AbstractController $filterForm->handleRequest($formRequest); - $table = $this->dataTableFactory->createFromType(PartsDataTable::class, array_merge(['filter' => $filter], $additional_table_vars), ['pageLength' => $this->tableSettings->fullDefaultPageSize]) + $table = $this->dataTableFactory->createFromType(PartsDataTable::class, array_merge( + ['filter' => $filter], $additional_table_vars), + ['pageLength' => $this->tableSettings->fullDefaultPageSize, 'lengthMenu' => PartsDataTable::LENGTH_MENU]) ->handleRequest($request); if ($table->isCallback()) { From 0d1ae030be0cc2fbb0075891dc992d5ee3f757d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 20:42:33 +0200 Subject: [PATCH 3/9] Allow to select default info providers for search This fixes issue #556 --- src/Controller/InfoProviderController.php | 20 ++++++++- .../InfoProviderSystem/ProviderSelectType.php | 45 ++++++++++++++++--- .../InfoProviderGeneralSettings.php | 45 +++++++++++++++++++ .../InfoProviderSettings.php | 6 ++- translations/messages.en.xlf | 18 ++++++++ 5 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 src/Settings/InfoProviderSystem/InfoProviderGeneralSettings.php 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. + + From ecd2abe00ea20ed40a9e2816300ac71e45fb4312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 21:21:08 +0200 Subject: [PATCH 4/9] Made image size of preview images in tables configurable and slightly bigger by default This makes PR #984 and #623 obsolete --- assets/css/app/images.css | 6 +++--- src/Settings/BehaviorSettings/TableSettings.php | 16 +++++++++++++++- templates/base.html.twig | 8 ++++++++ translations/messages.en.xlf | 12 ++++++++++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/assets/css/app/images.css b/assets/css/app/images.css index 214776e7..0212a85b 100644 --- a/assets/css/app/images.css +++ b/assets/css/app/images.css @@ -18,8 +18,8 @@ */ .hoverpic { - min-width: 10px; - max-width: 30px; + min-width: var(--table-image-preview-min-size, 20px); + max-width: var(--table-image-preview-max-size, 35px); display: block; margin-left: auto; margin-right: auto; @@ -49,7 +49,7 @@ } .part-table-image { - max-height: 40px; + max-height: calc(1.2*var(--table-image-preview-max-size, 35px)); /** Aspect ratio of maximum 1.2 */ object-fit: contain; } diff --git a/src/Settings/BehaviorSettings/TableSettings.php b/src/Settings/BehaviorSettings/TableSettings.php index 7b4e7912..b6964876 100644 --- a/src/Settings/BehaviorSettings/TableSettings.php +++ b/src/Settings/BehaviorSettings/TableSettings.php @@ -70,6 +70,20 @@ class TableSettings PartTableColumns::CATEGORY, PartTableColumns::FOOTPRINT, PartTableColumns::MANUFACTURER, PartTableColumns::LOCATION, PartTableColumns::AMOUNT]; + #[SettingsParameter(label: new TM("settings.behavior.table.preview_image_min_width"), + formOptions: ['attr' => ['min' => 1, 'max' => 100]], + envVar: "int:TABLE_IMAGE_PREVIEW_MIN_SIZE", envVarMode: EnvVarMode::OVERWRITE + )] + #[Assert\Range(min: 1, max: 100)] + public int $previewImageMinWidth = 20; + + #[SettingsParameter(label: new TM("settings.behavior.table.preview_image_max_width"), + formOptions: ['attr' => ['min' => 1, 'max' => 100]], + envVar: "int:TABLE_IMAGE_PREVIEW_MAX_SIZE", envVarMode: EnvVarMode::OVERWRITE + )] + #[Assert\Range(min: 1, max: 100)] + #[Assert\GreaterThanOrEqual(propertyPath: 'previewImageMinWidth')] + public int $previewImageMaxWidth = 35; public static function mapPartsDefaultColumnsEnv(string $columns): array { @@ -87,4 +101,4 @@ class TableSettings return $ret; } -} \ No newline at end of file +} diff --git a/templates/base.html.twig b/templates/base.html.twig index 48e45ab0..bb9844fa 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -53,6 +53,14 @@ {% endif %} {{ encore_entry_link_tags('app') }} + + {% set table_settings = settings_instance('table') %} + {% endblock %} {% block javascripts %} diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 68bbb653..88ae764a 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -13489,5 +13489,17 @@ Please note, that you can not impersonate a disabled user. If you try you will g These providers will be preselected for searches in part providers. + + + settings.behavior.table.preview_image_max_width + Preview image max width (px) + + + + + settings.behavior.table.preview_image_min_width + Preview image min width (px) + + From e81c8470beebd8f4665a6360981248239a0178b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 21:51:58 +0200 Subject: [PATCH 5/9] Made part table action bar sticky floating Related to PR #997 --- .../elements/datatables/parts_controller.js | 2 ++ assets/css/app/tables.css | 12 +++++++++++- templates/components/datatables.macro.html.twig | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/assets/controllers/elements/datatables/parts_controller.js b/assets/controllers/elements/datatables/parts_controller.js index 1fe11a20..c43fa276 100644 --- a/assets/controllers/elements/datatables/parts_controller.js +++ b/assets/controllers/elements/datatables/parts_controller.js @@ -45,8 +45,10 @@ export default class extends DatatablesController { //Hide/Unhide panel with the selection tools if (count > 0) { selectPanel.classList.remove('d-none'); + selectPanel.classList.add('sticky-select-bar'); } else { selectPanel.classList.add('d-none'); + selectPanel.classList.remove('sticky-select-bar'); } //Update selection count text diff --git a/assets/css/app/tables.css b/assets/css/app/tables.css index ae892f50..aa72fff3 100644 --- a/assets/css/app/tables.css +++ b/assets/css/app/tables.css @@ -17,6 +17,16 @@ * along with this program. If not, see . */ +/**************************************** + * Action bar + ****************************************/ + +.sticky-select-bar { + position: sticky; + top: 120px; + z-index: 3000; /* Ensure the bar is above other content */ +} + /**************************************** * Tables ****************************************/ @@ -109,4 +119,4 @@ Classes for Datatables export #export-messageTop, .export-helper{ display: none; -} \ No newline at end of file +} diff --git a/templates/components/datatables.macro.html.twig b/templates/components/datatables.macro.html.twig index 5ce0f23f..447aa69c 100644 --- a/templates/components/datatables.macro.html.twig +++ b/templates/components/datatables.macro.html.twig @@ -29,7 +29,7 @@ -
+
{# #}
@@ -95,4 +95,4 @@
-{% endmacro %} \ No newline at end of file +{% endmacro %} From c2cbbee0df692a6787bd956e4d7eca77161cb781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 21:59:30 +0200 Subject: [PATCH 6/9] Ensure that part table action bar dont overlap our navbar dropdowns --- assets/css/app/tables.css | 2 +- templates/components/datatables.macro.html.twig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/css/app/tables.css b/assets/css/app/tables.css index aa72fff3..8d4b200c 100644 --- a/assets/css/app/tables.css +++ b/assets/css/app/tables.css @@ -24,7 +24,7 @@ .sticky-select-bar { position: sticky; top: 120px; - z-index: 3000; /* Ensure the bar is above other content */ + z-index: 1000; /* Ensure the bar is above other content */ } /**************************************** diff --git a/templates/components/datatables.macro.html.twig b/templates/components/datatables.macro.html.twig index 447aa69c..009f815e 100644 --- a/templates/components/datatables.macro.html.twig +++ b/templates/components/datatables.macro.html.twig @@ -29,7 +29,7 @@ -
+
{# #}
From 6ff7f64384beec9a5b6a149e42231bcc2bd4f4f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 22:37:11 +0200 Subject: [PATCH 7/9] New translations messages.en.xlf (German) --- translations/messages.de.xlf | 79 +++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf index 8515abb8..9fb3f6ef 100644 --- a/translations/messages.de.xlf +++ b/translations/messages.de.xlf @@ -8553,16 +8553,6 @@ Element 1 -> Element 1.2 Authenticator App - - - obsolete - obsolete - - - Login successful - Login erfolgreich. - - obsolete @@ -8688,15 +8678,6 @@ Element 1 -> Element 1.2 Sicherheitsschlüssel erfolgreich hinzugefügt. - - - obsolete - - - Username - Benutzername - - obsolete @@ -13440,5 +13421,65 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Labelprofil aktualisiert + + + settings.behavior.hompepage.items + Startseiten-Elemente + + + + + settings.behavior.homepage.items.help + Die Elemente, die auf der Startseite angezeigt werden sollen. Die Reihenfolge kann per Drag & Drop geändert werden. + + + + + settings.system.customization.showVersionOnHomepage + Part-DB-Version auf der Startseite anzeigen + + + + + settings.behavior.part_info.extract_params_from_description + Parameter aus der Bauteilebeschreibung extrahieren + + + + + settings.behavior.part_info.extract_params_from_notes + Parameter aus der Bauteilenotiz extrahieren + + + + + settings.ips.default_providers + Standard-Suchquellen + + + + + settings.ips.general + Allgemeine Einstellungen + + + + + settings.ips.default_providers.help + Diese Anbieter werden für die Suche in Informationsquellen vorausgewählt. + + + + + settings.behavior.table.preview_image_max_width + Max. Vorschaubilde-Breite (px) + + + + + settings.behavior.table.preview_image_min_width + Min. Vorschaubilde-Breite (px) + + From 8d2ff6f5d75de290ff8a53cfe0aba98fe266319f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 22:37:16 +0200 Subject: [PATCH 8/9] New translations messages.en.xlf (English) --- translations/messages.en.xlf | 253 +++++++++++++++++++---------------- 1 file changed, 138 insertions(+), 115 deletions(-) diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index b7710f0c..af70cb50 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -242,7 +242,7 @@ part.info.timetravel_hint - Please note that this feature is experimental, so the info may not be correct.]]> + This is how the part appeared before %timestamp%. <i>Please note that this feature is experimental, so the info may not be correct.</i> @@ -731,10 +731,10 @@ user.edit.tfa.disable_tfa_message - all active two-factor authentication methods of the user and delete the backup codes! -
-The user will have to set up all two-factor authentication methods again and print new backup codes!

-Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!]]>
+ This will disable <b>all active two-factor authentication methods of the user</b> and delete the <b>backup codes</b>! +<br> +The user will have to set up all two-factor authentication methods again and print new backup codes! <br><br> +<b>Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!</b>
@@ -885,9 +885,9 @@ The user will have to set up all two-factor authentication methods again and pri entity.delete.message - -Sub elements will be moved upwards.]]> + This can not be undone! +<br> +Sub elements will be moved upwards. @@ -1441,7 +1441,7 @@ Sub elements will be moved upwards.]]> homepage.github.text - GitHub project page]]> + Source, downloads, bug reports, to-do-list etc. can be found on <a href="%href%" class="link-external" target="_blank">GitHub project page</a> @@ -1463,7 +1463,7 @@ Sub elements will be moved upwards.]]> homepage.help.text - GitHub page]]> + Help and tips can be found in Wiki the <a href="%href%" class="link-external" target="_blank">GitHub page</a> @@ -1705,7 +1705,7 @@ Sub elements will be moved upwards.]]> email.pw_reset.fallback - %url% and enter the following info]]> + If this does not work for you, go to <a href="%url%">%url%</a> and enter the following info @@ -1735,7 +1735,7 @@ Sub elements will be moved upwards.]]> email.pw_reset.valid_unit %date% - %date%.]]> + The reset token will be valid until <i>%date%</i>. @@ -3578,8 +3578,8 @@ Sub elements will be moved upwards.]]> tfa_google.disable.confirm_message - -Also note that without two-factor authentication, your account is no longer as well protected against attackers!]]> + If you disable the Authenticator App, all backup codes will be deleted, so you may need to reprint them.<br> +Also note that without two-factor authentication, your account is no longer as well protected against attackers! @@ -3599,7 +3599,7 @@ Also note that without two-factor authentication, your account is no longer as w tfa_google.step.download - Google Authenticator oder FreeOTP Authenticator)]]> + Download an authenticator app (e.g. <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a> oder <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">FreeOTP Authenticator</a>) @@ -3841,8 +3841,8 @@ Also note that without two-factor authentication, your account is no longer as w tfa_trustedDevices.explanation - all computers here.]]> + When checking the second factor, the current computer can be marked as trustworthy, so no more two-factor checks on this computer are needed. +If you have done this incorrectly or if a computer is no longer trusted, you can reset the status of <i>all </i>computers here. @@ -5313,7 +5313,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can label_options.lines_mode.help - Twig documentation and Wiki for more information.]]> + If you select Twig here, the content field is interpreted as Twig template. See <a href="https://twig.symfony.com/doc/3.x/templates.html">Twig documentation</a> and <a href="https://docs.part-db.de/usage/labels.html#twig-mode">Wiki</a> for more information. @@ -7157,15 +7157,15 @@ Exampletown mass_creation.lines.placeholder - Element 1 Element 1.1 Element 1.1.1 Element 1.2 Element 2 Element 3 -Element 1 -> Element 1.1 -Element 1 -> Element 1.2]]> +Element 1 -> Element 1.1 +Element 1 -> Element 1.2 @@ -8554,16 +8554,6 @@ Element 1 -> Element 1.2]]> Authenticator app - - - obsolete - obsolete - - - Login successful - Login successful - - obsolete @@ -8689,15 +8679,6 @@ Element 1 -> Element 1.2]]> Security key added successfully. - - - obsolete - - - Username - Username - - obsolete @@ -9391,25 +9372,25 @@ Element 1 -> Element 1.2]]> filter.parameter_value_constraint.operator.< - + Typ. Value < filter.parameter_value_constraint.operator.> - ]]> + Typ. Value > filter.parameter_value_constraint.operator.<= - + Typ. Value <= filter.parameter_value_constraint.operator.>= - =]]> + Typ. Value >= @@ -9517,7 +9498,7 @@ Element 1 -> Element 1.2]]> parts_list.search.searching_for - %keyword%]]> + Searching parts with keyword <b>%keyword%</b> @@ -10177,13 +10158,13 @@ Element 1 -> Element 1.2]]> project.builds.number_of_builds_possible - %max_builds% builds of this project.]]> + You have enough stocked to build <b>%max_builds%</b> builds of this project. project.builds.check_project_status - "%project_status%". You should check if you really want to build the project with this status!]]> + The current project status is <b>"%project_status%"</b>. You should check if you really want to build the project with this status! @@ -10285,7 +10266,7 @@ Element 1 -> Element 1.2]]> entity.select.add_hint - to create nested structures, e.g. "Node 1->Node 1.1"]]> + Use -> to create nested structures, e.g. "Node 1->Node 1.1" @@ -10309,13 +10290,13 @@ Element 1 -> Element 1.2]]> homepage.first_steps.introduction - documentation or start to creating the following data structures:]]> + Your database is still empty. You might want to read the <a href="%url%">documentation</a> or start to creating the following data structures: homepage.first_steps.create_part - create a new part.]]> + Or you can directly <a href="%url%">create a new part</a>. @@ -10327,7 +10308,7 @@ Element 1 -> Element 1.2]]> homepage.forum.text - discussion forum]]> + For questions about Part-DB use the <a href="%href%" class="link-external" target="_blank">discussion forum</a> @@ -10981,7 +10962,7 @@ Element 1 -> Element 1.2]]> parts.import.help_documentation - documentation for more information on the file format.]]> + See the <a href="%link%">documentation</a> for more information on the file format. @@ -11161,7 +11142,7 @@ Element 1 -> Element 1.2]]> part.filter.lessThanDesired - + In stock less than desired (total amount < min. amount) @@ -11973,13 +11954,13 @@ Please note, that you can not impersonate a disabled user. If you try you will g part.merge.confirm.title - %other% into %target%?]]> + Do you really want to merge <b>%other%</b> into <b>%target%</b>? part.merge.confirm.message - %other% will be deleted, and the part will be saved with the shown information.]]> + <b>%other%</b> will be deleted, and the part will be saved with the shown information. @@ -12333,7 +12314,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.element14.apiKey.help - https://partner.element14.com/.]]> + You can register for an API key on <a href="https://partner.element14.com/">https://partner.element14.com/</a>. @@ -12345,7 +12326,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.element14.storeId.help - here for a list of valid domains.]]> + The store domain to retrieve the data from. This decides the language and currency of results. See <a href="https://partner.element14.com/docs/Product_Search_API_REST__Description">here</a> for a list of valid domains. @@ -12363,7 +12344,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.tme.token.help - https://developers.tme.eu/en/.]]> + You can get an API token and secret on <a href="https://developers.tme.eu/en/">https://developers.tme.eu/en/</a>. @@ -12411,7 +12392,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.mouser.apiKey.help - https://eu.mouser.com/api-hub/.]]> + You can register for an API key on <a href="https://eu.mouser.com/api-hub/">https://eu.mouser.com/api-hub/</a>. @@ -12489,7 +12470,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.system.attachments - + Attachments & Files @@ -12513,7 +12494,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.system.attachments.allowDownloads.help - Attention: This can be a security issue, as it might allow users to access intranet ressources via Part-DB!]]> + With this option users can download external files into Part-DB by providing an URL. <b>Attention: This can be a security issue, as it might allow users to access intranet ressources via Part-DB!</b> @@ -12687,8 +12668,8 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.system.localization.base_currency_description - Please note that the currencies are not converted, when changing this value. So changing the default currency after you already added price information, will result in wrong prices!]]> + The currency that is used to store price information and exchange rates in. This currency is assumed, when no currency is set for a price information. +<b>Please note that the currencies are not converted, when changing this value. So changing the default currency after you already added price information, will result in wrong prices!</b> @@ -12718,7 +12699,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.misc.kicad_eda.category_depth.help - 0 to show more levels. Set to -1, to show all parts of Part-DB inside a sigle cnategory in KiCad.]]> + This value determines the depth of the category tree, that is visible inside KiCad. 0 means that only the top level categories are visible. Set to a value > 0 to show more levels. Set to -1, to show all parts of Part-DB inside a sigle cnategory in KiCad. @@ -12736,7 +12717,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.behavior.sidebar.items.help - + The menus which appear at the sidebar by default. Order of items can be changed via drag & drop. @@ -12784,7 +12765,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.behavior.table.parts_default_columns.help - + The columns to show by default in part tables. Order of items can be changed via drag & drop. @@ -12838,7 +12819,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.oemsecrets.sortMode.M - + Completeness & Manufacturer name @@ -13178,286 +13159,328 @@ Please note, that you can not impersonate a disabled user. If you try you will g - + project.bom_import.type.kicad_schematic KiCAD Schematic BOM (CSV file) - + common.back Back - + project.bom_import.validation.errors.required_field_missing Line %line%: Required field "%field%" is missing or empty. Please ensure this field is mapped and contains data. - + project.bom_import.validation.errors.no_valid_designators Line %line%: Designator field contains no valid component references. Expected format: "R1,C2,U3" or "R1, C2, U3". - + project.bom_import.validation.warnings.unusual_designator_format Line %line%: Some component references may have unusual format: %designators%. Expected format: "R1", "C2", "U3", etc. - + project.bom_import.validation.errors.duplicate_designators Line %line%: Duplicate component references found: %designators%. Each component should be referenced only once per line. - + project.bom_import.validation.errors.invalid_quantity Line %line%: Quantity "%quantity%" is not a valid number. Please enter a numeric value (e.g., 1, 2.5, 10). - + project.bom_import.validation.errors.quantity_zero_or_negative Line %line%: Quantity must be greater than 0, got %quantity%. - + project.bom_import.validation.warnings.quantity_unusually_high Line %line%: Quantity %quantity% seems unusually high. Please verify this is correct. - + project.bom_import.validation.warnings.quantity_not_whole_number Line %line%: Quantity %quantity% is not a whole number, but you have %count% component references. This may indicate a mismatch. - + project.bom_import.validation.errors.quantity_designator_mismatch Line %line%: Mismatch between quantity and component references. Quantity: %quantity%, References: %count% (%designators%). These should match. Either adjust the quantity or check your component references. - + project.bom_import.validation.errors.invalid_partdb_id Line %line%: Part-DB ID "%id%" is not a valid number. Please enter a numeric ID. - + project.bom_import.validation.errors.partdb_id_zero_or_negative Line %line%: Part-DB ID must be greater than 0, got %id%. - + project.bom_import.validation.warnings.partdb_id_not_found Line %line%: Part-DB ID %id% not found in database. The component will be imported without linking to an existing part. - + project.bom_import.validation.info.partdb_link_success Line %line%: Successfully linked to Part-DB part "%name%" (ID: %id%). - + project.bom_import.validation.warnings.no_component_name Line %line%: No component name/designation provided (MPN, Designation, or Value). Component will be named "Unknown Component". - + project.bom_import.validation.warnings.package_name_too_long Line %line%: Package name "%package%" is unusually long. Please verify this is correct. - + project.bom_import.validation.info.library_prefix_detected Line %line%: Package "%package%" contains library prefix. This will be automatically removed during import. - + project.bom_import.validation.errors.non_numeric_field Line %line%: Field "%field%" contains non-numeric value "%value%". Please enter a valid number. - + project.bom_import.validation.info.import_summary Import summary: %total% total entries, %valid% valid, %invalid% with issues. - + project.bom_import.validation.errors.summary Found %count% validation error(s) that must be fixed before import can proceed. - + project.bom_import.validation.warnings.summary Found %count% warning(s). Please review these issues before proceeding. - + project.bom_import.validation.info.all_valid All entries passed validation successfully! - + project.bom_import.validation.summary Validation Summary - + project.bom_import.validation.total_entries Total Entries - + project.bom_import.validation.valid_entries Valid Entries - + project.bom_import.validation.invalid_entries Invalid Entries - + project.bom_import.validation.success_rate Success Rate - + project.bom_import.validation.errors.title Validation Errors - + project.bom_import.validation.errors.description The following errors must be fixed before the import can proceed: - + project.bom_import.validation.warnings.title Validation Warnings - + project.bom_import.validation.warnings.description The following warnings should be reviewed before proceeding: - + project.bom_import.validation.info.title Information - + project.bom_import.validation.details.title Detailed Validation Results - + project.bom_import.validation.details.line Line - + project.bom_import.validation.details.status Status - + project.bom_import.validation.details.messages Messages - + project.bom_import.validation.details.valid Valid - + project.bom_import.validation.details.invalid Invalid - + project.bom_import.validation.all_valid All entries are valid and ready for import! - + project.bom_import.validation.fix_errors Please fix the validation errors before proceeding with the import. - + project.bom_import.type.generic_csv Generic CSV - + label_generator.update_profile Update profile with current settings - + label_generator.profile_updated Label profile updated successfully. - + settings.behavior.hompepage.items Homepage items - + settings.behavior.homepage.items.help - + The items to show at the homepage. Order can be changed via drag & drop. - + settings.system.customization.showVersionOnHomepage Show Part-DB version on homepage + + + settings.behavior.part_info.extract_params_from_description + Extract parameters from part description + + + + + settings.behavior.part_info.extract_params_from_notes + 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. + + + + + settings.behavior.table.preview_image_max_width + Preview image max width (px) + + + + + settings.behavior.table.preview_image_min_width + Preview image min width (px) + + From 03f7ad66d2ce62572df24d8c55e42696b856b691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 7 Sep 2025 23:16:15 +0200 Subject: [PATCH 9/9] Bumped version to 2.1.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e9307ca5..7ec1d6db 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.2 +2.1.0