| 
<?php
 namespace Lagdo\Polr\Admin;
 
 use Carbon\Carbon;
 use GuzzleHttp\Client as HttpClient;
 
 use Jaxon\Response\Response;
 use Jaxon\Laravel\Jaxon;
 
 use Lagdo\Polr\Admin\App\Link;
 use Lagdo\Polr\Admin\App\Stats;
 use Lagdo\Polr\Admin\App\User;
 
 class PolrAdmin
 {
 /**
 * The Polr page tabs
 *
 * @var array
 */
 protected $tabs = null;
 
 /**
 * The Polr endpoints, read from the config
 *
 * @var array
 */
 protected $endpoints = [];
 
 /**
 * The Polr config options, read from config file
 *
 * @var Jaxon\Utils\Config\Config
 */
 protected $config;
 
 /**
 * A function to call in order to reload the dashboard
 *
 * @var Closure
 */
 protected static $reloadCallback = null;
 
 public function __construct($dtRenderer)
 {
 // Set the class initializer
 $this->apiKey = null;
 $this->apiClient = null;
 // Set the Datatables renderer
 $this->dtRenderer = $dtRenderer;
 // Set the input validator
 $this->validator = new Helpers\Validator();
 }
 
 protected function init()
 {
 // Polr API Client
 if($this->apiClient == null)
 {
 $armada = jaxon()->armada();
 // Get Polr endpoints from the config
 if(!($current = $armada->session()->get('polr.endpoint')))
 {
 // $current = config('polradmin.default', '');
 $current = $this->config->getOption('default', '');
 $armada->session()->set('polr.endpoint', $current);
 }
 $cfgKey = 'endpoints.' . $current;
 $this->apiKey = $this->config->getOption($cfgKey . '.key');
 $uri = rtrim($this->config->getOption($cfgKey . '.url'), '/') . '/' .
 trim($this->config->getOption($cfgKey . '.api'), '/') . '/';
 $this->apiClient = new HttpClient(['base_uri' => $uri]);
 }
 
 if($this->tabs == null)
 {
 $jaxon = jaxon();
 // Get Polr endpoints from the config
 $armada = $jaxon->armada();
 if(!($current = $armada->session()->get('polr.endpoint')))
 {
 $current = $this->config->getOption('default', '');
 $armada->session()->set('polr.endpoint', $current);
 }
 $this->endpoints = [
 'current' => (object)$this->config->getOption('endpoints.' . $current, null),
 'names' => [],
 ];
 if($this->endpoints['current'] != null)
 {
 $this->endpoints['current']->id = $current;
 }
 foreach($this->config->getOption('endpoints') as $id => $endpoint)
 {
 $this->endpoints['names'][$id] = $endpoint['name'];
 }
 
 // Set the tabs content
 $this->tabs = [
 'home' => (object)[
 'view' => null,
 'title' => 'Home',
 'class' => '',
 'active' => true,
 ],
 'settings' => (object)[
 'view' => null,
 'title' => 'Settings',
 'class' => '',
 'active' => false,
 ],
 'user-links' => (object)[
 'view' => null,
 'title' => 'User Links',
 'class' => '',
 'active' => false,
 ],
 'admin-links' => (object)[
 'view' => null,
 'title' => 'Admin Links',
 'class' => '',
 'active' => false,
 ],
 'users' => (object)[
 'view' => null,
 'title' => 'Users',
 'class' => '',
 'active' => false,
 ],
 'stats' => (object)[
 'view' => null,
 'title' => 'Stats',
 'class' => 'stats',
 'active' => false,
 ],
 ];
 
 foreach($this->tabs as $id => &$tab)
 {
 $tab->view = $armada->view()->render('polr_admin::tabs.' . $id, [
 'endpoint' => $this->endpoints['current'],
 'endpoints' => $this->endpoints['names'],
 ]);
 }
 }
 }
 
 public function config($sConfigFile)
 {
 // Read the config file
 $this->config = jaxon()->readConfigFile($sConfigFile, 'lib', '');
 $this->init();
 }
 
 public function tabs()
 {
 return $this->tabs;
 }
 
 public function endpoint()
 {
 if(count($this->endpoints) == 0)
 {
 return null;
 }
 return $this->endpoints['current'];
 }
 
 public function css()
 {
 $armada = jaxon()->armada();
 $template = $this->config->getOption('templates.css', 'polr_admin::css');
 return $armada->view()->render($template);
 }
 
 public function js()
 {
 $armada = jaxon()->armada();
 $template = $this->config->getOption('templates.js', 'polr_admin::js');
 $js = $armada->view()->render($template);
 return $armada->view()->render('polr_admin::snippets.js', [
 'js' => $js,
 'user' => $armada->request(User::class), // Ajax request to the Jaxon User class
 'link' => $armada->request(Link::class), // Ajax request to the Jaxon Link class
 'stats' => $armada->request(Stats::class), // Ajax request to the Jaxon Stats class
 'datePickerLeftBound' => Carbon::now()->subDays(Stats::DAYS_TO_FETCH),
 'datePickerRightBound' => Carbon::now(),
 ]);
 }
 
 public function ready()
 {
 return 'polr.home.init();polr.stats.initDatePickers();polr.home.setHandlers();';
 }
 
 public function html()
 {
 $armada = jaxon()->armada();
 $template = $this->config->getOption('templates.html', 'polr_admin::default');
 return $armada->view()->render($template)->with('tabs', $this->tabs());
 }
 
 public function initInstance($instance)
 {
 // Save the HTTP REST client
 $instance->apiKey = $this->apiKey;
 $instance->apiClient = $this->apiClient;
 
 // Dialogs and notifications are implemented by the Dialogs plugin
 $sentry = jaxon()->sentry();
 $response = $sentry->ajaxResponse();
 $instance->dialog = $response->dialog;
 $instance->notify = $response->dialog;
 
 // The client IP address
 $instance->remoteAddress = $_SERVER['REMOTE_ADDR'];
 
 // Save the Datatables renderer in the class instance
 $instance->dtRenderer = $this->dtRenderer;
 
 // Polr plugin instance
 $instance->polr = $this;
 
 // The input validator
 $instance->validator = $this->validator;
 }
 
 public function setReloadCallback(\Closure $callback)
 {
 self::$reloadCallback = $callback;
 }
 
 public function onReload(\Closure $callback)
 {
 self::$reloadCallback = $callback;
 }
 
 public function reload(Response $response)
 {
 if(self::$reloadCallback == null)
 {
 $url = \Jaxon\Utils\URI::detect(); // Reload the page by redirecting to the current URL
 $response->redirect($url);
 }
 else
 {
 $callback = self::$reloadCallback; // Custom callback set by the user
 $callback($response);
 }
 }
 }
 
 |