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>
Fixes#1157.
- Focus `name` field on new part
- Focus `amount` on add/withdraw modal
- Focus first "number type" input on any newly added collectionType table row... (debatable)
It would be even more favorable if the user could configure if they want to use autofocus and/or for which fields/dialogs it should be enabled.