* Add stock quantity, datasheet URL, and HTTP caching to KiCad API
- 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
* Add KiCadHelper unit tests and fix PDF detection for external URLs
- 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)
* Fix 304 response body, parse_url safety, and location/stock consistency
- 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
* Fix testPartDetailsPart2 to actually test Part 2
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 Symfony's built-in ETag handling for HTTP caching
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.
* Add configurable KiCad field export for part parameters
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.
* Add partdb:kicad:populate command for bulk KiCad path assignment
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 CSV import support for EDA/KiCad fields
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.
* Add batch EDA field editing from parts table
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.
* Remove unused counter variable in BatchEdaController
* Fix PHPStan errors in PopulateKicadCommand and BatchEdaController
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.
* Fix batch EDA edit: required validation and pre-populate shared values
- 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 KiCad API v2, orderdetail export control, EDA status indicator, BOM improvements
- 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
* Fix kicad_export column default for SQLite compatibility
Add options default to ORM column definition so schema:update
works correctly on SQLite test databases.
* Make EDA status bolt icon clickable to open EDA settings tab
* Fix EDA bolt link to correctly open EDA tab via data-turbo=false
* Add configurable datasheet URL mode for KiCad API
New setting "Datasheet field links to PDF" in KiCad EDA settings.
When enabled (default), the datasheet field resolves to the actual
PDF attachment URL. When disabled, it links to the Part-DB page
(old behavior). Configurable via settings UI or EDA_KICAD_DATASHEET_AS_PDF env var.
* Fix settings crash when upgrading: make datasheetAsPdf nullable
The settings bundle stores values in the database. When upgrading from
a version without datasheetAsPdf, the stored JSON lacks this key,
causing a TypeError when assigning null to a non-nullable bool.
Making it nullable with a fallback in KiCadHelper fixes the upgrade path.
* Add functional tests for KiCad API v2 and batch EDA controller
- KiCadApiV2ControllerTest: root, categories, parts, volatile fields,
v1 vs v2 comparison, cache headers, 304 conditional request, auth
- BatchEdaControllerTest: page load, empty redirect, form submission
* Fix test failures: correct ids format and anonymous access assertion
* Improve test coverage for BatchEdaController
Add tests for: applying all EDA fields at once, custom redirect URL,
and verifying unchecked fields are skipped.
* Address PR review: rename to eda_visibility, merge migrations, API versioning
Changes based on jbtronics' review of PR #1241:
- Rename kicad_export -> eda_visibility (entities, forms, templates,
translations, tests) with nullable bool for system default support
- Merge two database migrations into one (Version20260211000000)
- Rename createCachedJsonResponse -> createCacheableJsonResponse
- Change bool $apiV2 -> int $apiVersion with version validation
- EDA visibility field only shown for part parameters, not other entities
- PopulateKicadCommand: check alternative names of footprints/categories
- PopulateKicadCommand: support external JSON mapping file (--mapping-file)
- Ship default mappings JSON at contrib/kicad-populate/default_mappings.json
- Add system-wide defaultEdaVisibility setting in KiCadEDASettings
- Add KiCad HTTP Library v2 spec link in controller docs
* Fix duplicate loadMappingFile method causing PHP fatal error
* Add tests for mapping file and alternative name matching, update populate command docs
Add 5 new tests for PopulateKicadCommand covering:
- Custom mapping file overriding defaults
- Invalid JSON mapping file error handling
- Missing mapping file error handling
- Footprint alternative name matching
- Category alternative name matching
Update contrib README to document --mapping-file option,
alternative name matching, and custom JSON mapping format.
* Split out KiCad API v2 into separate PR as requested by maintainer
Remove v2 controller, tests, and volatile field support from this PR.
The v2 API will be submitted as a separate PR for focused discussion.
* Improve test coverage for KiCadHelper and PopulateKicadCommand
KiCadHelper: Add tests for orderdetail eda_visibility filtering,
backward compatibility when no flags set, manufacturer/KiCost fields,
and parameter with empty name skipping.
PopulateKicadCommand: Add tests for mapping file with both footprints
and categories sections, and mapping file with only categories.
* Load populate Kicad default mappings from json file
* Moved kicad:populate documentation to central docs
* Added introduced column to PartTableColumns to make it configurable in the settings
* Use TristateCheckboxes for parameter and orderdetail types
* Fixed translation keys
* Split up default eda visibility for parameters and purchase infos
---------
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
* add option to disable keybindings
* add tests for disabling keybindings
* Fixed translation keys
* Added env to env configuration list
* Removed useless tests
The tests are already enforced by type declarations
---------
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
* Fixed Typos and mistranslations in GDPR mode (DSGVO Modus)
Fixed Typo enviroment
* Create BuerklinProvider based on LCSCProvider
* Update GET URLs for Buerklin
* Add getToken function analog to Octopart
* Remove line break in docs
* Remove trailing / in ENDPOINT_URL
Use Autowire to use values of environment variables
Remove unwanted Code from LCSC-Provider
Map json response to DTO variables
* Fix variable reference errors ($term → $keyword)
Ensure array keys exist before accessing them
Optimize API calls to prevent unnecessary requests
Improve error handling for better debugging
Enhance readability and maintainability of functions
* Bumped version v1.16.2
* Update BuerklinProvider.php
Change Order of Capabilities
* Change order of capabilities in LCSCProvider.php
* Change order of capabilities in PollinProvider.php
* Try to fix getToken BuerklinProvider.php
* Add ip_buerklin_oauth to knpu_oauth2_client.yaml
* Update buerklin authorize URL in knpu_oauth2_client.yaml
* Update knpu_oauth2_client.yaml
* Adapt Buerklin InfoProvider to new Settings mechanism
* According to Buerklin API spec it's really 'token' as urlAuthorize endpoint
* Rückgabewert ist schon ein Array deshalb kein toArray
* Fix API-Access, add image, price and parameter retrieval (Datasheets not yet implemented because it is not available in the API response)
* Add Caching of requests, use default query params (language and currency) using a function, Fix Footprint assignment, translate German code comments
* Remove DATASHEET from ProviderCapabilities because the Bürklin API doesn't include Datasheet URLs at the moment, more reverse engineering needed
* Update BuerklinSettings with existing translatable strings
* Improve Buerklin Settings Page
* Added Translation strings for Buerklin Info Provider
* Improve Buerklin Provider help message
* Adapt Buerklin-provider to new settings system
* Adapt Buerklin-provider to new settings system: add missing instance of BuerklinSettings
* Improve Compliance Parameters parsing
* Remove language-dependent RoHs Date code and use shortened ISO format, Add Customs Code without parseValueField
* Fix no results for keyword search
* Implement BatchInfoProviderInterface for Buerklin Provider
* Rename searchBatch to searchByKeywordsBatch to correctly implement BatchInfoProviderInterface
* Fix Bulk Info Provider Import for Buerklin
* Tranlate comments to English to prepare for Pull-Request
* Add phpUnit unit tests for BuerklinProvider
* Try fixing PHPStan issues
* Remove OAuthTokenManager from BuerklinProviderTest
Removed OAuthTokenManager mock from BuerklinProviderTest setup.
* Fix Settings must not be instantiated directly
* Fix UnitTest for value_typ
* edd5fb3319 (r2622249199)
Revert "Change order of capabilities in LCSCProvider.php"
This reverts commit dfd6f33e52.
* edd5fb3319 (r2622249861)
Revert "Change order of capabilities in PollinProvider.php"
This reverts commit fc2e7265be.
* Use language setting for ProductShortURL
* Update default language for Buerklin provider to English in documentation
* Add suggested improvements from SonarQube
* Removed unused use directives
* Revert SonarQube proposed change. Having more than one return is acceptable nowadays
* Improve getProviderInfo: disable oauth_app_name, add settings_class, improve disabled_help
* Implement retrieveROPCToken as proposed in https://github.com/Part-DB/Part-DB-server/pull/1151#discussion_r2622976206
* Add missing ) to retrieveROPCToken
* add use OAuthTokenManager and create instance in constructor
* Revert the following commits that tried to implement getToken using OAuthTokenManager
Revert "add use OAuthTokenManager and create instance in constructor"This reverts commit 2a1e7c9b0974ebd7e082d5a2fa62753d6254a767.Revert "Add missing ) to retrieveROPCToken"This reverts commit 8df5cfc49e.
Revert "Implement retrieveROPCToken as proposed in https://github.com/Part-DB/Part-DB-server/pull/1151#discussion_r2622976206"
This reverts commit 66cc732082.
* Remove OAuthTokenManager leftovers
* Disable buerklin provider if settings fields are empty
* Improved docs
* Added TODO comment
---------
Co-authored-by: root <root@part-db.fritz.box>
Co-authored-by: Jan Böhmer <mail@jan-boehmer.de>
* Initial plan
* Improve documentation clarity, fix typos, and update outdated information
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Replace LCSC with Mouser in cloud providers list per d-buchmann's review
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
* Remove outdated Mouser API issue notice
Removed outdated information about the Mouser API's current issues with datasheets and part specifications.
---------
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>