'?object', // 来源 BUG。
'bugs' => '?array', // 关联的 BUG 列表。
'builds' => '?array', // 关联的版本列表。
'releases' => '?array', // 关联的发布列表。
'storyProducts' => '?array', // 需求产品信息。
'linkedMRs' => '?array', // 需求 MR 信息。
'linkedPRs' => '?array', // 需求 PR 信息。
'linkedCommits' => '?linkedCommits', // 需求提交信息。
'story' => '?object' // 当前需求。
);
protected function created()
{
$data = $this->prop('data');
if($data) return;
$story = $this->prop('story');
if(!$story) $story = data('story');
if(!$story) return;
global $app, $lang;
$isStoryType = $story->type == 'story';
$fromBug = $this->prop('fromBug', data('fromBug'));
$bugs = $this->prop('bugs', data('bugs'));
$cases = $this->prop('cases', data('cases'));
$builds = $this->prop('builds', data('builds'));
$releases = $this->prop('releases', data('releases'));
$linkedMRs = $this->prop('linkedMRs', data('linkedMRs'));
$linkedPRs = $this->prop('linkedPRs', data('linkedPRs'));
$linkedCommits = $this->prop('linkedCommits', data('linkedCommits'));
$data = array();
if($isStoryType)
{
if(!empty($fromBug) && hasPriv('story', 'bugs'))
{
$data['fromBug'] = array
(
'title' => $lang->story->legendFromBug,
'items' => array($fromBug),
'url' => hasPriv('bug', 'view') ? createLink('bug', 'view', 'bugID={id}') : false
);
}
$data['bug'] = array
(
'title' => $lang->story->legendBugs,
'items' => $bugs,
'statusList' => $lang->bug->statusList
);
if(hasPriv('story', 'cases'))
{
$data['testcase'] = array
(
'title' => $lang->story->legendCases,
'items' => $cases,
'url' => hasPriv('testcase', 'view') ? createLink('testcase', 'view', 'caseID={id}') : false
);
}
$tab = $app->tab == 'product' ? 'project' : $app->tab;
if($app->tab == 'system') $tab = 'project';
$data['build'] = array
(
'title' => $lang->story->legendBuilds,
'items' => $builds,
'props' => array('data-app' => $tab)
);
$tab = $app->tab == 'execution' ? 'product' : $app->tab;
$releaseModule = $app->tab == 'project' ? 'projectrelease' : 'release';
if($app->tab == 'system') $tab = 'product';
$data['release'] = array
(
'title' => $lang->story->legendReleases,
'items' => $releases,
'url' => hasPriv($releaseModule, 'view') ? createLink($releaseModule, 'view', 'releaseID={id}') : false,
'props' => array('data-app' => $tab)
);
}
if($isStoryType && helper::hasFeature('devops'))
{
$data['mr'] = array
(
'title' => $lang->story->linkMR,
'items' => $linkedMRs,
'url' => hasPriv('mr', 'view') ? createLink('mr', 'view', 'MRID={id}') : false,
'props' => array('data-app' => 'devops'),
'onRender' => function($item, $mr) use($lang)
{
$item['titleClass'] = 'w-0 flex-1';
$statusClass = $mr->status;
if($mr->status == 'opened') $statusClass = 'draft';
if($mr->status == 'merged') $statusClass = 'done';
$item['content'] = array('html' => "" . zget($lang->mr->statusList, $mr->status) . '');
return $item;
}
);
if($linkedPRs)
{
$data['pr'] = array
(
'title' => $lang->story->linkPR,
'items' => $linkedPRs,
'url' => hasPriv('pullreq', 'view') ? createLink('pullreq', 'view', 'MRID={id}') : false,
'props' => array('data-app' => 'devops'),
'onRender' => function($item, $mr) use($lang)
{
$item['titleClass'] = 'w-0 flex-1';
$statusClass = $mr->status;
if($mr->status == 'opened') $statusClass = 'draft';
if($mr->status == 'merged') $statusClass = 'done';
$item['content'] = array('html' => "" . zget($lang->mr->statusList, $mr->status) . '');
return $item;
}
);
}
$data['commit'] = array
(
'title' => $lang->story->linkCommit,
'items' => $linkedCommits,
'url' => false,
'onRender' => function($item, $commit)
{
$item['text'] = $commit->comment;
if(hasPriv('repo', 'revision'))
{
$item['url'] = createLink('repo', 'revision', "repoID={$commit->repo}&objectID=0&revision={$commit->revision}");
$item['data-app'] = 'devops';
}
return $item;
}
);
}
$this->setProp('data', $data);
}
}