-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathprojectcontroller.php
More file actions
117 lines (107 loc) · 3.71 KB
/
projectcontroller.php
File metadata and controls
117 lines (107 loc) · 3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
namespace Plugin\Releases;
class Projectcontroller extends \Controller
{
/**
* View the planning board for a project
* @param \Base $f3
* @param array $params
* @return void
*/
public function projectPlan(\Base $f3, array $params)
{
$this->_requireLogin();
$issue = new \Model\Issue\Detail;
$issue->load($params['id']);
if (!$issue->id) {
$f3->error(404);
}
$f3->set('issue', $issue);
$board = [];
// Load features
$featureType = $f3->get('site.plugins.releases.type.feature');
$features = $issue->find([
'type_id = ? AND parent_id = ? AND deleted_date IS NULL',
$featureType,
$issue->id,
]);
$featureIds = [];
foreach ($features as $feature) {
$board[$feature->id] = $feature->cast();
$featureIds[] = $feature->id;
}
$featureIdStr = implode(',', $featureIds);
// Load epics
$epicType = $f3->get('site.plugins.releases.type.epic');
if ($featureIds) {
$epics = $issue->find([
"type_id = ? AND (parent_id = ? OR parent_id in ($featureIdStr)) AND deleted_date IS NULL",
$epicType,
$issue->id,
]);
} else {
// TODO: actually support this
$epics = $issue->find([
"type_id = ? AND (parent_id = ?) AND deleted_date IS NULL",
$epicType,
$issue->id,
]);
}
$epicIds = [];
foreach ($epics as $epic) {
if (isset($board[$epic->parent_id])) {
$board[$epic->parent_id]['epics'][] = $epic->cast();
$epicIds[] = $epic->id;
}
}
$storyParentStr = implode(',', array_merge($featureIds, $epicIds));
$f3->set('columnCount', count($featureIds) + count($epicIds));
$f3->set('board', $board);
// Load stories
$storyMap = [];
$storyIds = [];
if ($featureIds || $epicIds) {
$storyType = $f3->get('site.plugins.releases.type.story');
$stories = $issue->find([
"type_id = ? AND parent_id IN ($storyParentStr) AND deleted_date IS NULL",
$storyType,
], [
'order' => 'closed_date IS NULL'
]);
foreach ($stories as $story) {
$storyMap[$story->parent_id][] = $story->cast();
$storyIds[] = $story->id;
}
$storyIdStr = implode(',', $storyIds);
}
$f3->set('storyMap', $storyMap);
// Build release-story map
$releaseMap = [];
$releaseMappedIssues = [];
if ($storyIds) {
$releaseIssue = new Model\Release_Issue;
$releaseIssues = $releaseIssue->find(["issue_id IN ($storyIdStr)"]);
foreach ($releaseIssues as $ri) {
$releaseMappedIssues[] = $ri->issue_id;
$releaseMap[$ri->release_id][] = $ri->issue_id;
}
}
$f3->set('releaseMap', $releaseMap);
$f3->set('releaseMappedIssues', $releaseMappedIssues);
// Load releases
$release = new Model\Release;
if ($releaseMap) {
$releaseStr = implode(',', array_keys($releaseMap));
$where = "id IN ($releaseStr)";
} else {
$where = "closed_date IS NULL";
}
$releases = $release->find($where, [
'order' => 'target_date,id'
]);
$f3->set('releases', $releases);
// Render board
$f3->set('title', $issue->name . ' Product Overview');
$this->_render('releases/view/project-plan.html');
}
}