* @package product * @link https://www.zentao.net */ namespace zin; if($config->URAndSR && $this->app->rawModule == 'projectstory' && $this->session->hasProduct) { $productItems = array(); $projectProducts = $this->product->getPairs(); foreach($projectProducts as $id => $name) { $productItems[] = array('text' => $name, 'url' => createLink('projectstory', 'track', "projectID={$this->session->project}&productID={$id}"), 'active' => $productID == $id); } } $getRequirements = function($tracks) { global $app, $config, $lang; $requirementItems = array(); $tab = $app->rawModule == 'projectstory' ? 'project' : 'product'; $module = $app->rawModule == 'projectstory' ? 'projectstory' : 'story'; foreach($tracks as $key => $requirement) { $track = ($key == 'noRequirement') ? $requirement : $requirement->track; $rowspan = count($track); $title = $lang->story->noRequirement; if($config->URAndSR && $key != 'noRequirement') $title = common::hasPriv($requirement->type, 'view') ? a( set('href', createLink('story', 'view', "storyID={$requirement->id}")), set('title', $requirement->title), set('data-app', $tab), $requirement->title ) : $requirement->title; $requirementItems[] = h::tr( $config->URAndSR ? h::td( $rowspan != 0 ? set('rowspan', $rowspan) : null, setClass('requirement'), $key != 'noRequirement' ? label( setClass('primary-pale ring-primary mr-1'), zget($lang->story->statusList, $requirement->status) ) : null, set('title', $key != 'noRequirement' ? $requirement->title : $lang->story->noRequirement), $title ) : null, count($track) != 0 ? getStoryTrack($track, $tab, $module) : null ); } return $requirementItems; }; function getStoryTrack($track, $tab, $module) { $i = 0; $storyItems = array(); foreach($track as $storyID => $story) { if($i > 0) { $storyItems[] = h::tr(getTrackTd($storyID, $story, $tab, $module)); } else { $storyItems[] = getTrackTd($storyID, $story, $tab, $module); } $i ++; } return $storyItems; }; function getTrackTd($storyID, $story, $tab, $module) { global $lang, $config; $trackItem = array(); /* Story. */ $trackItem[] = h::td( isset($story->parent) && $story->parent > 0 ? label( setClass('rounded-full light mr-1'), set('title', $lang->story->children), $lang->story->childrenAB ) : null, a( set('href', createLink($module, 'view', "storyID={$storyID}")), set('title', $story->title), set('data-app', $tab), $story->title ) ); $trackItem[] = h::td(getTaskTd($story->tasks)); // Task if(in_array($config->edition, array('max', 'ipd'))) $trackItem[] = h::td(getDesignTd($story->designs)); // Design $trackItem[] = h::td(getCaseTd($story->cases)); // Case if(in_array($config->edition, array('max', 'ipd')) && helper::hasFeature('devops')) $trackItem[] = h::td(getRevisionTd($story->revisions)); // Revision $trackItem[] = h::td(getBugTd($story->bugs)); // Bug return $trackItem; }; function getTaskTd($tasks) { $taskItems = array(); foreach($tasks as $task) { $taskItems[] = a( set('href', createLink('task', 'view', "taskID={$task->id}")), set('title', $task->name), $task->name ); $taskItems[] = br(); } return $taskItems; }; function getDesignTd($designs) { $designItems = array(); foreach($designs as $design) { $designItems[] = a( set('href', createLink('design', 'view', "designID={$design->id}")), set('title', $design->name), $design->name ); $designItems[] = br(); } return $designItems; }; function getCaseTd($cases) { $caseItems = array(); foreach($cases as $case) { $caseItems[] = a( set('href', createLink('testcase', 'view', "caseID={$case->id}")), set('title', $case->title), $case->title ); $caseItems[] = br(); } return $caseItems; }; function getRevisionTd($revisions) { $revisionItems = array(); foreach($revisions as $revision => $repoComment) { $revisionItems[] = a( set('href', createLink('design', 'revision', "revisionID={$revision}")), set('title', $repoComment), '#'. $revision . '-' . $repoComment ); $revisionItems[] = br(); } return $revisionItems; }; function getBugTd($bugs) { $bugItems = array(); foreach($bugs as $bug) { $bugItems[] = a( set('href', createLink('bug', 'view', "bugID={$bug->id}")), set('title', $bug->title), $bug->title ); $bugItems[] = br(); } return $bugItems; }; div ( setClass('main-col'), empty($tracks) ? div( setClass('table-empty-tip'), span ( setClass('text-gray'), $lang->noData ) ) : div( setClass('main-table'), h::table ( setID('trackList'), setClass('table table-bordered'), h::thead ( $config->URAndSR ? h::th( !empty($productItems) ? dropdown( btn( setClass('ghost btn square btn-default'), set::icon('product'), $projectProducts[$productID] ), set::items($productItems), set::placement('bottom-start') ) : $lang->story->requirement ) : null, h::th($lang->story->story), h::th($lang->story->tasks), in_array($config->edition, array('max', 'ipd')) ? h::th($lang->story->design) : null, h::th($lang->story->case), in_array($config->edition, array('max', 'ipd')) && helper::hasFeature('devops') ? h::th($lang->story->repoCommit) : null, h::th($lang->story->bug) ), h::tbody ( $getRequirements($tracks) ) ), div ( setClass('table-footer'), pager( set::_className('flex justify-end items-center'), set::linkCreator(createLink($app->rawModule, $app->rawMethod, "productID={$productID}&branch={$branch}&projectID={$projectID}&recTotal={$pager->recTotal}&recPerPage={recPerPage}&pagerID={page}")) ) ) ) ); render();