diff --git a/src/Entity/Attachments/AttachmentType.php b/src/Entity/Attachments/AttachmentType.php index 5c48568f..9971e547 100644 --- a/src/Entity/Attachments/AttachmentType.php +++ b/src/Entity/Attachments/AttachmentType.php @@ -64,6 +64,7 @@ class AttachmentType extends AbstractStructuralDBElement /** @var AttachmentTypeParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\AttachmentTypeParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/Devices/Device.php b/src/Entity/Devices/Device.php index be1dd031..d5c5bdae 100644 --- a/src/Entity/Devices/Device.php +++ b/src/Entity/Devices/Device.php @@ -100,6 +100,7 @@ class Device extends AbstractPartsContainingDBElement /** @var DeviceParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\DeviceParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) */ protected $parameters; diff --git a/src/Entity/Parameters/AbstractParameter.php b/src/Entity/Parameters/AbstractParameter.php index e1997cb8..095df7ee 100644 --- a/src/Entity/Parameters/AbstractParameter.php +++ b/src/Entity/Parameters/AbstractParameter.php @@ -28,6 +28,7 @@ use App\Entity\Base\AbstractNamedDBElement; use Doctrine\ORM\Mapping as ORM; use InvalidArgumentException; use LogicException; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Validator\Constraints as Assert; /** @@ -211,6 +212,26 @@ abstract class AbstractParameter extends AbstractNamedDBElement return $this; } + /** + * Returns the name of the group this parameter is associated to (e.g. Technical Parameters) + * @return string + */ + public function getGroup(): string + { + return $this->group; + } + + /** + * Sets the name of the group this parameter is associated to. + * @param string $group + * @return $this + */ + public function setGroup(string $group): self + { + $this->group = $group; + return $this; + } + /** * Returns the mathematical symbol for this specification (e.g. "V_CB"). * diff --git a/src/Entity/Parameters/AttachmentTypeParameter.php b/src/Entity/Parameters/AttachmentTypeParameter.php index d3d90435..d1ad9094 100644 --- a/src/Entity/Parameters/AttachmentTypeParameter.php +++ b/src/Entity/Parameters/AttachmentTypeParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Attachments\AttachmentType; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class AttachmentTypeParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/CategoryParameter.php b/src/Entity/Parameters/CategoryParameter.php index 378178d4..86925755 100644 --- a/src/Entity/Parameters/CategoryParameter.php +++ b/src/Entity/Parameters/CategoryParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Parts\Category; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class CategoryParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/CurrencyParameter.php b/src/Entity/Parameters/CurrencyParameter.php index f3f80a7e..28f3c934 100644 --- a/src/Entity/Parameters/CurrencyParameter.php +++ b/src/Entity/Parameters/CurrencyParameter.php @@ -25,11 +25,13 @@ namespace App\Entity\Parameters; use App\Entity\PriceInformations\Currency; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * A attachment attached to a category element. * * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class CurrencyParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/DeviceParameter.php b/src/Entity/Parameters/DeviceParameter.php index 7234a2b5..724ad3be 100644 --- a/src/Entity/Parameters/DeviceParameter.php +++ b/src/Entity/Parameters/DeviceParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Devices\Device; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class DeviceParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/FootprintParameter.php b/src/Entity/Parameters/FootprintParameter.php index fabaed99..d92ed8cb 100644 --- a/src/Entity/Parameters/FootprintParameter.php +++ b/src/Entity/Parameters/FootprintParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Parts\Footprint; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class FootprintParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/GroupParameter.php b/src/Entity/Parameters/GroupParameter.php index d2d7f38c..c6b62aa1 100644 --- a/src/Entity/Parameters/GroupParameter.php +++ b/src/Entity/Parameters/GroupParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\UserSystem\Group; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class GroupParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/ManufacturerParameter.php b/src/Entity/Parameters/ManufacturerParameter.php index dd8d2b63..b06633f0 100644 --- a/src/Entity/Parameters/ManufacturerParameter.php +++ b/src/Entity/Parameters/ManufacturerParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Parts\Manufacturer; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class ManufacturerParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/MeasurementUnitParameter.php b/src/Entity/Parameters/MeasurementUnitParameter.php index 8442b61e..91ce5809 100644 --- a/src/Entity/Parameters/MeasurementUnitParameter.php +++ b/src/Entity/Parameters/MeasurementUnitParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Parts\MeasurementUnit; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class MeasurementUnitParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/ParametersTrait.php b/src/Entity/Parameters/ParametersTrait.php index bb8cc5f4..34d97a74 100644 --- a/src/Entity/Parameters/ParametersTrait.php +++ b/src/Entity/Parameters/ParametersTrait.php @@ -65,4 +65,14 @@ trait ParametersTrait return $this; } + + public function getGroupedParameters(): array + { + $tmp = []; + + foreach ($this->parameters as $parameter) { + $tmp[$parameter->getGroup()][] = $parameter; + } + return $tmp; + } } diff --git a/src/Entity/Parameters/PartParameter.php b/src/Entity/Parameters/PartParameter.php index 2a5d330f..d7d08cfa 100644 --- a/src/Entity/Parameters/PartParameter.php +++ b/src/Entity/Parameters/PartParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Parts\Part; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class PartParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/StorelocationParameter.php b/src/Entity/Parameters/StorelocationParameter.php index b81f3ff3..44077d48 100644 --- a/src/Entity/Parameters/StorelocationParameter.php +++ b/src/Entity/Parameters/StorelocationParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Parts\Storelocation; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class StorelocationParameter extends AbstractParameter { diff --git a/src/Entity/Parameters/SupplierParameter.php b/src/Entity/Parameters/SupplierParameter.php index 30724932..e61137a0 100644 --- a/src/Entity/Parameters/SupplierParameter.php +++ b/src/Entity/Parameters/SupplierParameter.php @@ -25,9 +25,11 @@ namespace App\Entity\Parameters; use App\Entity\Parts\Supplier; use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; /** * @ORM\Entity() + * @UniqueEntity(fields={"name", "group", "element"}) */ class SupplierParameter extends AbstractParameter { diff --git a/src/Entity/Parts/Category.php b/src/Entity/Parts/Category.php index 37ece1ab..9c0a1a09 100644 --- a/src/Entity/Parts/Category.php +++ b/src/Entity/Parts/Category.php @@ -109,6 +109,7 @@ class Category extends AbstractPartsContainingDBElement /** @var CategoryParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\CategoryParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/Parts/Footprint.php b/src/Entity/Parts/Footprint.php index 99a2023f..666aa95f 100644 --- a/src/Entity/Parts/Footprint.php +++ b/src/Entity/Parts/Footprint.php @@ -96,6 +96,7 @@ class Footprint extends AbstractPartsContainingDBElement /** @var FootprintParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\FootprintParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"})@ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/Parts/Manufacturer.php b/src/Entity/Parts/Manufacturer.php index 11da7ffc..e61e3063 100644 --- a/src/Entity/Parts/Manufacturer.php +++ b/src/Entity/Parts/Manufacturer.php @@ -89,6 +89,7 @@ class Manufacturer extends AbstractCompany /** @var ManufacturerParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\ManufacturerParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/Parts/MeasurementUnit.php b/src/Entity/Parts/MeasurementUnit.php index 394f7104..78a4180d 100644 --- a/src/Entity/Parts/MeasurementUnit.php +++ b/src/Entity/Parts/MeasurementUnit.php @@ -106,6 +106,7 @@ class MeasurementUnit extends AbstractPartsContainingDBElement /** @var MeasurementUnitParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\MeasurementUnitParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/Parts/Part.php b/src/Entity/Parts/Part.php index 47e57d8e..749c8af2 100644 --- a/src/Entity/Parts/Part.php +++ b/src/Entity/Parts/Part.php @@ -93,6 +93,8 @@ class Part extends AttachmentContainingDBElement /** @var PartParameter[] * @Assert\Valid() * @ORM\OneToMany(targetEntity="App\Entity\Parameters\PartParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) */ protected $parameters; diff --git a/src/Entity/Parts/Storelocation.php b/src/Entity/Parts/Storelocation.php index 2f1c7d65..3af60cbd 100644 --- a/src/Entity/Parts/Storelocation.php +++ b/src/Entity/Parts/Storelocation.php @@ -94,6 +94,7 @@ class Storelocation extends AbstractPartsContainingDBElement /** @var StorelocationParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\StorelocationParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/Parts/Supplier.php b/src/Entity/Parts/Supplier.php index 6ebaecc9..0ac3a1ed 100644 --- a/src/Entity/Parts/Supplier.php +++ b/src/Entity/Parts/Supplier.php @@ -116,6 +116,7 @@ class Supplier extends AbstractCompany /** @var SupplierParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\SupplierParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/PriceInformations/Currency.php b/src/Entity/PriceInformations/Currency.php index 19ede756..3a985ce1 100644 --- a/src/Entity/PriceInformations/Currency.php +++ b/src/Entity/PriceInformations/Currency.php @@ -96,6 +96,7 @@ class Currency extends AbstractStructuralDBElement /** @var CurrencyParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\CurrencyParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Entity/UserSystem/Group.php b/src/Entity/UserSystem/Group.php index 674f20c7..8ef9ec2a 100644 --- a/src/Entity/UserSystem/Group.php +++ b/src/Entity/UserSystem/Group.php @@ -95,6 +95,7 @@ class Group extends AbstractStructuralDBElement implements HasPermissionsInterfa /** @var GroupParameter[] * @ORM\OneToMany(targetEntity="App\Entity\Parameters\GroupParameter", mappedBy="element", cascade={"persist", "remove"}, orphanRemoval=true) + * @ORM\OrderBy({"group" = "ASC" ,"name" = "ASC"}) * @Assert\Valid() */ protected $parameters; diff --git a/src/Form/ParameterType.php b/src/Form/ParameterType.php index 7fd92cc5..d4d35275 100644 --- a/src/Form/ParameterType.php +++ b/src/Form/ParameterType.php @@ -47,7 +47,7 @@ class ParameterType extends AbstractType 'attr' => [ 'placeholder' => 'parameters.symbol.placeholder', 'class' => 'form-control-sm', - 'style' => 'max-width: 15ch;', + 'style' => 'max-width: 12ch;', ], ]); $builder->add('value_text', TextType::class, [ @@ -66,7 +66,7 @@ class ParameterType extends AbstractType 'step' => 'any', 'placeholder' => 'parameters.max.placeholder', 'class' => 'form-control-sm', - 'style' => 'max-width: 15ch;', + 'style' => 'max-width: 12ch;', ], ]); $builder->add('value_min', NumberType::class, [ @@ -76,7 +76,7 @@ class ParameterType extends AbstractType 'step' => 'any', 'placeholder' => 'parameters.min.placeholder', 'class' => 'form-control-sm', - 'style' => 'max-width: 15ch;', + 'style' => 'max-width: 12ch;', ], ]); $builder->add('value_typical', NumberType::class, [ @@ -86,7 +86,7 @@ class ParameterType extends AbstractType 'step' => 'any', 'placeholder' => 'parameters.typical.placeholder', 'class' => 'form-control-sm', - 'style' => 'max-width: 15ch;', + 'style' => 'max-width: 12ch;', ], ]); $builder->add('unit', TextType::class, [ @@ -98,12 +98,21 @@ class ParameterType extends AbstractType 'style' => 'max-width: 8ch;', ], ]); + + $builder->add('group', TextType::class, [ + 'required' => false, + 'empty_data' => '', + 'attr' => [ + 'placeholder' => 'parameter.group.placeholder', + 'class' => 'form-control-sm', + ] + ]); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ - 'data_class' => AbstractParameter::class, - ]); + 'data_class' => AbstractParameter::class, + ]); } } diff --git a/src/Form/Part/PartBaseType.php b/src/Form/Part/PartBaseType.php index 84f92403..b990fb4d 100644 --- a/src/Form/Part/PartBaseType.php +++ b/src/Form/Part/PartBaseType.php @@ -52,6 +52,7 @@ use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\Part; use App\Entity\PriceInformations\Orderdetail; use App\Form\AttachmentFormType; +use App\Form\ParameterGroupType; use App\Form\ParameterType; use App\Form\Type\MasterPictureAttachmentType; use App\Form\Type\SIUnitType; diff --git a/templates/Parts/edit/_specifications.html.twig b/templates/Parts/edit/_specifications.html.twig index 0e49569d..78ed67a8 100644 --- a/templates/Parts/edit/_specifications.html.twig +++ b/templates/Parts/edit/_specifications.html.twig @@ -10,6 +10,7 @@