mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2025-06-25 11:18:51 +02:00
Use enum for manufacturing status
This commit is contained in:
parent
6336b38cfc
commit
9e3cb4d694
7 changed files with 88 additions and 30 deletions
|
@ -31,10 +31,14 @@ class EnumColumn extends AbstractColumn
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @phpstan-return T
|
* @phpstan-return T|null
|
||||||
*/
|
*/
|
||||||
public function normalize($value): UnitEnum
|
public function normalize($value): ?UnitEnum
|
||||||
{
|
{
|
||||||
|
if ($value === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_a($value, $this->getEnumClass())) {
|
if (is_a($value, $this->getEnumClass())) {
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\DataTables;
|
namespace App\DataTables;
|
||||||
|
|
||||||
|
use App\DataTables\Column\EnumColumn;
|
||||||
|
use App\Entity\Parts\ManufacturingStatus;
|
||||||
use Symfony\Bundle\SecurityBundle\Security;
|
use Symfony\Bundle\SecurityBundle\Security;
|
||||||
use App\Entity\Parts\Storelocation;
|
use App\Entity\Parts\Storelocation;
|
||||||
use App\DataTables\Adapters\CustomFetchJoinORMAdapter;
|
use App\DataTables\Adapters\CustomFetchJoinORMAdapter;
|
||||||
|
@ -227,18 +229,17 @@ final class PartsDataTable implements DataTableTypeInterface
|
||||||
'label' => $this->translator->trans('part.table.favorite'),
|
'label' => $this->translator->trans('part.table.favorite'),
|
||||||
'visible' => false,
|
'visible' => false,
|
||||||
])
|
])
|
||||||
->add('manufacturing_status', MapColumn::class, [
|
->add('manufacturing_status', EnumColumn::class, [
|
||||||
'label' => $this->translator->trans('part.table.manufacturingStatus'),
|
'label' => $this->translator->trans('part.table.manufacturingStatus'),
|
||||||
'visible' => false,
|
'visible' => false,
|
||||||
'default' => $this->translator->trans('m_status.unknown'),
|
'class' => ManufacturingStatus::class,
|
||||||
'map' => [
|
'render' => function(?ManufacturingStatus $status, Part $context): string {
|
||||||
'' => $this->translator->trans('m_status.unknown'),
|
if (!$status) {
|
||||||
'announced' => $this->translator->trans('m_status.announced'),
|
return '';
|
||||||
'active' => $this->translator->trans('m_status.active'),
|
}
|
||||||
'nrfnd' => $this->translator->trans('m_status.nrfnd'),
|
|
||||||
'eol' => $this->translator->trans('m_status.eol'),
|
return $this->translator->trans($status->toTranslationKey());
|
||||||
'discontinued' => $this->translator->trans('m_status.discontinued'),
|
} ,
|
||||||
],
|
|
||||||
])
|
])
|
||||||
->add('manufacturer_product_number', TextColumn::class, [
|
->add('manufacturer_product_number', TextColumn::class, [
|
||||||
'label' => $this->translator->trans('part.table.mpn'),
|
'label' => $this->translator->trans('part.table.mpn'),
|
||||||
|
|
53
src/Entity/Parts/ManufacturingStatus.php
Normal file
53
src/Entity/Parts/ManufacturingStatus.php
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2023 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
|
||||||
|
namespace App\Entity\Parts;
|
||||||
|
|
||||||
|
enum ManufacturingStatus: string
|
||||||
|
{
|
||||||
|
/** Part has been announced, but is not in production yet */
|
||||||
|
case ANNOUNCED = 'announced';
|
||||||
|
/** Part is in production and will be for the foreseeable future */
|
||||||
|
case ACTIVE = 'active';
|
||||||
|
/** Not recommended for new designs. */
|
||||||
|
case NRFND = 'nrfnd';
|
||||||
|
/** End of life: Part will become discontinued soon */
|
||||||
|
case EOL = 'eol';
|
||||||
|
/** Part is obsolete/discontinued by the manufacturer. */
|
||||||
|
case DISCONTINUED = 'discontinued';
|
||||||
|
|
||||||
|
/** Status not set */
|
||||||
|
case NOT_SET = '';
|
||||||
|
|
||||||
|
public function toTranslationKey(): string
|
||||||
|
{
|
||||||
|
return match ($this) {
|
||||||
|
self::ANNOUNCED => 'm_status.announced',
|
||||||
|
self::ACTIVE => 'm_status.active',
|
||||||
|
self::NRFND => 'm_status.nrfnd',
|
||||||
|
self::EOL => 'm_status.eol',
|
||||||
|
self::DISCONTINUED => 'm_status.discontinued',
|
||||||
|
self::NOT_SET => '',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,6 +22,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Entity\Parts\PartTraits;
|
namespace App\Entity\Parts\PartTraits;
|
||||||
|
|
||||||
|
use App\Entity\Parts\ManufacturingStatus;
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use App\Entity\Parts\Manufacturer;
|
use App\Entity\Parts\Manufacturer;
|
||||||
use App\Entity\Parts\Part;
|
use App\Entity\Parts\Part;
|
||||||
|
@ -60,12 +61,11 @@ trait ManufacturerTrait
|
||||||
protected string $manufacturer_product_number = '';
|
protected string $manufacturer_product_number = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string|null The production status of this part. Can be one of the specified ones.
|
* @var ManufacturingStatus|null The production status of this part. Can be one of the specified ones.
|
||||||
*/
|
*/
|
||||||
#[Assert\Choice(['announced', 'active', 'nrfnd', 'eol', 'discontinued', ''])]
|
|
||||||
#[Groups(['extended', 'full', 'import'])]
|
#[Groups(['extended', 'full', 'import'])]
|
||||||
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
|
#[ORM\Column(type: Types::STRING, length: 255, nullable: true, enumType: ManufacturingStatus::class)]
|
||||||
protected ?string $manufacturing_status = '';
|
protected ?ManufacturingStatus $manufacturing_status = ManufacturingStatus::NOT_SET;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the link to the website of the article on the manufacturers website
|
* Get the link to the website of the article on the manufacturers website
|
||||||
|
@ -113,9 +113,9 @@ trait ManufacturerTrait
|
||||||
* * "eol": Part will become discontinued soon
|
* * "eol": Part will become discontinued soon
|
||||||
* * "discontinued": Part is obsolete/discontinued by the manufacturer.
|
* * "discontinued": Part is obsolete/discontinued by the manufacturer.
|
||||||
*
|
*
|
||||||
* @return string
|
* @return ManufacturingStatus|null
|
||||||
*/
|
*/
|
||||||
public function getManufacturingStatus(): ?string
|
public function getManufacturingStatus(): ?ManufacturingStatus
|
||||||
{
|
{
|
||||||
return $this->manufacturing_status;
|
return $this->manufacturing_status;
|
||||||
}
|
}
|
||||||
|
@ -124,9 +124,9 @@ trait ManufacturerTrait
|
||||||
* Sets the manufacturing status for this part
|
* Sets the manufacturing status for this part
|
||||||
* See getManufacturingStatus() for valid values.
|
* See getManufacturingStatus() for valid values.
|
||||||
*
|
*
|
||||||
* @return Part
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setManufacturingStatus(string $manufacturing_status): self
|
public function setManufacturingStatus(ManufacturingStatus $manufacturing_status): self
|
||||||
{
|
{
|
||||||
$this->manufacturing_status = $manufacturing_status;
|
$this->manufacturing_status = $manufacturing_status;
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Form\Part;
|
namespace App\Form\Part;
|
||||||
|
|
||||||
|
use App\Entity\Parts\ManufacturingStatus;
|
||||||
use Symfony\Bundle\SecurityBundle\Security;
|
use Symfony\Bundle\SecurityBundle\Security;
|
||||||
use App\Entity\Attachments\PartAttachment;
|
use App\Entity\Attachments\PartAttachment;
|
||||||
use App\Entity\Parameters\PartParameter;
|
use App\Entity\Parameters\PartParameter;
|
||||||
|
@ -42,6 +43,7 @@ use Symfony\Component\Form\AbstractType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
|
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\EnumType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ResetType;
|
use Symfony\Component\Form\Extension\Core\Type\ResetType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
|
@ -62,14 +64,6 @@ class PartBaseType extends AbstractType
|
||||||
$part = $builder->getData();
|
$part = $builder->getData();
|
||||||
$new_part = null === $part->getID();
|
$new_part = null === $part->getID();
|
||||||
|
|
||||||
$status_choices = [
|
|
||||||
'm_status.unknown' => '',
|
|
||||||
'm_status.announced' => 'announced',
|
|
||||||
'm_status.active' => 'active',
|
|
||||||
'm_status.nrfnd' => 'nrfnd',
|
|
||||||
'm_status.eol' => 'eol',
|
|
||||||
'm_status.discontinued' => 'discontinued',
|
|
||||||
];
|
|
||||||
|
|
||||||
//Common section
|
//Common section
|
||||||
$builder
|
$builder
|
||||||
|
@ -140,9 +134,10 @@ class PartBaseType extends AbstractType
|
||||||
'empty_data' => '',
|
'empty_data' => '',
|
||||||
'label' => 'part.edit.mpn',
|
'label' => 'part.edit.mpn',
|
||||||
])
|
])
|
||||||
->add('manufacturing_status', ChoiceType::class, [
|
->add('manufacturing_status', EnumType::class, [
|
||||||
'label' => 'part.edit.manufacturing_status',
|
'label' => 'part.edit.manufacturing_status',
|
||||||
'choices' => $status_choices,
|
'class' => ManufacturingStatus::class,
|
||||||
|
'choice_label' => fn (ManufacturingStatus $status) => $status->toTranslationKey(),
|
||||||
'required' => false,
|
'required' => false,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@ final class TwigCoreExtension extends AbstractExtension
|
||||||
new TwigTest('instanceof', static fn($var, $instance) => $var instanceof $instance),
|
new TwigTest('instanceof', static fn($var, $instance) => $var instanceof $instance),
|
||||||
/* Checks if a given variable is an object. E.g. `x is object` */
|
/* Checks if a given variable is an object. E.g. `x is object` */
|
||||||
new TwigTest('object', static fn($var): bool => is_object($var)),
|
new TwigTest('object', static fn($var): bool => is_object($var)),
|
||||||
|
new TwigTest('enum', fn($var) => $var instanceof \UnitEnum),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,10 @@
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro m_status_to_badge(status, class="badge") %}
|
{% macro m_status_to_badge(status, class="badge") %}
|
||||||
|
{% if status is enum %}
|
||||||
|
{% set status = status.value %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if status is not empty %}
|
{% if status is not empty %}
|
||||||
{% set color = " bg-secondary" %}
|
{% set color = " bg-secondary" %}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue