Allow to specify which label profiles are shown in dropdown.

This commit is contained in:
Jan Böhmer 2020-05-02 19:47:31 +02:00
parent 3804e2534d
commit 8b372a3443
8 changed files with 64 additions and 80 deletions

View file

@ -31,8 +31,8 @@ class LabelOptions
public const BARCODE_TYPES = ['none', /*'ean8',*/ 'qr', 'code39', 'datamatrix', 'code93']; public const BARCODE_TYPES = ['none', /*'ean8',*/ 'qr', 'code39', 'datamatrix', 'code93'];
public const SUPPORTED_ELEMENTS = ['part', 'part_lot']; public const SUPPORTED_ELEMENTS = ['part', 'part_lot'];
public const PICTURE_TYPES = ['none', 'element_picture', 'main_attachment']; public const PICTURE_TYPES = ['none', 'element_picture', 'main_attachment'];
public const POSITIONS = ['left', 'right', 'top', 'bottom'];
public const FONTS = ['default']; public const LINES_MODES = ['html', 'twig'];
/** /**
* @var float The page size of the label in mm * @var float The page size of the label in mm
@ -55,13 +55,6 @@ class LabelOptions
*/ */
protected $barcode_type = 'none'; protected $barcode_type = 'none';
/**
* @var string The position where the barcode should be put
* @Assert\Choice(choices=LabelOptions::POSITIONS)
* @ORM\Column(type="string")
*/
protected $barcode_position = 'left';
/** /**
* @var string What image should be shown along the * @var string What image should be shown along the
* @Assert\Choice(choices=LabelOptions::PICTURE_TYPES) * @Assert\Choice(choices=LabelOptions::PICTURE_TYPES)
@ -69,13 +62,6 @@ class LabelOptions
*/ */
protected $picture_type = 'none'; protected $picture_type = 'none';
/**
* @var string
* @Assert\Choice(choices=LabelOptions::POSITIONS)
* @ORM\Column(type="string")
*/
protected $picture_position = 'left';
/** /**
* @var string * @var string
* @Assert\Choice(choices=LabelOptions::SUPPORTED_ELEMENTS) * @Assert\Choice(choices=LabelOptions::SUPPORTED_ELEMENTS)
@ -84,10 +70,16 @@ class LabelOptions
protected $supported_element = 'part'; protected $supported_element = 'part';
/** /**
* @var string The font that should be used in the Barcode * @var string Any additional CSS for the label.
* @ORM\Column(type="text")
*/
protected $additional_css = '';
/** @var string The mode that will be used to interpret the lines.
* @Assert\Choice(choices=LabelOptions::LINES_MODES)
* @ORM\Column(type="string") * @ORM\Column(type="string")
*/ */
protected $font = 'default'; protected $lines_mode = 'html';
/** /**
* @var string * @var string
@ -149,24 +141,6 @@ class LabelOptions
return $this; return $this;
} }
/**
* @return string
*/
public function getBarcodePosition(): string
{
return $this->barcode_position;
}
/**
* @param string $barcode_position
* @return LabelOptions
*/
public function setBarcodePosition(string $barcode_position): LabelOptions
{
$this->barcode_position = $barcode_position;
return $this;
}
/** /**
* @return string * @return string
*/ */
@ -185,24 +159,6 @@ class LabelOptions
return $this; return $this;
} }
/**
* @return string
*/
public function getPicturePosition(): string
{
return $this->picture_position;
}
/**
* @param string $picture_position
* @return LabelOptions
*/
public function setPicturePosition(string $picture_position): LabelOptions
{
$this->picture_position = $picture_position;
return $this;
}
/** /**
* @return string * @return string
*/ */
@ -221,24 +177,6 @@ class LabelOptions
return $this; return $this;
} }
/**
* @return string
*/
public function getFont(): string
{
return $this->font;
}
/**
* @param string $font
* @return LabelOptions
*/
public function setFont(string $font): LabelOptions
{
$this->font = $font;
return $this;
}
/** /**
* @return string * @return string
*/ */

View file

@ -56,6 +56,12 @@ class LabelProfile extends AttachmentContainingDBElement
*/ */
protected $comment = ''; protected $comment = '';
/**
* @var bool Determines, if this label profile should be shown in the dropdown quick menu.
* @ORM\Column(type="boolean")
*/
protected $show_in_dropdown = true;
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
@ -82,6 +88,28 @@ class LabelProfile extends AttachmentContainingDBElement
return $this; return $this;
} }
/**
* Returns true, if this label profile should be shown in label generator quick menu.
* @return bool
*/
public function isShowInDropdown(): bool
{
return $this->show_in_dropdown;
}
/**
* Sets the show in dropdown menu.
* @param bool $show_in_dropdown
* @return LabelProfile
*/
public function setShowInDropdown(bool $show_in_dropdown): LabelProfile
{
$this->show_in_dropdown = $show_in_dropdown;
return $this;
}
/** /**
* @inheritDoc * @inheritDoc
*/ */

View file

@ -24,6 +24,7 @@ namespace App\Form\AdminPages;
use App\Entity\Base\AbstractNamedDBElement; use App\Entity\Base\AbstractNamedDBElement;
use App\Entity\LabelSystem\LabelProfile; use App\Entity\LabelSystem\LabelProfile;
use App\Form\LabelOptionsType; use App\Form\LabelOptionsType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
@ -31,6 +32,14 @@ class LabelProfileAdminForm extends BaseEntityAdminForm
{ {
protected function additionalFormElements(FormBuilderInterface $builder, array $options, AbstractNamedDBElement $entity): void protected function additionalFormElements(FormBuilderInterface $builder, array $options, AbstractNamedDBElement $entity): void
{ {
$builder->add('show_in_dropdown', CheckboxType::class, [
'required' => false,
'label' => 'label_profile.showInDropdown',
'label_attr' => [
'class' => 'checkbox-custom',
],
]);
$builder->add('options', LabelOptionsType::class); $builder->add('options', LabelOptionsType::class);
} }

View file

@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
/** /**
* Auto-generated Migration: Please modify to your needs! * Auto-generated Migration: Please modify to your needs!
*/ */
final class Version20200411145120 extends AbstractMigration final class Version20200502161750 extends AbstractMigration
{ {
public function getDescription() : string public function getDescription() : string
{ {
@ -22,7 +22,7 @@ final class Version20200411145120 extends AbstractMigration
// this up() migration is auto-generated, please modify it to your needs // this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('CREATE TABLE label_profiles (id INT AUTO_INCREMENT NOT NULL, id_preview_attachement INT DEFAULT NULL, comment LONGTEXT NOT NULL, name VARCHAR(255) NOT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, options_width DOUBLE PRECISION NOT NULL, options_height DOUBLE PRECISION NOT NULL, options_barcode_type VARCHAR(255) NOT NULL, options_barcode_position VARCHAR(255) NOT NULL, options_picture_type VARCHAR(255) NOT NULL, options_picture_position VARCHAR(255) NOT NULL, options_supported_element VARCHAR(255) NOT NULL, options_font VARCHAR(255) NOT NULL, options_lines LONGTEXT NOT NULL, INDEX IDX_C93E9CF56DEDCEC2 (id_preview_attachement), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); $this->addSql('CREATE TABLE label_profiles (id INT AUTO_INCREMENT NOT NULL, id_preview_attachement INT DEFAULT NULL, comment LONGTEXT NOT NULL, show_in_dropdown TINYINT(1) NOT NULL, name VARCHAR(255) NOT NULL, last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, options_width DOUBLE PRECISION NOT NULL, options_height DOUBLE PRECISION NOT NULL, options_barcode_type VARCHAR(255) NOT NULL, options_picture_type VARCHAR(255) NOT NULL, options_supported_element VARCHAR(255) NOT NULL, options_additional_css LONGTEXT NOT NULL, options_lines_mode VARCHAR(255) NOT NULL, options_lines LONGTEXT NOT NULL, INDEX IDX_C93E9CF56DEDCEC2 (id_preview_attachement), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE label_profiles ADD CONSTRAINT FK_C93E9CF56DEDCEC2 FOREIGN KEY (id_preview_attachement) REFERENCES `attachments` (id)'); $this->addSql('ALTER TABLE label_profiles ADD CONSTRAINT FK_C93E9CF56DEDCEC2 FOREIGN KEY (id_preview_attachement) REFERENCES `attachments` (id)');
$this->addSql('ALTER TABLE log CHANGE level level TINYINT(4) NOT NULL'); $this->addSql('ALTER TABLE log CHANGE level level TINYINT(4) NOT NULL');
} }

View file

@ -36,8 +36,10 @@ class LabelProfileRepository extends NamedDBElementRepository
*/ */
public function getDropdownProfiles(string $type): array public function getDropdownProfiles(string $type): array
{ {
//TODO: Improve this, when we have a 'showInDropdown' flag for profiles. if (!in_array($type, LabelOptions::SUPPORTED_ELEMENTS)) {
return $this->findForSupportedElement($type); throw new \InvalidArgumentException('Invalid supported_element type given.');
}
return $this->findBy(['options.supported_element' => $type, 'show_in_dropdown' => true], ['name' => 'ASC']);
} }
/** /**

View file

@ -33,9 +33,9 @@ class LabelProfileDropdownHelper
private $entityManager; private $entityManager;
private $keyGenerator; private $keyGenerator;
public function __construct(TagAwareCacheInterface $cache, EntityManagerInterface $entityManager, UserCacheKeyGenerator $keyGenerator) public function __construct(TagAwareCacheInterface $treeCache, EntityManagerInterface $entityManager, UserCacheKeyGenerator $keyGenerator)
{ {
$this->cache = $cache; $this->cache = $treeCache;
$this->entityManager = $entityManager; $this->entityManager = $entityManager;
$this->keyGenerator = $keyGenerator; $this->keyGenerator = $keyGenerator;
} }

View file

@ -14,6 +14,10 @@
</div> </div>
{% endblock %} {% endblock %}
{% block additional_controls %}
{{ form_row(form.show_in_dropdown) }}
{% endblock %}
{% block additional_content %} {% block additional_content %}
{% if pdf_data is defined and pdf_data is not empty %} {% if pdf_data is defined and pdf_data is not empty %}
<div class="card mt-2 mb-2 p-1 border-secondary" style="resize: vertical; overflow: scroll; height: 250px;"> <div class="card mt-2 mb-2 p-1 border-secondary" style="resize: vertical; overflow: scroll; height: 250px;">

View file

@ -4,10 +4,13 @@
<i class="fas fa-fw fa-qrcode"></i> {% if include_text %}{% trans %}label_generator.label_btn{% endtrans %}{% endif %} <i class="fas fa-fw fa-qrcode"></i> {% if include_text %}{% trans %}label_generator.label_btn{% endtrans %}{% endif %}
</button> </button>
<div class="dropdown-menu"> <div class="dropdown-menu">
{% for profile in label_profile_dropdown_helper.dropdownProfiles(type) %} {% set profiles = label_profile_dropdown_helper.dropdownProfiles(type) %}
{% for profile in profiles %}
<a class="dropdown-item" href="{{ path('label_dialog_profile', {'profile': profile.id, 'target_type': type, 'target_id': id, 'generate': true}) }}">{{ profile.name }}</a> <a class="dropdown-item" href="{{ path('label_dialog_profile', {'profile': profile.id, 'target_type': type, 'target_id': id, 'generate': true}) }}">{{ profile.name }}</a>
{% endfor %} {% endfor %}
<div class="dropdown-divider"></div> {% if profiles is not empty %}
<div class="dropdown-divider"></div>
{% endif %}
<a class="dropdown-item" href="{{ path('label_dialog', {'target_type': type, 'target_id': id}) }}">{% trans %}label_generator.label_empty{% endtrans %}</a> <a class="dropdown-item" href="{{ path('label_dialog', {'target_type': type, 'target_id': id}) }}">{% trans %}label_generator.label_empty{% endtrans %}</a>
</div> </div>
</div> </div>