Merge branch 'zentaopms_207'

This commit is contained in:
孙广明
2022-06-22 08:33:17 +08:00
25 changed files with 91 additions and 50 deletions
+1 -1
View File
@@ -93,7 +93,7 @@ tbody tr td:first-child input {display: none;}
<tbody class='text-center'>
<?php $objectID = $this->app->tab == 'execution' ? $build->execution : $build->project;?>
<?php foreach($stories as $storyID => $story):?>
<?php $storyLink = $this->createLink('story', 'view', "storyID=$story->id&version=0&param=$objectID", '', true);?>
<?php $storyLink = $this->app->tab == 'execution' ? $this->createLink('execution', 'storyView', "storyID=$story->id", '', true) : $this->createLink('story', 'view', "storyID=$story->id&version=0&param=$objectID", '', true);?>
<tr>
<td class='c-id text-left'>
<?php if($canBatchUnlink):?>
+2 -2
View File
@@ -871,9 +871,9 @@ class doc extends control
if($doclib->acl == 'custom')
{
return print(html::select('users[]', $users, $selectedUser, "multiple class='form-control"));
return print(html::select('users[]', $users, $selectedUser, "multiple class='form-control'"));
}
if($doclib->acl == 'open') return print(html::select('users[]', $users, $selectedUser, "multiple class='form-control"));
if($doclib->acl == 'open') return print(html::select('users[]', $users, $selectedUser, "multiple class='form-control'"));
if($doclib->acl == 'private') echo 'private';
if($doclib->acl == 'default') echo 'default';
return false;
+15
View File
@@ -871,6 +871,21 @@ class execution extends control
$this->display();
}
/**
* View a story.
*
* @param int $storyID
* @access public
* @return void
*/
public function storyView($storyID)
{
$this->session->set('productList', $this->app->getURI(true), 'product');
$story = $this->loadModel('story')->getByID($storyID);
echo $this->fetch('story', 'view', "storyID=$storyID&version=$story->version&param=" . $this->session->execution);
}
/**
* Browse bugs of a execution.
*
+1 -1
View File
@@ -501,7 +501,7 @@ function renderStoryItem(item, $item, col)
if(!$title.length)
{
$title = $('<a class="title iframe">' + (scaleSize <= 1 ? '<i class="icon icon-lightbulb text-muted"></i> ' : '') + '<span class="text"></span></a>')
.attr('href', $.createLink('story', 'view', 'storyID=' + item.id + '&version=0&param=' + execution.id, '', true)).attr('data-toggle', 'modal').attr('data-width', '95%');
.attr('href', $.createLink('execution', 'storyView', 'storyID=' + item.id + '&version=0&param=' + execution.id, '', true)).attr('data-toggle', 'modal').attr('data-width', '95%');
$title.appendTo($item);
}
var title = rdSearchValue != '' ? "<span class='text'>" + item.title.replaceAll(rdSearchValue, "<span class='text-danger'>" + rdSearchValue + "</span>") + "</span>": "<span class='text'>" + item.title + "</span>";
+1 -1
View File
@@ -123,7 +123,7 @@ function renderStoryItem(item, $item, col)
if(!$title.length)
{
$title = $('<a class="title iframe" data-width="95%">' + (scaleSize <= 1 ? '<i class="icon icon-lightbulb text-muted"></i> ' : '') + '<span class="text"></span></a>')
.attr('href', $.createLink('story', 'view', 'storyID=' + item.id, '', true));
.attr('href', $.createLink('execution', 'storyView', 'storyID=' + item.id, '', true));
$title.appendTo($item);
}
var title = searchValue != '' ? "<span class='text'>" + item.title.replaceAll(searchValue, "<span class='text-danger'>" + searchValue + "</span>") + "</span>": "<span class='text'>" + item.title + "</span>";
+1
View File
@@ -94,6 +94,7 @@ $lang->execution->viewBug = 'Bugs';
$lang->execution->noProduct = "No {$lang->productCommon} yet.";
$lang->execution->createStory = "Create Story";
$lang->execution->storyTitle = "Story Name";
$lang->execution->storyView = "Story Detail";
$lang->execution->all = "All {$lang->executionCommon}s";
$lang->execution->undone = 'Unfinished ';
$lang->execution->unclosed = 'Unclosed';
+1
View File
@@ -94,6 +94,7 @@ $lang->execution->viewBug = '查看bug';
$lang->execution->noProduct = "{$lang->executionCommon}";
$lang->execution->createStory = "{$lang->SRCommon}";
$lang->execution->storyTitle = "{$lang->SRCommon}名称";
$lang->execution->storyView = "{$lang->SRCommon}详情";
$lang->execution->all = '所有';
$lang->execution->undone = '未完成';
$lang->execution->unclosed = '未关闭';
+3 -6
View File
@@ -3848,7 +3848,7 @@ class executionModel extends model
$storyItem->storyId = $story->id;
$storyItem->openedBy = zget($users, $story->openedBy);
$storyItem->assignedTo = zget($users, $story->assignedTo);
$storyItem->url = helper::createLink('story', 'view', "storyID=$story->id&version=$story->version&from=execution&param=$executionID");
$storyItem->url = helper::createLink('execution', 'storyView', "storyID=$story->id&version=$story->version&from=execution&param=$executionID");
$storyItem->taskCreateUrl = helper::createLink('task', 'batchCreate', "executionID={$executionID}&story={$story->id}");
$storyTasks = isset($taskGroups[$node->id][$story->id]) ? $taskGroups[$node->id][$story->id] : array();
@@ -3984,18 +3984,15 @@ class executionModel extends model
->where('product')->in(array_keys($products))
->andWhere('deleted')->eq(0)
->andWhere('branch')->in($branchIdList)->fi()
->beginIF(strpos($param, 'skipparent') !== false)->andWhere('parent')->ne(-1)->fi()
->orderBy('begin desc')
->fetchAll('id');
$plans = $this->productplan->reorder4Children($plans);
$productPlans = array();
$parentTitle = array();
foreach($plans as $plan)
{
if($plan->parent == '-1') $parentTitle[$plan->id] = $plan->title;
if($plan->parent > 0 and isset($parentTitle[$plan->parent])) $plan->title = $parentTitle[$plan->parent] . ' /' . $plan->title;
if($plan->parent == '-1' and strpos($param, 'skipparent') !== false) continue;
if($plan->parent > 0 and isset($plans[$plan->parent])) $plan->title = $plans[$plan->parent]->title . ' /' . $plan->title;
$productPlans[$plan->product][$plan->id] = $plan->title . " [{$plan->begin} ~ {$plan->end}]";
if($plan->begin == '2030-01-01' and $plan->end == '2030-01-01') $productPlans[$plan->product][$plan->id] = $plan->title . ' ' . $this->lang->productplan->future;
}
+2 -2
View File
@@ -69,9 +69,9 @@
<?php
if($task->storyID)
{
if(common::hasPriv('story', 'view'))
if(common::hasPriv('execution', 'storyView'))
{
echo html::a($this->createLink('story', 'view', "storyid=$task->storyID"), $task->storyTitle, '', "class='preview'", true, isonlybody());
echo html::a($this->createLink('execution', 'storyView', "storyid=$task->storyID"), $task->storyTitle, '', "class='preview'", true, isonlybody());
}
else
{
+1 -1
View File
@@ -55,7 +55,7 @@
<tbody>
<?php $storyCount = 0;?>
<?php foreach($allStories as $story):?>
<?php $storyLink = $this->createLink('story', 'view', "storyID=$story->id", '', true);?>
<?php $storyLink = $this->createLink('execution', 'storyView', "storyID=$story->id", '', true);?>
<tr>
<td class='cell-id'>
<?php echo html::checkbox('stories', array($story->id => sprintf('%03d', $story->id)));?>
+1 -1
View File
@@ -225,7 +225,7 @@
<tbody id='storyTableList' class='sortable'>
<?php foreach($stories as $key => $story):?>
<?php
$storyLink = $this->createLink('story', 'view', "storyID=$story->id&version=$story->version&param=$execution->id");
$storyLink = $this->createLink('execution', 'storyView', "storyID=$story->id&version=$story->version&param=$execution->id");
$totalEstimate += $story->estimate;
?>
<tr id="story<?php echo $story->id;?>" data-id='<?php echo $story->id;?>' data-order='<?php echo $story->order ?>' data-estimate='<?php echo $story->estimate?>' data-cases='<?php echo zget($storyCases, $story->id, 0)?>'>
+1 -1
View File
@@ -85,7 +85,7 @@ $account = $this->app->user->account;
<?php if(!empty($stories[$col])):?>
<?php foreach($stories[$col] as $story):?>
<div class='board-item' data-id='<?php echo $story->id?>' id='story-<?php echo $story->id?>' data-type='story'>
<?php echo html::a($this->createLink('story', 'view', "story=$story->id", '', true), "#{$story->id} {$story->title}", '', 'class="title kanbaniframe" title="' . $story->title . '"');?>
<?php echo html::a($this->createLink('execution', 'storyView', "story=$story->id", '', true), "#{$story->id} {$story->title}", '', 'class="title kanbaniframe" title="' . $story->title . '"');?>
<div class='info'>
<span class='label-pri label-pri-<?php echo $story->pri?>' title='<?php echo $lang->story->pri?>'><?php echo zget($lang->story->priList, $story->pri);?></span>
<span class='status status-story status-<?php echo $story->status;?>' title='<?php echo $lang->story->status?>'><span class="label label-dot"></span> <?php echo $lang->story->statusList[$story->status];?></span>
+3 -3
View File
@@ -89,7 +89,7 @@
{
foreach($story->planTitle as $planID => $planTitle)
{
if(!common::printLink('productplan', 'view', "planID=$planID", $planTitle)) echo $lanTitle;
if(!common::printLink('productplan', 'view', "planID=$planID", $planTitle)) echo $planTitle;
echo '<br />';
}
}
@@ -258,7 +258,7 @@
<?php
foreach($linkStories as $linkStoryID)
{
if(isset($story->extraStories[$linkStoryID])) echo '<li>' . html::a($this->createLink('story', 'view', "storyID=$linkStoryID"), "#$linkStoryID " . $story->extraStories[$linkStoryID]) . '</li>';
if(isset($story->extraStories[$linkStoryID])) echo '<li>' . html::a($this->createLink('execution', 'storyView', "storyID=$linkStoryID"), "#$linkStoryID " . $story->extraStories[$linkStoryID]) . '</li>';
}
?>
</ul>
@@ -276,7 +276,7 @@
<?php
foreach($childStories as $childStoryID)
{
if(isset($story->extraStories[$childStoryID])) echo '<li>' . html::a($this->createLink('story', 'view', "storyID=$childStoryID"), "#$childStoryID " . $story->extraStories[$childStoryID]) . '</li>';
if(isset($story->extraStories[$childStoryID])) echo '<li>' . html::a($this->createLink('execution', 'storyView', "storyID=$childStoryID"), "#$childStoryID " . $story->extraStories[$childStoryID]) . '</li>';
}
?>
</ul>
+1
View File
@@ -769,6 +769,7 @@ $lang->resource->execution->whitelist = 'whitelist';
$lang->resource->execution->addWhitelist = 'addWhitelist';
$lang->resource->execution->unbindWhitelist = 'unbindWhitelist';
$lang->resource->execution->storyEstimate = 'storyEstimate';
$lang->resource->execution->storyView = 'storyView';
if($config->systemMode == 'new') $lang->resource->execution->executionkanban = 'kanbanAction';
$lang->resource->execution->kanban = 'RDKanban';
//if($config->systemMode == 'classic') $lang->resource->project->list = 'list';
+10
View File
@@ -516,6 +516,16 @@ class installModel extends model
}
}
/* Check password. */
if(!validater::checkReg($this->post->password, '|(.){6,}|')) dao::$errors['password'][] = $this->lang->error->passwordrule;
if(isset($this->config->safe->mode) and (strlen($this->post->password) < $this->config->safe->mode)) dao::$errors['password'][] = $this->lang->user->weakPassword;
if(!empty($this->config->safe->changeWeak))
{
if(!isset($this->config->safe->weak)) $this->app->loadConfig('admin');
if(strpos(",{$this->config->safe->weak},", ",{$this->post->password},") !== false) dao::$errors['password'][] = sprintf($this->lang->user->errorWeak, $this->config->safe->weak);
}
if(dao::isError()) return false;
/* Insert a company. */
$company = new stdclass();
$company->name = $data->company;
+3 -2
View File
@@ -46,7 +46,7 @@
</div>
<div class='modal-body'>
<form method='post'>
<table class='table table-form mw-400px' style='margin: 0 auto'>
<table class='table table-form mw-500px' style='margin: 0 auto'>
<tr>
<th class='c-company'><?php echo $lang->install->company;?></th>
<td class='c-company-value'><?php echo html::input('company', '', "class='form-control'");?></td>
@@ -61,7 +61,8 @@
</tr>
<tr>
<th><?php echo $lang->install->password;?></th>
<td><?php echo html::input('password', '', "class='form-control'");?></td>
<td><?php echo html::input('password', '', "class='form-control' oninput=\"this.value = this.value.replace(/[\u4e00-\u9fa5d]/g, '');\"");?></td>
<td><?php echo $lang->user->placeholder->password1;?></td>
</tr>
<tr>
<th></th><td><?php echo html::checkBox('importDemoData', $lang->install->importDemoData);?></td>
+8 -5
View File
@@ -917,6 +917,7 @@ class kanban extends control
public function editCard($cardID)
{
$this->loadModel('action');
$this->loadModel('user');
if(!empty($_POST))
{
$changes = $this->kanban->updateCard($cardID);
@@ -934,12 +935,14 @@ class kanban extends control
$card = $this->kanban->getCardByID($cardID);
$kanban = $this->kanban->getById($card->kanban);
$kanbanUsers = $card->kanban == 0 ? ',' : trim($kanban->owner) . ',' . trim($kanban->team);
$users = $this->loadModel('user')->getPairs('noclosed|nodeleted', '', 0, $kanbanUsers);
$kanbanUsers = $this->user->getPairs('noclosed|nodeleted', '', 0, $kanbanUsers);
$users = $this->user->getPairs('noclosed|nodeleted');
$this->view->card = $card;
$this->view->actions = $this->action->getList('kanbancard', $cardID);
$this->view->users = $users;
$this->view->kanban = $kanban;
$this->view->card = $card;
$this->view->actions = $this->action->getList('kanbancard', $cardID);
$this->view->users = $users;
$this->view->kanbanUsers = $kanbanUsers;
$this->view->kanban = $kanban;
$this->display();
}
+1 -1
View File
@@ -48,7 +48,7 @@
<table class="table table-form">
<tr>
<th><?php echo $lang->kanbancard->assignedTo;?></th>
<td><?php echo html::select('assignedTo[]', $users, $card->assignedTo, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('assignedTo[]', $kanbanUsers, $card->assignedTo, "class='form-control chosen' multiple");?></td>
</tr>
<tr>
<th><?php echo $lang->kanbancard->begin;?></th>
+10 -14
View File
@@ -247,18 +247,13 @@ class productplanModel extends model
->orderBy('t1.begin desc')
->fetchAll('id');
$plans = $this->reorder4Children($plans);
$planPairs = array();
$parentTitle = array();
$plans = $this->reorder4Children($plans);
$planPairs = array();
$this->app->loadLang('branch');
foreach($plans as $plan)
{
if($plan->parent == '-1')
{
$parentTitle[$plan->id] = $plan->title;
if($skipParent) continue;
}
if($plan->parent > 0 and isset($parentTitle[$plan->parent])) $plan->title = $parentTitle[$plan->parent] . ' /' . $plan->title;
if($skipParent and $plan->parent == '-1') continue;
if($plan->parent > 0 and isset($plans[$plan->parent])) $plan->title = $plans[$plan->parent]->title . ' /' . $plan->title;
$planPairs[$plan->id] = $plan->title . " [{$plan->begin} ~ {$plan->end}]";
if($plan->begin == $this->config->productplan->future and $plan->end == $this->config->productplan->future) $planPairs[$plan->id] = $plan->title . ' ' . $this->lang->productplan->future;
if($plan->productType != 'normal') $planPairs[$plan->id] = ($plan->branchName ? $plan->branchName : $this->lang->branch->main) . ' / ' . $planPairs[$plan->id];
@@ -351,7 +346,6 @@ class productplanModel extends model
$plans = $this->dao->select('*')->from(TABLE_PRODUCTPLAN)
->where('deleted')->eq(0)
->beginIF($products)->andWhere('product')->in($products)->fi()
->beginIF(strpos($param, 'skipparent') !== false)->andWhere('parent')->ne(-1)->fi()
->beginIF(strpos($param, 'unexpired') !== false)->andWhere('end')->ge($date)->fi()
->orderBy($orderBy)
->fetchAll('id');
@@ -366,8 +360,8 @@ class productplanModel extends model
if($field == 'name')
{
if($plan->parent == '-1') $parentTitle[$plan->id] = $plan->title;
if($plan->parent > 0 and isset($parentTitle[$plan->parent])) $plan->title = $parentTitle[$plan->parent] . ' /' . $plan->title;
if($plan->parent == '-1' and strpos($param, 'skipparent') !== false) continue;
if($plan->parent > 0 and isset($plans[$plan->parent])) $plan->title = $plans[$plan->parent]->title . ' /' . $plan->title;
$planGroup[$plan->product][$plan->branch][$plan->id] = $plan->title . " [{$plan->begin} ~ {$plan->end}]";
if($plan->begin == $this->config->productplan->future and $plan->end == $this->config->productplan->future) $planGroup[$plan->product][$plan->branch][$plan->id] = $plan->title . ' ' . $this->lang->productplan->future;
}
@@ -419,17 +413,19 @@ class productplanModel extends model
*/
public function getBranchPlanPairs($productID, $branches = '', $skipParent = false)
{
$plans = $this->dao->select('branch,id,title,begin,end')->from(TABLE_PRODUCTPLAN)
$plans = $this->dao->select('parent,branch,id,title,begin,end')->from(TABLE_PRODUCTPLAN)
->where('product')->eq($productID)
->andWhere('deleted')->eq(0)
->beginIF($branches != '')->andWhere('branch')->in($branches)->fi()
->beginIF($skipParent)->andWhere('parent')->ne(-1)->fi()
->orderBy('begin desc')
->fetchAll('id');
$planPairs = array();
foreach($plans as $planID => $plan)
{
if($skipParent and $plan->parent == '-1') continue;
if($plan->parent > 0 and isset($plans[$plan->parent])) $plan->title = $plans[$plan->parent]->title . ' /' . $plan->title;
$planPairs[$plan->branch][$planID] = $plan->title . ' [' . $plan->begin . '~' . $plan->end . ']';
}
return $planPairs;
+8 -2
View File
@@ -1868,9 +1868,7 @@ class projectModel extends model
$projectType = 'project';
$accounts = array_unique($accounts);
$oldJoin = $this->dao->select('`account`, `join`')->from(TABLE_TEAM)->where('root')->eq($projectID)->andWhere('type')->eq($projectType)->fetchPairs();
$this->dao->delete()->from(TABLE_TEAM)->where('root')->eq($projectID)->andWhere('type')->eq($projectType)->exec();
$projectMember = array();
foreach($accounts as $key => $account)
{
if(empty($account)) continue;
@@ -1885,6 +1883,14 @@ class projectModel extends model
dao::$errors['message'][] = $this->lang->project->errorHours;
return false;
}
}
$this->dao->delete()->from(TABLE_TEAM)->where('root')->eq($projectID)->andWhere('type')->eq($projectType)->exec();
$projectMember = array();
foreach($accounts as $key => $account)
{
if(empty($account)) continue;
$member = new stdclass();
$member->role = $roles[$key];
+1 -1
View File
@@ -197,7 +197,7 @@ class release extends control
->fetchAll('id');
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story');
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($release->stories)->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage');
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in(array_keys($stories))->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage');
foreach($stages as $storyID => $stage)$stories[$storyID]->stage = $stage;
$bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1);
+13 -3
View File
@@ -4133,12 +4133,22 @@ class storyModel extends model
*/
public function printCell($col, $story, $users, $branches, $storyStages, $modulePairs = array(), $storyTasks = array(), $storyBugs = array(), $storyCases = array(), $mode = 'datatable', $storyType = 'story', $execution = '', $isShowBranch = '')
{
$module = $this->app->rawModule == 'product' ? 'story' : $this->app->rawModule;
$canView = common::hasPriv($module, 'view');
$tab = $this->app->tab;
$executionID = empty($execution) ? $this->session->execution : $execution->id;
$storyLink = $tab == 'execution' ? helper::createLink('story', 'view', "storyID=$story->id&version=$story->version&param=$executionID") : helper::createLink($module, 'view', "storyID=$story->id");
$account = $this->app->user->account;
$storyLink = helper::createLink('story', 'view', "storyID=$story->id");
$canView = common::hasPriv('story', 'view');
if($tab == 'project')
{
$storyLink = helper::createLink('projectstory', 'view', "storyID=$story->id");
$canView = common::hasPriv('projectstory', 'view');
}
elseif($tab == 'execution')
{
$storyLink = helper::createLink('execution', 'storyView', "storyID=$story->id");
$canView = common::hasPriv('execution', 'storyView');
}
/* Check the product is closed. */
$canBeChanged = common::canBeChanged('story', $story);
+1 -1
View File
@@ -268,7 +268,7 @@
{
foreach($story->planTitle as $planID => $planTitle)
{
if(!common::printLink('productplan', 'view', "planID=$planID", $planTitle, '', "data-app='product'")) echo $lanTitle;
if(!common::printLink('productplan', 'view', "planID=$planID", $planTitle, '', "data-app='product'")) echo $planTitle;
echo '<br />';
}
}
+1 -1
View File
@@ -246,7 +246,7 @@
<?php
if(!$task->storyTitle) echo $lang->noData;
$class = isonlybody() ? 'showinonlybody' : 'iframe';
if($task->storyTitle and !common::printLink('story', 'view', "storyID=$task->story", $task->storyTitle, '', "class=$class data-width='80%'", true, true)) echo $task->storyTitle;
if($task->storyTitle and !common::printLink('execution', 'storyView', "storyID=$task->story", $task->storyTitle, '', "class=$class data-width='80%'", true, true)) echo $task->storyTitle;
if($task->needConfirm)
{
echo "(<span class='warning'>{$lang->story->changed}</span> ";
+1 -1
View File
@@ -74,7 +74,7 @@ class testsuite extends control
$sort = common::appendOrder($orderBy);
$productName = isset($this->products[$productID]) ? $this->products[$productID] : '';
$suites = $this->testsuite->getSuites($productID, $sort, $pager, 'all');
$suites = $this->testsuite->getSuites($productID, $sort, $pager);
if(empty($suites) and $pageID > 1)
{
$pager = pager::init(0, $recPerPage, 1);