Skip to content
Snippets Groups Projects
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>&nbsp;';
            case 'xls': return "<i class=\"fa fa-file-excel-o\"></i>&nbsp;";
            case 'xlsx': return "<i class=\"fa fa-file-excel-o\"></i>&nbsp;";
            case 'ods': return "<i class=\"fa fa-file-excel-o\"></i>&nbsp;";
            case 'txt': return "<i class=\"fa fa-file-text-o\"></i>&nbsp;";
            case 'doc': return "<i class=\"fa fa-file-word-o\"></i>&nbsp;";
            case 'docx': return "<i class=\"fa fa-file-word-o\"></i>&nbsp;";
            case 'odt': return "<i class=\"fa fa-file-word-o\"></i>&nbsp;";
            case 'ppt': return "<i class=\"fa fa-file-powerpoint-o\"></i>&nbsp;";
            case 'odp': return "<i class=\"fa fa-file-powerpoint-o\"></i>&nbsp;";
            case 'jpg': return "<i class=\"fa fa-file-image-o\"></i>&nbsp;";
            case 'jpeg': return "<i class=\"fa fa-file-image-o\"></i>&nbsp;";
            case 'png': return "<i class=\"fa fa-file-image-o\"></i>&nbsp;";
            case 'gif': return "<i class=\"fa fa-file-image-o\"></i>&nbsp;";
            case 'bmp': return "<i class=\"fa fa-file-image-o\"></i>&nbsp;";
            case 'zip': return "<i class=\"fa fa-file-zip-o\"></i>&nbsp;";
            default   : return "<i class=\"fa fa-file-o\"></i>&nbsp;";
        }
    }

    public function isImage($extension)
    {
        switch (strtolower($extension)) {
            case 'jpg':
            case 'jpeg':
            case 'png':
            case 'gif':
            case 'bmp': return true;
            default   : return false;
        }
    }

}