diff --git a/VERSION b/VERSION
index e9307ca5..7ec1d6db 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.0.2
+2.1.0
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/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/assets/css/app/tables.css b/assets/css/app/tables.css
index ae892f50..8d4b200c 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: 1000; /* 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/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/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/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/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()) {
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/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/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/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/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/templates/components/datatables.macro.html.twig b/templates/components/datatables.macro.html.twig
index 5ce0f23f..009f815e 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 %}
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)
+
+
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_schematicKiCAD Schematic BOM (CSV file)
-
+ common.backBack
-
+ project.bom_import.validation.errors.required_field_missingLine %line%: Required field "%field%" is missing or empty. Please ensure this field is mapped and contains data.
-
+ project.bom_import.validation.errors.no_valid_designatorsLine %line%: Designator field contains no valid component references. Expected format: "R1,C2,U3" or "R1, C2, U3".
-
+ project.bom_import.validation.warnings.unusual_designator_formatLine %line%: Some component references may have unusual format: %designators%. Expected format: "R1", "C2", "U3", etc.
-
+ project.bom_import.validation.errors.duplicate_designatorsLine %line%: Duplicate component references found: %designators%. Each component should be referenced only once per line.
-
+ project.bom_import.validation.errors.invalid_quantityLine %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_negativeLine %line%: Quantity must be greater than 0, got %quantity%.
-
+ project.bom_import.validation.warnings.quantity_unusually_highLine %line%: Quantity %quantity% seems unusually high. Please verify this is correct.
-
+ project.bom_import.validation.warnings.quantity_not_whole_numberLine %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_mismatchLine %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_idLine %line%: Part-DB ID "%id%" is not a valid number. Please enter a numeric ID.
-
+ project.bom_import.validation.errors.partdb_id_zero_or_negativeLine %line%: Part-DB ID must be greater than 0, got %id%.
-
+ project.bom_import.validation.warnings.partdb_id_not_foundLine %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_successLine %line%: Successfully linked to Part-DB part "%name%" (ID: %id%).
-
+ project.bom_import.validation.warnings.no_component_nameLine %line%: No component name/designation provided (MPN, Designation, or Value). Component will be named "Unknown Component".
-
+ project.bom_import.validation.warnings.package_name_too_longLine %line%: Package name "%package%" is unusually long. Please verify this is correct.
-
+ project.bom_import.validation.info.library_prefix_detectedLine %line%: Package "%package%" contains library prefix. This will be automatically removed during import.
-
+ project.bom_import.validation.errors.non_numeric_fieldLine %line%: Field "%field%" contains non-numeric value "%value%". Please enter a valid number.
-
+ project.bom_import.validation.info.import_summaryImport summary: %total% total entries, %valid% valid, %invalid% with issues.
-
+ project.bom_import.validation.errors.summaryFound %count% validation error(s) that must be fixed before import can proceed.
-
+ project.bom_import.validation.warnings.summaryFound %count% warning(s). Please review these issues before proceeding.
-
+ project.bom_import.validation.info.all_validAll entries passed validation successfully!
-
+ project.bom_import.validation.summaryValidation Summary
-
+ project.bom_import.validation.total_entriesTotal Entries
-
+ project.bom_import.validation.valid_entriesValid Entries
-
+ project.bom_import.validation.invalid_entriesInvalid Entries
-
+ project.bom_import.validation.success_rateSuccess Rate
-
+ project.bom_import.validation.errors.titleValidation Errors
-
+ project.bom_import.validation.errors.descriptionThe following errors must be fixed before the import can proceed:
-
+ project.bom_import.validation.warnings.titleValidation Warnings
-
+ project.bom_import.validation.warnings.descriptionThe following warnings should be reviewed before proceeding:
-
+ project.bom_import.validation.info.titleInformation
-
+ project.bom_import.validation.details.titleDetailed Validation Results
-
+ project.bom_import.validation.details.lineLine
-
+ project.bom_import.validation.details.statusStatus
-
+ project.bom_import.validation.details.messagesMessages
-
+ project.bom_import.validation.details.validValid
-
+ project.bom_import.validation.details.invalidInvalid
-
+ project.bom_import.validation.all_validAll entries are valid and ready for import!
-
+ project.bom_import.validation.fix_errorsPlease fix the validation errors before proceeding with the import.
-
+ project.bom_import.type.generic_csvGeneric CSV
-
+ label_generator.update_profileUpdate profile with current settings
-
+ label_generator.profile_updatedLabel profile updated successfully.
-
+ settings.behavior.hompepage.itemsHomepage items
-
+ settings.behavior.homepage.items.help
-
+ The items to show at the homepage. Order can be changed via drag & drop.
-
+ settings.system.customization.showVersionOnHomepageShow 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)
+
+