<?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);
}
}
}
|