231 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Views;
 | |
| 
 | |
| // Source: https://adminlte.io/themes/v3/
 | |
| 
 | |
| use Elements\Body;
 | |
| use Elements\Script;
 | |
| 
 | |
| class AdminDashboard extends Body {
 | |
| 
 | |
|   private array $errorMessages;
 | |
| 
 | |
|   public function __construct($document) {
 | |
|     parent::__construct($document);
 | |
|     $this->errorMessages = array();
 | |
|   }
 | |
| 
 | |
|   private function getNotifications() : array {
 | |
|     $req = new \Api\Notifications\Fetch($this->getDocument()->getUser());
 | |
|     if(!$req->execute()) {
 | |
|       $this->errorMessages[] = $req->getLastError();
 | |
|       return array();
 | |
|     } else {
 | |
|       return $req->getResult()['notifications'];
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private function getUsers() : array {
 | |
|     $req = new \Api\User\Fetch($this->getDocument()->getUser());
 | |
|     if(!$req->execute()) {
 | |
|       $this->errorMessages[] = $req->getLastError();
 | |
|       return array();
 | |
|     } else {
 | |
|       return $req->getResult()['users'];
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private function getHeader() {
 | |
| 
 | |
|     // Locale
 | |
|     $home = L("Home");
 | |
|     $search = L("Search");
 | |
| 
 | |
|     // Icons
 | |
|     $iconMenu = $this->createIcon("bars");
 | |
|     $iconNotification = $this->createIcon("bell", "far");
 | |
|     $iconSearch = $this->createIcon("search");
 | |
|     $iconMail = $this->createIcon("envelope", "fas");
 | |
| 
 | |
|     // Notifications
 | |
|     $notifications = $this->getNotifications();
 | |
|     $numNotifications = count($notifications);
 | |
|     if ($numNotifications === 0) {
 | |
|       $notificationText = L("No new notifications");
 | |
|     } else if($numNotifications === 1) {
 | |
|       $notificationText = L("1 new notification");
 | |
|     } else {
 | |
|       $notificationText = sprintf(L("%d new notification"), $numNotifications);
 | |
|     }
 | |
| 
 | |
|     $html =
 | |
|       "<nav class=\"main-header navbar navbar-expand navbar-white navbar-light\">
 | |
| 
 | |
|         <!-- Left navbar links -->
 | |
|         <ul class=\"navbar-nav\">
 | |
|           <li class=\"nav-item\">
 | |
|             <a class=\"nav-link\" data-widget=\"pushmenu\" href=\"#\" role=\"button\">$iconMenu</a>
 | |
|           </li>
 | |
|           <li class=\"nav-item d-none d-sm-inline-block\">
 | |
|             <a href=\"/\" class=\"nav-link\">$home</a>
 | |
|           </li>
 | |
|         </ul>
 | |
|     
 | |
|         <!-- SEARCH FORM -->
 | |
|         <form class=\"form-inline ml-3\">
 | |
|           <div class=\"input-group input-group-sm\">
 | |
|             <input class=\"form-control form-control-navbar\" type=\"search\" placeholder=\"$search\" aria-label=\"$search\">
 | |
|             <div class=\"input-group-append\">
 | |
|               <button class=\"btn btn-navbar\" type=\"submit\">
 | |
|                 $iconSearch
 | |
|               </button>
 | |
|             </div>
 | |
|           </div>
 | |
|         </form>
 | |
|     
 | |
|         <!-- Right navbar links -->
 | |
|         <ul class=\"navbar-nav ml-auto\">
 | |
|           <!-- Notifications Dropdown Menu -->
 | |
|           <li class=\"nav-item dropdown\">
 | |
|             <a class=\"nav-link\" data-toggle=\"dropdown\" href=\"#\">
 | |
|               $iconNotification
 | |
|               <span class=\"badge badge-warning navbar-badge\">$numNotifications</span>
 | |
|             </a>
 | |
|             <div class=\"dropdown-menu dropdown-menu-lg dropdown-menu-right\">
 | |
|               <span class=\"dropdown-item dropdown-header\">$notificationText</span>
 | |
|               <div class=\"dropdown-divider\"></div>";
 | |
| 
 | |
|     // Notifications
 | |
|     $i = 0;
 | |
|     foreach($notifications as $notification) {
 | |
| 
 | |
|       $title = $notification["title"];
 | |
|       $notificationId = $notification["uid"];
 | |
|       $createdAt = getPeriodString($notification["created_at"]);
 | |
| 
 | |
|       if ($i > 0) {
 | |
|         $html .= "<div class=\"dropdown-divider\"></div>";
 | |
|       }
 | |
| 
 | |
|       $html .=
 | |
|         "<a href=\"#\" class=\"dropdown-item\" data-id=\"$notificationId\">
 | |
|             $iconMail<span class=\"ml-2\">$title</span>
 | |
|             <span class=\"float-right text-muted text-sm\">$createdAt</span>
 | |
|         </a>";
 | |
| 
 | |
|       $i++;
 | |
|       if ($i >= 5) {
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     $html .= "<a href=\"#\" class=\"dropdown-item dropdown-footer\">See All Notifications</a>
 | |
|             </div>
 | |
|           </li>
 | |
|         </ul>
 | |
|       </nav>";
 | |
| 
 | |
|     return $html;
 | |
|   }
 | |
| 
 | |
|   private function getSidebar() {
 | |
| 
 | |
|     $menuEntries = array(
 | |
|       "dashboard" => array(
 | |
|         "name" => "Dashboard",
 | |
|         "icon" => "tachometer-alt"
 | |
|       ),
 | |
|       "users" => array(
 | |
|         "name" => "Users",
 | |
|         "icon" => "users"
 | |
|       ),
 | |
|       "settings" => array(
 | |
|         "name" => "Settings",
 | |
|         "icon" => "tools"
 | |
|       ),
 | |
|       "help" => array(
 | |
|         "name" => "Help",
 | |
|         "icon" => "question-circle"
 | |
|       ),
 | |
|     );
 | |
| 
 | |
|     $currentView = $_GET["view"] ?? "dashboard";
 | |
| 
 | |
|     $html =
 | |
|       "<aside class=\"main-sidebar sidebar-dark-primary elevation-4\">
 | |
|         <!-- Brand Logo -->
 | |
|         <a href=\"index3.html\" class=\"brand-link\">
 | |
|           <img src=\"/img/web_base_logo.png\" alt=\"WebBase Logo\" class=\"brand-image img-circle elevation-3\"
 | |
|                style=\"opacity: .8\">
 | |
|           <span class=\"brand-text font-weight-light\">WebBase</span>
 | |
|         </a>
 | |
|     
 | |
|         <!-- Sidebar -->
 | |
|         <div class=\"sidebar\">
 | |
|      
 | |
|           <!-- Sidebar Menu -->
 | |
|           <nav class=\"mt-2\">
 | |
|             <ul class=\"nav nav-pills nav-sidebar flex-column\" data-widget=\"treeview\" role=\"menu\" data-accordion=\"false\">";
 | |
| 
 | |
|     foreach($menuEntries as $view => $menuEntry) {
 | |
|       $name = L($menuEntry["name"]);
 | |
|       $icon = $this->createIcon($menuEntry["icon"], "fas", "nav-icon");
 | |
|       $active = ($currentView === $view) ? " active" : "";
 | |
|       $html .=
 | |
|               "<li class=\"nav-item\">
 | |
|                 <a href=\"?view=$view\" class=\"nav-link$active\">
 | |
|                   $icon
 | |
|                   <p>$name </p>
 | |
|                 </a>
 | |
|               </li>";
 | |
|     }
 | |
| 
 | |
|     $html .=
 | |
|             "</ul>  
 | |
|           </nav>
 | |
|         </div>
 | |
|       </aside>";
 | |
| 
 | |
|     return $html;
 | |
|   }
 | |
| 
 | |
|   private function getContent() {
 | |
| 
 | |
|     $this->getUsers();
 | |
| 
 | |
|     $html = "<div class=\"content-wrapper p-2\">";
 | |
| 
 | |
|     foreach($this->errorMessages as $errorMessage) {
 | |
|       $html .= $this->createErrorText($errorMessage);
 | |
|     }
 | |
| 
 | |
|     $html .= "</div>";
 | |
| 
 | |
|     return $html;
 | |
|   }
 | |
| 
 | |
|   public function getCode() {
 | |
| 
 | |
|     $head = $this->getDocument()->getHead();
 | |
|     $head->addJS(Script::BOOTSTRAP);
 | |
|     $head->loadAdminlte();
 | |
| 
 | |
|     $header = $this->getHeader();
 | |
|     $sidebar = $this->getSidebar();
 | |
|     $content = $this->getContent();
 | |
| 
 | |
|     $html =
 | |
|       "<!-- LICENSE: /docs/LICENSE_ADMINLTE -->
 | |
|       <body class=\"hold-transition sidebar-mini layout-fixed\">
 | |
|           <div class=\"wrapper\">
 | |
|             $header
 | |
|             $sidebar
 | |
|             $content
 | |
|           </div>
 | |
|       </body>";
 | |
| 
 | |
|     return $html;
 | |
|   }
 | |
| }
 |