Select Git revision
dashboard.php
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
dashboard.php 5.38 KiB
<?php
/**
* @property User|null $user
*/
final class DashboardController extends TracToGitlab\Controller
{
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->getIssues();
$this->mapping = $this->getQMLabelMapping();
$this->filters = $this->getSelected('filters');
}
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->gitlabPager->fetchAll(
$this->gitlab->issues(),
'all',
[
$this->gitlabProjectId,
[
'sort' => 'asc',
'scope' => 'all',
'milestone' => $this->getSelected('milestone'),
'labels' => $type,
]
]
)
);
}
usort($issues, function ($a, $b) {
return $a['id'] - $b['id'];
});
return array_map(function ($issue) {
$mrs = $this->gitlab->issues()->relatedMergeRequests($this->gitlabProjectId, $issue['iid']);
return new TracToGitlab\GitlabIssue($issue, $mrs);
}, $issues);
}
private function getMilestones()
{
$milestones = $this->gitlabPager->fetchAll(
$this->gitlab->milestones(),
'all',
[$this->gitlabProjectId]
);
$milestones = array_filter($milestones, function ($milestone) {
return preg_match('/^Stud\.IP \d+\.\d+$/', $milestone['title']);
});
return $milestones;
}
private function getMilestonesAsSelection()
{
$result = [];
foreach ($this->getMilestones() as $milestone) {
$result[$milestone['title']] = $milestone['title'];
}
return $result;
}
private function getQMLabels()
{
$labels = $this->gitlabPager->fetchAll(
$this->gitlab->projects(),
'labels',
[$this->gitlabProjectId]
);
$labels = array_filter($labels, function ($label) {
return strpos($label['name'], 'QM::') === 0;
});
$labels = array_map(function ($label) {
return substr($label['name'], 4, -3);
}, $labels);
$labels = array_unique($labels);
$labels = array_values($labels);
return $labels;
}
private function getQMLabelMapping()
{
return TracToGitlab\GitlabIssue::QM_LABEL_MAPPING;
}
}