View source
<?php
namespace Drupal\opigno_statistics\Controller;
use Drupal\Core\Access\CsrfTokenGenerator;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\GeneratedUrl;
use Drupal\Core\Url;
use Drupal\opigno_statistics\Services\UserStatisticsManager;
use Drupal\user\UserInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
class UserAchievements extends ControllerBase {
const TRANINGS_TAB = 'trainings';
const CERTIFICATES_TAB = 'certificates';
const BADGES_TAB = 'badges';
const SKILLS_TAB = 'skills';
protected $statsManager;
protected $csrfToken;
public function __construct(UserStatisticsManager $stats_manager, CsrfTokenGenerator $csrf_token) {
$this->statsManager = $stats_manager;
$this->csrfToken = $csrf_token;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('opigno_statistics.user_stats_manager'), $container
->get('csrf_token'));
}
public function achievementsPage(Request $request, UserInterface $user) : array {
$uid = (int) $user
->id();
$active_tab = $request
->get('tab', 'trainings');
$tabs = [];
$names = [
static::TRANINGS_TAB,
static::CERTIFICATES_TAB,
static::BADGES_TAB,
static::SKILLS_TAB,
];
foreach ($names as $name) {
$params = [
'user' => $uid,
'tab' => $name,
];
$url = Url::fromRoute('opigno_statistics.switch_achievement_tabs', $params);
$internal = $url
->getInternalPath();
$url
->setOption('query', [
'token' => $this->csrfToken
->get($internal),
]);
$tabs[$name] = [
'title' => $this
->getTabTitle($name),
'url' => $url
->toString(),
];
}
$attached = [];
if ($this->statsManager->isSocialsEnabled) {
$share_url = Url::fromRoute('opigno_social.share_post_content')
->toString();
$attached = [
'library' => [
'opigno_social/post_sharing',
],
'drupalSettings' => [
'opignoSocial' => [
'shareContentUrl' => $share_url instanceof GeneratedUrl ? $share_url
->getGeneratedUrl() : $share_url,
],
],
];
}
return [
'#theme' => 'opigno_user_achievements_page',
'#tabs' => $tabs,
'#active' => $active_tab,
'#content' => $this
->getTabContent($uid, $active_tab),
'#attached' => $attached,
];
}
private function getTabTitle(string $tab) {
$titles = [
static::TRANINGS_TAB => $this
->t('Trainings completed'),
static::CERTIFICATES_TAB => $this
->t('Certificates'),
static::BADGES_TAB => $this
->t('Badges'),
static::SKILLS_TAB => $this
->t('Skills'),
];
return $titles[$tab] ?? '';
}
private function getTabContent(int $uid, string $tab) : array {
switch ($tab) {
case static::CERTIFICATES_TAB:
$content = $this->statsManager
->buildCertificatesList($uid);
break;
case static::BADGES_TAB:
$content = $this->statsManager
->buildBadgesList($uid);
break;
case static::SKILLS_TAB:
$content = $this->statsManager
->buildSkillsList($uid);
break;
default:
$content = $this->statsManager
->buildTrainingsList($uid, TRUE);
}
return $content;
}
public function switchTabs(UserInterface $user, string $tab) : AjaxResponse {
$uid = (int) $user
->id();
$content = $this
->getTabContent($uid, $tab);
$title = $this
->getTabTitle($tab);
$response = new AjaxResponse();
$response
->addCommand(new HtmlCommand('#opigno-achievements-content h2', $title));
$response
->addCommand(new HtmlCommand('#opigno-achievements-content .tab-content', $content));
$response
->addCommand(new InvokeCommand('.achievements-tabs a', 'removeClass', [
'active',
]));
$response
->addCommand(new InvokeCommand(".achievements-tabs a.{$tab}", 'addClass', [
'active',
]));
return $response;
}
}