-
enzosim authored41d3d22e
AppTwigExtension.php 8.64 KiB
<?php
namespace App\Twig;
use App\Entity\Label;
use App\Entity\User;
use Symfony\Component\Asset\Packages;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
class AppTwigExtension extends AbstractExtension
{
private $packages;
public function __construct(Packages $packages)
{
$this->packages = $packages;
}
private function asset($path, $packageName = null)
{
return $this->packages->getUrl($path, $packageName);
}
public function getFilters()
{
return array(
new TwigFilter('badge', array($this, 'badge'), array('is_safe' => ['html'])),
new TwigFilter('badgeXl', array($this, 'badgeXl'), array('is_safe' => ['html'])),
new TwigFilter('labelClass', array($this, 'labelClass'), array('is_safe' => ['html'])),
new TwigFilter('fileIcon', array($this, 'getIcon'), array('is_safe' => ['html'])),
new TwigFilter('isImage', array($this, 'isImage')),
new TwigFilter('renderRewardImageBig', array($this, 'renderRewardImageBig'), array('is_safe' => ['html'])),
new TwigFilter('renderRewardImageSmall', array($this, 'renderRewardImageSmall'), array('is_safe' => ['html'])),
new TwigFilter('renderSuccessProgress', array($this, 'renderSuccessProgress'), array('is_safe' => ['html'])),
new TwigFilter('textFormat', array($this, 'textFormat'), array('is_safe' => ['html'])),
);
}
public function getBlockPrefix()
{
return 'file_twig_extension';
}
public function badgeXl($entity)
{
return sprintf("<div class='member-badge member-badge-xl'
style='background-color: rgb(%s); margin-top: -0.2rem;'
title='%s'>%s</div>", $entity->getRGB(), $entity, $entity->getInitials());
}
public function badge($entity, $title = null)
{
return sprintf("<div class='member-badge'
style='background-color: rgb(%s); margin-top: -0.2rem;'
title='%s'>%s</div>", $entity->getRGB(), $title ? : $entity, $entity->getInitials());
}
public function renderRewardImageBig($successMilestoneToDisplay, $successCurrentMilestone, $successName)
{
// Check if the current image should be fully visible based on the user's progress
$isFullyVisible = $successMilestoneToDisplay <= $successCurrentMilestone;
// Set the CSS class for the reward image based on its visibility
$cssClass = $isFullyVisible ? '' : 'locked-reward';
// Return the HTML for the image with the appropriate CSS class
$imageUrl = $this->asset(sprintf("assets/images/Succes/%s/%s__%s.svg", $successName, $successName, $successMilestoneToDisplay));
return sprintf(
"<img src='%s' alt='%s %s' class='%s'
style='width: 140px; height: auto; display: block; margin: 0 auto;' />",
$imageUrl,
$successName,
$successMilestoneToDisplay,
$cssClass
);
}
public function renderRewardImageSmall($successMilestoneToDisplay, $successCurrentMilestone, $successName)
{
// Check if the current image should be fully visible based on the user's progress
$isFullyVisible = $successMilestoneToDisplay <= $successCurrentMilestone;
// Set the CSS class for the reward image based on its visibility
$cssClass = $isFullyVisible ? '' : 'locked-reward';
// Return the HTML for the image with the appropriate CSS class
$imageUrl = $this->asset(sprintf("assets/images/Succes/%s/%s__%s.svg", $successName, $successName, $successMilestoneToDisplay));
return sprintf(
"<img src='%s' alt='%s %s' class='%s'
style='width: 75px; height: auto; display: block; margin: 0 auto;' />",
$imageUrl,
$successName,
$successMilestoneToDisplay,
$cssClass
);
}
public function renderSuccessProgress($currentMilestone, $successMilestones, $counter, $successName, $successColors)
{
$numSuccesses = count($successMilestones);
$nextMilestoneIndex = $currentMilestone < $numSuccesses - 1 ? $currentMilestone + 1 : $numSuccesses - 1;
$progressPercentage = ($counter - $successMilestones[$currentMilestone]) / ($successMilestones[min($currentMilestone+1, $numSuccesses-1)] - $currentMilestone) * 100; // Calculate progress percentage
// Define CSS styles for the progress bar container and fill
$containerStyle = sprintf('background-color: %s;', $successColors[1]); // Use the first color in $successColors for the container background
$fillStyle = sprintf('background-color: %s; width: %s%%;', $successColors[0], $progressPercentage); // Use the second color in $successColors for the fill
// $currentReward = $this->renderRewardImageSmall($currentMilestone, $currentMilestone, $successName);
// $nextReward = $this->renderRewardImageSmall($nextMilestoneIndex, $currentMilestone, $successName);
if($currentMilestone == 0 )
{
$currentReward = $this->renderRewardImageSmall($successMilestones[$currentMilestone], $successMilestones[$currentMilestone], 'niveau zero');
}
else
{
$currentReward = $this->renderRewardImageSmall($successMilestones[$currentMilestone], $successMilestones[$currentMilestone], $successName);
}
if($currentMilestone == $numSuccesses - 1 )
{
$nextReward = $this->renderRewardImageSmall($successMilestones[$currentMilestone], $successMilestones[$currentMilestone], $successName);
}
else
{
$nextReward = $this->renderRewardImageSmall($successMilestones[$nextMilestoneIndex], $successMilestones[$currentMilestone], $successName);
}
// Return the concatenated HTML for rewards and progress bar
return sprintf(
'<div class="success-progress">
%s
<div class="progress-bar-container" style="%s">
<div class="progress-bar-fill" style="%s"></div>
</div>
%s
</div>',
$currentReward,
$containerStyle,
$fillStyle,
$nextReward
);
}
public function textFormat($text)
{
return preg_replace('/\'\'\'([^\']+)\'\'\'/', '<strong>$1</strong>', $text);
}
public function labelClass(Label $label)
{
if ($label->isGeneral() && $label->isMasterPersonal()) {
return 'bg-label-personal';
}
if ($label->isGeneral() && $label->isMasterGroup()) {
return 'bg-label-group';
}
if ($label->isGeneral() && $label->isMasterPersonal()) {
return 'bg-label-personnal';
}
if ($label->isGeneral() && $label->isMasterPublic()) {
return 'bg-label-public';
}
if ($label->isInstitutional()) {
return 'bg-label-institutional';
}
if ($label->isMilestone()) {
return 'bg-label-milestone';
}
return 'bg-secondary';
}
public function getIcon($extension)
{
switch (strtolower($extension)) {
case 'pdf': return '<i class="fa fa-file-pdf-o"></i> ';
case 'xls': return "<i class=\"fa fa-file-excel-o\"></i> ";
case 'xlsx': return "<i class=\"fa fa-file-excel-o\"></i> ";
case 'ods': return "<i class=\"fa fa-file-excel-o\"></i> ";
case 'txt': return "<i class=\"fa fa-file-text-o\"></i> ";
case 'doc': return "<i class=\"fa fa-file-word-o\"></i> ";
case 'docx': return "<i class=\"fa fa-file-word-o\"></i> ";
case 'odt': return "<i class=\"fa fa-file-word-o\"></i> ";
case 'ppt': return "<i class=\"fa fa-file-powerpoint-o\"></i> ";
case 'odp': return "<i class=\"fa fa-file-powerpoint-o\"></i> ";
case 'jpg': return "<i class=\"fa fa-file-image-o\"></i> ";
case 'jpeg': return "<i class=\"fa fa-file-image-o\"></i> ";
case 'png': return "<i class=\"fa fa-file-image-o\"></i> ";
case 'gif': return "<i class=\"fa fa-file-image-o\"></i> ";
case 'bmp': return "<i class=\"fa fa-file-image-o\"></i> ";
case 'zip': return "<i class=\"fa fa-file-zip-o\"></i> ";
default : return "<i class=\"fa fa-file-o\"></i> ";
}
}
public function isImage($extension)
{
switch (strtolower($extension)) {
case 'jpg':
case 'jpeg':
case 'png':
case 'gif':
case 'bmp': return true;
default : return false;
}
}
}