diff options
Diffstat (limited to 'library/Director/Web/Widget/SyncRunDetails.php')
-rw-r--r-- | library/Director/Web/Widget/SyncRunDetails.php | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/library/Director/Web/Widget/SyncRunDetails.php b/library/Director/Web/Widget/SyncRunDetails.php new file mode 100644 index 0000000..408e8f6 --- /dev/null +++ b/library/Director/Web/Widget/SyncRunDetails.php @@ -0,0 +1,129 @@ +<?php + +namespace Icinga\Module\Director\Web\Widget; + +use Icinga\Module\Director\Objects\DirectorActivityLog; +use ipl\Html\HtmlDocument; +use Icinga\Module\Director\Db; +use Icinga\Module\Director\Objects\SyncRun; +use gipfl\IcingaWeb2\Link; +use gipfl\Translation\TranslationHelper; +use gipfl\IcingaWeb2\Widget\NameValueTable; +use function sprintf; + +class SyncRunDetails extends NameValueTable +{ + use TranslationHelper; + + const URL_ACTIVITIES = 'director/config/activities'; + + /** @var SyncRun */ + protected $run; + + public function __construct(SyncRun $run) + { + $this->run = $run; + $this->getAttributes()->add('data-base-target', '_next'); // eigentlich nur runSummary + $this->addNameValuePairs([ + $this->translate('Start time') => $run->get('start_time'), + $this->translate('Duration') => sprintf('%.2fs', $run->get('duration_ms') / 1000), + $this->translate('Activity') => $this->runSummary($run) + ]); + } + + /** + * @param SyncRun $run + * @return array + */ + protected function runSummary(SyncRun $run) + { + $html = []; + $total = $run->countActivities(); + if ($total === 0) { + $html[] = $this->translate('No changes have been made'); + } else { + if ($total === 1) { + $html[] = $this->translate('One object has been modified'); + } else { + $html[] = sprintf( + $this->translate('%s objects have been modified'), + $total + ); + } + + /** @var Db $db */ + $db = $run->getConnection(); + $formerId = $db->fetchActivityLogIdByChecksum($run->get('last_former_activity')); + if ($formerId === null) { + return $html; + } + $lastId = $db->fetchActivityLogIdByChecksum($run->get('last_related_activity')); + + if ($formerId !== $lastId) { + $idRangeEx = sprintf( + 'id>%d&id<=%d', + $formerId, + $lastId + ); + } else { + $idRangeEx = null; + } + + $links = new HtmlDocument(); + $links->setSeparator(', '); + $links->add([ + $this->activitiesLink( + 'objects_created', + $this->translate('%d created'), + DirectorActivityLog::ACTION_CREATE, + $idRangeEx + ), + $this->activitiesLink( + 'objects_modified', + $this->translate('%d modified'), + DirectorActivityLog::ACTION_MODIFY, + $idRangeEx + ), + $this->activitiesLink( + 'objects_deleted', + $this->translate('%d deleted'), + DirectorActivityLog::ACTION_DELETE, + $idRangeEx + ), + ]); + + if ($idRangeEx && count($links) > 1) { + $links->add(new Link( + $this->translate('Show all actions'), + self::URL_ACTIVITIES, + ['idRangeEx' => $idRangeEx] + )); + } + + if (! $links->isEmpty()) { + $html[] = ': '; + $html[] = $links; + } + } + + return $html; + } + + protected function activitiesLink($key, $label, $action, $rangeFilter) + { + $count = $this->run->get($key); + if ($count > 0) { + if ($rangeFilter) { + return new Link( + sprintf($label, $count), + self::URL_ACTIVITIES, + ['action' => $action, 'idRangeEx' => $rangeFilter] + ); + } + + return sprintf($label, $count); + } + + return null; + } +} |