diff --git a/src/Entity/Attachments/Attachment.php b/src/Entity/Attachments/Attachment.php index 7a16767c..c9eefa93 100644 --- a/src/Entity/Attachments/Attachment.php +++ b/src/Entity/Attachments/Attachment.php @@ -25,6 +25,7 @@ namespace App\Entity\Attachments; use App\Entity\Base\DBElement; use App\Entity\Base\NamedDBElement; +use App\Validator\Constraints\Selectable; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Intl\Exception\NotImplementedException; @@ -61,6 +62,7 @@ abstract class Attachment extends NamedDBElement * @var AttachmentType * @ORM\ManyToOne(targetEntity="AttachmentType", inversedBy="attachments") * @ORM\JoinColumn(name="type_id", referencedColumnName="id") + * @Selectable() */ protected $attachement_type; diff --git a/src/Entity/Base/StructuralDBElement.php b/src/Entity/Base/StructuralDBElement.php index 1ce888bc..db749f7e 100644 --- a/src/Entity/Base/StructuralDBElement.php +++ b/src/Entity/Base/StructuralDBElement.php @@ -275,6 +275,14 @@ abstract class StructuralDBElement extends AttachmentContainingDBElement return $this->children; } + /** + * @return bool + */ + public function isNotSelectable(): bool + { + return $this->not_selectable; + } + /****************************************************************************** * * Setters @@ -317,6 +325,16 @@ abstract class StructuralDBElement extends AttachmentContainingDBElement return $this; } + /** + * @param bool $not_selectable + * @return StructuralDBElement + */ + public function setNotSelectable(bool $not_selectable): StructuralDBElement + { + $this->not_selectable = $not_selectable; + return $this; + } + public function clearChildren() : self { $this->children = new ArrayCollection(); diff --git a/src/Entity/Parts/Part.php b/src/Entity/Parts/Part.php index 379808c3..7e14ef60 100644 --- a/src/Entity/Parts/Part.php +++ b/src/Entity/Parts/Part.php @@ -66,6 +66,7 @@ use App\Entity\Attachments\AttachmentContainingDBElement; use App\Entity\Devices\Device; use App\Entity\PriceInformations\Orderdetail; use App\Security\Annotations\ColumnSecurity; +use App\Validator\Constraints\Selectable; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; @@ -89,6 +90,7 @@ class Part extends AttachmentContainingDBElement * @var Category * @ORM\ManyToOne(targetEntity="Category", inversedBy="parts") * @ORM\JoinColumn(name="id_category", referencedColumnName="id") + * @Selectable() */ protected $category; @@ -98,6 +100,7 @@ class Part extends AttachmentContainingDBElement * @ORM\JoinColumn(name="id_footprint", referencedColumnName="id") * * @ColumnSecurity(prefix="footprint", type="object") + * @Selectable() */ protected $footprint; @@ -107,6 +110,7 @@ class Part extends AttachmentContainingDBElement * @ORM\JoinColumn(name="id_manufacturer", referencedColumnName="id") * * @ColumnSecurity(prefix="manufacturer", type="object") + * @Selectable() */ protected $manufacturer; diff --git a/src/Entity/Parts/PartLot.php b/src/Entity/Parts/PartLot.php index 7c974c87..83626d79 100644 --- a/src/Entity/Parts/PartLot.php +++ b/src/Entity/Parts/PartLot.php @@ -35,6 +35,7 @@ namespace App\Entity\Parts; use App\Entity\Base\DBElement; use App\Entity\Base\NamedDBElement; use App\Entity\Base\TimestampTrait; +use App\Validator\Constraints\Selectable; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; @@ -74,6 +75,7 @@ class PartLot extends DBElement * @var Storelocation The storelocation of this lot * @ORM\ManyToOne(targetEntity="Storelocation") * @ORM\JoinColumn(name="id_store_location", referencedColumnName="id") + * @Selectable() */ protected $storage_location; diff --git a/src/Entity/Parts/Supplier.php b/src/Entity/Parts/Supplier.php index 14a3cf1c..cbd8eefe 100644 --- a/src/Entity/Parts/Supplier.php +++ b/src/Entity/Parts/Supplier.php @@ -63,6 +63,7 @@ namespace App\Entity\Parts; use App\Entity\Base\Company; use App\Entity\PriceInformations\Currency; +use App\Validator\Constraints\Selectable; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; @@ -95,6 +96,7 @@ class Supplier extends Company * Set to null, to use global base currency. * @ORM\ManyToOne(targetEntity="App\Entity\PriceInformations\Currency") * @ORM\JoinColumn(name="default_currency_id", referencedColumnName="id", nullable=true) + * @Selectable() */ protected $default_currency; diff --git a/src/Entity/PriceInformations/Pricedetail.php b/src/Entity/PriceInformations/Pricedetail.php index d2c8e7b2..561617cd 100644 --- a/src/Entity/PriceInformations/Pricedetail.php +++ b/src/Entity/PriceInformations/Pricedetail.php @@ -62,6 +62,7 @@ declare(strict_types=1); namespace App\Entity\PriceInformations; use App\Entity\Base\DBElement; +use App\Validator\Constraints\Selectable; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Validator\Constraints as Assert; @@ -94,6 +95,7 @@ class Pricedetail extends DBElement * If this is null, the global base unit is assumed. * @ORM\ManyToOne(targetEntity="Currency") * @ORM\JoinColumn(name="id_currency", referencedColumnName="id", nullable=true) + * @Selectable() */ protected $currency; diff --git a/src/Entity/UserSystem/User.php b/src/Entity/UserSystem/User.php index 05f38163..d7cbded1 100644 --- a/src/Entity/UserSystem/User.php +++ b/src/Entity/UserSystem/User.php @@ -63,6 +63,7 @@ namespace App\Entity\UserSystem; use App\Entity\Base\NamedDBElement; use App\Security\Interfaces\HasPermissionsInterface; +use App\Validator\Constraints\Selectable; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Validator\Constraints as Assert; @@ -156,6 +157,7 @@ class User extends NamedDBElement implements UserInterface, HasPermissionsInterf * @var Group|null the group this user belongs to * @ORM\ManyToOne(targetEntity="Group", inversedBy="users", fetch="EAGER") * @ORM\JoinColumn(name="group_id", referencedColumnName="id") + * @Selectable() */ protected $group; diff --git a/src/Form/BaseEntityAdminForm.php b/src/Form/BaseEntityAdminForm.php index 2a81a279..e7dc268a 100644 --- a/src/Form/BaseEntityAdminForm.php +++ b/src/Form/BaseEntityAdminForm.php @@ -37,6 +37,7 @@ use App\Entity\Base\StructuralDBElement; use FOS\CKEditorBundle\Form\Type\CKEditorType; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\ResetType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; @@ -69,6 +70,10 @@ class BaseEntityAdminForm extends AbstractType 'attr' => ['class' => 'selectpicker', 'data-live-search' => true], 'required' => false, 'label' => 'parent.label', 'disabled' => !$this->security->isGranted($is_new ? 'create' : 'move', $entity), ]) + ->add('not_selectable', CheckboxType::class, ['required' => false, + 'label' => 'not_selectable.label', 'help' => 'not_selectable.help', 'label_attr'=> ['class' => 'checkbox-custom'], + 'disabled' => !$this->security->isGranted($is_new ? 'create' : 'edit', $entity) ]) + ->add('comment', CKEditorType::class, ['required' => false, 'label' => 'comment.label', 'attr' => ['rows' => 4], 'help' => 'bbcode.hint', 'disabled' => !$this->security->isGranted($is_new ? 'create' : 'edit', $entity)]); diff --git a/src/Validator/Constraints/NoneOfItsChildrenValidator.php b/src/Validator/Constraints/NoneOfItsChildrenValidator.php index 5340772c..0c09642f 100644 --- a/src/Validator/Constraints/NoneOfItsChildrenValidator.php +++ b/src/Validator/Constraints/NoneOfItsChildrenValidator.php @@ -37,6 +37,7 @@ use Symfony\Bundle\MakerBundle\Str; use Symfony\Component\Form\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; +use Symfony\Component\Validator\Exception\UnexpectedValueException; /** * The validator for the NoneOfItsChildren annotation. @@ -62,6 +63,11 @@ class NoneOfItsChildrenValidator extends ConstraintValidator return; } + //Check type of value. Validating only works for StructuralDBElements + if (!$value instanceof StructuralDBElement) { + throw new UnexpectedValueException($value, 'StructuralDBElement'); + } + //Check if the object is assigned to itself /** @var StructuralDBElement $entity */ $entity = $this->context->getObject(); diff --git a/src/Validator/Constraints/Selectable.php b/src/Validator/Constraints/Selectable.php new file mode 100644 index 00000000..701973e7 --- /dev/null +++ b/src/Validator/Constraints/Selectable.php @@ -0,0 +1,47 @@ + show error message then. + if ($value->isNotSelectable()) { + $this->context->buildViolation($constraint->message) + ->setParameter('{{ name }}', $value->getName()) + ->setParameter('{{ full_path }}', $value->getFullPath()) + ->addViolation(); + } + } +} \ No newline at end of file diff --git a/templates/AdminPages/EntityAdminBase.html.twig b/templates/AdminPages/EntityAdminBase.html.twig index ea71b3ae..7f971e72 100644 --- a/templates/AdminPages/EntityAdminBase.html.twig +++ b/templates/AdminPages/EntityAdminBase.html.twig @@ -68,6 +68,7 @@ {% if form.parent%} {{ form_row(form.parent) }} {% endif %} + {{ form_row(form.not_selectable) }} {% block additional_controls %}{% endblock %}