diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index ab2dd493f4..5539edd282 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -41,6 +41,9 @@ $lang->zentaoSite = "官方网站"; $lang->myControl = "我的地盘"; $lang->sponser = "普加赞助"; $lang->at = ' 于 '; +$lang->feature = '未来'; +$lang->year = '年'; +$lang->downArrow = '↓'; /* 主导航菜单。*/ $lang->menu->index = '首页|index|index'; @@ -70,6 +73,7 @@ $lang->product->menu->list = '%s'; $lang->product->menu->story = array('link' => '需求列表|product|browse|productID=%s', 'subModule' => 'story'); $lang->product->menu->plan = array('link' => '计划列表|productplan|browse|productID=%s', 'subModule' => 'productplan'); $lang->product->menu->release= array('link' => '发布列表|release|browse|productID=%s', 'subModule' => 'release'); +$lang->product->menu->roadmap= '路线图|product|roadmap|productID=%s'; $lang->product->menu->edit = '编辑产品|product|edit|productID=%s'; $lang->product->menu->delete = array('link' => '删除产品|product|delete|productID=%s', 'target' => 'hiddenwin'); $lang->product->menu->module = '维护模块|tree|browse|productID=%s&view=product'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index 26777b576a..de69f431c2 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -66,15 +66,23 @@ $lang->resource->product->browse = 'browse'; $lang->resource->product->create = 'create'; $lang->resource->product->edit = 'edit'; $lang->resource->product->delete = 'delete'; +$lang->resource->product->roadmap= 'roadmap'; $lang->resource->product->ajaxGetProjects = 'ajaxGetProjects'; $lang->resource->productplan->browse = 'browse'; $lang->resource->productplan->create = 'create'; $lang->resource->productplan->edit = 'edit'; $lang->resource->productplan->delete = 'delete'; +$lang->resource->productplan->view = 'view'; $lang->resource->productplan->linkStory = 'linkStory'; $lang->resource->productplan->unlinkStory = 'unlinkStory'; +$lang->resource->release->browse = 'browse'; +$lang->resource->release->create = 'create'; +$lang->resource->release->edit = 'edit'; +$lang->resource->release->delete = 'delete'; +$lang->resource->release->view = 'view'; + $lang->resource->story->create = 'create'; $lang->resource->story->edit = 'edit'; $lang->resource->story->delete = 'delete'; @@ -110,6 +118,11 @@ $lang->resource->task->view = 'view'; $lang->resource->task->ajaxGetUserTasks = 'ajaxGetUserTasks'; $lang->resource->task->ajaxGetProjectTasks = 'ajaxGetProjectTasks'; +$lang->resource->build->create = 'create'; +$lang->resource->build->edit = 'edit'; +$lang->resource->build->delete = 'delete'; +$lang->resource->build->view = 'view'; + $lang->resource->qa->index = 'index'; $lang->resource->bug->index = 'index'; diff --git a/module/product/control.php b/module/product/control.php index a2998b010f..bf8fdc94e1 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -166,6 +166,22 @@ class product extends control } } + /* 产品路线图。*/ + public function roadmap($productID) + { + /* 设置菜单。*/ + $this->product->setMenu($this->products, $productID); + + /* 赋值。*/ + $product = $this->dao->findById($productID)->from(TABLE_PRODUCT)->fetch(); + $this->view->header->title = $this->lang->product->roadmap; + $this->view->position[] = html::a($this->createLink($this->moduleName, 'browse'), $product->name); + $this->view->position[] = $this->lang->product->roadmap; + $this->view->product = $product; + $this->view->roadmaps = $this->product->getRoadmap($productID); + $this->display(); + } + /* 获得某一个产品对应的项目列表。*/ public function ajaxGetProjects($productID, $projectID = 0) { diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index f0e72c2edc..d7946a1901 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -30,6 +30,8 @@ $lang->product->read = "产品详情"; $lang->product->edit = "编辑产品"; $lang->product->delete = "删除产品"; +$lang->product->roadmap = '路线图'; + $lang->product->selectProduct = "请选择产品"; $lang->product->saveButton = " 保存 (S) "; $lang->product->confirmDelete = " 您确定删除该产品吗?"; diff --git a/module/product/model.php b/module/product/model.php index 1b0a40999d..0a44d742d5 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -32,6 +32,7 @@ class productModel extends model common::setMenuVars($this->lang->product->menu, 'list', $selectHtml . $this->lang->arrow); common::setMenuVars($this->lang->product->menu, 'story', $productID); common::setMenuVars($this->lang->product->menu, 'plan', $productID); + common::setMenuVars($this->lang->product->menu, 'roadmap',$productID); common::setMenuVars($this->lang->product->menu, 'release',$productID); common::setMenuVars($this->lang->product->menu, 'edit', $productID); common::setMenuVars($this->lang->product->menu, 'delete', $productID); @@ -112,4 +113,26 @@ class productModel extends model $projects = array('' => '') + $projects; return $projects; } + + /* Ʒ·ͼ*/ + public function getRoadmap($productID) + { + $plans = $this->loadModel('productplan')->getList($productID); + $releases = $this->loadModel('release')->getList($productID); + $roadmap = array(); + if(is_array($releases)) $releases = array_reverse($releases); + foreach($releases as $release) + { + $year = substr($release->date, 0, 4); + $roadmap[$year][] = $release; + } + foreach($plans as $plan) + { + if($plan->end != '0000-00-00' and strtotime($plan->end) - time() <= 0) continue; + $year = substr($plan->end, 0, 4); + $roadmap[$year][] = $plan; + } + arsort($roadmap); + return $roadmap; + } } diff --git a/module/product/view/roadmap.html.php b/module/product/view/roadmap.html.php new file mode 100644 index 0000000000..df4c47bd17 --- /dev/null +++ b/module/product/view/roadmap.html.php @@ -0,0 +1,63 @@ +. + * + * @copyright Copyright: 2009 Chunsheng Wang + * @author Chunsheng Wang + * @package product + * @version $Id$ + * @link http://www.zentao.cn + */ +?> + +
+ + + '; + foreach($years as $year) + { + if($year == '0000') $year = $lang->feature; + echo ""; + } + echo ''; + echo ''; + foreach($years as $year) + { + echo ''; + } + echo ''; + ?> +
product->roadmap;?>
$year$lang->year
'; + foreach($roadmaps[$year] as $key => $roadmap) + { + if(isset($roadmap->build)) + { + echo "
"; + echo "

" . html::a($this->createLink('release', 'view', "releaseID=$roadmap->id"), $roadmap->name, '_blank') . '

' . $roadmap->date; + } + else + { + echo "
"; + echo "

" . html::a($this->createLink('productplan', 'view', "planID=$roadmap->id"), $roadmap->title, '_blank') . '

' . $roadmap->begin . ' ~ ' . $roadmap->end; + } + echo "
"; + if(isset($roadmaps[$year][$key + 1])) echo "{$lang->downArrow}"; + } + echo '
+
+ diff --git a/module/productplan/control.php b/module/productplan/control.php index 4cf6092d93..80d752323c 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -92,6 +92,19 @@ class productplan extends control $this->display(); } + /* 计划详情。*/ + public function view($planID = 0) + { + $plan = $this->productplan->getByID($planID); + $this->commonAction($plan->product); + $this->view->header->title = $this->lang->productplan->view; + $this->view->position[] = $this->lang->productplan->view; + $this->view->planStories= $this->loadModel('story')->getPlanStories($planID); + $this->view->products = $this->product->getPairs(); + $this->view->plan = $plan; + $this->display(); + } + /* 关联需求。*/ public function linkStory($planID = 0) { diff --git a/module/productplan/lang/zh-cn.php b/module/productplan/lang/zh-cn.php index 5a06cee125..113240a423 100644 --- a/module/productplan/lang/zh-cn.php +++ b/module/productplan/lang/zh-cn.php @@ -27,6 +27,7 @@ $lang->productplan->index = "计划列表"; $lang->productplan->create = "创建计划"; $lang->productplan->edit = "编辑计划"; $lang->productplan->delete = "删除计划"; +$lang->productplan->view = "计划详情"; $lang->productplan->linkStory = "关联需求"; $lang->productplan->unlinkStory = "移除需求"; $lang->productplan->linkedStories = '已关联需求列表'; diff --git a/module/productplan/view/browse.html.php b/module/productplan/view/browse.html.php index 1a37b5f099..50744a31cf 100644 --- a/module/productplan/view/browse.html.php +++ b/module/productplan/view/browse.html.php @@ -34,7 +34,6 @@ productplan->id;?> productplan->title;?> - productplan->desc;?> productplan->begin;?> productplan->end;?> action;?> @@ -43,9 +42,8 @@ - id;?> + id"), sprintf('%03d', $plan->id));?> title;?> - desc);?> begin;?> end;?> diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php new file mode 100644 index 0000000000..53563e596e --- /dev/null +++ b/module/productplan/view/view.html.php @@ -0,0 +1,75 @@ +. + * + * @copyright Copyright: 2009 Chunsheng Wang + * @author Chunsheng Wang + * @package productplan + * @version $Id$ + * @link http://www.zentao.cn + */ +?> + + +
+ + + + + + + + + + + + + + + + + +
title . $lang->colon . $lang->productplan->view;?>
productplan->id;?>id;?> +
productplan->title;?>title;?> +
productplan->begin;?>begin;?> +
productplan->end;?>end;?> +
productplan->desc;?>desc);?> +
+ + + + + + + + + + + + + + + + + + + + + + +
title .$lang->colon . $lang->productplan->linkedStories;?>
story->id;?>story->pri;?>story->product;?>story->title;?>action?>
id;?>pri;?>createLink('product', 'browse', "productID=$story->product"), $products[$story->product], '_blank');?>title;?>id", $lang->productplan->unlinkStory, 'hiddenwin');?>
+
+ diff --git a/www/theme/default/style.css b/www/theme/default/style.css index d66087fb4c..56b1f20f4e 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -210,6 +210,10 @@ caption {border:1px solid #e4e4e4; background:#efefef; margin:0; padding:5 /* ҳԪء*/ .history {border:1px solid gray; background:#efefef; padding:10px; margin-top:10px; margin-bottom:10px} .content {font-size:14px; padding:10px} +.roadmap {width:200px; margin:10px auto 10px auto; padding:10px; border:1px solid gray;} +.roadmap a{color:white;} +.release {background:darkgreen; color:white} +.plan {background:#9F9F5F;} /* ҳš*/ #footer {width:100%; position:fixed; bottom:0; left:0; margin:0; border-top:2px solid #F4BF20; background-color:#FBF5C6;}