diff --git a/VERSION b/VERSION index 965a689e..edcfe40d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.13.4 +2.14.0 diff --git a/composer.lock b/composer.lock index 39341239..53a056f1 100644 --- a/composer.lock +++ b/composer.lock @@ -5172,16 +5172,16 @@ }, { "name": "jbtronics/2fa-webauthn", - "version": "v3.0.0", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/jbtronics/2fa-webauthn.git", - "reference": "542424bcc51f06932cbecfd7b75afbb5e107c9ce" + "reference": "9881f3ea8d3ba7a8d1afa9adc0339d92c90aff22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jbtronics/2fa-webauthn/zipball/542424bcc51f06932cbecfd7b75afbb5e107c9ce", - "reference": "542424bcc51f06932cbecfd7b75afbb5e107c9ce", + "url": "https://api.github.com/repos/jbtronics/2fa-webauthn/zipball/9881f3ea8d3ba7a8d1afa9adc0339d92c90aff22", + "reference": "9881f3ea8d3ba7a8d1afa9adc0339d92c90aff22", "shasum": "" }, "require": { @@ -5226,9 +5226,9 @@ ], "support": { "issues": "https://github.com/jbtronics/2fa-webauthn/issues", - "source": "https://github.com/jbtronics/2fa-webauthn/tree/v3.0.0" + "source": "https://github.com/jbtronics/2fa-webauthn/tree/v3.0.2" }, - "time": "2025-08-14T15:12:48+00:00" + "time": "2026-07-27T20:24:28+00:00" }, { "name": "jbtronics/dompdf-font-loader-bundle", diff --git a/migrations/Version20260713120000.php b/migrations/Version20260713120000.php new file mode 100644 index 00000000..d25ed18d --- /dev/null +++ b/migrations/Version20260713120000.php @@ -0,0 +1,46 @@ +addSql('ALTER TABLE parameters ADD eda_symbol_visibility TINYINT(1) DEFAULT NULL'); + } + + public function mySQLDown(Schema $schema): void + { + $this->addSql('ALTER TABLE parameters DROP COLUMN eda_symbol_visibility'); + } + + public function sqLiteUp(Schema $schema): void + { + $this->addSql('ALTER TABLE parameters ADD COLUMN eda_symbol_visibility BOOLEAN DEFAULT NULL'); + } + + public function sqLiteDown(Schema $schema): void + { + $this->addSql('ALTER TABLE parameters DROP COLUMN eda_symbol_visibility'); + } + + public function postgreSQLUp(Schema $schema): void + { + $this->addSql('ALTER TABLE parameters ADD eda_symbol_visibility BOOLEAN DEFAULT NULL'); + } + + public function postgreSQLDown(Schema $schema): void + { + $this->addSql('ALTER TABLE parameters DROP COLUMN eda_symbol_visibility'); + } +} diff --git a/src/Entity/Parameters/AbstractParameter.php b/src/Entity/Parameters/AbstractParameter.php index f47f2e82..48aa40bd 100644 --- a/src/Entity/Parameters/AbstractParameter.php +++ b/src/Entity/Parameters/AbstractParameter.php @@ -179,6 +179,14 @@ abstract class AbstractParameter extends AbstractNamedDBElement implements Uniqu #[ORM\Column(type: Types::BOOLEAN, nullable: true, options: ['default' => null])] protected ?bool $eda_visibility = null; + /** + * @var bool|null Whether the exported EDA field should be visible in the schematic symbol + * (sets the KiCad field's "visible" flag). Null means use system default. + */ + #[Groups(['full', 'parameter:read', 'parameter:write', 'import'])] + #[ORM\Column(type: Types::BOOLEAN, nullable: true, options: ['default' => null])] + protected ?bool $eda_symbol_visibility = null; + /** * Mapping is done in subclasses. * @@ -493,6 +501,21 @@ abstract class AbstractParameter extends AbstractNamedDBElement implements Uniqu return $this; } + public function isEdaSymbolVisibility(): ?bool + { + return $this->eda_symbol_visibility; + } + + /** + * @return $this + */ + public function setEdaSymbolVisibility(?bool $eda_symbol_visibility): self + { + $this->eda_symbol_visibility = $eda_symbol_visibility; + + return $this; + } + public function getComparableFields(): array { return ['name' => $this->name, 'group' => $this->group, 'element' => $this->element?->getId()]; diff --git a/src/Form/ParameterType.php b/src/Form/ParameterType.php index f68c3921..bf37fca4 100644 --- a/src/Form/ParameterType.php +++ b/src/Form/ParameterType.php @@ -156,6 +156,11 @@ class ParameterType extends AbstractType 'label' => false, 'required' => false, ]); + + $builder->add('eda_symbol_visibility', TriStateCheckboxType::class, [ + 'label' => false, + 'required' => false, + ]); } } diff --git a/src/Services/EDA/KiCadHelper.php b/src/Services/EDA/KiCadHelper.php index 42cc2518..a4d0a901 100644 --- a/src/Services/EDA/KiCadHelper.php +++ b/src/Services/EDA/KiCadHelper.php @@ -341,7 +341,9 @@ class KiCadHelper $fieldName = $parameter->getName(); //Don't overwrite hardcoded fields if (!isset($result['fields'][$fieldName])) { - $result['fields'][$fieldName] = $this->createField($parameter->getFormattedValue()); + //Whether the field should be visible in the schematic symbol (explicit, or system default when null) + $symbolVisibility = $parameter->isEdaSymbolVisibility() ?? $this->kiCadEDASettings->defaultParameterSymbolVisibility; + $result['fields'][$fieldName] = $this->createField($parameter->getFormattedValue(), $symbolVisibility); } } } diff --git a/src/Services/ProjectSystem/ProjectBuildHelper.php b/src/Services/ProjectSystem/ProjectBuildHelper.php index e011d980..090f9e66 100644 --- a/src/Services/ProjectSystem/ProjectBuildHelper.php +++ b/src/Services/ProjectSystem/ProjectBuildHelper.php @@ -242,7 +242,11 @@ final readonly class ProjectBuildHelper * taking bulk pricing into account for N builds. */ private function getBomEntryUnitPrice(ProjectBOMEntry $entry, int $number_of_builds, ?Currency $currency): ?BigDecimal - { + { + if ($entry->getPart() && $entry->getPart()->getBuiltProject() instanceof Project){ + return $this->calculateTotalBuildPrice($entry->getPart()->getBuiltProject(), 1, $entry->getPriceCurrency()); + } + if ($entry->getPart() instanceof Part) { $total_qty = $entry->getQuantity() * $number_of_builds; $min_order = $this->pricedetailHelper->getMinOrderAmount($entry->getPart()); diff --git a/src/Settings/MiscSettings/KiCadEDASettings.php b/src/Settings/MiscSettings/KiCadEDASettings.php index dd223007..a32b31e5 100644 --- a/src/Settings/MiscSettings/KiCadEDASettings.php +++ b/src/Settings/MiscSettings/KiCadEDASettings.php @@ -56,6 +56,13 @@ class KiCadEDASettings )] public bool $defaultParameterVisibility = false; + #[SettingsParameter( + label: new TM("settings.misc.kicad_eda.default_parameter_symbol_visibility"), + description: new TM("settings.misc.kicad_eda.default_parameter_symbol_visibility.help"), + + )] + public bool $defaultParameterSymbolVisibility = false; + #[SettingsParameter( label: new TM("settings.misc.kicad_eda.default_orderdetails_visibility"), description: new TM("settings.misc.kicad_eda.default_orderdetails_visibility.help"), diff --git a/templates/log_system/details/log_details.html.twig b/templates/log_system/details/log_details.html.twig index 2255dd97..2c83aee0 100644 --- a/templates/log_system/details/log_details.html.twig +++ b/templates/log_system/details/log_details.html.twig @@ -58,7 +58,7 @@ {% trans %}log.target{% endtrans %} - {{ target_html|sanitize_html }} + {{ target_html|raw }} diff --git a/templates/parts/edit/_specifications.html.twig b/templates/parts/edit/_specifications.html.twig index 6f631b9f..e55ea9da 100644 --- a/templates/parts/edit/_specifications.html.twig +++ b/templates/parts/edit/_specifications.html.twig @@ -15,6 +15,7 @@ {% trans %}specifications.text{% endtrans %} {% trans %}specifications.group{% endtrans %} + diff --git a/templates/parts/edit/edit_form_styles.html.twig b/templates/parts/edit/edit_form_styles.html.twig index 44c8d89c..993e1fb7 100644 --- a/templates/parts/edit/edit_form_styles.html.twig +++ b/templates/parts/edit/edit_form_styles.html.twig @@ -83,6 +83,9 @@ {% if form.eda_visibility is defined %} {{ form_widget(form.eda_visibility) }} {% endif %} + {% if form.eda_symbol_visibility is defined %} + {{ form_widget(form.eda_symbol_visibility) }} + {% endif %}