src/Widgets/Account.php line 35

Open in your IDE?
  1. <?php
  2. /**
  3.  * This file is part of the pdAdmin package.
  4.  *
  5.  * @package     pd-admin
  6.  * @license     LICENSE
  7.  * @author      Ramazan APAYDIN <apaydin541@gmail.com>
  8.  * @link        https://github.com/appaydin/pd-admin
  9.  */
  10. namespace App\Widgets;
  11. use App\Entity\Account\User;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Pd\WidgetBundle\Builder\Item;
  14. use Pd\WidgetBundle\Builder\ItemInterface;
  15. use Pd\WidgetBundle\Event\WidgetEvent;
  16. use Symfony\Component\HttpFoundation\Request;
  17. /**
  18.  * Account Widget.
  19.  *
  20.  * @author Ramazan APAYDIN <apaydin541@gmail.com>
  21.  */
  22. class Account
  23. {
  24.     public function __construct(private EntityManagerInterface $entityManager)
  25.     {
  26.     }
  27.     /**
  28.      * Build Widgets.
  29.      */
  30.     public function builder(WidgetEvent $event): void
  31.     {
  32.         $event->getWidgetContainer()
  33.             ->addWidget($this->getUserInfoWidget())
  34.             ->addWidget($this->getUserStatisticsWidget());
  35.     }
  36.     private function getUserInfoWidget(): ItemInterface
  37.     {
  38.         return (new Item('user.info'))
  39.             ->setGroup('admin')
  40.             ->setName('widget.user_info.name')
  41.             ->setDescription('widget.user_info.description')
  42.             ->setTemplate('admin/widgets/userInfo.html.twig')
  43.             ->setRole(['ROLE_WIDGET_USERINFO'])
  44.             ->setData(function ($config) {
  45.                 $userCount $this->entityManager->getRepository(User::class)
  46.                     ->createQueryBuilder('u')
  47.                     ->select('count(u.id)')
  48.                     ->getQuery()
  49.                     ->getSingleScalarResult();
  50.                 return ['result' => $userCount];
  51.             })
  52.             ->setOrder(5);
  53.     }
  54.     private function getUserStatisticsWidget(): ItemInterface
  55.     {
  56.         return (new Item('user_statistics'))
  57.             ->setGroup('admin')
  58.             ->setName('widget.user_statistic.name')
  59.             ->setDescription('widget.user_statistic.description')
  60.             ->setTemplate('admin/widgets/userStatistics.html.twig')
  61.             ->setRole(['ROLE_WIDGET_USERSTATISTICS'])
  62.             ->setConfigProcess(static function (Request $request) {
  63.                 if ($type $request->get('type')) {
  64.                     switch ($type) {
  65.                         case '1week':
  66.                             return ['type' => '1week'];
  67.                         case '1month':
  68.                             return ['type' => '1month'];
  69.                         case '3month':
  70.                             return ['type' => '3month'];
  71.                     }
  72.                 }
  73.                 return false;
  74.             })
  75.             ->setData(function ($config) {
  76.                 // Create Chart Data
  77.                 $chart = [
  78.                     'column' => [],
  79.                     'created' => [],
  80.                     'logged' => [],
  81.                 ];
  82.                 // Set Default
  83.                 if (!isset($config['type'])) {
  84.                     $config['type'] = '1week';
  85.                 }
  86.                 // Create Statistics Data
  87.                 if ('3month' === $config['type']) {
  88.                     // Load Records
  89.                     $createdData $this->entityManager->getRepository(User::class)
  90.                         ->createQueryBuilder('u')
  91.                         ->select('count(u.id) as count, MONTH(u.createdAt) as month')
  92.                         ->groupBy('month')
  93.                         ->where('u.createdAt >= :date')
  94.                         ->setParameter('date', new \DateTime('-3 Month'))
  95.                         ->getQuery()->getArrayResult();
  96.                     $loggedData $this->entityManager->getRepository(User::class)
  97.                         ->createQueryBuilder('u')
  98.                         ->select('count(u.id) as count, MONTH(u.lastLogin) as month')
  99.                         ->groupBy('month')
  100.                         ->where('u.lastLogin >= :date')
  101.                         ->setParameter('date', new \DateTime('-3 Month'))
  102.                         ->getQuery()->getArrayResult();
  103.                     $createdData array_column($createdData'count''month');
  104.                     $loggedData array_column($loggedData'count''month');
  105.                     // Optimize Data
  106.                     for ($i 0$i 3; ++$i) {
  107.                         $month explode('/'date('n/Y'strtotime("-{$i} month")));
  108.                         $chart['column'][] = $month[0].'/'.$month[1];
  109.                         $chart['created'][] = $createdData[$month[0]] ?? 0;
  110.                         $chart['logged'][] = $loggedData[$month[0]] ?? 0;
  111.                     }
  112.                 } elseif (\in_array($config['type'], ['1month''1week'], true) || !$config['type']) {
  113.                     $time '1month' === $config['type'] ? new \DateTime('-1 Month') : new \DateTime('-6 Day');
  114.                     $column '1month' === $config['type'] ? 30 7;
  115.                     // Load Records
  116.                     $createdData $this->entityManager->getRepository(User::class)
  117.                         ->createQueryBuilder('u')
  118.                         ->select('count(u.id) as count, DAY(u.createdAt) as day')
  119.                         ->groupBy('day')
  120.                         ->where('u.createdAt >= :date')
  121.                         ->setParameter('date'$time)
  122.                         ->getQuery()->getArrayResult();
  123.                     $loggedData $this->entityManager->getRepository(User::class)
  124.                         ->createQueryBuilder('u')
  125.                         ->select('count(u.id) as count, DAY(u.lastLogin) as day')
  126.                         ->groupBy('day')
  127.                         ->where('u.lastLogin >= :date')
  128.                         ->setParameter('date'$time)
  129.                         ->getQuery()->getArrayResult();
  130.                     $createdData array_column($createdData'count''day');
  131.                     $loggedData array_column($loggedData'count''day');
  132.                     // Optimize Data
  133.                     for ($i 0$i $column; ++$i) {
  134.                         $day explode('/'date('j/m'strtotime("-{$i} day")));
  135.                         $chart['column'][] = $day[0].'/'.$day[1];
  136.                         $chart['created'][] = $createdData[$day[0]] ?? 0;
  137.                         $chart['logged'][] = $loggedData[$day[0]] ?? 0;
  138.                     }
  139.                 }
  140.                 // JSON & Reverse Data
  141.                 $chart['column'] = json_encode(array_reverse($chart['column']));
  142.                 $chart['created'] = json_encode(array_reverse($chart['created']));
  143.                 $chart['logged'] = json_encode(array_reverse($chart['logged']));
  144.                 return $chart;
  145.             });
  146.     }
  147. }