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 %}
|