Added basic placeholder providers for parts.

This commit is contained in:
Jan Böhmer 2020-04-14 17:21:30 +02:00
parent dee4094d8b
commit 7ce5776694
13 changed files with 521 additions and 3 deletions

View file

@ -0,0 +1,55 @@
<?php
/**
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2020 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/>.
*/
namespace App\Services\LabelSystem\PlaceholderProviders;
use App\Entity\Base\AbstractDBElement;
use App\Services\ElementTypeNameGenerator;
class AbstractDBElementProvider implements PlaceholderProviderInterface
{
protected $elementTypeNameGenerator;
public function __construct(ElementTypeNameGenerator $elementTypeNameGenerator)
{
$this->elementTypeNameGenerator = $elementTypeNameGenerator;
}
/**
* @inheritDoc
*/
public function replace(string $placeholder, object $label_target, array $options = []): ?string
{
if ($label_target instanceof AbstractDBElement) {
if ($placeholder === '%%TYPE%%') {
return $this->elementTypeNameGenerator->getLocalizedTypeLabel($label_target);
}
if ($placeholder === '%%ID%%') {
return (string) ($label_target->getID() ?? 'unknown');
}
}
return null;
}
}

View file

@ -0,0 +1,107 @@
<?php
/**
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2020 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/>.
*/
namespace App\Services\LabelSystem\PlaceholderProviders;
use App\Entity\UserSystem\User;
use IntlDateFormatter;
use Locale;
use Symfony\Component\Security\Core\Security;
/**
* Provides Placeholders for infos about global infos like Installation name or datetimes.
* @package App\Services\LabelSystem\PlaceholderProviders
*/
class GlobalProviders implements PlaceholderProviderInterface
{
protected $partdb_title;
protected $security;
public function __construct(string $partdb_title, Security $security)
{
$this->partdb_title = $partdb_title;
$this->security = $security;
}
/**
* @inheritDoc
*/
public function replace(string $placeholder, object $label_target, array $options = []): ?string
{
if ($placeholder === "%%INSTALL_NAME%%") {
return $this->partdb_title;
}
$user = $this->security->getUser();
if ($placeholder === "%%USERNAME%%") {
if ($user instanceof User) {
return $user->getName();
}
return 'anonymous';
}
if ($placeholder === "%%USERNAME_FULL%%") {
if ($user instanceof User) {
return $user->getFullName(true);
}
return 'anonymous';
}
$now = new \DateTime();
if ($placeholder === '%%DATETIME%%') {
$formatter = IntlDateFormatter::create(
Locale::getDefault(),
IntlDateFormatter::SHORT,
IntlDateFormatter::SHORT,
$now->getTimezone()
);
return $formatter->format($now);
}
if ($placeholder === '%%DATE%%') {
$formatter = IntlDateFormatter::create(
Locale::getDefault(),
IntlDateFormatter::SHORT,
IntlDateFormatter::NONE,
$now->getTimezone()
);
return $formatter->format($now);
}
if ($placeholder === '%%TIME%%') {
$formatter = IntlDateFormatter::create(
Locale::getDefault(),
IntlDateFormatter::NONE,
IntlDateFormatter::SHORT,
$now->getTimezone()
);
return $formatter->format($now);
}
return null;
}
}

View file

@ -0,0 +1,40 @@
<?php
/**
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2020 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/>.
*/
namespace App\Services\LabelSystem\PlaceholderProviders;
use App\Entity\Contracts\NamedElementInterface;
class NamedElementProvider implements PlaceholderProviderInterface
{
/**
* @inheritDoc
*/
public function replace(string $placeholder, object $label_target, array $options = []): ?string
{
if ($label_target instanceof NamedElementInterface && $placeholder === '%%NAME%%') {
return $label_target->getName();
}
return null;
}
}

View file

@ -0,0 +1,112 @@
<?php
/**
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2020 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/>.
*/
namespace App\Services\LabelSystem\PlaceholderProviders;
use App\Entity\Parts\Part;
use App\Services\SIFormatter;
use Symfony\Contracts\Translation\TranslatorInterface;
class PartProvider implements PlaceholderProviderInterface
{
protected $siFormatter;
protected $translator;
public function __construct(SIFormatter $SIFormatter, TranslatorInterface $translator)
{
$this->siFormatter = $SIFormatter;
$this->translator = $translator;
}
/**
* @inheritDoc
*/
public function replace(string $placeholder, object $part, array $options = []): ?string
{
if (!$part instanceof Part) {
return null;
}
if ($placeholder === '%%CATEGORY%%') {
return $part->getCategory() ? $part->getCategory()->getName() : '';
}
if ($placeholder === '%%CATEGORY_FULL%%') {
return $part->getCategory() ? $part->getCategory()->getFullPath() : '';
}
if ($placeholder === '%%MANUFACTURER%%') {
return $part->getManufacturer() ? $part->getManufacturer()->getName() : '';
}
if ($placeholder === '%%MANUFACTURER_FULL%%') {
return $part->getManufacturer() ? $part->getManufacturer()->getFullPath() : '';
}
if ($placeholder === '%%FOOTPRINT%%') {
return $part->getFootprint() ? $part->getFootprint()->getName() : '';
}
if ($placeholder === '%%FOOTPRINT_FULL%%') {
return $part->getFootprint() ? $part->getFootprint()->getFullPath() : '';
}
if ($placeholder === '%%MASS%%') {
return $part->getMass() ? $this->siFormatter->format($part->getMass(), 'g', 1) : '';
}
if ($placeholder === '%%MPN%%') {
return $part->getManufacturerProductNumber();
}
if ($placeholder === '%%TAGS%%') {
return $part->getTags();
}
if ($placeholder === '%%M_STATUS%%') {
if ($part->getManufacturingStatus() === '') {
return '';
}
return $this->translator->trans('m_status.' . $part->getManufacturingStatus());
}
$parsedown = new \Parsedown();
if ($placeholder === '%%DESCRIPTION%%') {
return $parsedown->line($part->getDescription());
}
if ($placeholder === '%%DESCRIPTION_T%%') {
return strip_tags($parsedown->line($part->getDescription()));
}
if ($placeholder === '%%COMMENT%%') {
return $parsedown->line($part->getComment());
}
if ($placeholder === '%%COMMENT_T%%') {
return strip_tags($parsedown->line($part->getComment()));
}
return null;
}
}

View file

@ -0,0 +1,36 @@
<?php
/**
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2020 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/>.
*/
namespace App\Services\LabelSystem\PlaceholderProviders;
interface PlaceholderProviderInterface
{
/**
* Determines the real value of this placeholder.
* If the placeholder is not supported, null must be returned.
* @param string $placeholder The placeholder (e.g. "%%PLACEHOLDER%%") that should be replaced
* @param object $label_target The object that is targeted by the label
* @param array $options A list of options that can be used to specify the generated output further.
* @return string|null The real value of this placeholder, null if not supported.
*/
public function replace(string $placeholder, object $label_target, array $options = []): ?string;
}

View file

@ -0,0 +1,48 @@
<?php
/**
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2020 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/>.
*/
namespace App\Services\LabelSystem\PlaceholderProviders;
use App\Entity\Contracts\TimeStampableInterface;
use IntlDateFormatter;
use Locale;
class TimestampableElementProvider implements PlaceholderProviderInterface
{
/**
* @inheritDoc
*/
public function replace(string $placeholder, object $label_target, array $options = []): ?string
{
if ($label_target instanceof TimeStampableInterface) {
if ($placeholder === '%%LAST_MODIFIED%%') {
return IntlDateFormatter::formatObject($label_target->getLastModified() ?? new \DateTime(), IntlDateFormatter::SHORT, Locale::getDefault());
}
if ($placeholder === '%%CREATION_DATE%%') {
return IntlDateFormatter::formatObject($label_target->getAddedDate() ?? new \DateTime(), IntlDateFormatter::SHORT, Locale::getDefault());
}
}
return null;
}
}