- Add KiCad API v2 endpoints (/kicad-api/v2) with volatile field support
for stock and storage location (shown but not saved to schematic)
- Add kicad_export flag to Orderdetail entity for per-supplier SPN control
(backward compatible: if no flag set, all SPNs exported as before)
- Add EDA completeness indicator column in parts datatable (bolt icon)
- Add ?minimal=true query param for faster category parts loading
- Improve category descriptions (use comment instead of URL when available)
- Improve BOM importer multi-footprint support: merge entries by Part-DB
part ID when linked, tracking footprint variants in comments
- Fix KiCost manf/manf# fields always present (not conditional on orderdetails)
- Fix duplicate getEdaInfo() call in shouldPartBeVisible
- Consolidate supplier SPN and KiCost field generation into single loop
- Add required=false to TriStateCheckboxType fields so HTML5 validation
doesn't force users to check visibility/BOM/board checkboxes
- Pre-populate form fields when all selected parts share the same EDA
value, so users can see current state before editing
Add @var type annotations for Doctrine repository findAll() calls so
PHPStan can resolve getEdaInfo() on Footprint/Category entities. Fix
array return type for numeric-string keys and add explicit callback to
array_filter to satisfy strict rules.
Users can now select multiple parts in any parts table and batch-edit
their EDA/KiCad fields (symbol, footprint, reference prefix, value,
visibility, exclude from BOM/board/sim). Each field has an "Apply"
checkbox so users control exactly which fields are changed.
Add user-friendly column aliases (kicad_symbol, kicad_footprint,
kicad_reference, kicad_value, eda_exclude_bom, etc.) to the CSV import
system. Users can now bulk-set KiCad symbols, footprints, and other EDA
metadata via CSV/Excel import without knowing the internal dot notation.
Console command that populates KiCad footprint/symbol paths on Footprint
and Category entities based on name-to-library mappings. Supports dry-run,
force overwrite, and list modes. Includes 130+ footprint mappings and 30+
category symbol mappings for KiCad 9.x standard libraries.
Add a kicad_export checkbox to parameters, allowing users to control
which specifications appear as fields in the KiCad HTTP library API.
Parameters with kicad_export enabled are included using their formatted
value, without overwriting hardcoded fields like description or Stock.
Replace manual If-None-Match comparison with Response::setEtag() and
Response::isNotModified(), which properly handles ETag quoting, weak
vs strong comparison, and 304 response cleanup. Fixes PHPStan return
type error and CI test failures.
The test was requesting /parts/1.json instead of /parts/2.json and had
Part 1's expected data. Now tests Part 2 which inherits EDA info from
its category and footprint, verifying the inheritance behavior.
- Use empty Response instead of JsonResponse(null) for 304 Not Modified
to avoid sending "null" as response body
- Guard parse_url() result with is_string() since it can return false
for malformed URLs
- Move storage location tracking inside the availability check so
expired and unknown-quantity lots don't contribute locations
- Add comprehensive KiCadHelperTest with 14 test cases covering:
- Stock quantity calculation (zero, single lot, multiple lots)
- Stock exclusion of expired and unknown-quantity lots
- Storage location display (present, absent, multiple)
- Datasheet URL resolution by type name, attachment name, PDF extension
- Datasheet fallback to Part-DB URL when no match
- "Data sheet" (with space) name variant matching
- Fix PDF extension detection for external attachments (getExtension()
returns null for external-only attachments, now also parses URL path)
- Add Stock field showing total available quantity across all part lots
- Add Storage Location field when parts have stored locations
- Resolve actual datasheet PDF from attachments (by type name, attachment
name, or first PDF) instead of always linking to Part-DB page
- Keep Part-DB page URL as separate "Part-DB URL" field
- Add ETag and Cache-Control headers to all KiCad API endpoints
- Support conditional requests (If-None-Match) returning 304
- Categories/part lists cached 5 min, part details cached 1 min
* Initial plan
* Use ARM runners for ARM Docker image builds
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Fix artifact naming and add comments for latest=false flavor
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Remove trailing commas from tag configuration in merge job
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Remove duplicate tag entries and clean up configuration
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Initial plan
* Refactor Dockerfiles to use Node.js multistage builds
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Fix node-builder stage with stub translations file
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Improve stub translations file creation using heredoc
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Build real translations in node-builder stage via cache warmup
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Improve error handling for cache warmup fallback
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Use native build platform for node-builder stage
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Do not include fallback for case that translations not exist
* Use newer format for dockerfile-frankenphp
* Dockfile added caching to package managers
* Fixed frankenphp build
* Fixed complain about missing symfony runtime
* Use caching for frankenphp dockerfile
* add target arch to dockerfile caches, to avoid problems
* add targetarch arg
* moved targetarch argument to correct position
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
* init API endpoint for generating labels
* Improved API docs for label endpoint
* Improved LabelGenerationProcessor
---------
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>