diff --git a/.env b/.env index c530f312..73b7b350 100644 --- a/.env +++ b/.env @@ -35,9 +35,6 @@ DATABASE_EMULATE_NATURAL_SORT=0 # This must end with a slash! DEFAULT_URI="https://partdb.changeme.invalid/" -# Use an %%ipn%% placeholder in the name of a assembly. Placeholder is replaced with the ipn input while saving. -CREATE_ASSEMBLY_USE_IPN_PLACEHOLDER_IN_NAME=0 - ################################################################################### # Email settings ################################################################################### @@ -63,16 +60,6 @@ ERROR_PAGE_ADMIN_EMAIL='' # If this is set to true, solutions to common problems are shown on error pages. Disable this, if you do not want your users to see them... ERROR_PAGE_SHOW_HELP=1 -################################################################################## -# Part table settings -################################################################################## - -# Configure which columns will be visible by default in the specific table (and in which order). -# This is a comma separated list of column names. See documentation for available values. -TABLE_PARTS_DEFAULT_COLUMNS=name,description,category,footprint,manufacturer,storage_location,amount -TABLE_ASSEMBLIES_DEFAULT_COLUMNS=id,ipn,name,description,referencedAssemblies,edit -TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS=quantity,id,ipn,name,description - ################################################################################### # SAML Single sign on-settings ################################################################################### diff --git a/config/parameters.yaml b/config/parameters.yaml index e436113c..118e367c 100644 --- a/config/parameters.yaml +++ b/config/parameters.yaml @@ -59,12 +59,6 @@ parameters: ###################################################################################################################### partdb.saml.enabled: '%env(bool:SAML_ENABLED)%' # If this is set to true, SAML authentication is enabled - ###################################################################################################################### - # Table settings - ###################################################################################################################### - partdb.table.assemblies.default_columns: '%env(trim:string:TABLE_ASSEMBLIES_DEFAULT_COLUMNS)%' # The default columns in assembly tables and their order - partdb.table.assemblies_bom.default_columns: '%env(trim:string:TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS)%' # The default columns in assembly bom tables and their order - ###################################################################################################################### # Miscellaneous ###################################################################################################################### diff --git a/config/services.yaml b/config/services.yaml index 7f0b5897..e354ca84 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -164,10 +164,6 @@ services: arguments: $saml_enabled: '%partdb.saml.enabled%' - App\Form\AdminPages\AssemblyAdminForm: - arguments: - $useAssemblyIpnPlaceholder: '%partdb.create_assembly_use_ipn_placeholder_in_name%' - App\Validator\Constraints\AssemblySystem\AssemblyCycleValidator: tags: [ 'validator.constraint_validator' ] @@ -177,12 +173,6 @@ services: App\DataTables\Helpers\ColumnSortHelper: shared: false # Service has a state so not share it between different tables - App\DataTables\AssemblyDataTable: - arguments: - $visible_columns: '%partdb.table.assemblies.default_columns%' - App\DataTables\AssemblyBomEntriesDataTable: - arguments: - $visible_columns: '%partdb.table.assemblies_bom.default_columns%' #################################################################################################################### # Label system @@ -206,8 +196,6 @@ services: #################################################################################################################### App\Services\Trees\TreeViewGenerator: arguments: - $rootNodeExpandedByDefault: '%partdb.sidebar.root_expanded%' - $rootNodeEnabled: '%partdb.sidebar.root_node_enable%' $dataSourceSynonyms: '%partdb.data_sources.synonyms%' App\Services\Trees\ToolsTreeBuilder: arguments: diff --git a/migrations/Version20250304081039.php b/migrations/Version20250304081039.php index ccdb24ac..0c64e250 100644 --- a/migrations/Version20250304081039.php +++ b/migrations/Version20250304081039.php @@ -18,42 +18,42 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration { $this->addSql(<<<'SQL' CREATE TABLE assemblies ( - id INT AUTO_INCREMENT NOT NULL, - parent_id INT DEFAULT NULL, - id_preview_attachment INT DEFAULT NULL, - name VARCHAR(255) NOT NULL, - comment LONGTEXT NOT NULL, - not_selectable TINYINT(1) NOT NULL, - alternative_names LONGTEXT DEFAULT NULL, - order_quantity INT NOT NULL, - status VARCHAR(64) DEFAULT NULL, - order_only_missing_parts TINYINT(1) NOT NULL, - description LONGTEXT NOT NULL, - last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, - datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, - INDEX IDX_5F3832C0727ACA70 (parent_id), - INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment), + id INT AUTO_INCREMENT NOT NULL, + parent_id INT DEFAULT NULL, + id_preview_attachment INT DEFAULT NULL, + name VARCHAR(255) NOT NULL, + comment LONGTEXT NOT NULL, + not_selectable TINYINT(1) NOT NULL, + alternative_names LONGTEXT DEFAULT NULL, + order_quantity INT NOT NULL, + status VARCHAR(64) DEFAULT NULL, + order_only_missing_parts TINYINT(1) NOT NULL, + description LONGTEXT NOT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + INDEX IDX_5F3832C0727ACA70 (parent_id), + INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment), PRIMARY KEY(id) ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` SQL); $this->addSql(<<<'SQL' CREATE TABLE assembly_bom_entries ( - id INT AUTO_INCREMENT NOT NULL, - id_assembly INT DEFAULT NULL, - id_part INT DEFAULT NULL, - id_project INT DEFAULT NULL, - quantity DOUBLE PRECISION NOT NULL, - mountnames LONGTEXT NOT NULL, - name VARCHAR(255) DEFAULT NULL, - comment LONGTEXT NOT NULL, - price NUMERIC(11, 5) DEFAULT NULL, - price_currency_id INT DEFAULT NULL, - last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, - datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, - INDEX IDX_8C74887E2F180363 (id_assembly), - INDEX IDX_8C74887EC22F6CC4 (id_part), - INDEX IDX_8C74887EF12E799E (id_project), - INDEX IDX_8C74887E3FFDCD60 (price_currency_id), + id INT AUTO_INCREMENT NOT NULL, + id_assembly INT DEFAULT NULL, + id_part INT DEFAULT NULL, + id_project INT DEFAULT NULL, + quantity DOUBLE PRECISION NOT NULL, + mountnames LONGTEXT NOT NULL, + name VARCHAR(255) DEFAULT NULL, + comment LONGTEXT NOT NULL, + price NUMERIC(11, 5) DEFAULT NULL, + price_currency_id INT DEFAULT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + INDEX IDX_8C74887E2F180363 (id_assembly), + INDEX IDX_8C74887EC22F6CC4 (id_part), + INDEX IDX_8C74887EF12E799E (id_project), + INDEX IDX_8C74887E3FFDCD60 (price_currency_id), PRIMARY KEY(id) ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` SQL); @@ -109,7 +109,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration { $this->addSql(<<<'SQL' CREATE TABLE assemblies ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, parent_id INTEGER DEFAULT NULL, id_preview_attachment INTEGER DEFAULT NULL, order_quantity INTEGER NOT NULL, @@ -120,7 +120,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, status VARCHAR(64) DEFAULT NULL, - ipn VARCHAR(100) DEFAULT NULL, + ipn VARCHAR(100) DEFAULT NULL, description CLOB NOT NULL, alternative_names CLOB DEFAULT NULL, CONSTRAINT FK_5F3832C0727ACA70 FOREIGN KEY (parent_id) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE, @@ -145,7 +145,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, id_assembly INTEGER DEFAULT NULL, id_part INTEGER DEFAULT NULL, - id_project INTEGER DEFAULT NULL, id_referenced_assembly INTEGER DEFAULT NULL, price_currency_id INTEGER DEFAULT NULL, quantity DOUBLE PRECISION NOT NULL, @@ -157,9 +156,8 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CONSTRAINT FK_8C74887E4AD2039E FOREIGN KEY (id_assembly) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, - CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE, - CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE, - CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE + CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE ) SQL); $this->addSql(<<<'SQL' @@ -168,9 +166,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration $this->addSql(<<<'SQL' CREATE INDEX IDX_8C74887EC22F6CC4 ON assembly_bom_entries (id_part) SQL); - $this->addSql(<<<'SQL' - CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project) - SQL); $this->addSql(<<<'SQL' CREATE INDEX IDX_8C74887E22522999 ON assembly_bom_entries (id_referenced_assembly) SQL); @@ -193,19 +188,19 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration { $this->addSql(<<<'SQL' CREATE TABLE assemblies ( - id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name VARCHAR(255) NOT NULL, - last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, - datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, - comment TEXT NOT NULL, - not_selectable BOOLEAN NOT NULL, - alternative_names TEXT DEFAULT NULL, - order_quantity INT NOT NULL, - status VARCHAR(64) DEFAULT NULL, - order_only_missing_parts BOOLEAN NOT NULL, - description TEXT NOT NULL, - parent_id INT DEFAULT NULL, - id_preview_attachment INT DEFAULT NULL, + id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, + last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, + comment TEXT NOT NULL, + not_selectable BOOLEAN NOT NULL, + alternative_names TEXT DEFAULT NULL, + order_quantity INT NOT NULL, + status VARCHAR(64) DEFAULT NULL, + order_only_missing_parts BOOLEAN NOT NULL, + description TEXT NOT NULL, + parent_id INT DEFAULT NULL, + id_preview_attachment INT DEFAULT NULL, PRIMARY KEY(id) ) SQL); @@ -217,18 +212,17 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration SQL); $this->addSql(<<<'SQL' CREATE TABLE assembly_bom_entries ( - id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - id_assembly INT DEFAULT NULL, - id_part INT DEFAULT NULL, - id_project INT DEFAULT NULL, - quantity DOUBLE PRECISION NOT NULL, - mountnames TEXT NOT NULL, - name VARCHAR(255) DEFAULT NULL, - comment TEXT NOT NULL, - price NUMERIC(11, 5) DEFAULT NULL, + id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + id_assembly INT DEFAULT NULL, + id_part INT DEFAULT NULL, + quantity DOUBLE PRECISION NOT NULL, + mountnames TEXT NOT NULL, + name VARCHAR(255) DEFAULT NULL, + comment TEXT NOT NULL, + price NUMERIC(11, 5) DEFAULT NULL, price_currency_id INT DEFAULT NULL, - last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, - datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, + last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY(id) ) SQL); @@ -238,9 +232,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration $this->addSql(<<<'SQL' CREATE INDEX IDX_8C74887EC22F6CC4 ON assembly_bom_entries (id_part) SQL); - $this->addSql(<<<'SQL' - CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project) - SQL); $this->addSql(<<<'SQL' CREATE INDEX IDX_8C74887E3FFDCD60 ON assembly_bom_entries (price_currency_id) SQL); @@ -256,9 +247,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration $this->addSql(<<<'SQL' ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE SQL); - $this->addSql(<<<'SQL' - ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES "projects" (id) NOT DEFERRABLE INITIALLY IMMEDIATE - SQL); $this->addSql(<<<'SQL' ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE SQL); diff --git a/migrations/Version20250627130848.php b/migrations/Version20250627130848.php index 16a6f318..6223de13 100644 --- a/migrations/Version20250627130848.php +++ b/migrations/Version20250627130848.php @@ -17,7 +17,7 @@ final class Version20250627130848 extends AbstractMultiPlatformMigration public function mySQLUp(Schema $schema): void { $this->addSql(<<<'SQL' - ALTER TABLE assembly_bom_entries ADD id_referenced_assembly INT DEFAULT NULL AFTER id_project + ALTER TABLE assembly_bom_entries ADD id_referenced_assembly INT DEFAULT NULL AFTER id_part SQL); $this->addSql(<<<'SQL' ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON DELETE SET NULL diff --git a/migrations/Version20250910113423.php b/migrations/Version20250910113423.php new file mode 100644 index 00000000..0e65e4ab --- /dev/null +++ b/migrations/Version20250910113423.php @@ -0,0 +1,51 @@ +addSql('ALTER TABLE assembly_bom_entries DROP FOREIGN KEY `FK_8C74887EF12E799E`'); + $this->addSql('DROP INDEX IDX_8C74887EF12E799E ON assembly_bom_entries'); + $this->addSql('ALTER TABLE assembly_bom_entries DROP id_project'); + } + + public function mySQLDown(Schema $schema): void + { + $this->addSql('ALTER TABLE assembly_bom_entries ADD id_project INT DEFAULT NULL'); + $this->addSql('ALTER TABLE assembly_bom_entries ADD CONSTRAINT `FK_8C74887EF12E799E` FOREIGN KEY (id_project) REFERENCES projects (id)'); + $this->addSql('CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project)'); + } + + public function sqLiteUp(Schema $schema): void + { + //nothing to do. Already removed from AssemblyBOMEntry and Version20250304081039 + } + + public function sqLiteDown(Schema $schema): void + { + //nothing to do. + } + + public function postgreSQLUp(Schema $schema): void + { + //nothing to do. Already removed from AssemblyBOMEntry and Version20250304081039 + } + + public function postgreSQLDown(Schema $schema): void + { + //nothing to do. + } +} diff --git a/src/Controller/AssemblyController.php b/src/Controller/AssemblyController.php index 94e12964..520bc52d 100644 --- a/src/Controller/AssemblyController.php +++ b/src/Controller/AssemblyController.php @@ -216,6 +216,7 @@ class AssemblyController extends AbstractController 'assembly.bom_import.type.json' => 'json', 'assembly.bom_import.type.csv' => 'csv', 'assembly.bom_import.type.kicad_pcbnew' => 'kicad_pcbnew', + 'assembly.bom_import.type.kicad_schematic' => 'kicad_schematic', ] ]); $builder->add('clear_existing_bom', CheckboxType::class, [ diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php index 2106098c..e510506f 100644 --- a/src/Controller/ProjectController.php +++ b/src/Controller/ProjectController.php @@ -193,10 +193,6 @@ class ProjectController extends AbstractController } // For PCB imports, proceed directly - $entries = $BOMImporter->importFileIntoProject($form->get('file')->getData(), $project, [ - 'type' => $import_type, - ]); - $importerResult = $BOMImporter->importFileIntoProject($form->get('file')->getData(), $project, [ 'type' => $import_type, ]); @@ -425,7 +421,7 @@ class ProjectController extends AbstractController } // Import with field mapping and priorities (validation already passed) - $entries = $BOMImporter->stringToBOMEntries($file_content, [ + $entries = $BOMImporter->stringToBOMEntries($project, $file_content, [ 'type' => 'kicad_schematic', 'field_mapping' => $field_mapping, 'field_priorities' => $field_priorities, diff --git a/src/DataTables/AssemblyBomEntriesDataTable.php b/src/DataTables/AssemblyBomEntriesDataTable.php index e506dccd..f9baeb86 100644 --- a/src/DataTables/AssemblyBomEntriesDataTable.php +++ b/src/DataTables/AssemblyBomEntriesDataTable.php @@ -34,8 +34,8 @@ use App\Entity\Attachments\Attachment; use App\Entity\Parts\Part; use App\Entity\AssemblySystem\AssemblyBOMEntry; use App\Entity\ProjectSystem\Project; -use App\Services\EntityURLGenerator; use App\Services\Formatters\AmountFormatter; +use App\Settings\BehaviorSettings\TableSettings; use Doctrine\ORM\QueryBuilder; use Omines\DataTablesBundle\Adapter\Doctrine\ORM\SearchCriteriaProvider; use Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter; @@ -47,15 +47,14 @@ use Symfony\Contracts\Translation\TranslatorInterface; class AssemblyBomEntriesDataTable implements DataTableTypeInterface { public function __construct( - protected TranslatorInterface $translator, - protected PartDataTableHelper $partDataTableHelper, - protected ProjectDataTableHelper $projectDataTableHelper, - protected AssemblyDataTableHelper $assemblyDataTableHelper, - protected EntityURLGenerator $entityURLGenerator, - protected AmountFormatter $amountFormatter, - private string $visible_columns, - private ColumnSortHelper $csh - ){ + private readonly TranslatorInterface $translator, + private readonly PartDataTableHelper $partDataTableHelper, + private readonly ProjectDataTableHelper $projectDataTableHelper, + private readonly AssemblyDataTableHelper $assemblyDataTableHelper, + private readonly AmountFormatter $amountFormatter, + private readonly ColumnSortHelper $csh, + private readonly TableSettings $tableSettings, + ) { } public function configure(DataTable $dataTable, array $options): void @@ -200,11 +199,11 @@ class AssemblyBomEntriesDataTable implements DataTableTypeInterface ]) ->add('lastModified', LocaleDateTimeColumn::class, [ 'label' => $this->translator->trans('part.table.lastModified'), - ]) - ; + ]); //Apply the user configured order and visibility and add the columns to the table - $this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->visible_columns,"TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS"); + $this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->tableSettings->assembliesBomDefaultColumns, + "TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS"); $dataTable->addOrderBy('name'); diff --git a/src/DataTables/AssemblyDataTable.php b/src/DataTables/AssemblyDataTable.php index 745a62b6..aaad2e45 100644 --- a/src/DataTables/AssemblyDataTable.php +++ b/src/DataTables/AssemblyDataTable.php @@ -34,6 +34,7 @@ use App\DataTables\Helpers\ColumnSortHelper; use App\Doctrine\Helpers\FieldHelper; use App\Entity\AssemblySystem\Assembly; use App\Services\EntityURLGenerator; +use App\Settings\BehaviorSettings\TableSettings; use Doctrine\ORM\AbstractQuery; use Doctrine\ORM\QueryBuilder; use Omines\DataTablesBundle\Adapter\Doctrine\ORM\SearchCriteriaProvider; @@ -53,8 +54,8 @@ final class AssemblyDataTable implements DataTableTypeInterface private readonly TranslatorInterface $translator, private readonly AssemblyDataTableHelper $assemblyDataTableHelper, private readonly Security $security, - private readonly string $visible_columns, private readonly ColumnSortHelper $csh, + private readonly TableSettings $tableSettings, ) { } @@ -139,7 +140,8 @@ final class AssemblyDataTable implements DataTableTypeInterface ]); //Apply the user configured order and visibility and add the columns to the table - $this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->visible_columns, "TABLE_ASSEMBLIES_DEFAULT_COLUMNS"); + $this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->tableSettings->assembliesDefaultColumns, + "TABLE_ASSEMBLIES_DEFAULT_COLUMNS"); $dataTable->addOrderBy('name') ->createAdapter(TwoStepORMAdapter::class, [ diff --git a/src/Entity/AssemblySystem/AssemblyBOMEntry.php b/src/Entity/AssemblySystem/AssemblyBOMEntry.php index 9bca209d..6de6cc3a 100644 --- a/src/Entity/AssemblySystem/AssemblyBOMEntry.php +++ b/src/Entity/AssemblySystem/AssemblyBOMEntry.php @@ -149,18 +149,6 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt #[Groups(['bom_entry:read', 'bom_entry:write'])] protected ?Assembly $referencedAssembly = null; - /** - * @var Project|null The associated project - */ - #[Assert\Expression( - '(this.getPart() === null or this.getProject() === null) and (this.getName() === null or (this.getName() != null and this.getName() != ""))', - message: 'validator.project.bom_entry.only_part_or_assembly_allowed' - )] - #[ORM\ManyToOne(targetEntity: Project::class)] - #[ORM\JoinColumn(name: 'id_project', nullable: true)] - #[Groups(['bom_entry:read', 'bom_entry:write'])] - protected ?Project $project = null; - /** * @var BigDecimal|null The price of this non-part BOM entry */ diff --git a/src/Form/AdminPages/AssemblyAdminForm.php b/src/Form/AdminPages/AssemblyAdminForm.php index 0512f64a..2c2f3cc4 100644 --- a/src/Form/AdminPages/AssemblyAdminForm.php +++ b/src/Form/AdminPages/AssemblyAdminForm.php @@ -26,6 +26,7 @@ use App\Entity\Base\AbstractNamedDBElement; use App\Form\AssemblySystem\AssemblyBOMEntryCollectionType; use App\Form\Type\RichTextEditorType; use App\Services\LogSystem\EventCommentNeededHelper; +use App\Settings\MiscSettings\AssemblySettings; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\TextType; @@ -36,9 +37,9 @@ class AssemblyAdminForm extends BaseEntityAdminForm public function __construct( protected Security $security, protected EventCommentNeededHelper $eventCommentNeededHelper, - protected bool $useAssemblyIpnPlaceholder = false + protected AssemblySettings $assemblySettings, ) { - parent::__construct($security, $eventCommentNeededHelper, $useAssemblyIpnPlaceholder); + parent::__construct($security, $eventCommentNeededHelper, $assemblySettings); } protected function additionalFormElements(FormBuilderInterface $builder, array $options, AbstractNamedDBElement $entity): void diff --git a/src/Form/AdminPages/BaseEntityAdminForm.php b/src/Form/AdminPages/BaseEntityAdminForm.php index bbc437e3..5ffd7f4d 100644 --- a/src/Form/AdminPages/BaseEntityAdminForm.php +++ b/src/Form/AdminPages/BaseEntityAdminForm.php @@ -27,6 +27,7 @@ use App\Entity\PriceInformations\Currency; use App\Entity\ProjectSystem\Project; use App\Entity\UserSystem\Group; use App\Services\LogSystem\EventCommentType; +use App\Settings\MiscSettings\AssemblySettings; use Symfony\Bundle\SecurityBundle\Security; use App\Entity\Base\AbstractNamedDBElement; use App\Entity\Base\AbstractStructuralDBElement; @@ -51,7 +52,7 @@ class BaseEntityAdminForm extends AbstractType public function __construct( protected Security $security, protected EventCommentNeededHelper $eventCommentNeededHelper, - protected bool $useAssemblyIpnPlaceholder = false + protected AssemblySettings $assemblySettings, ) { } @@ -73,7 +74,7 @@ class BaseEntityAdminForm extends AbstractType ->add('name', TextType::class, [ 'empty_data' => '', 'label' => 'name.label', - 'data' => $is_new && $entity instanceof Assembly && $this->useAssemblyIpnPlaceholder ? '%%ipn%%' : $entity->getName(), + 'data' => $is_new && $entity instanceof Assembly && $this->assemblySettings->useIpnPlaceholderInName ? '%%ipn%%' : $entity->getName(), 'attr' => [ 'placeholder' => 'part.name.placeholder', ], diff --git a/src/Services/ImportExportSystem/BOMImporter.php b/src/Services/ImportExportSystem/BOMImporter.php index 1a57e1f9..5f3310ef 100644 --- a/src/Services/ImportExportSystem/BOMImporter.php +++ b/src/Services/ImportExportSystem/BOMImporter.php @@ -63,19 +63,29 @@ class BOMImporter 5 => 'Supplier and ref', ]; + private readonly PartRepository $partRepository; + + private readonly ManufacturerRepository $manufacturerRepository; + + private readonly CategoryRepository $categoryRepository; + + private readonly DBElementRepository $projectBomEntryRepository; + + private readonly DBElementRepository $assemblyBomEntryRepository; + private string $jsonRoot = ''; public function __construct( private readonly EntityManagerInterface $entityManager, private readonly LoggerInterface $logger, private readonly BOMValidationService $validationService, - private readonly PartRepository $partRepository, - private readonly ManufacturerRepository $manufacturerRepository, - private readonly CategoryRepository $categoryRepository, - private readonly DBElementRepository $projectBOMEntryRepository, - private readonly DBElementRepository $assemblyBOMEntryRepositor, private readonly TranslatorInterface $translator ) { + $this->partRepository = $this->entityManager->getRepository(Part::class); + $this->manufacturerRepository = $this->entityManager->getRepository(Manufacturer::class); + $this->categoryRepository = $this->entityManager->getRepository(Category::class); + $this->projectBomEntryRepository = $this->entityManager->getRepository(ProjectBOMEntry::class); + $this->assemblyBomEntryRepository = $this->entityManager->getRepository(AssemblyBOMEntry::class); } protected function configureOptions(OptionsResolver $resolver): OptionsResolver @@ -244,7 +254,7 @@ class BOMImporter $options = $resolver->resolve($options); return match ($options['type']) { - self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $objectType)->getBomEntries(), + self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $importObject)->getBomEntries(), self::IMPORT_TYPE_KICAD_SCHEMATIC => $this->parseKiCADSchematic($data, $options), default => throw new InvalidArgumentException($this->translator->trans('validator.bom_importer.invalid_import_type', [], 'validators')), }; @@ -272,7 +282,7 @@ class BOMImporter )); return match ($options['type']) { - self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($importObject, $data, $options), + self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $importObject), self::IMPORT_TYPE_JSON => $this->parseJson($importObject, $data), self::IMPORT_TYPE_CSV => $this->parseCsv($importObject, $data), default => $defaultImporterResult, @@ -286,14 +296,13 @@ class BOMImporter * validates the required fields, and creates BOM entries for each record in the data. * The BOM entries are added to the provided Project or Assembly, depending on the context. * + * @param string $data The semicolon- or comma-delimited CSV data to be parsed. * @param Project|Assembly $importObject The object determining the context of the BOM entry (either a Project or Assembly). - * @param string $data The semicolon- or comma-delimited CSV data to be parsed. - * * @return ImporterResult The result of the import process, containing the created BOM entries. * * @throws UnexpectedValueException If required fields are missing in the provided data. */ - private function parseKiCADPCB(Project|Assembly $importObject, string $data): ImporterResult + private function parseKiCADPCB(string $data, Project|Assembly $importObject): ImporterResult { $result = new ImporterResult(); @@ -818,11 +827,11 @@ class BOMImporter } if ($importObject instanceof Assembly) { - $bomEntry = $this->assemblyBOMEntryRepository->findOneBy(['assembly' => $importObject, 'part' => $part]); + $bomEntry = $this->assemblyBomEntryRepository->findOneBy(['assembly' => $importObject, 'part' => $part]); if ($bomEntry === null) { if (isset($entry['name']) && $entry['name'] !== '') { - $bomEntry = $this->assemblyBOMEntryRepository->findOneBy(['assembly' => $importObject, 'name' => $entry['name']]); + $bomEntry = $this->assemblyBomEntryRepository->findOneBy(['assembly' => $importObject, 'name' => $entry['name']]); } if ($bomEntry === null) { @@ -830,11 +839,11 @@ class BOMImporter } } } else { - $bomEntry = $this->projectBOMEntryRepository->findOneBy(['project' => $importObject, 'part' => $part]); + $bomEntry = $this->projectBomEntryRepository->findOneBy(['project' => $importObject, 'part' => $part]); if ($bomEntry === null) { if (isset($entry['name']) && $entry['name'] !== '') { - $bomEntry = $this->projectBOMEntryRepository->findOneBy(['project' => $importObject, 'name' => $entry['name']]); + $bomEntry = $this->projectBomEntryRepository->findOneBy(['project' => $importObject, 'name' => $entry['name']]); } if ($bomEntry === null) { diff --git a/src/Settings/BehaviorSettings/AssemblyBomTableColumns.php b/src/Settings/BehaviorSettings/AssemblyBomTableColumns.php new file mode 100644 index 00000000..da8557c2 --- /dev/null +++ b/src/Settings/BehaviorSettings/AssemblyBomTableColumns.php @@ -0,0 +1,46 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\BehaviorSettings; + +use Symfony\Contracts\Translation\TranslatableInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +enum AssemblyBomTableColumns : string implements TranslatableInterface +{ + + case NAME = "name"; + case ID = "id"; + case QUANTITY = "quantity"; + case IPN = "ipn"; + case DESCRIPTION = "description"; + + public function trans(TranslatorInterface $translator, ?string $locale = null): string + { + $key = match($this) { + default => 'assembly.bom.table.' . $this->value, + }; + + return $translator->trans($key, locale: $locale); + } +} diff --git a/src/Settings/BehaviorSettings/AssemblyTableColumns.php b/src/Settings/BehaviorSettings/AssemblyTableColumns.php new file mode 100644 index 00000000..02c315b4 --- /dev/null +++ b/src/Settings/BehaviorSettings/AssemblyTableColumns.php @@ -0,0 +1,49 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\BehaviorSettings; + +use Symfony\Contracts\Translation\TranslatableInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +enum AssemblyTableColumns : string implements TranslatableInterface +{ + + case NAME = "name"; + case ID = "id"; + case IPN = "ipn"; + case DESCRIPTION = "description"; + case REFERENCED_ASSEMBLIES = "referencedAssemblies"; + case ADDED_DATE = "addedDate"; + case LAST_MODIFIED = "lastModified"; + case EDIT = "edit"; + + public function trans(TranslatorInterface $translator, ?string $locale = null): string + { + $key = match($this) { + default => 'assembly.table.' . $this->value, + }; + + return $translator->trans($key, locale: $locale); + } +} diff --git a/src/Settings/BehaviorSettings/TableSettings.php b/src/Settings/BehaviorSettings/TableSettings.php index b6964876..5c7455e2 100644 --- a/src/Settings/BehaviorSettings/TableSettings.php +++ b/src/Settings/BehaviorSettings/TableSettings.php @@ -53,7 +53,6 @@ class TableSettings )] public int $fullDefaultPageSize = 50; - /** @var PartTableColumns[] */ #[SettingsParameter(ArrayType::class, label: new TM("settings.behavior.table.parts_default_columns"), @@ -70,6 +69,37 @@ class TableSettings PartTableColumns::CATEGORY, PartTableColumns::FOOTPRINT, PartTableColumns::MANUFACTURER, PartTableColumns::LOCATION, PartTableColumns::AMOUNT]; + /** @var AssemblyTableColumns[] */ + #[SettingsParameter(ArrayType::class, + label: new TM("settings.behavior.table.assemblies_default_columns"), + description: new TM("settings.behavior.table.assemblies_default_columns.help"), + options: ['type' => EnumType::class, 'options' => ['class' => AssemblyTableColumns::class]], + formType: \Symfony\Component\Form\Extension\Core\Type\EnumType::class, + formOptions: ['class' => AssemblyTableColumns::class, 'multiple' => true, 'ordered' => true], + envVar: "TABLE_ASSEMBLIES_DEFAULT_COLUMNS", envVarMode: EnvVarMode::OVERWRITE, envVarMapper: [self::class, 'mapAssembliesDefaultColumnsEnv'] + )] + #[Assert\NotBlank()] + #[Assert\Unique()] + #[Assert\All([new Assert\Type(AssemblyTableColumns::class)])] + public array $assembliesDefaultColumns = [AssemblyTableColumns::ID, AssemblyTableColumns::IPN, AssemblyTableColumns::NAME, + AssemblyTableColumns::DESCRIPTION, AssemblyTableColumns::REFERENCED_ASSEMBLIES, AssemblyTableColumns::EDIT]; + + /** @var AssemblyBomTableColumns[] */ + #[SettingsParameter(ArrayType::class, + label: new TM("settings.behavior.table.assemblies_bom_default_columns"), + description: new TM("settings.behavior.table.assemblies_bom_default_columns.help"), + options: ['type' => EnumType::class, 'options' => ['class' => AssemblyBomTableColumns::class]], + formType: \Symfony\Component\Form\Extension\Core\Type\EnumType::class, + formOptions: ['class' => AssemblyBomTableColumns::class, 'multiple' => true, 'ordered' => true], + envVar: "TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS", envVarMode: EnvVarMode::OVERWRITE, envVarMapper: [self::class, 'mapAssemblyBomsDefaultColumnsEnv'] + )] + #[Assert\NotBlank()] + #[Assert\Unique()] + #[Assert\All([new Assert\Type(AssemblyBomTableColumns::class)])] + + public array $assembliesBomDefaultColumns = [AssemblyBomTableColumns::QUANTITY, AssemblyTableColumns::ID, AssemblyTableColumns::IPN, + AssemblyTableColumns::NAME, AssemblyTableColumns::DESCRIPTION]; + #[SettingsParameter(label: new TM("settings.behavior.table.preview_image_min_width"), formOptions: ['attr' => ['min' => 1, 'max' => 100]], envVar: "int:TABLE_IMAGE_PREVIEW_MIN_SIZE", envVarMode: EnvVarMode::OVERWRITE @@ -101,4 +131,36 @@ class TableSettings return $ret; } + public static function mapAssembliesDefaultColumnsEnv(string $columns): array + { + $exploded = explode(',', $columns); + $ret = []; + foreach ($exploded as $column) { + $enum = AssemblyTableColumns::tryFrom($column); + if (!$enum) { + throw new \InvalidArgumentException("Invalid column '$column' in TABLE_ASSEMBLIES_DEFAULT_COLUMNS"); + } + + $ret[] = $enum; + } + + return $ret; + } + + public static function mapAssemblyBomsDefaultColumnsEnv(string $columns): array + { + $exploded = explode(',', $columns); + $ret = []; + foreach ($exploded as $column) { + $enum = AssemblyBomTableColumns::tryFrom($column); + if (!$enum) { + throw new \InvalidArgumentException("Invalid column '$column' in TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS"); + } + + $ret[] = $enum; + } + + return $ret; + } + } diff --git a/src/Settings/MiscSettings/AssemblySettings.php b/src/Settings/MiscSettings/AssemblySettings.php new file mode 100644 index 00000000..82fb26b6 --- /dev/null +++ b/src/Settings/MiscSettings/AssemblySettings.php @@ -0,0 +1,45 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\MiscSettings; + +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Jbtronics\SettingsBundle\Settings\SettingsTrait; +use Symfony\Component\Translation\TranslatableMessage as TM; + +#[Settings(label: new TM("settings.misc.assembly"))] +#[SettingsIcon("fa-list")] +class AssemblySettings +{ + use SettingsTrait; + + #[SettingsParameter( + label: new TM("settings.misc.assembly.useIpnPlaceholderInName"), + envVar: "bool:CREATE_ASSEMBLY_USE_IPN_PLACEHOLDER_IN_NAME", envVarMode: EnvVarMode::OVERWRITE, + )] + public bool $useIpnPlaceholderInName = true; +} diff --git a/src/Settings/MiscSettings/MiscSettings.php b/src/Settings/MiscSettings/MiscSettings.php index b8a3a73f..68d0cf6d 100644 --- a/src/Settings/MiscSettings/MiscSettings.php +++ b/src/Settings/MiscSettings/MiscSettings.php @@ -34,4 +34,7 @@ class MiscSettings #[EmbeddedSettings] public ?ExchangeRateSettings $exchangeRate = null; -} \ No newline at end of file + + #[EmbeddedSettings] + public ?AssemblySettings $assembly = null; +} diff --git a/translations/messages.cs.xlf b/translations/messages.cs.xlf index 778b3461..c5f9000a 100644 --- a/translations/messages.cs.xlf +++ b/translations/messages.cs.xlf @@ -13138,6 +13138,30 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz Sloupce, které se mají ve výchozím nastavení zobrazovat v částečných tabulkách. Pořadí položek lze změnit pomocí funkce drag & drop. + + + settings.behavior.table.assemblies_default_columns + Výchozí sloupce pro tabulky sestav + + + + + settings.behavior.table.assemblies_default_columns.help + Sloupce, které by měly být zobrazeny ve výchozím nastavení v tabulkách sestav. Pořadí prvků lze změnit přetažením. + + + + + settings.behavior.table.assemblies_bom_default_columns + Výchozí sloupce pro kusovníky sestav + + + + + settings.behavior.table.assemblies_bom_default_columns.help + Sloupce, které by měly být zobrazeny ve výchozím nastavení v kusovnících sestav. Pořadí prvků lze změnit přetažením. + + settings.ips.oemsecrets @@ -13348,6 +13372,18 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz Pokud potřebujete směnné kurzy mezi měnami mimo eurozónu, můžete zde zadat API klíč z fixer.io. + + + settings.misc.assembly + Sestavy + + + + + settings.misc.assembly.useIpnPlaceholderInName + Použít zástupný symbol %%ipn%% v názvu sestavy. Zástupný symbol bude při ukládání nahrazen vstupem IPN. + + settings.behavior.part_info @@ -13792,6 +13828,12 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz CSV (KiCAD Pcbnew BOM) + + + assembly.bom_import.type.kicad_schematic + KiCAD Schématický editor BOM (CSV soubor) + + assembly.bom_import.clear_existing_bom @@ -14757,6 +14799,12 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz Popis + + + assembly.table.referencedAssemblies + Referenceované sestavy + + assembly.table.addedDate @@ -14787,6 +14835,36 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz Neplatný regulární výraz (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Název + + + + + assembly.bom.table.quantity + Množství + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Popis + + datasource.synonym diff --git a/translations/messages.da.xlf b/translations/messages.da.xlf index 8e66fdf4..4518c801 100644 --- a/translations/messages.da.xlf +++ b/translations/messages.da.xlf @@ -12953,6 +12953,12 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver CSV (KiCAD Pcbnew BOM) + + + assembly.bom_import.type.kicad_schematic + KiCAD Skematisk editor BOM (CSV-fil) + + assembly.bom_import.clear_existing_bom @@ -13438,6 +13444,12 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver Beskrivelse + + + assembly.table.referencedAssemblies + Referencerede forsamlinger + + assembly.table.addedDate @@ -13468,6 +13480,36 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver Ugyldigt regulært udtryk (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Navn + + + + + assembly.bom.table.quantity + Mængde + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Beskrivelse + + datasource.synonym diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf index 3bc10765..31b5f5e9 100644 --- a/translations/messages.de.xlf +++ b/translations/messages.de.xlf @@ -13236,6 +13236,30 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Die Spalten, die standardmäßig in Bauteiltabellen angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag & Drop geändert werden. + + + settings.behavior.table.assemblies_default_columns + Standardmäßige Spalten für Baugruppentabellen + + + + + settings.behavior.table.assemblies_default_columns.help + Die Spalten, die standardmäßig in Baugruppentabellen angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag & Drop geändert werden. + + + + + settings.behavior.table.assemblies_bom_default_columns + Standardmäßige Spalten für Baugruppen-Stücklisten + + + + + settings.behavior.table.assemblies_bom_default_columns.help + Die Spalten, die standardmäßig in Baugruppen-Stücklisten angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag & Drop geändert werden. + + settings.ips.oemsecrets @@ -13686,6 +13710,12 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön CSV (KiCAD Pcbnew BOM) + + + assembly.bom_import.type.kicad_schematic + KiCAD Schaltplaneditor BOM (CSV Datei) + + assembly.bom_import.clear_existing_bom @@ -14201,6 +14231,18 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Wenn Sie Wechselkurse zwischen Nicht-Euro-Währungen benötigen, können Sie hier einen API-Schlüssel von fixer.io eingeben. + + + settings.misc.assembly + Baugruppen + + + + + settings.misc.assembly.useIpnPlaceholderInName + Verwenden Sie einen %%ipn%%-Platzhalter im Namen einer Baugruppe. Der Platzhalter wird beim Speichern durch die eingegebene IPN ersetzt. + + settings.behavior.part_info @@ -15431,6 +15473,12 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Beschreibung + + + assembly.table.referencedAssemblies + Referenzierte Baugruppen + + assembly.table.addedDate @@ -15461,6 +15509,36 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Ungültiger regulärer Ausdruck (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Name + + + + + assembly.bom.table.quantity + Stückzahl + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Beschreibung + + datasource.synonym diff --git a/translations/messages.el.xlf b/translations/messages.el.xlf index 6f4e3f68..fecbac21 100644 --- a/translations/messages.el.xlf +++ b/translations/messages.el.xlf @@ -1961,6 +1961,12 @@ CSV (KiCAD Pcbnew BOM) + + + assembly.bom_import.type.kicad_schematic + KiCAD Σχηματικό BOM (CSV αρχείο) + + assembly.bom_import.clear_existing_bom @@ -2446,6 +2452,12 @@ Περιγραφή + + + assembly.table.referencedAssemblies + Αναφερόμενες συναρμολογήσεις + + assembly.table.addedDate @@ -2476,6 +2488,36 @@ Μη έγκυρη κανονική έκφραση (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Όνομα + + + + + assembly.bom.table.quantity + Ποσότητα + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Περιγραφή + + datasource.synonym diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 3984257d..1295c253 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -13237,6 +13237,30 @@ Please note, that you can not impersonate a disabled user. If you try you will g The columns to show by default in part tables. Order of items can be changed via drag & drop. + + + settings.behavior.table.assemblies_default_columns + Default columns for assembly tables + + + + + settings.behavior.table.assemblies_default_columns.help + The columns to show by default in assembly tables. Order of items can be changed via drag & drop. + + + + + settings.behavior.table.assemblies_bom_default_columns + Default columns for assembly BOM tables + + + + + settings.behavior.table.assemblies_bom_default_columns.help + The columns to show by default in assembly BOM tables. Order of items can be changed via drag & drop. + + settings.ips.oemsecrets @@ -13687,6 +13711,12 @@ Please note, that you can not impersonate a disabled user. If you try you will g CSV (KiCAD Pcbnew BOM) + + + assembly.bom_import.type.kicad_schematic + KiCAD Schematic BOM (CSV file) + + assembly.bom_import.clear_existing_bom @@ -14202,6 +14232,18 @@ Please note, that you can not impersonate a disabled user. If you try you will g If you need exchange rates between non-euro currencies, you can input an API key from fixer.io here. + + + settings.misc.assembly + Assemblies + + + + + settings.misc.assembly.useIpnPlaceholderInName + Use an %%ipn%% placeholder in the name of an assembly. Placeholder is replaced with the ipn input while saving. + + settings.behavior.part_info @@ -15432,6 +15474,12 @@ Please note, that you can not impersonate a disabled user. If you try you will g Description + + + assembly.table.referencedAssemblies + Referenced assemblies + + assembly.table.addedDate @@ -15462,6 +15510,36 @@ Please note, that you can not impersonate a disabled user. If you try you will g Invalid regular expression (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Name + + + + + assembly.bom.table.quantity + Quantity + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Description + + datasource.synonym diff --git a/translations/messages.es.xlf b/translations/messages.es.xlf index 5927b8ec..0268e83c 100644 --- a/translations/messages.es.xlf +++ b/translations/messages.es.xlf @@ -13101,6 +13101,12 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S CSV (KiCAD Pcbnew BOM) + + + assembly.bom_import.type.kicad_schematic + KiCAD Editor Esquemático BOM (archivo CSV) + + assembly.bom_import.clear_existing_bom @@ -13610,6 +13616,12 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S Descripción + + + assembly.table.referencedAssemblies + Ensambles referenciados + + assembly.table.addedDate @@ -13640,6 +13652,36 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S Expresión regular no válida (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Nombre + + + + + assembly.bom.table.quantity + Cantidad + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Descripción + + datasource.synonym diff --git a/translations/messages.fr.xlf b/translations/messages.fr.xlf index bb7128e5..44af739d 100644 --- a/translations/messages.fr.xlf +++ b/translations/messages.fr.xlf @@ -9535,6 +9535,12 @@ exemple de ville CSV (KiCAD Pcbnew BOM) + + + assembly.bom_import.type.kicad_schematic + KiCAD Éditeur Schématique BOM (fichier CSV) + + assembly.bom_import.clear_existing_bom @@ -10020,6 +10026,12 @@ exemple de ville Description + + + assembly.table.referencedAssemblies + Ensembles référencés + + assembly.table.addedDate @@ -10050,6 +10062,36 @@ exemple de ville Expression régulière invalide (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Nom + + + + + assembly.bom.table.quantity + Quantité + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Description + + datasource.synonym diff --git a/translations/messages.it.xlf b/translations/messages.it.xlf index 29a9d64c..70ae96f2 100644 --- a/translations/messages.it.xlf +++ b/translations/messages.it.xlf @@ -13103,6 +13103,12 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a CSV (KiCAD Pcbnew) + + + assembly.bom_import.type.kicad_schematic + KiCAD Editor Schematico BOM (file CSV) + + assembly.bom_import.clear_existing_bom @@ -13612,6 +13618,12 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a Descrizione + + + assembly.table.referencedAssemblies + Assiemi referenziati + + assembly.table.addedDate @@ -13642,6 +13654,36 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a Espressione regolare non valida (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Nome + + + + + assembly.bom.table.quantity + Quantità + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Descrizione + + datasource.synonym diff --git a/translations/messages.ja.xlf b/translations/messages.ja.xlf index 95b9bc81..13ced250 100644 --- a/translations/messages.ja.xlf +++ b/translations/messages.ja.xlf @@ -9248,6 +9248,12 @@ Exampletown CSV (KiCAD Pcbnew) + + + assembly.bom_import.type.kicad_schematic + KiCAD 回路図エディタ BOM (CSV ファイル) + + assembly.bom_import.clear_existing_bom @@ -9733,6 +9739,12 @@ Exampletown 説明 + + + assembly.table.referencedAssemblies + 参照されているアセンブリ + + assembly.table.addedDate @@ -9763,6 +9775,36 @@ Exampletown 無効な正規表現(regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + 名前 + + + + + assembly.bom.table.quantity + 数量 + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + 説明 + + datasource.synonym diff --git a/translations/messages.nl.xlf b/translations/messages.nl.xlf index 5b8fe89f..5d473dc2 100644 --- a/translations/messages.nl.xlf +++ b/translations/messages.nl.xlf @@ -1186,6 +1186,12 @@ CSV (KiCAD Pcbnew) + + + assembly.bom_import.type.kicad_schematic + KiCAD Schematische editor BOM (CSV-bestand) + + assembly.bom_import.clear_existing_bom @@ -1671,6 +1677,12 @@ Beschrijving + + + assembly.table.referencedAssemblies + Gerefereerde assemblages + + assembly.table.addedDate @@ -1701,6 +1713,36 @@ Ongeldige reguliere expressie (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Naam + + + + + assembly.bom.table.quantity + Hoeveelheid + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Beschrijving + + datasource.synonym diff --git a/translations/messages.pl.xlf b/translations/messages.pl.xlf index 3be5447f..88ba9a0a 100644 --- a/translations/messages.pl.xlf +++ b/translations/messages.pl.xlf @@ -12980,6 +12980,12 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli CSV (KiCAD Pcbnew) + + + assembly.bom_import.type.kicad_schematic + KiCAD Schematyczny edytor BOM (plik CSV) + + assembly.bom_import.clear_existing_bom @@ -13465,6 +13471,12 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli Opis + + + assembly.table.referencedAssemblies + Zestawy referencyjne + + assembly.table.addedDate @@ -13495,6 +13507,36 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli Nieprawidłowe wyrażenie regularne (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Nazwa + + + + + assembly.bom.table.quantity + Ilość + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Opis + + datasource.synonym diff --git a/translations/messages.ru.xlf b/translations/messages.ru.xlf index e7b4ef93..4d0b102b 100644 --- a/translations/messages.ru.xlf +++ b/translations/messages.ru.xlf @@ -737,7 +737,7 @@ user.edit.tfa.disable_tfa_message - Это выключит <b>все активные двухфакторной способы аутентификации пользователя</b>и удалит <b>резервные коды</b>! + Это выключит <b>все активные двухфакторной способы аутентификации пользователя</b>и удалит <b>резервные коды</b>! <br> Пользователь должен будет снова настроить все методы двухфакторной аутентификации и распечатать новые резервные коды! <br><br> <b>Делайте это только в том случае, если вы абсолютно уверены в личности пользователя (обращающегося за помощью), в противном случае учетная запись может быть взломана злоумышленником!</b> @@ -3746,7 +3746,7 @@ tfa_backup.reset_codes.confirm_message - Это удалит все предыдущие коды и создаст набор новых. Это не может быть отменено. + Это удалит все предыдущие коды и создаст набор новых. Это не может быть отменено. Не забудьте распечатать новы кода и хранить их в безопасном месте! @@ -13080,6 +13080,12 @@ CSV (KiCAD Pcbnew) + + + assembly.bom_import.type.kicad_schematic + KiCAD Схематический редактор BOM (CSV файл) + + assembly.bom_import.clear_existing_bom @@ -13565,6 +13571,12 @@ Описание + + + assembly.table.referencedAssemblies + Ссылочные сборки + + assembly.table.addedDate @@ -13595,6 +13607,36 @@ Неверное регулярное выражение (regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + Название + + + + + assembly.bom.table.quantity + Количество + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + Описание + + datasource.synonym diff --git a/translations/messages.zh.xlf b/translations/messages.zh.xlf index 8d445de4..6fc40930 100644 --- a/translations/messages.zh.xlf +++ b/translations/messages.zh.xlf @@ -12965,6 +12965,12 @@ Element 3 CSV 文件(KiCAD Pcbnew) + + + assembly.bom_import.type.kicad_schematic + KiCAD 原理图编辑器 BOM(CSV 文件) + + assembly.bom_import.clear_existing_bom @@ -13450,6 +13456,12 @@ Element 3 描述 + + + assembly.table.referencedAssemblies + 引用的组件 + + assembly.table.addedDate @@ -13480,6 +13492,36 @@ Element 3 无效的正则表达式(regex) + + + assembly.bom.table.id + ID + + + + + assembly.bom.table.name + 名称 + + + + + assembly.bom.table.quantity + 数量 + + + + + assembly.bom.table.ipn + IPN + + + + + assembly.bom.table.description + 描述 + + datasource.synonym diff --git a/translations/validators.cs.xlf b/translations/validators.cs.xlf index 838f4745..66f440d1 100644 --- a/translations/validators.cs.xlf +++ b/translations/validators.cs.xlf @@ -251,12 +251,6 @@ Musíte vybrat díl pro položku BOM dílu nebo nastavit název pro položku BOM bez dílu. - - - validator.project.bom_entry.only_part_or_assembly_allowed - Je povoleno vybrat pouze jednu součástku nebo sestavu. Upravit prosím svůj výběr! - - project.bom_entry.name_already_in_bom