diff --git a/library/Icinga/Web/Dashboard/Dashboard.php b/library/Icinga/Web/Dashboard/Dashboard.php new file mode 100644 index 000000000..2c8518747 --- /dev/null +++ b/library/Icinga/Web/Dashboard/Dashboard.php @@ -0,0 +1,281 @@ + 'dashboard content']; + + /** + * The @see Tabs object for displaying displayable panes + * + * @var Tabs + */ + protected $tabs; + + /** + * The parameter that will be added to identify panes + * + * @var string + */ + private $tabParam = 'pane'; + + /** + * A welcome form rendered when there is no dashboard panes + * + * @var Form + */ + private $welcomeForm; + + /** + * Set the given tab name as active + * + * @param string $name The tab name to activate + * + */ + public function activate($name) + { + $this->getTabs()->activate($name); + } + + /** + * Set this dashboard's tabs + * + * @param Tabs $tabs + * + * @return $this + */ + public function setTabs(Tabs $tabs) + { + $this->tabs = $tabs; + + return $this; + } + + /** + * Return the tab object used to navigate through this dashboard + * + * @return Tabs + */ + public function getTabs() + { + $activeHome = $this->getActiveHome(); + if ($activeHome && $activeHome->getName() !== DashboardHome::DEFAULT_HOME) { + $url = Url::fromPath(self::BASE_ROUTE . '/home')->getUrlWithout(['home', $this->tabParam]); + $url->addParams(['home' => $activeHome->getName()]); + } else { + $url = Url::fromPath(self::BASE_ROUTE)->getUrlWithout($this->tabParam); + } + + if ($this->tabs === null) { + $this->tabs = new Tabs(); + } + + $this->tabs->disableLegacyExtensions(); + if (! $activeHome || $activeHome->isDisabled()) { + return $this->tabs; + } + + foreach ($activeHome->getPanes() as $key => $pane) { + if ($pane->isDisabled()) { + continue; + } + + if (! $this->tabs->get($key)) { + $this->tabs->add( + $key, + [ + 'title' => sprintf( + t('Show %s', 'dashboard.pane.tooltip'), + $pane->getTitle() + ), + 'label' => $pane->getTitle(), + 'url' => clone($url), + 'urlParams' => [$this->tabParam => $key] + ] + ); + } + } + + return $this->tabs; + } + + /** + * Activate the default pane of this dashboard and returns its name + * + * @return ?int|string + */ + private function setDefaultPane() + { + $active = null; + $activeHome = $this->getActiveHome(); + + foreach ($activeHome->getPanes() as $key => $pane) { + if ($pane->isDisabled() === false) { + $active = $key; + break; + } + } + + if ($active !== null) { + $this->activate($active); + } + + return $active; + } + + /** + * @see determineActivePane() + */ + public function getActivePane() + { + return $this->determineActivePane(); + } + + /** + * Determine the active pane either by the selected tab or the current request + * + * @throws \Icinga\Exception\ConfigurationError + * @throws \Icinga\Exception\ProgrammingError + * + * @return Pane The currently active pane + */ + public function determineActivePane() + { + $active = $this->getTabs()->getActiveTab(); + $activeHome = $this->getActiveHome(); + + if (! $active) { + if ($active = Url::fromRequest()->getParam($this->tabParam)) { + if ($activeHome->hasPane($active)) { + $this->activate($active); + } else { + throw new ProgrammingError('Try to get an inexistent pane.'); + } + } else { + $active = $this->setDefaultPane(); + } + } else { + $active = $active->getName(); + } + + $panes = $activeHome->getPanes(); + if (isset($panes[$active])) { + return $panes[$active]; + } + + throw new ConfigurationError('Could not determine active pane'); + } + + public function setWelcomeForm(Form $form) + { + $this->welcomeForm = $form; + + return $this; + } + + protected function assemble() + { + $activeHome = $this->getActiveHome(); + if (! $activeHome || $activeHome->getName() === DashboardHome::DEFAULT_HOME && ! $activeHome->hasPanes()) { + $this->setAttribute('class', 'content welcome-view'); + $wrapper = HtmlElement::create('div', ['class' => 'dashboard-introduction']); + + $wrapper->addHtml(HtmlElement::create('h1', null, t('Welcome to Icinga Web 2!'))); + $wrapper->addHtml(HtmlElement::create( + 'p', + null, + t('You will see this screen every time you log in and haven\'t created any dashboards yet.') + )); + + $message = t('At the moment this view is empty, but you can populate it with small portions of information called Dashlets.'); + $wrapper->addHtml(HtmlElement::create('p', null, $message)); + + $message = t( + 'Now you can either customize which dashlets to display, or use the system default dashlets.' + . ' You will be always able to edit them afterwards.' + ); + $wrapper->addHtml(HtmlElement::create('p', null, $message)); + + $wrapper->addHtml($this->welcomeForm); + $this->addHtml($wrapper); + } elseif (! empty($activeHome->getPanes(true))) { + $dashlets = $this->getActivePane()->getDashlets(); + $this->setAttribute('data-icinga-pane', $activeHome->getName() . '|' . $this->getActivePane()->getName()); + + if (empty($dashlets)) { + $this->setAttribute('class', 'content'); + $dashlets = HtmlElement::create('h1', null, t('No dashlet added to this pane.')); + } + + $this->add($dashlets); + } else { + // TODO: What to do with dashboard homes without any dashboards?? + exit(0); + } + } +}