This commit is contained in:
hufangzhou
2021-09-08 13:45:26 +08:00
38 changed files with 304 additions and 200 deletions
+51
View File
@@ -0,0 +1,51 @@
<?php
/**
* 禅道API的build资源类
* 版本V1
*
* The build entry point of zentaopms
* Version 1
*/
class buildEntry extends Entry
{
public function get($buildID)
{
$control = $this->loadController('build', 'view');
$control->view($buildID);
$data = $this->getData();
if(!$data or (isset($data->status) and $data->message == '404 Not found')) return $this->send404();
if(isset($data->status) and $data->status == 'success') return $this->send(200, $data->data->build);
if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message);
$this->sendError(400, 'error');
}
public function put($buildID)
{
$old = $this->loadModel('build')->getByID($buildID);
/* Set $_POST variables. */
$fields = 'type,title,severity,pri,assignedTo,deadline,desc';
$this->batchSetPost($fields, $oldBuild);
$control = $this->loadController('build', 'edit');
$control->edit($buildID);
$data = $this->getData();
if(!$data or (isset($data->message) and $data->message == '404 Not found')) return $this->send404();
if(isset($data->result) and $data->result == 'fail') return $this->sendError(400, $data->message);
$build = $this->build->getByID($buildID);
$this->send(200, $this->format($build, 'createdDate:time,editedDate:time,assignedDate:time'));
}
public function delete($buildID)
{
$control = $this->loadController('build', 'delete');
$control->delete($buildID, 'true');
$this->getData();
$this->sendSuccess(200, 'success');
}
}
+52
View File
@@ -0,0 +1,52 @@
<?php
/**
* 禅道API的builds资源类
* 版本V1
*
* The builds entry point of zentaopms
* Version 1
*/
class buildsEntry extends entry
{
public function get($projectID = 0)
{
$control = $this->loadController('project', 'build');
$control->build($projectID, $this->param('type', 'all'), $this->param('param', 0));
$data = $this->getData();
if(!isset($data->status)) return $this->sendError(400, 'error');
if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message);
$result = array();
foreach($data->data->projectBuilds as $productID => $builds)
{
foreach($builds as $build)
{
$result[] = $build;
}
}
return $this->send(200, $result);
}
public function post($projectID = 0)
{
$project = $this->loadModel('project')->getByID($projectID);
if(!$project) return $this->send404();
$fields = 'type,title,severity,pri,assignedTo,deadline,desc';
$this->batchSetPost($fields);
$control = $this->loadController('build', 'create');
$this->requireFields('type,title,severity');
$control->create($projectID);
$data = $this->getData();
if(isset($data->result) and $data->result == 'fail') return $this->sendError(400, $data->message);
if(isset($data->result) and!isset($data->id)) return $this->sendError(400, $data->message);
$build = $this->loadModel('build')->getByID($data->id);
$this->send(201, $this->format($build, 'createdDate:time,editedDate:time,assignedDate:time'));
}
}
+4
View File
@@ -51,6 +51,10 @@ $routes['/issues/:issueID'] = 'issue';
$routes['/todos'] = 'todos';
$routes['/todos/:id'] = 'todo';
$routes['/projects/:projectID/builds'] = 'builds';
$routes['/builds'] = 'builds';
$routes['/builds/:id'] = 'build';
$routes['/testcases'] = 'testcases';
$routes['/testcases/:id'] = 'testcase';
+1
View File
@@ -897,6 +897,7 @@ class baseControl
foreach($data as $key => $value)
{
if(!is_string($value)) continue;
/* Retain ["] for json encode when value is jsoned string. */
$data[$key] = str_replace('%22', '"', urlencode($value));
}
+2 -1
View File
@@ -160,7 +160,8 @@ class router extends baseRouter
}
}
$hourKey = $planKey = $URSR = $URAndSR = 0;
$hourKey = $planKey = $URSR = $URAndSR = 0;
$mode = 'new';
$score = '0';
$projectKey = empty($this->config->isINT) ? ITERATION_KEY : SPRINT_KEY;
+5 -1
View File
@@ -185,7 +185,11 @@ class build extends control
{
$buildID = (int)$buildID;
$build = $this->build->getByID($buildID, true);
if(!$build) die(js::error($this->lang->notFound) . js::locate('back'));
if(!$build)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
}
$this->session->project = $build->project;
$this->loadModel('story');
+2 -2
View File
@@ -181,7 +181,7 @@ function renderExecutionItem(item, $item)
{
$item.addClass('link-block');
$title = $('<a class="title" />')
.attr('href', $.createLink('project', 'index', 'projectID=' + item._id));
.attr('href', $.createLink('execution', 'task', 'executionID=' + item._id));
}
else
{
@@ -320,7 +320,7 @@ function updateKanbanAffixState()
{
var $board = $(this);
var offsetTop = $board.offset().top;
if(scrollTop >= offsetTop && offsetTop > currentOffsetTop && scrollTop < (offsetTop + $board.outerHeight()))
if(scrollTop >= offsetTop && offsetTop > currentOffsetTop && scrollTop < (offsetTop + $board.outerHeight() - 72))
{
currentOffsetTop = offsetTop;
$currentAffixedBoard = $board;
+1 -1
View File
@@ -18,5 +18,5 @@
.dynamic.collapsed .timeline > li + li {display: none;}
.dynamic.collapsed .dynamic-btn > .icon:before {content: '\f0d8';}
.c-user, .c-project, .c-product, .c-execution {width: 150px !important;}
.c-user, .c-project, .c-product, .c-execution {width: 150px !important; overflow: unset;}
.c-date {width: 200px;}
+4 -4
View File
@@ -25,12 +25,12 @@
echo html::a(inlink('dynamic', "browseType=$period"), $label, '', "class='btn btn-link $active' id='{$period}'")
?>
<?php endforeach;?>
<div class="input-control space c-user"><?php echo html::select('account', $userIdPairs, $user ? $user->id : '', 'onchange=changeUser(this.value) class="form-control chosen"');?></div>
<div class="input-control space c-product"><?php echo html::select('product', $products, $product, 'onchange=changeProduct(this.value) class="form-control chosen"');?></div>
<div class="input-control space c-user"><?php echo html::select('account', $userIdPairs, $user ? $user->id : '', 'onchange=changeUser(this.value) class="form-control chosen" data-max_drop_width="215"');?></div>
<div class="input-control space c-product"><?php echo html::select('product', $products, $product, 'onchange=changeProduct(this.value) class="form-control chosen" data-max_drop_width="215"');?></div>
<?php if($config->systemMode == 'new'):?>
<div class="input-control space c-project"><?php echo html::select('project', $projects, $project, 'onchange=changeProject(this.value) class="form-control chosen"');?></div>
<div class="input-control space c-project"><?php echo html::select('project', $projects, $project, 'onchange=changeProject(this.value) class="form-control chosen" data-max_drop_width="215"');?></div>
<?php endif;?>
<div class="input-control space c-execution"><?php echo html::select('execution', $executions, $execution, 'onchange=changeExecution(this.value) class="form-control chosen"'); ?></div>
<div class="input-control space c-execution"><?php echo html::select('execution', $executions, $execution, 'onchange=changeExecution(this.value) class="form-control chosen" data-max_drop_width="215"'); ?></div>
<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> <?php echo $lang->action->dynamic->search;?></a>
</div>
</div>
+1 -5
View File
@@ -1159,11 +1159,7 @@ class docModel extends model
->where('deleted')->eq(0)
->andWhere($type)->eq($objectID)
->beginIF(!empty($appendLib))->orWhere('id')->eq($appendLib)->fi()
->beginIF($type == 'project')
->andWhere('(execution')->eq(0)
->orWhere('main')->eq(0)
->markRight(1)
->fi()
->beginIF($type == 'project')->andWhere('execution')->eq(0)->fi()
->orderBy('`order`, id')
->fetchAll('id');
}
+13 -5
View File
@@ -1,3 +1,15 @@
<?php
/**
* The select lib type view file of doc module of ZenTaoPMS.
*
* @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.zentao.net)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yuchun Li <liyuchun@easycorp.ltd>
* @package doc
* @version $Id: selectlibtype.html.php 958 2021-09-3 17:09:42Z liyuchun $
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.lite.html.php';?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
@@ -12,11 +24,7 @@
<td class='w-p85'><?php echo html::radio('objectType', $lang->doc->libTypeList, 'product');?></td>
</tr>
<tr>
<td colspan='3' class='text-center form-actions'>
<?php
echo html::submitButton($lang->confirm);
?>
</td>
<td colspan='3' class='text-center form-actions'><?php echo html::submitButton($lang->confirm);?></td>
</tr>
</table>
</form>
+2
View File
@@ -19,3 +19,5 @@
.table-grouped > tbody > tr,
.table-grouped > tbody > tr:hover {background: #fff !important;}
.projectColor {width: 5px; padding: 0px !important; border-right: unset !important}
+2 -2
View File
@@ -2,8 +2,8 @@ $(function()
{
$('[id^="projects"]').change(function()
{
executionID = $(this).attr('id').replace('projects', '');
$td = $(this).closest('td');
var executionID = $(this).attr('id').replace('projects', '');
var $td = $(this).closest('td');
if($td.find('[id^="syncStories"]').length == 0)
{
$td.append("<input type='hidden' id='syncStories" + executionID + "' name='syncStories[" + executionID + "]' value='no' />");
@@ -20,7 +20,7 @@
<table class="table no-margin table-grouped text-center">
<thead>
<tr>
<th style='width: 5px; padding: 0px; border-right: unset !important'></th>
<th class='projectColor'></th>
<th><?php echo $lang->execution->doingProject . ' (' . $projectCount . ')';?></th>
<?php foreach($lang->execution->kanbanColType as $status => $colName):?>
<th><?php echo $colName . ($status != 'closed' ? ' (' . $statusCount[$status] . ')' : '');?></th>
+1 -1
View File
@@ -70,7 +70,7 @@ class gitlabModel extends model
*
* @param int $gitlabID
* @access public
* @return void
* @return array
*/
public function getUserIdRealnamePairs($gitlabID)
{
+2 -1
View File
@@ -35,7 +35,8 @@
item.icon = ($link.find('.icon').attr('class') || '').replace('icon ', '');
item.text = $link.text().trim();
$link.html('<i class="icon ' + item.icon + '"></i><span class="text num">' + item.text + '</span>');
$link.html('<i class="icon ' + item.icon + '"></i><span class="text">' + item.text + '</span>');
if(item.code === 'devops') $link.find('.text').addClass('num');
appsMap[item.code] = item;
$('<li></li>').attr('data-app', item.code)
+7
View File
@@ -30,6 +30,13 @@ js::set('manualUrl', ((!empty($config->isINT)) ? $config->manualUrl['int'] :
#upgradeContent {top: -272px; height: 262px;}
#latestVersionList {height: 200px;}
<?php endif;?>
<?php if(commonModel::isTutorialMode()):?>
#menuMoreNav > li.dropdown:hover + .tooltip {display: none!important;}
#menuMoreList > li.active {position: relative;}
#menuMoreList > li.active:before {content: ' '; display: block; position: absolute; left: 100%; border-width: 5px 5px 5px 0; border-style: solid; border-color: transparent; border-right-color: #ff9800; width: 0; height: 0; top: 12px}
#menuMoreList > li.active:after {content: attr(data-tip); display: block; position: absolute; left: 100%; background-color: #f1a325; color: #fff; top: 3px; white-space: nowrap; line-height: 16px; padding: 8px 10px; margin-left: 5px; border-radius: 4px;}
<?php endif;?>
</style>
<div id='menu'>
<nav id='menuNav'>
+1
View File
@@ -59,6 +59,7 @@ class pipelineModel extends model
->where('deleted')->eq('0')
->AndWhere('type')->eq($type)
->orderBy('id')->fetchPairs('id', 'name');
return $pipeline;
}
-1
View File
@@ -91,7 +91,6 @@ class productplanModel extends model
if(!empty($plans))
{
$plans = $this->reorder4Children($plans);
$planIdList = array_keys($plans);
+6
View File
@@ -67,6 +67,12 @@ class program extends control
$this->display();
}
/**
* Program kanban list.
*
* @access public
* @return void
*/
public function kanban()
{
$this->app->loadLang('release');
+39 -44
View File
@@ -147,7 +147,7 @@ class programModel extends model
* Get kanban group data.
*
* @access public
* @return void
* @return array
*/
public function getKanbanGroup()
{
@@ -155,15 +155,7 @@ class programModel extends model
$kanbanGroup['my'] = array();
$kanbanGroup['others'] = array();
/* Get all prived programs. */
$programs = $this->dao->select('id, name')->from(TABLE_PROGRAM)
->where('type')->eq('program')
->andWhere('deleted')->eq(0)
->andWhere('grade')->eq(1)
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->programs)->fi()
->andWhere('status')->ne('closed')
->fetchAll('id');
$programs = $this->getTopPairs('', 'noclosed');
$involvedPrograms = $this->getInvolvedPrograms($this->app->user->account);
/* Get all products under programs. */
@@ -175,10 +167,7 @@ class programModel extends model
->fetchGroup('program', 'id');
$productPairs = array();
foreach($productGroup as $programID => $products)
{
foreach($products as $productID => $product) $productPairs[$productID] = $productID;
}
foreach($productGroup as $programID => $products) $productPairs = array_merge($productPairs, array_keys($products));
/* Get all plans under products. */
$plans = $this->dao->select('id, product, title')->from(TABLE_PRODUCTPLAN)
@@ -198,10 +187,7 @@ class programModel extends model
->fetchGroup('product');
$projectPairs = array();
foreach($projectGroup as $projects)
{
foreach($projects as $project) $projectPairs[$project->id] = $project->id;
}
foreach($projectGroup as $projects) $projectPairs = array_merge($projectPairs, array_keys($projects));
/* Get all releases under products. */
$releases = $this->dao->select('product, id, name, marker')->from(TABLE_RELEASE)
@@ -233,7 +219,7 @@ class programModel extends model
$hours = $this->computeProgress($tasks);
/* Group data. */
/* Group data by product. */
foreach($productGroup as $programID => $products)
{
foreach($products as $productID => $product)
@@ -258,28 +244,23 @@ class programModel extends model
$project->hours = zget($hours, $project->id, array());
$product->projects[$status][] = $project;
}
$product->rowspan = isset($product->projects['doing']) ? count($product->projects['doing']) > 0 ? count($product->projects['doing']) : 1 : 1;
}
}
/* Group data. */
foreach($programs as $programID => $program)
/* Group data by program. */
foreach($programs as $programID => $programName)
{
$program->products = zget($productGroup, $programID, array());
$program->rowspan = count($program->products) > 0 ? count($program->products) : 1;
foreach($program->products as $product)
{
if(isset($product->projects['doing']) and count($product->projects['doing']) > 0) $program->rowspan += count($product->projects['doing']) - 1;
}
$programGroup = new stdclass();
$programGroup->name = $programName;
$programGroup->products = zget($productGroup, $programID, array());
if(in_array($programID, $involvedPrograms))
{
$kanbanGroup['my'][$programID] = $program;
$kanbanGroup['my'][$programID] = $programGroup;
}
else
{
$kanbanGroup['others'][$programID] = $program;
$kanbanGroup['others'][$programID] = $programGroup;
}
}
@@ -291,29 +272,31 @@ class programModel extends model
*
* @param string $account
* @access public
* @return void
* @return array
*/
public function getInvolvedPrograms($account)
{
$involvedPrograms = array();
/* All involves in program table. */
$objects = $this->dao->select('id,type,project,path')->from(TABLE_PROGRAM)
->where('deleted')->eq(0)
->andWhere("(openedBy = '$account' or PM = '$account')")
->fetchAll('id');
/* All objects in program table. */
$objects = $this->dao->select('id,type,project,parent,path,openedBy,PM')->from(TABLE_PROGRAM)->where('deleted')->eq(0)->fetchAll('id');
foreach($objects as $id => $object)
{
if($object->openedBy != $account and $object->PM != $account) continue;
if($object->type == 'program') $involvedPrograms[$id] = $id;
if($object->type == 'project')
{
$programID = $this->getTopByID($id);
$programID = $this->getTopByPath($object->path);
$involvedPrograms[$programID] = $programID;
}
if($object->type == 'sprint' or $object->type == 'stage')
{
$programID = $this->getTopByID($object->project);
$parentProject = zget($objects, $object->parent, array());
if(!$parentProject) continue;
$programID = $this->getTopByPath($parentProject->path);
$involvedPrograms[$programID] = $programID;
}
}
@@ -334,7 +317,10 @@ class programModel extends model
}
if($object->type == 'project')
{
$programID = $this->getTopByID($objectID);
$project = zget($objects, $objectID, array());
if(!$project) continue;
$programID = $this->getTopByPath($project->path);
$involvedPrograms[$programID] = $programID;
}
}
@@ -351,12 +337,21 @@ class programModel extends model
{
if($object->type == 'project')
{
$programID = $this->getTopByID($objectID);
$project = zget($objects, $objectID, array());
if(!$project) continue;
$programID = $this->getTopByPath($project->path);
$involvedPrograms[$programID] = $programID;
}
if($object->type == 'execution')
if($object->type == 'sprint' or $object->type == 'stage')
{
$programID = $this->getTopByID($object->project);
$execution = zget($objects, $objectID, array());
if(!$execution) continue;
$project = zget($objects, $execution->parent, array());
if(!$project) continue;
$programID = $this->getTopByPath($project->path);
$involvedPrograms[$programID] = $programID;
}
}
@@ -914,7 +909,7 @@ class programModel extends model
}
/**
* get top program by path.
* Get top program by path.
*
* @param string $path
* @access public
+1 -1
View File
@@ -4,7 +4,7 @@
th.c-budget {text-align: right;}
td.c-actions {overflow: visible;}
td.c-PM{white-space: nowrap;overflow: hidden;}
td.c-PM {white-space: nowrap; overflow: hidden;}
.c-actions .btn {overflow: visible;}
#programBox {float: left; margin-right: 10px; width: 170px !important;}
#switchButton {background: #fff !important;}
+5 -5
View File
@@ -30,13 +30,13 @@
</div>
<?php
$kanbanColumns = array();
$kanbanColumns['waitProject'] = array('name' => $lang->project->waitProjects, 'type' => 'waitProject');
$kanbanColumns['doingProject'] = array('name' => $lang->project->doingProjects, 'type' => 'doingProject');
$kanbanColumns['doingExecution'] = array('name' => $lang->project->doingExecutions, 'type' => 'doingExecution');
$kanbanColumns['waitProject'] = array('name' => $lang->project->waitProjects, 'type' => 'waitProject');
$kanbanColumns['doingProject'] = array('name' => $lang->project->doingProjects, 'type' => 'doingProject');
$kanbanColumns['doingExecution'] = array('name' => $lang->project->doingExecutions, 'type' => 'doingExecution');
$kanbanColumns['closedProject'] = array('name' => $lang->project->closedProjects, 'type' => 'closedProject');
$userPrivs = array();
$userPrivs['project'] = common::hasPriv('project', 'index');
$userPrivs['execution'] = common::hasPriv('execution', 'task');
$userPrivs['project'] = common::hasPriv('project', 'index');
$userPrivs['execution'] = common::hasPriv('execution', 'task');
js::set('kanbanColumns', $kanbanColumns);
js::set('userPrivs', $userPrivs);
js::set('kanbanGroup', $kanbanGroup);
+4 -4
View File
@@ -2572,8 +2572,8 @@ class storyModel extends model
->beginIF($type == 'bybranch' and strpos($branchID, ',') !== false)->andWhere('t2.branch')->eq($branchParam)->fi()
->beginIF(strpos('changed|closed', $type) !== false)->andWhere('t2.status')->eq($type)->fi()
->beginIF($type == 'unclosed')->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi()
->beginIF($type == 'linkedexecution')->andWhere('t2.id')->in(array_keys($storyIdList))->fi()
->beginIF($type == 'unlinkedexecution')->andWhere('t2.id')->notIn(array_keys($storyIdList))->fi()
->beginIF($type == 'linkedexecution')->andWhere('t2.id')->in($storyIdList)->fi()
->beginIF($type == 'unlinkedexecution')->andWhere('t2.id')->notIn($storyIdList)->fi()
->fi()
->beginIF($execution->type != 'project')
->beginIF(!empty($productParam))->andWhere('t1.product')->eq($productParam)->fi()
@@ -2631,8 +2631,8 @@ class storyModel extends model
->beginIF($status == 'unclosed')->andWhere('t2.status')->ne('closed')->fi()
->orderBy('t1.`order` desc')
->fetchAll();
if(empty($stories)) return array();
return $this->formatStories($stories, $type);
return empty($stories) ? array() : $this->formatStories($stories, $type);
}
/**
+3 -1
View File
@@ -21,6 +21,8 @@ select[id^="story"] + .picker-single {width: 130px; max-width: 130px;}
.chosen-results > li.has-new-task.highlighted {color: #fff;}
.c-id {width: 30px;}
.c-module {width: 150px;}
.c-module, .c-desc {width: 150px;}
.c-story {width: 200px;}
.c-assigned {width: 130px;}
.c-date {width: 120px;}
.c-pri {width: 80px;}
+4 -4
View File
@@ -68,10 +68,10 @@
<th class='c-type required'><?php echo $lang->typeAB;?></span></th>
<th class='c-assigned<?php echo zget($visibleFields, 'assignedTo', ' hidden') . zget($requiredFields, 'assignedTo', '', ' required');?>'><?php echo $lang->task->assignedTo;?></th>
<th class='c-estimate<?php echo zget($visibleFields, 'estimate', ' hidden') . zget($requiredFields, 'estimate', '', ' required');?>'><?php echo $lang->task->estimateAB;?></th>
<th class='c-full-date<?php echo zget($visibleFields, 'estStarted', ' hidden') . zget($requiredFields, 'estStarted', '', ' required');?>'><?php echo $lang->task->estStarted;?></th>
<th class='w-120px<?php echo zget($visibleFields, 'deadline', ' hidden') . zget($requiredFields, 'deadline', '', ' required');?>'><?php echo $lang->task->deadline;?></th>
<th class='w-150px<?php echo zget($visibleFields, 'desc', ' hidden') . zget($requiredFields, 'desc', '', ' required');?>'><?php echo $lang->task->desc;?></th>
<th class='w-80px<?php echo zget($visibleFields, 'pri', ' hidden') . zget($requiredFields, 'pri', '', ' required');?>'><?php echo $lang->task->pri;?></th>
<th class='c-date<?php echo zget($visibleFields, 'estStarted', ' hidden') . zget($requiredFields, 'estStarted', '', ' required');?>'><?php echo $lang->task->estStarted;?></th>
<th class='c-date<?php echo zget($visibleFields, 'deadline', ' hidden') . zget($requiredFields, 'deadline', '', ' required');?>'><?php echo $lang->task->deadline;?></th>
<th class='c-desc<?php echo zget($visibleFields, 'desc', ' hidden') . zget($requiredFields, 'desc', '', ' required');?>'><?php echo $lang->task->desc;?></th>
<th class='c-pri<?php echo zget($visibleFields, 'pri', ' hidden') . zget($requiredFields, 'pri', '', ' required');?>'><?php echo $lang->task->pri;?></th>
<?php
$extendFields = $this->task->getFlowExtendFields();
foreach($extendFields as $extendField) echo "<th class='w-100px'>{$extendField->name}</th>";
+1
View File
@@ -4,3 +4,4 @@
.c-story, .c-module, .c-type {width: 120px;}
.c-stage {width: 160px;}
.c-step {width: 300px;}
.form-actions .btn {margin-right: 20px;}
+2 -2
View File
@@ -137,8 +137,8 @@ $(function()
}
echo html::hidden('isEndPage', $isEndPage ? 1 : 0);
echo html::hidden('pagerID', $pagerID);
echo ' &nbsp; ' . html::linkButton($lang->goback, $this->inlink('browse', "productID=$productID"), 'self', '', 'btn btn-wide');
echo ' &nbsp; ' . sprintf($lang->file->importPager, $allCount, $pagerID, $allPager);
echo html::linkButton($lang->goback, $this->inlink('browse', "productID=$productID"), 'self', '', 'btn btn-wide');
echo sprintf($lang->file->importPager, $allCount, $pagerID, $allPager);
?>
</td>
</tr>
-3
View File
@@ -21,7 +21,6 @@ $(function()
return false;
}
var onlybody = config.onlybody == 'yes';
var projectID = $('#project').val();
var link = createLink('task', 'create', 'executionID=' + executionID + '&storyID=0&moduleID=0&taskID=0&todoID=' + todoID, config.defaultView, onlybody);
location.href = link;
@@ -30,7 +29,6 @@ $(function()
$('#toStoryButton').click(function()
{
var onlybody = config.onlybody == 'yes';
var programID = $('#productProgram').val();
var productID = $('#product').val();
var link = createLink('story', 'create', 'productID=' + productID + '&branch=0&moduleID=0&storyID=0&projectID=0&bugID=0&planID=0&todoID=' + todoID, config.defaultView, onlybody);
@@ -40,7 +38,6 @@ $(function()
$('#toBugButton').click(function()
{
var onlybody = config.onlybody == 'yes';
var projectID = $('#bugProject').val();
var productID = $('#bugProduct').val();
var link = createLink('bug', 'create', 'productID=' + productID + '&branch=0&extras=todoID=' + todoID, config.defaultView, onlybody);
+1 -1
View File
@@ -109,7 +109,7 @@ class tutorial extends control
$moduleLower = strtolower($module);
foreach($this->lang->tutorial->tasks as $task)
{
$taskModule = strtolower($task['nav']['module']);
$taskModule = strtolower($task['nav']['module']);
$taskMenuModule = strtolower($task['nav']['menuModule']);
if($taskModule == $moduleLower or $taskMenuModule == $moduleLower)
{
+15 -7
View File
@@ -81,8 +81,7 @@ $(function()
var clearTips = function()
{
appsWindow.$('#menuMainNav > li.hl-tutorial').removeClass('hl-tutorial hl-in').tooltip('destroy');
var $menuMainNav = appsWindow.$('#menuMainNav');
var $menuMainNav = appsWindow.$('#menuNav');
$menuMainNav.find('.hl-tutorial').removeClass('hl-tutorial hl-in');
$menuMainNav.find('.tooltip-tutorial').tooltip('destroy').removeClass('tooltip-tutorial');
var appWindow = getAppWindow();
@@ -178,16 +177,25 @@ $(function()
html: true
}, options);
$e = $e.first();
if($e.css('display') == 'none')
{
$e.parent().addClass('tooltip-tutorial').after("<div id='typeLabel' class='text-danger help-text'>" + options.title + "</div>");
}
else
if($e.css('display') !== 'none')
{
if(!$e.data('zui.tooltip')) $e.addClass('tooltip-tutorial').attr('data-toggle', 'tooltip').tooltip(options);
$e.tooltip('show');
if($e[0].getBoundingClientRect().top > $(window).height() || $e[0].getBoundingClientRect().top < 0) $e[0].scrollIntoView();
}
else if($e.parent().is('#menuMainNav'))
{
var $menuMoreItem = appsWindow.$('#menuMoreNav>li.dropdown');
highlight($menuMoreItem);
showToolTip($menuMoreItem, text, $.extend({}, options, {tipClass: 'tooltip-warning tooltip-max tooltip-menu-more text-nowrap', container: false}));
var appCode = $e.data('app');
appsWindow.$('#menuMoreList>li').removeClass('active').attr('data-tip', '');
appsWindow.$('#menuMoreList>li[data-app="' + appCode + '"]').addClass('active hl-tutorial hl-in').attr('data-tip', text);
}
else
{
$e.parent().addClass('tooltip-tutorial').after("<div id='typeLabel' class='text-danger help-text'>" + options.title + "</div>");
}
};
var tryCheckTask = function()
+33 -50
View File
@@ -45,62 +45,45 @@ $lang->tutorial->tasks['createProgram']['mode'] = 'new';
$lang->tutorial->tasks['createProgram']['nav'] = array('app' => 'program', 'module' => 'program', 'method' => 'create', 'menuModule' => 'program', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="browse"],.create-program-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-program-btn', 'targetPageName' => 'Create program');
$lang->tutorial->tasks['createProgram']['desc'] = "<p>Create a new program:</p><ul><li data-target='nav'>Open <span class='task-nav'>Program <i class='icon icon-angle-right'></i> Program list <i class='icon icon-angle-right'></i> Create program</span>;</li><li data-target='form'>Fill the form with program information;</li><li data-target='submit'>Save</li></ul>";
global $config;
if($config->global->flow == 'full' or $config->global->flow != 'onlyTask')
{
$lang->tutorial->tasks['createProduct'] = array('title' => 'Create a ' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['nav'] = array('app' => 'product', 'module' => 'product', 'method' => 'create', 'menuModule' => 'product', 'menu' => 'all', 'form' => '#createForm', 'submit' => '#submit', 'target' => '.create-product-btn', 'targetPageName' => $lang->productCommon);
$lang->tutorial->tasks['createProduct']['desc'] = "<p>Create a {$lang->productCommon}: </p><ul><li data-target='nav'> Open <span class='task-nav'>{$lang->productCommon} list <i class='icon icon-angle-right'></i> {$lang->productCommon} <i class='icon icon-angle-right'></i> New;</span></li><li data-target='form'>Fill the form with {$lang->productCommon} information;</li><li data-target='submit'>Save</li></ul>";
}
$lang->tutorial->tasks['createProduct'] = array('title' => 'Create a ' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['nav'] = array('app' => 'product', 'module' => 'product', 'method' => 'create', 'menuModule' => 'product', 'menu' => 'all', 'form' => '#createForm', 'submit' => '#submit', 'target' => '.create-product-btn', 'targetPageName' => $lang->productCommon);
$lang->tutorial->tasks['createProduct']['desc'] = "<p>Create a {$lang->productCommon}: </p><ul><li data-target='nav'> Open <span class='task-nav'>{$lang->productCommon} list <i class='icon icon-angle-right'></i> {$lang->productCommon} <i class='icon icon-angle-right'></i> New;</span></li><li data-target='form'>Fill the form with {$lang->productCommon} information;</li><li data-target='submit'>Save</li></ul>";
if($config->global->flow == 'full' or $config->global->flow == 'onlyStory')
{
$lang->tutorial->tasks['createStory'] = array('title' => "Create a {$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['nav'] = array('app' => 'product', 'module' => 'story', 'method' => 'create', 'menuModule' => 'story', 'menu' => '#productTableList>tr:not(.has-nest-child):first>.c-name>a,#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-story-btn', 'target' => '.create-story-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => "Create {$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['desc'] = "<p>Create a story: </p><ul><li data-target='nav'>Open <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i>Story <i class='icon icon-angle-right'></i>Create;</span></li><li data-target='form'>Fill the form with story information;</li><li data-target='submit'>Save</li></ul>";
}
$lang->tutorial->tasks['createStory'] = array('title' => "Create a {$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['nav'] = array('app' => 'product', 'module' => 'story', 'method' => 'create', 'menuModule' => 'story', 'menu' => '#productTableList>tr:not(.has-nest-child):first>.c-name>a,#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-story-btn', 'target' => '.create-story-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => "Create {$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['desc'] = "<p>Create a story: </p><ul><li data-target='nav'>Open <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i>Story <i class='icon icon-angle-right'></i>Create;</span></li><li data-target='form'>Fill the form with story information;</li><li data-target='submit'>Save</li></ul>";
if($config->global->flow == 'full' or $config->global->flow == 'onlyTask')
{
$lang->tutorial->tasks['createProject'] = array('title' => 'Create a ' . $lang->executionCommon);
$lang->tutorial->tasks['createProject']['mode'] = 'new';
$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => 'Create ' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['desc'] = "<p>Create a {$lang->projectCommon}: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> New</span> Page;</li><li data-target='form'>Fill the form with {$lang->projectCommon} information;</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['createProject'] = array('title' => 'Create a ' . $lang->executionCommon);
$lang->tutorial->tasks['createProject']['mode'] = 'new';
$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => 'Create ' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['desc'] = "<p>Create a {$lang->projectCommon}: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> New</span> Page;</li><li data-target='form'>Fill the form with {$lang->projectCommon} information;</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['manageTeam'] = array('title' => "Manage {$lang->projectCommon} Team");
$lang->tutorial->tasks['manageTeam']['mode'] = 'new';
$lang->tutorial->tasks['manageTeam']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="members"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'accounts1', 'submit' => '#submit', 'targetPageName' => 'Manage team members');
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>Manage {$lang->projectCommon} team members: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> Team <i class='icon icon-angle-right'></i> Manage Team Members</span> Page;</li><li data-target='form'>Choose users for the team.</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['manageTeam'] = array('title' => "Manage {$lang->projectCommon} Team");
$lang->tutorial->tasks['manageTeam']['mode'] = 'new';
$lang->tutorial->tasks['manageTeam']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="members"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'accounts1', 'submit' => '#submit', 'targetPageName' => 'Manage team members');
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>Manage {$lang->projectCommon} team members: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> Team <i class='icon icon-angle-right'></i> Manage Team Members</span> Page;</li><li data-target='form'>Choose users for the team.</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['createExecution'] = array('title' => 'Create a ' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => 'Create ' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['desc'] = "<p>Create a new {$lang->executionCommon}:</p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon} list <i class='icon icon-angle-right'></i> Create {$lang->executionCommon}</span>;</li><li data-target='form'>Fill the form with {$lang->executionCommon} information;</li><li data-target='submit'>Save {$lang->executionCommon}</li></ul>";
$lang->tutorial->tasks['createExecution'] = array('title' => 'Create a ' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => 'Create ' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['desc'] = "<p>Create a new {$lang->executionCommon}:</p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon} list <i class='icon icon-angle-right'></i> Create {$lang->executionCommon}</span>;</li><li data-target='form'>Fill the form with {$lang->executionCommon} information;</li><li data-target='submit'>Save {$lang->executionCommon}</li></ul>";
$lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "Manage {$lang->executionCommon} Team");
$lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic';
$lang->tutorial->tasks['manageExecutionTeam']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#executionTableList>tr:first>.c-name>a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="team"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'account1', 'submit' => '#submit', 'targetPageName' => 'Manage team members');
$lang->tutorial->tasks['manageExecutionTeam']['desc'] = "<p>Manage {$lang->projectCommon} team members: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> Team <i class='icon icon-angle-right'></i> Manage Team Members</span> Page;</li><li data-target='form'>Choose users for the team.</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "Manage {$lang->executionCommon} Team");
$lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic';
$lang->tutorial->tasks['manageExecutionTeam']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#executionTableList>tr:first>.c-name>a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="team"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'account1', 'submit' => '#submit', 'targetPageName' => 'Manage team members');
$lang->tutorial->tasks['manageExecutionTeam']['desc'] = "<p>Manage {$lang->projectCommon} team members: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> Team <i class='icon icon-angle-right'></i> Manage Team Members</span> Page;</li><li data-target='form'>Choose users for the team.</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['linkStory'] = array('title' => 'Link a Story');
$lang->tutorial->tasks['linkStory']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'linkStory', 'menuModule' => 'story', 'menu' => '', 'target' => '.link-story-btn', 'form' => '#linkStoryForm', 'formType' => 'table', 'submit' => '#submit', 'targetPageName' => "Link {$lang->SRCommon}");
$lang->tutorial->tasks['linkStory']['desc'] = "<p>Link a Story to {$lang->executionCommon}: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> Story <i class='icon icon-angle-right'></i>Relate Story;</span></li><li data-target='form'>Select stories from story list to relate;</li><li data-target='submit'>Save</li></ul>";
if($config->global->flow == 'full')
{
$lang->tutorial->tasks['linkStory'] = array('title' => 'Link a Story');
$lang->tutorial->tasks['linkStory']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'linkStory', 'menuModule' => 'story', 'menu' => '', 'target' => '.link-story-btn', 'form' => '#linkStoryForm', 'formType' => 'table', 'submit' => '#submit', 'targetPageName' => "Link {$lang->SRCommon}");
$lang->tutorial->tasks['linkStory']['desc'] = "<p>Link a Story to {$lang->executionCommon}: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> Story <i class='icon icon-angle-right'></i>Relate Story;</span></li><li data-target='form'>Select stories from story list to relate;</li><li data-target='submit'>Save</li></ul>";
}
$lang->tutorial->tasks['createTask'] = array('title' => 'Task Breakdown');
$lang->tutorial->tasks['createTask']['nav'] = array('app' => 'execution', 'module' => 'task', 'method' => 'create', 'menuModule' => 'story', 'menu' => '', 'target' => '.btn-task-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Create Task');
$lang->tutorial->tasks['createTask']['desc'] = "<p>Task breakdown for a story: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> Story <i class='icon icon-angle-right'></i> WBS;</span></li><li data-target='form'>Fill the form with task information;</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['createTask'] = array('title' => 'Task Breakdown');
$lang->tutorial->tasks['createTask']['nav'] = array('app' => 'execution', 'module' => 'task', 'method' => 'create', 'menuModule' => 'story', 'menu' => '', 'target' => '.btn-task-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Create Task');
$lang->tutorial->tasks['createTask']['desc'] = "<p>Task breakdown for a story: </p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> Story <i class='icon icon-angle-right'></i> WBS;</span></li><li data-target='form'>Fill the form with task information;</li><li data-target='submit'>Save</li></ul>";
}
$lang->tutorial->tasks['createBug'] = array('title' => 'Report Bug');
$lang->tutorial->tasks['createBug']['nav'] = array('app' => 'qa', 'module' => 'bug', 'method' => 'create', 'menuModule' => 'bug', 'menu' => 'bug', 'target' => '.create-bug-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Report Bug');
$lang->tutorial->tasks['createBug']['desc'] = "<p>Report a Bug: </p><ul><li data-target='nav'>Open <span class='task-nav'> Test <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> Report Bug</span>;</li><li data-target='form'>Fill the form with bug information:</li><li data-target='submit'>Save</li></ul>";
if($config->global->flow == 'full' or $config->global->flow == 'onlyTest')
{
$lang->tutorial->tasks['createBug'] = array('title' => 'Report Bug');
$lang->tutorial->tasks['createBug']['nav'] = array('app' => 'qa', 'module' => 'bug', 'method' => 'create', 'menuModule' => 'bug', 'menu' => 'bug', 'target' => '.create-bug-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Report Bug');
$lang->tutorial->tasks['createBug']['desc'] = "<p>Report a Bug: </p><ul><li data-target='nav'>Open <span class='task-nav'> Test <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> Report Bug</span>;</li><li data-target='form'>Fill the form with bug information:</li><li data-target='submit'>Save</li></ul>";
$lang->tutorial->tasks['createBug'] = array('title' => 'Report Bug');
$lang->tutorial->tasks['createBug']['nav'] = array('module' => 'bug', 'method' => 'create', 'menuModule' => 'qa', 'menu' => 'bug', 'target' => '.btn-bug-create', 'vars' => 'productID=0', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Report Bug');
$lang->tutorial->tasks['createBug']['desc'] = "<p>Report a Bug: </p><ul><li data-target='nav'>Open <span class='task-nav'> QA <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> Report Bug</span>;</li><li data-target='form'>Fill the form with bug information:</li><li data-target='submit'>Save</li></ul>";
}
$lang->tutorial->tasks['createBug'] = array('title' => 'Report Bug');
$lang->tutorial->tasks['createBug']['nav'] = array('module' => 'bug', 'method' => 'create', 'menuModule' => 'qa', 'menu' => 'bug', 'target' => '.btn-bug-create', 'vars' => 'productID=0', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => 'Report Bug');
$lang->tutorial->tasks['createBug']['desc'] = "<p>Report a Bug: </p><ul><li data-target='nav'>Open <span class='task-nav'> QA <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> Report Bug</span>;</li><li data-target='form'>Fill the form with bug information:</li><li data-target='submit'>Save</li></ul>";
+30 -46
View File
@@ -44,57 +44,41 @@ $lang->tutorial->tasks['createProgram']['mode'] = 'new';
$lang->tutorial->tasks['createProgram']['nav'] = array('app' => 'program', 'module' => 'program', 'method' => 'create', 'menuModule' => 'program', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="browse"],.create-program-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-program-btn', 'targetPageName' => '添加项目集');
$lang->tutorial->tasks['createProgram']['desc'] = "<p>在系统创建一个新的项目集:</p><ul><li data-target='nav'>打开 <span class='task-nav'>项目集 <i class='icon icon-angle-right'></i> 项目集列表 <i class='icon icon-angle-right'></i> 添加项目集</span> 页面;</li><li data-target='form'>在添加项目集表单中填写项目集信息;</li><li data-target='submit'>保存项目集信息。</li></ul>";
global $config;
if($config->global->flow == 'full' or $config->global->flow != 'onlyTask')
{
$lang->tutorial->tasks['createProduct'] = array('title' => '创建' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['nav'] = array('app' => 'product', 'module' => 'product', 'method' => 'create', 'menuModule' => 'product', 'menu' => 'all', 'form' => '#createForm', 'submit' => '#submit', 'target' => '.create-product-btn', 'targetPageName' => '添加' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['desc'] = "<p>在系统创建一个新的{$lang->productCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i> {$lang->productCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->productCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->productCommon}信息;</li><li data-target='submit'>保存{$lang->productCommon}信息。</li></ul>";
}
$lang->tutorial->tasks['createProduct'] = array('title' => '创建' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['nav'] = array('app' => 'product', 'module' => 'product', 'method' => 'create', 'menuModule' => 'product', 'menu' => 'all', 'form' => '#createForm', 'submit' => '#submit', 'target' => '.create-product-btn', 'targetPageName' => '添加' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['desc'] = "<p>在系统创建一个新的{$lang->productCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i> {$lang->productCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->productCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->productCommon}信息;</li><li data-target='submit'>保存{$lang->productCommon}信息。</li></ul>";
if($config->global->flow == 'full' or $config->global->flow == 'onlyStory')
{
$lang->tutorial->tasks['createStory'] = array('title' => "创建{$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['nav'] = array('app' => 'product', 'module' => 'story', 'method' => 'create', 'menuModule' => 'story', 'menu' => '#productTableList>tr:not(.has-nest-child):first>.c-name>a,#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-story-btn', 'target' => '.create-story-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => "提{$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['desc'] = "<p>在系统创建一个新的{$lang->SRCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 提{$lang->SRCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->SRCommon}信息;</li><li data-target='submit'>保存{$lang->SRCommon}信息。</li></ul>";
}
$lang->tutorial->tasks['createStory'] = array('title' => "创建{$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['nav'] = array('app' => 'product', 'module' => 'story', 'method' => 'create', 'menuModule' => 'story', 'menu' => '#productTableList>tr:not(.has-nest-child):first>.c-name>a,#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-story-btn', 'target' => '.create-story-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => "提{$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['desc'] = "<p>在系统创建一个新的{$lang->SRCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 提{$lang->SRCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->SRCommon}信息;</li><li data-target='submit'>保存{$lang->SRCommon}信息。</li></ul>";
if($config->global->flow == 'full' or $config->global->flow == 'onlyTask')
{
$lang->tutorial->tasks['createProject'] = array('title' => '创建' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['mode'] = 'new';
$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['desc'] = "<p>在系统创建一个新的{$lang->projectCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->projectCommon}列表 <i class='icon icon-angle-right'></i> 创建{$lang->projectCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->projectCommon}信息;</li><li data-target='submit'>保存{$lang->projectCommon}信息。</li></ul>";
$lang->tutorial->tasks['createProject'] = array('title' => '创建' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['mode'] = 'new';
$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['desc'] = "<p>在系统创建一个新的{$lang->projectCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->projectCommon}列表 <i class='icon icon-angle-right'></i> 创建{$lang->projectCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->projectCommon}信息;</li><li data-target='submit'>保存{$lang->projectCommon}信息。</li></ul>";
$lang->tutorial->tasks['manageTeam'] = array('title' => "管理{$lang->projectCommon}团队");
$lang->tutorial->tasks['manageTeam']['mode'] = 'new';
$lang->tutorial->tasks['manageTeam']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="members"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'accounts1', 'submit' => '#submit', 'targetPageName' => '团队管理');
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>管理{$lang->projectCommon}团队成员:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> 设置 <i class='icon icon-angle-right'></i> 团队 <i class='icon icon-angle-right'></i> 团队管理</span> 页面;</li><li data-target='form'>选择要加入团队的成员;</li><li data-target='submit'>保存团队成员信息。</li></ul>";
$lang->tutorial->tasks['manageTeam'] = array('title' => "管理{$lang->projectCommon}团队");
$lang->tutorial->tasks['manageTeam']['mode'] = 'new';
$lang->tutorial->tasks['manageTeam']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="members"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'accounts1', 'submit' => '#submit', 'targetPageName' => '团队管理');
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>管理{$lang->projectCommon}团队成员:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> 设置 <i class='icon icon-angle-right'></i> 团队 <i class='icon icon-angle-right'></i> 团队管理</span> 页面;</li><li data-target='form'>选择要加入团队的成员;</li><li data-target='submit'>保存团队成员信息。</li></ul>";
$lang->tutorial->tasks['createExecution'] = array('title' => '创建' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => '添加' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['desc'] = "<p>在系统创建一个新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['createExecution'] = array('title' => '创建' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => '添加' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['desc'] = "<p>在系统创建一个新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "管理{$lang->executionCommon}团队");
$lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic';
$lang->tutorial->tasks['manageExecutionTeam']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#executionTableList>tr:first>.c-name>a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="team"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'account1', 'submit' => '#submit', 'targetPageName' => '团队管理');
$lang->tutorial->tasks['manageExecutionTeam']['desc'] = "<p>管理{$lang->executionCommon}团队成员:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> 设置 <i class='icon icon-angle-right'></i> 团队 <i class='icon icon-angle-right'></i> 团队管理</span> 页面;</li><li data-target='form'>选择要加入团队的成员;</li><li data-target='submit'>保存团队成员信息。</li></ul>";
$lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "管理{$lang->executionCommon}团队");
$lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic';
$lang->tutorial->tasks['manageExecutionTeam']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#executionTableList>tr:first>.c-name>a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="team"],.manage-team-btn', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'account1', 'submit' => '#submit', 'targetPageName' => '团队管理');
$lang->tutorial->tasks['manageExecutionTeam']['desc'] = "<p>管理{$lang->executionCommon}团队成员:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> 设置 <i class='icon icon-angle-right'></i> 团队 <i class='icon icon-angle-right'></i> 团队管理</span> 页面;</li><li data-target='form'>选择要加入团队的成员;</li><li data-target='submit'>保存团队成员信息。</li></ul>";
if($config->global->flow == 'full')
{
$lang->tutorial->tasks['linkStory'] = array('title' => "关联{$lang->SRCommon}");
$lang->tutorial->tasks['linkStory']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'linkStory', 'menuModule' => 'story', 'menu' => '', 'target' => '.link-story-btn', 'form' => '#linkStoryForm', 'formType' => 'table', 'submit' => '#submit', 'targetPageName' => "关联{$lang->SRCommon}");
$lang->tutorial->tasks['linkStory']['desc'] = "<p>将{$lang->SRCommon}关联到{$lang->executionCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 关联{$lang->SRCommon}</span> 页面;</li><li data-target='form'>在{$lang->SRCommon}列表中勾选要关联的{$lang->SRCommon};</li><li data-target='submit'>保存关联的{$lang->SRCommon}信息。</li></ul>";
}
$lang->tutorial->tasks['linkStory'] = array('title' => "关联{$lang->SRCommon}");
$lang->tutorial->tasks['linkStory']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'linkStory', 'menuModule' => 'story', 'menu' => '', 'target' => '.link-story-btn', 'form' => '#linkStoryForm', 'formType' => 'table', 'submit' => '#submit', 'targetPageName' => "关联{$lang->SRCommon}");
$lang->tutorial->tasks['linkStory']['desc'] = "<p>将{$lang->SRCommon}关联到{$lang->executionCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 关联{$lang->SRCommon}</span> 页面;</li><li data-target='form'>在{$lang->SRCommon}列表中勾选要关联的{$lang->SRCommon};</li><li data-target='submit'>保存关联的{$lang->SRCommon}信息。</li></ul>";
$lang->tutorial->tasks['createTask'] = array('title' => '分解任务');
$lang->tutorial->tasks['createTask']['nav'] = array('app' => 'execution', 'module' => 'task', 'method' => 'create', 'menuModule' => 'story', 'menu' => '', 'target' => '.btn-task-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '建任务');
$lang->tutorial->tasks['createTask']['desc'] = "<p>将{$lang->executionCommon}{$lang->SRCommon}分解为任务:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 分解任务</span> 页面;</li><li data-target='form'>在表单中填写任务信息;</li><li data-target='submit'>保存任务信息。</li></ul>";
}
$lang->tutorial->tasks['createTask'] = array('title' => '分解任务');
$lang->tutorial->tasks['createTask']['nav'] = array('app' => 'execution', 'module' => 'task', 'method' => 'create', 'menuModule' => 'story', 'menu' => '', 'target' => '.btn-task-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '建任务');
$lang->tutorial->tasks['createTask']['desc'] = "<p>将{$lang->executionCommon}{$lang->SRCommon}分解为任务:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 分解任务</span> 页面;</li><li data-target='form'>在表单中填写任务信息;</li><li data-target='submit'>保存任务信息。</li></ul>";
if($config->global->flow == 'full' or $config->global->flow == 'onlyTest')
{
$lang->tutorial->tasks['createBug'] = array('title' => '提Bug');
$lang->tutorial->tasks['createBug']['nav'] = array('app' => 'qa', 'module' => 'bug', 'method' => 'create', 'menuModule' => 'bug', 'menu' => 'bug', 'target' => '.create-bug-btn', 'vars' => 'productID=0', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '提Bug');
$lang->tutorial->tasks['createBug']['desc'] = "<p>在系统中提交一个Bug:</p><ul><li data-target='nav'>打开 <span class='task-nav'> 测试 <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> 提Bug</span>;</li><li data-target='form'>在表单中填写Bug信息;</li><li data-target='submit'>保存Bug信息。</li></ul>";
}
$lang->tutorial->tasks['createBug'] = array('title' => '提Bug');
$lang->tutorial->tasks['createBug']['nav'] = array('app' => 'qa', 'module' => 'bug', 'method' => 'create', 'menuModule' => 'bug', 'menu' => 'bug', 'target' => '.create-bug-btn', 'vars' => 'productID=0', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '提Bug');
$lang->tutorial->tasks['createBug']['desc'] = "<p>在系统中提交一个Bug:</p><ul><li data-target='nav'>打开 <span class='task-nav'> 测试 <i class='icon icon-angle-right'></i> Bug <i class='icon icon-angle-right'></i> 提Bug</span>;</li><li data-target='form'>在表单中填写Bug信息;</li><li data-target='submit'>保存Bug信息。</li></ul>";
+1 -1
View File
@@ -78,7 +78,7 @@
$nav = $task['nav'];
if(!commonModel::hasPriv($nav['module'], $nav['method'])) continue;
$task['name'] = $name;
$task['id'] = ++$idx;
$task['id'] = ++ $idx;
$task['url'] = helper::createLink($nav['module'], $nav['method'], isset($nav['vars']) ? $nav['vars'] : '', 'tutorial');
$tasks[$name] = $task;
?>
+4 -3
View File
@@ -4307,7 +4307,6 @@ class upgradeModel extends model
if(isset($data->projectName) and $data->projectType == 'execution' and empty($data->projectName)) die(js::alert(sprintf($this->lang->error->notempty, $this->lang->upgrade->projectName)));
/* Insert program. */
$program = new stdclass();
$program->name = $data->programName;
@@ -4729,6 +4728,8 @@ class upgradeModel extends model
$today = helper::today();
foreach($projectTeams as $projectID => $projectMember)
{
if(empty($projectMember)) continue;
$projectMember = array_filter($projectMember);
$project = zget($projects, $projectID, '');
$members = implode(',', $projectMember);
@@ -5287,7 +5288,7 @@ class upgradeModel extends model
}
/**
* Required to adjust the bug.
* Adjust for bug required field.
*
* @access public
* @return void
@@ -5303,6 +5304,6 @@ class upgradeModel extends model
$data->value = ',' . $data->value . ',';
$data->value = str_replace(',project,', ',', $data->value);
$this->dao->update(TABLE_CONFIG)->set('value')->eq(trim($data->value, ','))->where('id')->eq($data->id)->exec();
$this->dao->update(TABLE_CONFIG)->set('`value`')->eq(trim($data->value, ','))->where('id')->eq($data->id)->exec();
}
}
+1 -1
View File
@@ -18,5 +18,5 @@ $config->user->failTimes = 6;
$config->user->lockMinutes = 10;
$config->user->batchCreate = 10;
/* user detail fields for API against JIHU GitLab. */
/* User detail fields for API against JIHU GitLab. */
$config->user->detailFields = 'id,account,realname,avatar';
+1 -1
View File
@@ -596,7 +596,7 @@ class webhookModel extends model
$toList = implode(',', $toList);
}
$toList = str_replace(",{$this->app->user->account},", ' ', ",$toList,");
$toList = str_replace(",{$this->app->user->account},", ',', ",$toList,");
$openIdList = $this->getBoundUsers($webhookID, $toList);
$openIdList = join(',', $openIdList);
File diff suppressed because one or more lines are too long