. */ declare(strict_types=1); /** * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). * * Copyright (C) 2019 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 General Public License * as published by the Free Software Foundation; either version 2 * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ namespace App\DataTables; use App\DataTables\Column\LocaleDateTimeColumn; use App\Entity\Attachments\Attachment; use App\Services\Attachments\AttachmentManager; use App\Services\Attachments\AttachmentURLGenerator; use App\Services\ElementTypeNameGenerator; use App\Services\EntityURLGenerator; use Doctrine\ORM\QueryBuilder; use Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter; use Omines\DataTablesBundle\Column\BoolColumn; use Omines\DataTablesBundle\Column\TextColumn; use Omines\DataTablesBundle\DataTable; use Omines\DataTablesBundle\DataTableTypeInterface; use Symfony\Contracts\Translation\TranslatorInterface; final class AttachmentDataTable implements DataTableTypeInterface { private $translator; private $entityURLGenerator; private $attachmentHelper; private $elementTypeNameGenerator; private $attachmentURLGenerator; public function __construct(TranslatorInterface $translator, EntityURLGenerator $entityURLGenerator, AttachmentManager $attachmentHelper, AttachmentURLGenerator $attachmentURLGenerator, ElementTypeNameGenerator $elementTypeNameGenerator) { $this->translator = $translator; $this->entityURLGenerator = $entityURLGenerator; $this->attachmentHelper = $attachmentHelper; $this->elementTypeNameGenerator = $elementTypeNameGenerator; $this->attachmentURLGenerator = $attachmentURLGenerator; } public function configure(DataTable $dataTable, array $options): void { $dataTable->add('picture', TextColumn::class, [ 'label' => '', 'render' => function ($value, Attachment $context) { if ($context->isPicture() && ! $context->isExternal() && $this->attachmentHelper->isFileExisting($context)) { $title = htmlspecialchars($context->getName()); if ($context->getFilename()) { $title .= ' (' . htmlspecialchars($context->getFilename()) . ')'; } return sprintf( '%s', 'Part image', $this->attachmentURLGenerator->getThumbnailURL($context), $this->attachmentURLGenerator->getThumbnailURL($context, 'thumbnail_md'), 'img-fluid hoverpic', $title ); } return ''; }, ]); $dataTable->add('name', TextColumn::class, [ 'label' => 'attachment.edit.name', 'render' => function ($value, Attachment $context) { //Link to external source if ($context->isExternal()) { return sprintf( '%s', htmlspecialchars($context->getURL()), htmlspecialchars($value) ); } if ($this->attachmentHelper->isFileExisting($context)) { return sprintf( '%s', $this->entityURLGenerator->viewURL($context), htmlspecialchars($value) ); } return $value; }, ]); $dataTable->add('attachment_type', TextColumn::class, [ 'label' => 'attachment.table.type', 'field' => 'attachment_type.name', 'render' => function ($value, Attachment $context) { return sprintf( '%s', $this->entityURLGenerator->editURL($context->getAttachmentType()), htmlspecialchars($value) ); }, ]); $dataTable->add('element', TextColumn::class, [ 'label' => 'attachment.table.element', //'propertyPath' => 'element.name', 'render' => function ($value, Attachment $context) { return sprintf( '%s', $this->entityURLGenerator->infoURL($context->getElement()), $this->elementTypeNameGenerator->getTypeNameCombination($context->getElement(), true) ); }, ]); $dataTable->add('filename', TextColumn::class, [ 'label' => $this->translator->trans('attachment.table.filename'), 'propertyPath' => 'filename', ]); $dataTable->add('filesize', TextColumn::class, [ 'label' => $this->translator->trans('attachment.table.filesize'), 'render' => function ($value, Attachment $context) { if ($this->attachmentHelper->isFileExisting($context)) { return $this->attachmentHelper->getHumanFileSize($context); } if ($context->isExternal()) { return ''.$this->translator->trans('attachment.external').''; } return sprintf( ' %s ', $this->translator->trans('attachment.file_not_found') ); }, ]); $dataTable ->add('addedDate', LocaleDateTimeColumn::class, [ 'label' => 'part.table.addedDate', 'visible' => false, ]) ->add('lastModified', LocaleDateTimeColumn::class, [ 'label' => 'part.table.lastModified', 'visible' => false, ]); $dataTable->add('show_in_table', BoolColumn::class, [ 'label' => 'attachment.edit.show_in_table', 'trueValue' => $this->translator->trans('true'), 'falseValue' => $this->translator->trans('false'), 'nullValue' => '', 'visible' => false, ]); $dataTable->add('isPicture', BoolColumn::class, [ 'label' => 'attachment.edit.isPicture', 'trueValue' => $this->translator->trans('true'), 'falseValue' => $this->translator->trans('false'), 'nullValue' => '', 'visible' => false, 'propertyPath' => 'picture', ]); $dataTable->add('is3DModel', BoolColumn::class, [ 'label' => 'attachment.edit.is3DModel', 'trueValue' => $this->translator->trans('true'), 'falseValue' => $this->translator->trans('false'), 'nullValue' => '', 'visible' => false, 'propertyPath' => '3dmodel', ]); $dataTable->add('isBuiltin', BoolColumn::class, [ 'label' => 'attachment.edit.isBuiltin', 'trueValue' => $this->translator->trans('true'), 'falseValue' => $this->translator->trans('false'), 'nullValue' => '', 'visible' => false, 'propertyPath' => 'builtin', ]); $dataTable->createAdapter(ORMAdapter::class, [ 'entity' => Attachment::class, 'query' => function (QueryBuilder $builder): void { $this->getQuery($builder); }, ]); } private function getQuery(QueryBuilder $builder): void { $builder->distinct()->select('attachment') ->addSelect('attachment_type') //->addSelect('element') ->from(Attachment::class, 'attachment') ->leftJoin('attachment.attachment_type', 'attachment_type'); //->leftJoin('attachment.element', 'element'); } }