You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
4.8 KiB
192 lines
4.8 KiB
<?php
|
|
/*
|
|
** Zabbix
|
|
** Copyright (C) 2001-2023 Zabbix SIA
|
|
**
|
|
** This program is free software; you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation; either version 2 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program; if not, write to the Free Software
|
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**/
|
|
|
|
|
|
class CTabView extends CDiv {
|
|
|
|
protected $id = 'tabs';
|
|
|
|
/**
|
|
* @var CDiv[]
|
|
*/
|
|
protected $tabs = [];
|
|
protected $headers = [];
|
|
protected $footer = null;
|
|
protected $selectedTab = null;
|
|
protected $indicators = [];
|
|
|
|
/**
|
|
* Script for tab change event.
|
|
*/
|
|
private $tab_change_js = '';
|
|
|
|
/**
|
|
* Disabled tabs IDs, tab option
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $disabledTabs = [];
|
|
|
|
public function __construct($data = []) {
|
|
if (isset($data['id'])) {
|
|
$this->id = $data['id'];
|
|
}
|
|
if (isset($data['selected'])) {
|
|
$this->setSelected($data['selected']);
|
|
}
|
|
if (isset($data['disabled'])) {
|
|
$this->setDisabled($data['disabled']);
|
|
}
|
|
parent::__construct();
|
|
$this->setId(zbx_formatDomId($this->id));
|
|
$this->addClass(ZBX_STYLE_TABLE_FORMS_CONTAINER);
|
|
}
|
|
|
|
public function setSelected($selected) {
|
|
if ($selected == 0) {
|
|
CCookieHelper::unset('tab');
|
|
}
|
|
|
|
$this->selectedTab = $selected;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set javascript on tab change event.
|
|
*
|
|
* @param string $value Script body.
|
|
*
|
|
* @return CTabView
|
|
*/
|
|
public function onTabChange($value) {
|
|
$this->tab_change_js = $value;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Disable tabs
|
|
*
|
|
* @param array $disabled disabled tabs IDs (first tab - 0, second - 1...)
|
|
*/
|
|
public function setDisabled($disabled) {
|
|
$this->disabledTabs = $disabled;
|
|
return $this;
|
|
}
|
|
|
|
public function addTab($id, $header, $body, $indicator_type = false) {
|
|
$this->headers[$id] = $header;
|
|
$this->tabs[$id] = new CDiv($body);
|
|
$this->tabs[$id]->setId(zbx_formatDomId($id));
|
|
|
|
if ($indicator_type) {
|
|
$this->indicators[$id] = $indicator_type;
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
public function setFooter($footer) {
|
|
$this->footer = $footer;
|
|
return $this;
|
|
}
|
|
|
|
public function toString($destroy = true) {
|
|
// No header if we have only one Tab
|
|
if (count($this->tabs) == 1) {
|
|
$tab = reset($this->tabs);
|
|
$this->addItem($tab);
|
|
}
|
|
else {
|
|
$visible_tab = CCookieHelper::has('tab') ? (int) CCookieHelper::get('tab') : (int) $this->selectedTab;
|
|
foreach (array_values($this->tabs) as $index => $tab) {
|
|
if ($visible_tab == $index) {
|
|
$tab->setAttribute('aria-hidden', 'false');
|
|
}
|
|
else {
|
|
$tab->addStyle('display: none');
|
|
$tab->setAttribute('aria-hidden', 'true');
|
|
}
|
|
}
|
|
|
|
$headersList = (new CList())
|
|
->addClass('ui-tabs-nav')
|
|
->addClass(ZBX_STYLE_TABS_NAV);
|
|
|
|
foreach ($this->headers as $id => $header) {
|
|
$tabLink = (new CLink($header, '#'.$id))
|
|
->setId('tab_'.$id);
|
|
|
|
if (array_key_exists($id, $this->indicators)) {
|
|
$tabLink->setAttribute('js-indicator', $this->indicators[$id]);
|
|
}
|
|
|
|
$headersList->addItem($tabLink);
|
|
}
|
|
|
|
$this->addItem($headersList);
|
|
$this->addItem($this->tabs);
|
|
|
|
zbx_add_post_js($this->makeJavascript());
|
|
zbx_add_post_js('try { new TabIndicators('.json_encode($this->id).'); } catch(e) { }');
|
|
}
|
|
|
|
$this->addItem($this->footer);
|
|
|
|
return parent::toString($destroy);
|
|
}
|
|
|
|
public function makeJavascript() {
|
|
$tab_name = ':tab.'.$this->id;
|
|
$create_event = '';
|
|
|
|
if ($this->selectedTab !== null) {
|
|
$create_event = 'create: function() {'.
|
|
'sessionStorage.setItem(ZBX_SESSION_NAME + "'.$tab_name.'", '.json_encode($this->selectedTab).');'.
|
|
'},';
|
|
$active_tab = 'active: '.json_encode($this->selectedTab).',';
|
|
}
|
|
else {
|
|
$active_tab = 'active: function() {'.
|
|
'return sessionStorage.getItem(ZBX_SESSION_NAME + "'.$tab_name.'") || 0;'.
|
|
'}(),';
|
|
}
|
|
|
|
$disabled_tabs = ($this->disabledTabs === null) ? '' : 'disabled: '.json_encode($this->disabledTabs).',';
|
|
|
|
return
|
|
'jQuery("#'.$this->id.'")
|
|
.tabs({'.
|
|
$create_event.
|
|
$disabled_tabs.
|
|
$active_tab.
|
|
'activate: function(event, ui) {'.
|
|
'sessionStorage.setItem(ZBX_SESSION_NAME + "'.$tab_name.'", ui.newTab.index().toString());'.
|
|
'jQuery.cookie("tab", ui.newTab.index().toString());'.
|
|
$this->tab_change_js.
|
|
'}'.
|
|
'})'.
|
|
// Prevent changing the cookie value in a different tab.
|
|
'.parent().on("submit", function() {'.
|
|
'jQuery.cookie("tab", sessionStorage.getItem(ZBX_SESSION_NAME + "'.$tab_name.'") || 0);'.
|
|
'});';
|
|
}
|
|
}
|