pandorafms/pandora_console/include/lib/Dashboard/Manager.php

1528 lines
38 KiB
PHP

<?php
namespace PandoraFMS\Dashboard;
use PandoraFMS\View;
use PandoraFMS\Dashboard\Cell;
use PandoraFMS\PublicLogin;
/**
* Dashboard manager.
*/
class Manager implements PublicLogin
{
/**
* Ajax controller.
*
* @var string
*/
protected $ajaxController;
/**
* User is admin.
*
* @var integer
*/
private $isAdmin;
/**
* Groups for user ACL.
*
* @var array
*/
private $groups;
/**
* Groups for user ACL string for IN clauses query.
*
* @var string
*/
private $stringGroups;
/**
* Acl write report.
*
* @var integer
*/
private $writeDashboards;
/**
* Acl manage report.
*
* @var integer
*/
private $manageDashboards;
/**
* ID dashboard
*
* @var integer
*/
private $dashboardId;
/**
* Dashboard data.
*
* @var array
*/
private $dashboardFields;
/**
* Operations delete dashboard.
*
* @var integer
*/
private $deleteDashboard;
/**
* Operations copy dashboard.
*
* @var integer
*/
private $copyDashboard;
/**
* Operations create dashboard.
*
* @var integer
*/
private $createDashboard;
/**
* Operations update dashboard.
*
* @var integer
*/
private $updateDashboard;
/**
* Cells for this dashboard.
*
* @var array
*/
private $cells;
/**
* Id Cell.
*
* @var integer
*/
private $cellId;
/**
* Id Widget.
*
* @var integer
*/
private $widgetId;
/**
* Offset.
*
* @var integer
*/
private $offset;
/**
* Slides.
*
* @var integer
*/
private $slides;
/**
* Cell Mode Slides.
*
* @var integer
*/
private $cellModeSlides;
/**
* Slides Ids.
*
* @var array
*/
private $slidesIds;
/**
* Refr.
*
* @var integer
*/
private $refr;
/**
* Public Link.
*
* @var boolean
*/
private $publicLink;
/**
* Allowed methods to be called using AJAX request.
*
* @var array
*/
public $AJAXMethods = [
'getCellsLayout',
'insertCellLayout',
'drawCell',
'drawWidget',
'saveLayout',
'deleteCell',
'drawAddWidget',
'drawConfiguration',
'drawFormDashboard',
'updateDashboard',
'saveWidgetIntoCell',
'imageIconDashboardAjax',
'formSlides',
'callWidgetMethod',
];
/**
* Constructor
*
* @param string $page For ajax controller.
*/
public function __construct(string $page='operation/dashboard/dashboard')
{
global $config;
// Check ACL.
$hash = get_parameter('hash', false);
$this->publicLink = false;
// Check user access.
if ($hash === false) {
check_login();
if (check_acl($config['id_user'], 0, 'RR') === 0) {
include 'general/noaccess.php';
return;
}
} else {
if (self::validatePublicHash($hash) === false) {
db_pandora_audit(
'Invalid public hash',
'Trying to access public dashboard'
);
include 'general/noaccess.php';
exit;
}
$this->publicLink = true;
}
if (empty(get_parameter('auth_hash', '')) === false) {
$this->publicLink = true;
}
// User is admin.
$this->isAdmin = (bool) \is_user_admin($config['id_user']);
// Groups user access.
$this->groups = array_keys(
\users_get_groups(
$config['id_user'],
'RR',
true
)
);
// String groups for query.
$this->stringGroups = \io_safe_output(
implode(
', ',
array_values($this->groups)
)
);
// Urls.
$this->url = \ui_get_full_url(
'index.php?sec=reporting&sec2=operation/dashboard/dashboard'
);
$this->ajaxController = $page;
// ACL Dashboards.
$this->writeDashboards = \check_acl($config['id_user'], 0, 'RW');
$this->manageDashboards = \check_acl($config['id_user'], 0, 'RM');
// Operations Dashboards.
$this->deleteDashboard = (bool) \get_parameter('deleteDashboard', 0);
$this->copyDashboard = (bool) \get_parameter('copyDashboard', 0);
$this->createDashboard = \get_parameter('createDashboard', null);
$this->updateDashboard = \get_parameter('updateDashboard', null);
$this->slides = (int) \get_parameter('slides', 0);
$extradata = \get_parameter('extradata', '');
if (empty($extradata) === false) {
$extradata = json_decode(\io_safe_output($extradata), true);
if (isset($extradata['dashboardId']) === false) {
$extradata['dashboardId'] = null;
}
if (isset($extradata['cellId']) === false) {
$extradata['cellId'] = null;
}
if (isset($extradata['offset']) === false) {
$extradata['offset'] = null;
}
if (isset($extradata['widgetId']) === false) {
$extradata['widgetId'] = null;
}
$this->dashboardId = (int) $extradata['dashboardId'];
$this->cellId = (int) $extradata['cellId'];
$this->offset = (int) $extradata['offset'];
$this->widgetId = (int) $extradata['widgetId'];
} else {
$this->cellId = (int) \get_parameter('cellId', []);
$this->offset = (int) \get_parameter('offset', 0);
$this->dashboardId = (int) \get_parameter('dashboardId', 0);
if ($this->slides === 1) {
$this->slidesIds = (array) \get_parameter('slidesIds');
$this->cellModeSlides = (int) \get_parameter(
'cellModeSlides',
0
);
if ($this->dashboardId === 0) {
$this->dashboardId = (int) $this->slidesIds[0];
}
}
$this->widgetId = (int) \get_parameter('widgetId', 0);
}
if ($this->dashboardId !== 0) {
$this->dashboardFields = $this->get();
$this->cells = Cell::getCells($this->dashboardId);
}
$this->refr = (int) get_parameter('refr', 0);
$this->refr = (empty($this->refr) === false) ? $this->refr : $config['vc_refr'];
}
/**
* Generates a hash to authenticate in public dashboards.
*
* @param string|null $other_secret To authenticate some parts
* of public dashboards (like visual consoles or wux widgets)
* another hash is needed. Other secret avoid
* to reuse the main hash to view other components.
*
* @return string Returns a hash with the authenticaction.
*/
public static function generatePublicHash(?string $other_secret=''):string
{
global $config;
$str = $config['dbpass'];
$str .= $config['id_user'];
$str .= $other_secret;
return hash('sha256', $str);
}
/**
* Validates a hash to authenticate in public dashboards.
*
* @param string $hash Hash to be checked.
* @param string $other_secret Yo need to provide it to
* authenticate some parts of widgets.
*
* @return boolean Returns true if hash is valid.
*/
public static function validatePublicHash(
string $hash,
string $other_secret=''
):bool {
global $config;
if (isset($config['id_user']) === true) {
// Already logged in.
return true;
}
$userFromParams = false;
// Try to get id_user from parameters if it is missing.
if (isset($config['id_user']) === false) {
$userFromParams = true;
$config['id_user'] = get_parameter('id_user', false);
// It is impossible to authenticate without an id user.
if ($config['id_user'] === false) {
unset($config['id_user']);
return false;
}
} else {
$config['public_dashboard'] = false;
}
// Build a hash to check.
$hashCheck = self::generatePublicHash($other_secret);
if ($hashCheck === $hash) {
// "Log" user in.
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
$_SESSION['id_usuario'] = $config['id_user'];
session_write_close();
$config['public_dashboard'] = true;
$config['force_instant_logout'] = true;
return true;
}
// Remove id user from config array if authentication has failed.
if ($userFromParams === true) {
unset($config['id_user']);
}
return false;
}
/**
* Instance Widget.
*
* @param integer|null $width Width.
* @param integer|null $height Height.
* @param integer|null $gridWidth Width Grid.
*
* @return object
*/
private function instanceWidget(
?int $width=0,
?int $height=0,
?int $gridWidth=0
):object {
global $config;
if ($this->widgetId === 0) {
$cellClass = new Cell($this->cellId, $this->dashboardId);
$dataCell = $cellClass->get();
$this->widgetId = $dataCell['id_widget'];
}
$this->cWidget = new Widget(
$this->cellId,
$this->dashboardId,
$this->widgetId
);
$widgetData = $this->cWidget->get();
// Include widget if necesary.
$urlWidget = $config['homedir'];
$urlWidget .= '/include/lib/Dashboard/Widgets/';
$urlWidget .= $widgetData['page'];
include_once $urlWidget;
$class = new \ReflectionClass($this);
$nameSpace = $class->getNamespaceName();
// Rename Old bad name class.
if ($widgetData['class_name'] === 'TopN_event_by_group') {
$widgetData['class_name'] = 'TopNEventByGroupWidget';
} else if ($widgetData['class_name'] === 'TopN_event_by_module') {
$widgetData['class_name'] = 'TopNEventByModuleWidget';
}
$className = $nameSpace.'\\'.$widgetData['class_name'];
// Hack: class_name is the name of the widget class to create.
$instance = new $className(
$this->cellId,
$this->dashboardId,
$this->widgetId,
$width,
$height,
$gridWidth,
$this->publicLink
);
return $instance;
}
/**
* Retrieve a dashboard definition.
*
* @return array dashboard data.
*/
private function get()
{
global $config;
$sql = sprintf(
'SELECT *
FROM tdashboard
WHERE id = %d',
$this->dashboardId
);
if ($this->isAdmin !== true) {
$sql = sprintf(
"SELECT *
FROM tdashboard
WHERE id = %d
AND (id_group IN (%s) AND id_user = '') OR id_user = '%s'",
$this->dashboardId,
$this->stringGroups,
$config['id_user']
);
}
$data = \db_get_row_sql($sql);
if ($data === false) {
return [];
}
return $data;
}
/**
* Insert dashboard item.
*
* @param array $data Array data Insert.
*
* @return integer
*/
public function set(array $data):int
{
global $config;
// Insert.
$result = \db_process_sql_insert(
'tdashboard',
$data
);
if ($result === false) {
$result = 0;
}
return $result;
}
/**
* Update local object attributes and updates the DB.
*
* @param array $values Values to be updated.
*
* @return array Result of set operation.
*/
public function put(array $values) : array
{
global $config;
$result = [
'error' => false,
'msg_error' => '',
'result' => 0,
];
// Update.
$res = \db_process_sql_update(
'tdashboard',
$values,
['id' => $this->dashboardId]
);
$result['result'] = $res;
if ($res === false) {
$result = [
'error' => true,
'msg_error' => $config['dbconnection']->error,
'result' => $res,
];
}
return $result;
}
/**
* Delete Dashboard.
*
* @return boolean
*/
public function delete()
{
global $config;
$result = 0;
if ($this->manageDashboards === 1) {
$result = \db_process_sql_delete(
'tdashboard',
['id' => $this->dashboardId]
);
}
// Audit.
if ($result !== 0) {
\db_pandora_audit(
'Dashboard management',
'Delete dashboard #'.$this->dashboardId
);
} else {
\db_pandora_audit(
'Dashboard management',
'Fail try to delete dashboard #'.$this->dashboardId
);
}
return $result;
}
/**
* Copy Dashboard and asociate widgets.
*
* @return integer
*/
public function copy():int
{
$result = true;
// Name copy change.
$name = __('Copy of %s', $this->dashboardFields['name']);
$i = 1;
while (true) {
$exists = db_get_value(
'name',
'tdashboard',
'name',
$name
);
if (empty($exists) === true) {
break;
} else {
$name = $name.' ('.$i.')';
}
$i++;
}
$values = [
'name' => $name,
'id_user' => $this->dashboardFields['id_user'],
'id_group' => $this->dashboardFields['id_group'],
'active' => $this->dashboardFields['active'],
'cells' => $this->dashboardFields['cells'],
'cells_slideshow' => $this->dashboardFields['cells_slideshow'],
];
$id = $this->set($values);
if (empty($id) === true) {
$result = 0;
} else {
$cells = Cell::getCells($this->dashboardId);
foreach ($cells as $cell) {
// Remove Id.
unset($cell['id']);
// Change Id dashboard.
$cell['id_dashboard'] = $id;
$result = db_process_sql_insert('twidget_dashboard', $cell);
if (empty($result) === true) {
$result = 0;
break;
}
}
// Clean database.
if ($result === 0) {
db_process_sql_delete(
'tdashboard',
['id' => $id]
);
db_process_sql_delete(
'twidget_dashboard',
['id_dashboard' => $id]
);
}
}
return $result;
}
/**
* Get all dashboard user can you see.
*
* @param integer $offset Offset query.
* @param integer $limit Limit query.
* @param boolean $favourite Fovorite dashboard.
* @param boolean $slideshow Slideshow Mode.
*
* @return array
*/
static public function getDashboards(
int $offset=-1,
int $limit=-1,
bool $favourite=false,
bool $slideshow=false
):array {
global $config;
$sql_limit = '';
if ($offset !== -1 && $limit !== -1) {
$sql_limit = ' LIMIT '.$offset.','.$limit;
}
$sql_where = '';
if ($favourite === true) {
$sql_where .= 'AND td.active = 1';
}
if ($slideshow === true) {
$sql_where .= 'AND td.cells_slideshow = 1';
}
// Check ACl.
if (\is_user_admin($config['id_user']) !== true) {
// User no admin see dashboards of him groups and profile 'AR'.
$group_list = \users_get_groups(
$config['id_user'],
'RR',
true
);
if ($group_list === false) {
$group_list = [];
}
if (empty($group_list) === false) {
$string_groups = implode(', ', array_keys($group_list));
$string_groups = \io_safe_output($string_groups);
// Select user's dashboards.
$sql_dashboard = sprintf(
"SELECT td.id,
td.name,
td.id_user,
td.id_group,
td.active,
count(twd.id) as cells,
td.cells_slideshow
FROM tdashboard td
LEFT JOIN twidget_dashboard twd
ON td.id = twd.id_dashboard
WHERE ((td.id_group IN (%s) AND td.id_user = '') OR
td.id_user = '%s') %s
GROUP BY td.id
ORDER BY name%s",
$string_groups,
$config['id_user'],
$sql_where,
$sql_limit
);
} else {
$sql_dashboard = sprintf(
"SELECT td.id,
td.name,
td.id_user,
td.id_group,
td.active,
count(twd.id) as cells,
td.cells_slideshow
FROM tdashboard td
LEFT JOIN twidget_dashboard twd
ON td.id = twd.id_dashboard
WHERE td.id_group = 0 AND td.id_user = '%s' %s
GROUP BY td.id
ORDER BY name%s",
$config['id_user'],
$sql_where,
$sql_limit
);
}
} else {
// User admin view all dashboards.
$sql_dashboard = sprintf(
'SELECT td.id,
td.name,
td.id_user,
td.id_group,
td.active,
count(twd.id) as cells,
td.cells_slideshow
FROM tdashboard td
LEFT JOIN twidget_dashboard twd
ON td.id = twd.id_dashboard
WHERE 1=1 %s
GROUP BY td.id
ORDER BY name%s',
$sql_where,
$sql_limit
);
}
$dashboards = \db_get_all_rows_sql($sql_dashboard);
if ($dashboards === false) {
$dashboards = [];
}
return $dashboards;
}
/**
* Get all dashboard user can you see.
*
* @return array Return counts.
*/
static public function getDashboardsCount()
{
global $config;
if (is_user_admin($config['id_user']) !== false) {
// User no admin see dashboards of him groups and profile 'AR'.
$group_list = \users_get_groups(
$config['id_user'],
'RR',
true
);
if ($group_list === false) {
$group_list = [];
}
if (empty($group_list) === false) {
$string_groups = implode(', ', array_keys($group_list));
$string_groups = io_safe_output($string_groups);
$sql_dashboard = sprintf(
"SELECT COUNT(*)
FROM tdashboard
WHERE (id_group IN (%s) AND id_user = '') OR
id_user = '%s'",
$string_groups,
$config['id_user']
);
} else {
$sql_dashboard = sprintf(
"SELECT COUNT(*)
FROM tdashboard
WHERE id_group = 0 AND id_user = '%s'",
$config['id_user']
);
}
} else {
$sql_dashboard = 'SELECT COUNT(*) FROM tdashboard';
}
$count_dashboards = db_get_all_rows_sql($sql_dashboard);
if ($count_dashboards === false) {
$count_dashboards = [];
}
return $count_dashboards[0]['COUNT(*)'];
}
/**
* Checks if target method is available to be called using AJAX.
*
* @param string $method Target method.
*
* @return boolean True allowed, false not.
*/
public function ajaxMethod(string $method):bool
{
return in_array($method, $this->AJAXMethods);
}
/**
* Init manager dashboard.
*
* @return void
*/
public function run()
{
global $config;
ui_require_css_file('modal');
ui_require_css_file('form');
if ($this->dashboardId === 0
|| $this->deleteDashboard === true
|| $this->copyDashboard === true
) {
$this->showList();
} else {
$this->drawLayout();
}
}
/**
* Draw list dashboards.
*
* @return void
*/
private function showList()
{
global $config;
$limit_sql = $config['block_size'];
$resultDelete = null;
if ($this->deleteDashboard === true) {
$resultDelete = $this->delete();
}
$resultCopy = null;
if ($this->copyDashboard === true) {
$resultCopy = $this->copy();
}
$dashboards = $this->getDashboards($this->offset, $limit_sql);
$count = $this->getDashboardsCount();
View::render(
'dashboard/list',
[
'dashboards' => $dashboards,
'count' => $count,
'offset' => $this->offset,
'urlDashboard' => $this->url,
'manageDashboards' => $this->manageDashboards,
'writeDashboards' => $this->writeDashboards,
'resultDelete' => $resultDelete,
'resultCopy' => $resultCopy,
'ajaxController' => $this->ajaxController,
'urlAjax' => \ui_get_full_url('ajax.php'),
]
);
}
/**
* Form Upadte dashboards.
*
* @return void
*/
public function drawFormDashboard()
{
View::render(
'dashboard/formDashboard',
[
'dashboardId' => $this->dashboardId,
'arrayDashboard' => $this->dashboardFields,
]
);
}
/**
* Update dashboards.
*
* @return mixed
*/
public function updateDashboard()
{
global $config;
if (check_acl($config['id_user'], 0, 'RW') === 0) {
include 'general/noaccess.php';
return;
}
$name = \get_parameter('name', '');
$private = \get_parameter_switch('private');
$id_group = \get_parameter('id_group');
$slideshow = \get_parameter_switch('slideshow');
$favourite = \get_parameter_switch('favourite');
$id_user = (empty($private) === false) ? $config['id_user'] : '';
$values = [
'name' => $name,
'id_user' => $id_user,
'id_group' => $id_group,
'cells_slideshow' => $slideshow,
'active' => $favourite,
];
if ($this->dashboardId === 0) {
$this->dashboardId = $this->set($values);
$res = $this->dashboardId;
if ($res !== false) {
// Create Initial Widget.
$values = [
'x' => '0',
'y' => '0',
'width' => '4',
'height' => '4',
];
$cellClass = new Cell($values, $this->dashboardId);
$dataCell = $cellClass->get();
}
$type = '&createDashboard=1';
$type .= '&cellIdCreate='.$dataCell['id'];
} else {
$res = $this->put($values);
}
$result = [
'error' => ($res === false) ? 1 : 0,
'error_mesage' => __('Error create or update dashboard'),
'url' => $this->url.$type,
'dashboardId' => $this->dashboardId,
];
echo json_encode($result);
}
/**
* Draw layout.
*
* @return mixed
*/
public function drawLayout()
{
global $config;
$dashboards = $this->getDashboards();
$dashboards = array_reduce(
$dashboards,
function ($carry, $item) {
$carry[$item['id']] = $item['name'];
return $carry;
},
[]
);
// Header.
if ($this->slides === 0) {
if ((bool) \is_metaconsole() === true) {
open_meta_frame();
}
View::render(
'dashboard/header',
[
'dashboards' => $dashboards,
'ajaxController' => $this->ajaxController,
'dashboardId' => $this->dashboardId,
'refr' => $this->refr,
'url' => $this->url,
'dashboardName' => $this->dashboardFields['name'],
'hash' => self::generatePublicHash(),
'publicLink' => $this->publicLink,
'dashboardGroup' => $this->dashboardFields['id_group'],
]
);
} else {
View::render(
'dashboard/slides',
[
'dashboard' => $this->dashboardFields,
'ajaxController' => $this->ajaxController,
'dashboardId' => $this->dashboardId,
'refr' => $this->refr,
'url' => $this->url,
'dashboardName' => $this->dashboardFields['name'],
'slides' => $this->slides,
'slidesIds' => $this->slidesIds,
'cells' => $this->cells,
'cellModeSlides' => $this->cellModeSlides,
'cellId' => ($this->cellId === 0) ? $this->cells[0]['id'] : $this->cellId,
'dashboardGroup' => $this->dashboardFields['id_group'],
]
);
}
if (isset($config['public_dashboard']) === false) {
$config['public_dashboard'] = false;
}
// View.
if ($this->slides === 0 || $this->cellModeSlides === 0) {
View::render(
'dashboard/layout',
[
'ajaxController' => $this->ajaxController,
'dashboardId' => $this->dashboardId,
'url' => \ui_get_full_url('ajax.php'),
'createDashboard' => $this->createDashboard,
'updateDashboard' => $this->updateDashboard,
'cellIdCreate' => \get_parameter('cellIdCreate', 0),
'class' => (($config['public_dashboard'] === true) ? quotemeta(__CLASS__) : ''),
'hash' => (($config['public_dashboard'] === true) ? self::generatePublicHash() : ''),
]
);
} else {
$this->cellId = ($this->cellId === 0) ? $this->cells[0]['id'] : $this->cellId;
$cellClass = new Cell($this->cellId, $this->dashboardId);
$cellData = $cellClass->get();
$instance = '';
if ((int) $cellData['id_widget'] !== 0 || $this->widgetId !== 0) {
$settings = [
'page' => $this->ajaxController,
'url' => \ui_get_full_url('ajax.php'),
'dashboardId' => $this->dashboardId,
'widgetId' => $cellData['id_widget'],
'cellId' => $this->cellId,
];
}
View::render(
'dashboard/slidesWidget',
[
'options' => \json_decode($cellData['options'], true),
'settings' => $settings,
]
);
}
// Js countdown for mode slice.
View::render(
'dashboard/jsLayout',
['dashboardId' => $this->dashboardId]
);
if ((bool) \is_metaconsole() === true
&& $this->slides === 0
) {
close_meta_frame();
}
return null;
}
/**
* Get cells for layout draw
*
* @return void
*/
public function getCellsLayout()
{
global $config;
$result = [];
$cells = $this->cells;
if ($cells === false) {
$cells = [];
}
if (empty($cells) === false) {
$result = array_reduce(
$cells,
function ($carry, $item) {
$carry[$item['order']]['id'] = $item['id'];
$carry[$item['order']]['position'] = $item['position'];
$carry[$item['order']]['widgetId'] = $item['id_widget'];
return $carry;
},
[]
);
}
echo json_encode($result);
}
/**
* Insert new cell layout.
*
* @return void
*/
public function insertCellLayout():void
{
global $config;
$position = [
'x' => 0,
'y' => 0,
'width' => 4,
'height' => 4,
];
$cellClass = new Cell($position, $this->dashboardId);
$dataCell = $cellClass->get();
$result = ['cellId' => $dataCell['id']];
echo json_encode($result);
}
/**
* Draw Cell.
*
* @return mixed
*/
public function drawCell()
{
global $config;
$redraw = (bool) \get_parameter('redraw', 0);
$cellClass = new Cell($this->cellId, $this->dashboardId);
$cellData = $cellClass->get();
if ((int) $cellData['id_widget'] !== 0 || $this->widgetId !== 0) {
if ((int) $cellData['id_widget'] === 0 && $this->widgetId !== 0) {
// Insert in cell widget ID.
$res = $cellClass->put([], $this->widgetId);
if ($res === 1) {
$cellData['id_widget'] = $this->widgetId;
}
}
$instance = $this->instanceWidget();
$cellData['options'] = $instance->decoders(
$instance->getOptionsWidget()
);
if (isset($cellData['options']['title']) === false) {
$cellData['options']['title'] = $instance->getDescription();
}
$cellData['options'] = json_encode($cellData['options']);
}
View::render(
'dashboard/cell',
[
'redraw' => $redraw,
'cellData' => $cellData,
'manageDashboards' => $this->manageDashboards,
]
);
return null;
}
/**
* Draw widget.
*
* @return mixed
*/
public function drawWidget()
{
$newWidth = (int) \get_parameter('newWidth', 0);
$newHeight = (int) \get_parameter('newHeight', 0);
$gridWidth = (int) \get_parameter('gridWidth', 0);
$cellClass = new Cell($this->cellId, $this->dashboardId);
$cellData = $cellClass->get();
$instance = '';
if ((int) $cellData['id_widget'] !== 0 || $this->widgetId !== 0) {
$instance = $this->instanceWidget(
$newWidth,
$newHeight,
$gridWidth
);
}
View::render(
'dashboard/widget',
[
'widgetId' => $this->widgetId,
'cellData' => $cellData,
'instance' => $instance,
]
);
return null;
}
/**
* Save layout.
* Update, Insert and delete widgets.
* More important order.
*
* @return mixed
*/
public function saveLayout()
{
global $config;
$items = \get_parameter('items', []);
// Class Dashboard.
if (empty($items) === false) {
// Order for position Y and X.
usort(
$items,
function ($a, $b) {
// First order by position `y`.
// if `y` is the same order by position `x`.
$retval = ($a['y'] <=> $b['y']);
if ($retval === 0) {
$retval = ($a['x'] <=> $b['x']);
}
return $retval;
}
);
$result = false;
foreach ($items as $order => $item) {
$item['order'] = $order;
$id = $item['id'];
unset($item['id']);
// Update cells.
$cellClass = new Cell($id, $this->dashboardId);
$result = $cellClass->put($item);
if ($result === false) {
return false;
}
}
}
echo json_encode($result);
}
/**
* Ajax layout delete Cell.
*
* @return void
*/
public function deleteCell():void
{
global $config;
$res = 0;
if ($this->cellId !== 0) {
// Remove cells.
$cellClass = new Cell($this->cellId, $this->dashboardId);
$res = $cellClass->delete();
}
$result = ['result' => $res];
echo json_encode($result);
}
/**
* Draw list widgets.
*
* @return mixed
*/
public function drawAddWidget()
{
global $config;
Widget::dashboardInstallWidgets($this->cellId);
$search = \io_safe_output(\get_parameter('search', ''));
// The limit is fixed here.
$total = count(Widget::getWidgets(-1, -1, $search));
$widgets = Widget::getWidgets($this->offset, 9, $search);
View::render(
'dashboard/listWidgets',
[
'widgets' => $widgets,
'total' => $total,
'offset' => $this->offset,
'dashboardId' => $this->dashboardId,
'cellId' => $this->cellId,
'search' => $search,
'ajaxController' => $this->ajaxController,
]
);
return null;
}
/**
* Form configuration widget.
*
* @return mixed
*/
public function drawConfiguration()
{
global $config;
$instance = $this->instanceWidget();
$htmlInputs = $instance->getFormInputs([]);
$js = $instance->getFormJS();
View::render(
'dashboard/configurationWidgets',
[
'dashboardId' => $this->dashboardId,
'cellId' => $this->cellId,
'htmlInputs' => $htmlInputs,
'js' => $js,
]
);
return null;
}
/**
* Save widget into cell.
*
* @return void
*/
public function saveWidgetIntoCell()
{
global $config;
// Init result.
$result = ['result' => false];
if ($this->widgetId !== 0) {
// Instance widget for get Post.
$instance = $this->instanceWidget();
$values = $instance->getPost();
// Add new configuration for widget into cell.
$cellClass = new Cell($this->cellId, $this->dashboardId);
$res = $cellClass->put([], $this->widgetId, $values);
$result = [
'result' => $res,
'page' => $this->ajaxController,
'url' => ui_get_full_url('ajax.php'),
'dashboardId' => $this->dashboardId,
'cellId' => $this->cellId,
'widgetId' => $this->widgetId,
];
}
echo json_encode($result);
}
/**
* Image icon Dashboard ajax change.
*
* @return mixed
*/
public function imageIconDashboardAjax()
{
$nameImg = \get_parameter('nameImg', '');
$output = $this->imageIconDashboard($nameImg);
echo $output;
return null;
}
/**
* Return image php.
*
* @param string|null $nameImg Path image.
*
* @return string Image.
*/
public static function imageIconDashboard(?string $nameImg):string
{
if (empty($nameImg) === true) {
$nameImg = 'appliance';
}
$output = html_print_image(
'images/console/icons/'.$nameImg.'.png',
true,
[
'alt' => __('Icon image dashboard'),
'style' => 'max-width:70px; max-height:70px;',
]
);
return $output;
}
/**
* Draw form slides.
*
* @return mixed
*/
public function formSlides()
{
$dashboards = $this->getDashboards(-1, -1, false, false);
View::render(
'dashboard/formSlides',
[
'url' => $this->url,
'dashboards' => $dashboards,
]
);
return null;
}
/**
* Prints error.
*
* @param string $msg Message.
*
* @return void
*/
public function error(string $msg)
{
if ((bool) \is_ajax() === true) {
echo json_encode(['error' => $msg]);
} else {
\ui_print_error_message($msg);
}
}
/**
* Call widget method (ajax only).
*
* @param string $method Method to be invoked.
*
* @return boolean Executed or not.
*/
public function callWidgetMethod(string $method):bool
{
$widget = $this->instanceWidget();
if (method_exists($widget, $method) === true) {
$widget->$method();
return true;
}
return false;
}
}