Skip to content
Snippets Groups Projects
Select Git revision
  • a21998487ce220e67b6b065479bc0bd4acd46382
  • main default protected
  • issue-56
  • testing-systems
4 results

dashboard.php

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    dashboard.php 5.25 KiB
    <?php
    
    use TracToGitlab\GitlabIssue;
    
    /**
     * @property User|null $user
     */
    final class DashboardController extends TracToGitlab\GitlabController
    {
        public function before_filter(&$action, &$args)
        {
            parent::before_filter($action, $args);
    
            $this->user = User::findCurrent();
    
            Navigation::activateItem('/gitlab-dashboard/dashboard');
            PageLayout::setTitle(_('Übersicht der Issues in gitlab'));
            $this->activateNavigation('dashboard');
    
            $this->setupSidebar();
        }
    
        private function getSelected(string $what)
        {
            $source = $this->user
                    ? $this->user->getConfiguration()->TRAC2GITLAB_USER_FILTERS
                    : ($_SESSION['GITLAB_DASHBOARD_SELECTION'] ?? []);
    
            return $source[$what] ?? $this->getDefaultSelection($what);
        }
    
        private function setSelected(string $what, $value): void
        {
            if ($value === $this->getSelected($what)) {
                return;
            }
    
            if ($this->user) {
                $config = $this->user->getConfiguration();
                $config_value = $config->TRAC2GITLAB_USER_FILTERS;
                $config_value[$what] = $value;
                $config->store('TRAC2GITLAB_USER_FILTERS', $config_value);
            } else {
                if (!isset($_SESSION['GITLAB_DASHBOARD_SELECTION'])) {
                    $_SESSION['GITLAB_DASHBOARD_SELECTION'] = [];
                }
                $_SESSION['GITLAB_DASHBOARD_SELECTION'][$what] = $value;
            }
        }
    
        private function getDefaultSelection(string $what)
        {
            if ($what === 'milestone') {
                return array_reverse(array_keys($this->getMilestonesAsSelection()))[0];
            }
    
            if ($what === 'types') {
                return 'TIC,StEP';
            }
    
            if ($what === 'filters') {
                return [];
            }
    
            return null;
        }
    
        public function index_action()
        {
            $this->issues = $this->cached('issues', fn() => $this->getIssues());
            $this->mapping = $this->getQMLabelMapping();
            $this->filters = $this->getSelected('filters');
    
            Sidebar::get()->addWidget(new TemplateWidget(
                _('Stand der Daten'),
                $this->get_template_factory()->open('sidebar'),
                ['time' => $this->getCachedDate('issues')]
            ));
        }
    
        public function select_action(string $what, string $value = null)
        {
            $this->setSelected($what, Request::get($what, $value));
    
            $this->redirect($this->indexURL());
        }
    
        public function store_filters_action()
        {
            $this->setSelected('filters', Request::getArray('filters'));
    
            if (Request::isXhr()) {
                $this->render_nothing();
            } else {
                $this->redirect($this->indexURL());
            }
        }
    
        private function setupSidebar()
        {
            $options = Sidebar::get()->addWidget(new OptionsWidget());
            $options->addSelect(
                _('Meilenstein'),
                $this->selectURL('milestone'),
                'milestone',
                $this->getMilestonesAsSelection(),
                $this->getSelected('milestone')
            );
    
            $options->addSelect(
                _('Typ'),
                $this->selectURL('types'),
                'types',
                [
                    'TIC,StEP' => 'StEPs und TICs',
                    'StEP'     => 'StEPs',
                    'TIC'      => 'TICs',
                ],
                $this->getSelected('types')
            );
        }
    
        private function getIssues(): array
        {
            $issues = [];
            foreach (explode(',', $this->getSelected('types')) as $type) {
                $issues = array_merge(
                    $issues,
                    $this->result_pager->fetchAll(
                        $this->gitlab->issues(),
                        'all',
                        [
                            $this->gitlab_project_id,
                            [
                                'sort'      => 'asc',
                                'scope'     => 'all',
                                'milestone' => $this->getSelected('milestone'),
                                'labels'    => $type,
                            ]
                        ]
                    )
                );
            }
            usort($issues, function ($a, $b) {
                return $a['id'] - $b['id'];
            });
    
            return array_map(function (array $issue): GitlabIssue {
                $mrs = $this->gitlab->issues()->closedByMergeRequests(
                    $this->gitlab_project_id,
                    $issue['iid']
                );
                return new GitlabIssue($issue, $mrs);
            }, $issues);
        }
    
        private function getMilestones()
        {
            return $this->cached('milestones', function () {
                $milestones = $this->result_pager->fetchAll(
                    $this->gitlab->milestones(),
                    'all',
                    [Config::get()->TRAC2GITLAB_GITLAB_PROJECT_ID]
                );
                return array_filter($milestones, function ($milestone) {
                    return preg_match('/^Stud\.IP \d+\.\d+$/', $milestone['title']);
                });
            });
        }
    
        private function getMilestonesAsSelection()
        {
            $result = [];
            foreach ($this->getMilestones() as $milestone) {
                $result[$milestone['title']] = $milestone['title'];
            }
            return $result;
        }
    
        private function getQMLabelMapping()
        {
            return TracToGitlab\GitlabIssue::QM_LABEL_MAPPING;
        }
    }