This commit is contained in:
hufangzhou
2021-01-08 14:52:42 +08:00
70 changed files with 651 additions and 474 deletions
+1 -1
View File
@@ -1 +1 @@
20.0.beta2
20.0.beta3
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '20.0.beta2'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '20.0.beta3'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
$config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php.
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->budget->subject = 'Category';
$lang->budget->name = 'Item';
$lang->budget->amount = 'Estimated';
$lang->budget->desc = 'Description';
$lang->budget->yuan = 'Yuan';
$lang->budget->wanyuan = 'Wanyuan';
$lang->budget->dollar = 'Dollars';
$lang->budget->createdBy = 'CreatedBy';
$lang->budget->createdDate = 'CreatedDate';
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->budget->subject = 'Category';
$lang->budget->name = 'Item';
$lang->budget->amount = 'Estimated';
$lang->budget->desc = 'Description';
$lang->budget->yuan = 'Yuan';
$lang->budget->wanyuan = 'Wanyuan';
$lang->budget->dollar = 'Dollars';
$lang->budget->createdBy = 'CreatedBy';
$lang->budget->createdDate = 'CreatedDate';
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->budget->subject = 'Category';
$lang->budget->name = 'Item';
$lang->budget->amount = 'Estimated';
$lang->budget->desc = 'Description';
$lang->budget->yuan = 'Yuan';
$lang->budget->wanyuan = 'Wanyuan';
$lang->budget->dollar = 'Dollars';
$lang->budget->createdBy = 'CreatedBy';
$lang->budget->createdDate = 'CreatedDate';
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->budget->subject = 'Category';
$lang->budget->name = 'Item';
$lang->budget->amount = 'Estimated';
$lang->budget->desc = 'Description';
$lang->budget->yuan = 'Yuan';
$lang->budget->wanyuan = 'Wanyuan';
$lang->budget->dollar = 'Dollars';
$lang->budget->createdBy = 'CreatedBy';
$lang->budget->createdDate = 'CreatedDate';
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->budget->subject = '科目';
$lang->budget->name = '费用名称';
$lang->budget->amount = '预计金额';
$lang->budget->desc = '说明';
$lang->budget->yuan = '元';
$lang->budget->wanyuan = '万元';
$lang->budget->dollar = 'Dollars';
$lang->budget->createdBy = '由谁创建';
$lang->budget->createdDate = '创建时间';
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->budget->subject = '科目';
$lang->budget->name = '費用名稱';
$lang->budget->amount = '預計金額';
$lang->budget->desc = '說明';
$lang->budget->yuan = '元';
$lang->budget->wanyuan = '萬元';
$lang->budget->dollar = 'Dollars';
$lang->budget->createdBy = '由誰創建';
$lang->budget->createdDate = '創建時間';
+1 -1
View File
@@ -26,7 +26,7 @@
<?php if($bug->deleted):?>
<span class='label label-danger'><?php echo $lang->bug->deleted;?></span>
<?php endif; ?>
</div>
</div>
</div>
<?php if(!isonlybody()):?>
<div class="btn-toolbar pull-right">
+1
View File
@@ -53,6 +53,7 @@ $lang->preview = 'Ansehen';
$lang->goback = 'Zurück';
$lang->goPC = 'PC';
$lang->more = 'Mehr';
$lang->moreLink = 'MORE';
$lang->day = 'Tag';
$lang->customConfig = 'Custom Config';
$lang->public = 'Öffentlich';
+1
View File
@@ -53,6 +53,7 @@ $lang->preview = 'View';
$lang->goback = 'Back';
$lang->goPC = 'PC';
$lang->more = 'More';
$lang->moreLink = 'MORE';
$lang->day = ' Day';
$lang->customConfig = 'Custom Config';
$lang->public = 'Public';
+1
View File
@@ -53,6 +53,7 @@ $lang->preview = 'Consulter';
$lang->goback = 'Retour';
$lang->goPC = 'PC';
$lang->more = 'Plus';
$lang->moreLink = 'MORE';
$lang->day = 'Jour';
$lang->customConfig = 'Personnalisation';
$lang->public = 'Public';
+1
View File
@@ -53,6 +53,7 @@ $lang->preview = 'Xem';
$lang->goback = 'Trở lại';
$lang->goPC = 'PC';
$lang->more = 'Thêm';
$lang->moreLink = 'MORE';
$lang->day = ' Day';
$lang->customConfig = 'Tùy biến cấu hình';
$lang->public = 'Công khai';
+1
View File
@@ -53,6 +53,7 @@ $lang->preview = '查看';
$lang->goback = '返回';
$lang->goPC = 'PC版';
$lang->more = '更多';
$lang->moreLink = 'More';
$lang->day = '天';
$lang->customConfig = '自定义';
$lang->public = '公共';
+2 -2
View File
@@ -295,7 +295,7 @@ class commonModel extends model
echo "<li class='divider'></li>";
}
echo "<li class='dropdown-submenu theme'>";
echo "<li class='dropdown-submenu top'>";
echo "<a href='javascript:;'>" . "<i class='icon icon-theme'></i> " . $lang->theme . "</a><ul class='dropdown-menu pull-left'>";
foreach($app->lang->themes as $key => $value)
{
@@ -303,7 +303,7 @@ class commonModel extends model
}
echo '</ul></li>';
echo "<li class='dropdown-submenu lang'>";
echo "<li class='dropdown-submenu top'>";
echo "<a href='javascript:;'>" . "<i class='icon icon-lang'></i> " . $lang->lang . "</a><ul class='dropdown-menu pull-left'>";
foreach ($app->config->langs as $key => $value)
{
+3 -3
View File
@@ -57,7 +57,7 @@ var browseType = '<?php echo $browseType;?>';
<ul class='dropdown-menu'>
<?php foreach($lang->doc->typeList as $typeKey => $typeName):?>
<?php $class = strpos($config->doc->officeTypes, $typeKey) !== false ? 'iframe' : '';?>
<li><?php echo html::a($this->createLink('doc', 'create', "libID=$libID&moduleID=$moduleID&type=$typeKey"), $typeName, '', "class='$class'");?></li>
<li><?php echo html::a($this->createLink('doc', 'create', "libID=$libID&moduleID=$moduleID&type=$typeKey"), $typeName, '', "class='$class' data-group=$from");?></li>
<?php endforeach;?>
</ul>
</div>
@@ -75,7 +75,7 @@ var browseType = '<?php echo $browseType;?>';
<?php if($libID):?>
<span class="text-muted"><?php echo $lang->doc->noDoc;?></span>
<?php if(common::hasPriv('doc', 'create') and common::canBeChanged('doc', $currentLib)):?>
<?php echo html::a($this->createLink('doc', 'create', "libID={$libID}&moduleID=$moduleID"), "<i class='icon icon-plus'></i> " . $lang->doc->create, '', "class='btn btn-info'");?>
<?php echo html::a($this->createLink('doc', 'create', "libID={$libID}&moduleID=$moduleID"), "<i class='icon icon-plus'></i> " . $lang->doc->create, '', "class='btn btn-info' data-group=$from");?>
<?php endif;?>
<?php elseif($browseType == 'byediteddate'):?>
<span class="text-muted"><?php echo $lang->doc->noEditedDoc;?></span>
@@ -168,7 +168,7 @@ var browseType = '<?php echo $browseType;?>';
<?php if(common::hasPriv('doc', 'collect')):?>
<a data-url="<?php echo $this->createLink('doc', 'collect', "objectID=$doc->id&objectType=doc");?>" title="<?php echo $collectTitle;?>" class='btn btn-link ajaxCollect'><i class='icon <?php echo $star;?>'></i></a>
<?php endif;?>
<?php common::printLink('doc', 'edit', "docID=$doc->id", "<i class='icon icon-edit'></i>", '', "title='{$lang->edit}' class='btn btn-link'")?>
<?php common::printLink('doc', 'edit', "docID=$doc->id", "<i class='icon icon-edit'></i>", '', "title='{$lang->edit}' class='btn btn-link' data-group=$from")?>
<?php common::printLink('doc', 'delete', "docID=$doc->id", "<i class='icon icon-trash'></i>", 'hiddenwin', "title='{$lang->delete}' class='btn btn-link'")?>
<?php endif;?>
</td>
+1 -1
View File
@@ -48,7 +48,7 @@
<?php if($libID == 'files') $icon = 'icon-paper-clip text-brown';?>
<div class="col">
<a class="file" href="<?php echo $libLink;?>">
<a class="file" href="<?php echo $libLink;?>" data-group=<?php echo $from;?>>
<i class="file-icon icon <?php echo $icon;?>"></i>
<div class="file-name"><?php echo ($libID != 'project' && $libID != 'files' && strpos($lib->collector, $this->app->user->account) !== false ? "<i class='icon icon-star text-yellow'></i> " : '') . $lib->name;?></div>
<div class="text-primary file-info"><?php echo $lib->allCount . $lang->doc->item;?></div>
+1 -1
View File
@@ -29,7 +29,7 @@
<?php if($libID == 'project') $libLink = inlink('allLibs', "type=project&product=$object->id");?>
<?php if($libID == 'files') $libLink = inlink('showFiles', "type=$type&objectID=$object->id");?>
<tr>
<td class="c-name"><?php echo html::a($libLink, $lib->name);?></td>
<td class="c-name"><?php echo html::a($libLink, $lib->name, '', "data-group=$from");?></td>
<td class="c-num"><?php echo $lib->allCount . $lang->doc->item;?></td>
<td class="c-actions">
<?php if($canBeChanged and $libID != 'project' and $libID != 'files'):?>
+1 -1
View File
@@ -46,7 +46,7 @@ body.menu-hide {padding-left: 0;}
#userNav>li>.dropdown-menu{left: 100%; bottom: 0; top: auto; width: 140px; text-align: left; background: #3c495c;}
#userNav>li>.dropdown-menu a{color: #fff}
#userNav>li>.dropdown-menu .dropdown-menu{left: 100%; text-align: left; background: #3c495c}
#userNav>li .lang .dropdown-menu, #userNav>li .theme .dropdown-menu{top: -60px}
#userNav>li .top .dropdown-menu{top: -60px}
#userNav .dropdown-menu>li>a>.icon { position: initial; display: inline;}
#userNav li.open>a{background:#0c64eb}
#userNav li.divider{opacity: .24; border-top: 1px solid; height: 0px;}
+6 -4
View File
@@ -67,12 +67,14 @@
var methodLowerCase = methodName.toLowerCase();
if(moduleName === 'doc')
{
if(link.prj && ['browse', 'create', 'showfiles', 'objectlibs'].includes(methodLowerCase))
if(link.prj)
{
var from = $.cookie('from');
if(from === 'project') return 'project';
if(from === 'product') return 'product';
if(methodLowerCase === 'objectlibs' && (link.params.from || link.params.$3) == 'product') return 'product';
return 'project';
}
if(methodLowerCase === 'browse' && (link.params.from || link.params.$5) == 'product') return 'product';
return 'doc';
}
if(moduleName === 'custom' && ['estimate', 'browsestoryconcept', 'configurescrum'].includes(methodLowerCase))
+52 -27
View File
@@ -17,12 +17,12 @@ class issueModel extends model
* Create an issue.
*
* @access public
* @return bool
* @return int
*/
public function create()
{
$now = helper::now();
$data = fixer::input('post')
$now = helper::now();
$issue = fixer::input('post')
->add('createdBy', $this->app->user->account)
->add('createdDate', $now)
->add('status', 'unconfirmed')
@@ -33,7 +33,7 @@ class issueModel extends model
->stripTags($this->config->issue->editor->create['id'], $this->config->allowedTags)
->get();
$this->dao->insert(TABLE_ISSUE)->data($data)->batchCheck($this->config->issue->create->requiredFields, 'notempty')->exec();
$this->dao->insert(TABLE_ISSUE)->data($issue)->batchCheck($this->config->issue->create->requiredFields, 'notempty')->exec();
$issueID = $this->dao->lastInsertID();
$this->loadModel('file')->saveUpload('issue', $issueID);
@@ -215,14 +215,14 @@ class issueModel extends model
*
* @param int $issueID
* @access public
* @return bool
* @return array
*/
public function update($issueID)
{
$oldIssue = $this->getByID($issueID);
$now = helper::now();
$data = fixer::input('post')
$now = helper::now();
$issue = fixer::input('post')
->add('editedBy', $this->app->user->account)
->add('editedDate', $now)
->remove('labels,files')
@@ -231,14 +231,14 @@ class issueModel extends model
->stripTags($this->config->issue->editor->edit['id'], $this->config->allowedTags)
->get();
$this->dao->update(TABLE_ISSUE)->data($data)
$this->dao->update(TABLE_ISSUE)->data($issue)
->where('id')->eq($issueID)
->batchCheck($this->config->issue->edit->requiredFields, 'notempty')
->exec();
$this->loadModel('file')->saveUpload('issue', $issueID);
return common::createChanges($oldIssue, $data);
return common::createChanges($oldIssue, $issue);
}
/**
@@ -251,14 +251,18 @@ class issueModel extends model
public function assignTo($issueID)
{
$oldIssue = $this->getByID($issueID);
$data = fixer::input('post')
$now = helper::now();
$issue = fixer::input('post')
->add('assignedBy', $this->app->user->account)
->add('assignedDate', helper::now())
->add('assignedDate', $now)
->add('editedBy', $this->app->user->account)
->add('editedDate', $now)
->get();
$this->dao->update(TABLE_ISSUE)->data($data)->where('id')->eq($issueID)->exec();
$this->dao->update(TABLE_ISSUE)->data($issue)->where('id')->eq($issueID)->exec();
return common::createChanges($oldIssue, $data);
return common::createChanges($oldIssue, $issue);
}
/**
@@ -271,19 +275,21 @@ class issueModel extends model
public function close($issueID)
{
$oldIssue = $this->getByID($issueID);
$data = fixer::input('post')
$issue = fixer::input('post')
->add('closedBy', $this->app->user->account)
->add('status', 'closed')
->add('assignedTo', 'closed')
->add('editedBy', $this->app->user->account)
->add('editedDate', helper::now())
->get();
$this->dao->update(TABLE_ISSUE)->data($data)->where('id')->eq($issueID)->exec();
$this->dao->update(TABLE_ISSUE)->data($issue)->where('id')->eq($issueID)->exec();
return common::createChanges($oldIssue, $data);
return common::createChanges($oldIssue, $issue);
}
/**
* Cancel an issue.
* Confirm an issue.
*
* @param int $issueID
* @access public
@@ -292,10 +298,15 @@ class issueModel extends model
public function confirm($issueID)
{
$oldIssue = $this->getByID($issueID);
$data = fixer::input('post')->add('status', 'confirmed')->get();
$this->dao->update(TABLE_ISSUE)->data($data)->where('id')->eq($issueID)->exec();
$issue = fixer::input('post')
->add('status', 'confirmed')
->add('editedBy', $this->app->user->account)
->add('editedDate', helper::now())
->get();
return common::createChanges($oldIssue, $data);
$this->dao->update(TABLE_ISSUE)->data($issue)->where('id')->eq($issueID)->exec();
return common::createChanges($oldIssue, $issue);
}
/**
@@ -308,10 +319,14 @@ class issueModel extends model
public function cancel($issueID)
{
$oldIssue = $this->getByID($issueID);
$data = fixer::input('post')->add('status', 'canceled')->get();
$this->dao->update(TABLE_ISSUE)->data($data)->where('id')->eq($issueID)->exec();
$issue = fixer::input('post')
->add('status', 'canceled')
->add('editedBy', $this->app->user->account)
->add('editedDate', helper::now())
->get();
$this->dao->update(TABLE_ISSUE)->data($issue)->where('id')->eq($issueID)->exec();
return common::createChanges($oldIssue, $data);
return common::createChanges($oldIssue, $issue);
}
/**
@@ -324,13 +339,21 @@ class issueModel extends model
public function activate($issueID)
{
$oldIssue = $this->getByID($issueID);
$data = fixer::input('post')
$now = helper::now();
$issue = fixer::input('post')
->add('status', 'active')
->add('activateBy', $this->app->user->account)
->add('editedBy', $this->app->user->account)
->add('editedDate', $now)
->add('assignedBy', $this->app->user->account)
->add('assignedDate', $now)
->addIF($this->post->assignedTo == '', 'assignedTo', $this->app->user->account)
->get();
$this->dao->update(TABLE_ISSUE)->data($data)->where('id')->eq($issueID)->exec();
$this->dao->update(TABLE_ISSUE)->data($issue)->where('id')->eq($issueID)->exec();
return common::createChanges($oldIssue, $data);
return common::createChanges($oldIssue, $issue);
}
/**
@@ -383,7 +406,7 @@ class issueModel extends model
* @param int $issueID
* @param object $data
* @access public
* @return object
* @return void
*/
public function resolve($issueID, $data)
{
@@ -393,6 +416,8 @@ class issueModel extends model
$issue->resolvedBy = $data->resolvedBy;
$issue->resolvedDate = $data->resolvedDate;
$issue->status = 'resolved';
$issue->editedBy = $this->app->user->account;
$issue->editedDate = helper::now();
$this->dao->update(TABLE_ISSUE)->data($issue)->where('id')->eq($issueID)->exec();
}
+2 -2
View File
@@ -23,8 +23,8 @@
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
<table class='table table-form'>
<tr>
<th><?php echo $lang->issue->activateBy;?></th>
<td colspan='2'><?php echo html::select('activateBy', $users, '', 'class="form-control chosen"');?></td>
<th><?php echo $lang->issue->assignedTo;?></th>
<td colspan='2'><?php echo html::select('assignedTo', $users, '', 'class="form-control chosen"');?></td>
</tr>
<tr>
<th><?php echo $lang->issue->activateDate;?></th>
+2
View File
@@ -86,6 +86,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '详情';
$lang->misc->releaseDate['20.0.beta3'] = '2020-01-08';
$lang->misc->releaseDate['20.0.beta2'] = '2020-12-18';
$lang->misc->releaseDate['20.0.beta1'] = '2020-11-30';
$lang->misc->releaseDate['12.5.1'] = '2020-11-30';
@@ -140,6 +141,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['20.0.beta3'][] = array('title'=>'优化导航交互,增强用户体验', 'desc' => '');
$lang->misc->feature->all['20.0.beta2'][] = array('title'=>'重构组织导航,修复bug,完善细节', 'desc' => '');
$lang->misc->feature->all['20.0.beta1'][] = array('title'=>'禅道20beta版本,修复bug,完善细节', 'desc' => '');
$lang->misc->feature->all['20.0.alpha1'][] = array('title'=>'禅道20版本大更新,重构导航,增加瀑布模型', 'desc' => '<p>增加项目集和项目概念</p><p>将原项目概念变为迭代或阶段概念</p><p>增加瀑布开发模板</p>');
+4
View File
@@ -38,7 +38,9 @@
<tr>
<th class='c-id w-50px'><?php echo $lang->idAB;?></th>
<th><?php echo $lang->program->PRJName;?></th>
<?php if($status == 'openedbyme'):?>
<th class='w-80px'> <?php echo $lang->program->PRJStatus;?></th>
<?php endif;?>
<th class='w-100px'><?php echo $lang->program->begin;?></th>
<th class='w-100px'><?php echo $lang->program->end;?></th>
<th class='w-100px'><?php echo $lang->program->PRJBudget;?></th>
@@ -53,7 +55,9 @@
<td class='c-name text-left' title='<?php echo $project->name?>'>
<?php echo html::a($this->createLink('program', 'index', "projectID=$project->id", '', '', $project->id), $project->name, '', "data-group='project'");?>
</td>
<?php if($status == 'openedbyme'):?>
<td class='c-status'><span class="status-program status-<?php echo $project->status?>"><?php echo zget($lang->project->statusList, $project->status, '');?></span></td>
<?php endif;?>
<td class='text-left'><?php echo $project->begin;?></td>
<td class='text-left'><?php echo $project->end == '0000-00-00' ? '' : $project->end;?></td>
<td class='text-left'><?php echo $project->budget . ' ' . zget($lang->program->unitList, $project->budgetUnit);?></td>
+17 -18
View File
@@ -9,27 +9,26 @@ $lang->personnel->job = 'Position';
$lang->personnel->genders = 'Gender';
$lang->personnel->project = 'Project';
$lang->personnel->search = 'Search';
$lang->personnel->emptyTip = 'No data';
$lang->personnel->delete = 'Remove';
$lang->personnel->role = 'Role';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStory = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->surplus = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->pending = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStories = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->left = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+17 -18
View File
@@ -9,27 +9,26 @@ $lang->personnel->job = 'Position';
$lang->personnel->genders = 'Gender';
$lang->personnel->project = 'Project';
$lang->personnel->search = 'Search';
$lang->personnel->emptyTip = 'No data';
$lang->personnel->delete = 'Remove';
$lang->personnel->role = 'Role';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStory = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->surplus = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->pending = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStories = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->left = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+17 -18
View File
@@ -9,27 +9,26 @@ $lang->personnel->job = 'Position';
$lang->personnel->genders = 'Gender';
$lang->personnel->project = 'Project';
$lang->personnel->search = 'Search';
$lang->personnel->emptyTip = 'No data';
$lang->personnel->delete = 'Remove';
$lang->personnel->role = 'Role';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStory = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->surplus = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->pending = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStories = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->left = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+17 -18
View File
@@ -9,27 +9,26 @@ $lang->personnel->job = 'Position';
$lang->personnel->genders = 'Gender';
$lang->personnel->project = 'Project';
$lang->personnel->search = 'Search';
$lang->personnel->emptyTip = 'No data';
$lang->personnel->delete = 'Remove';
$lang->personnel->role = 'Role';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStory = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->surplus = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->pending = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->name = 'User';
$lang->personnel->projects = 'Projects';
$lang->personnel->executions = 'Executions';
$lang->personnel->workingHours = 'Hours';
$lang->personnel->task = 'Task';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStories = 'Story';
$lang->personnel->risk = 'Risk';
$lang->personnel->issue = 'Issue';
$lang->personnel->putInto = 'Input';
$lang->personnel->left = 'Remained';
$lang->personnel->created = 'Created';
$lang->personnel->finished = 'Finished';
$lang->personnel->wait = 'Pending';
$lang->personnel->resolved = 'Resolved';
$lang->personnel->UR = 'UR';
$lang->personnel->SR = 'SR';
$lang->personnel->whitelist = 'Whitelist';
$lang->personnel->addWhitelist = 'Add Whitelist';
+17 -18
View File
@@ -9,27 +9,26 @@ $lang->personnel->job = '岗位';
$lang->personnel->genders = '性别';
$lang->personnel->project = '项目';
$lang->personnel->search = '搜索';
$lang->personnel->emptyTip = '暂无';
$lang->personnel->delete = '移除';
$lang->personnel->role = '角色';
$lang->personnel->name = '人员名称';
$lang->personnel->projects = '项目数';
$lang->personnel->executions = '执行';
$lang->personnel->workingHours = '工时';
$lang->personnel->task = '任务';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStory = '创建需求数';
$lang->personnel->risk = '风险';
$lang->personnel->issue = '问题';
$lang->personnel->putInto = '已投入';
$lang->personnel->surplus = '剩余';
$lang->personnel->created = '创建';
$lang->personnel->finished = '完成';
$lang->personnel->pending = '待处理';
$lang->personnel->resolved = '解决';
$lang->personnel->UR = '用需';
$lang->personnel->SR = '软需';
$lang->personnel->name = '人员名称';
$lang->personnel->projects = '项目数';
$lang->personnel->executions = '执行';
$lang->personnel->workingHours = '工时';
$lang->personnel->task = '任务';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStories = '创建需求数';
$lang->personnel->risk = '风险';
$lang->personnel->issue = '问题';
$lang->personnel->putInto = '已投入';
$lang->personnel->left = '剩余';
$lang->personnel->created = '创建';
$lang->personnel->finished = '完成';
$lang->personnel->wait = '待处理';
$lang->personnel->resolved = '解决';
$lang->personnel->UR = '用需';
$lang->personnel->SR = '软需';
$lang->personnel->whitelist = '白名单列表';
$lang->personnel->addWhitelist = '添加白名单';
+17 -18
View File
@@ -9,27 +9,26 @@ $lang->personnel->job = '崗位';
$lang->personnel->genders = '性別';
$lang->personnel->project = '項目';
$lang->personnel->search = '搜索';
$lang->personnel->emptyTip = '暫無';
$lang->personnel->delete = '移除';
$lang->personnel->role = '角色';
$lang->personnel->name = '人員名稱';
$lang->personnel->projects = '項目數';
$lang->personnel->executions = '执行';
$lang->personnel->workingHours = '工時';
$lang->personnel->task = '任務';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStory = '創建需求數';
$lang->personnel->risk = '風險';
$lang->personnel->issue = '問題';
$lang->personnel->putInto = '已投入';
$lang->personnel->surplus = '剩餘';
$lang->personnel->created = '創建';
$lang->personnel->finished = '完成';
$lang->personnel->pending = '待處理';
$lang->personnel->resolved = '解決';
$lang->personnel->UR = '用需';
$lang->personnel->SR = '軟需';
$lang->personnel->name = '人員名稱';
$lang->personnel->projects = '項目數';
$lang->personnel->executions = '执行';
$lang->personnel->workingHours = '工時';
$lang->personnel->task = '任務';
$lang->personnel->bug = 'Bug';
$lang->personnel->createStories = '創建需求數';
$lang->personnel->risk = '風險';
$lang->personnel->issue = '問題';
$lang->personnel->putInto = '已投入';
$lang->personnel->left = '剩餘';
$lang->personnel->created = '創建';
$lang->personnel->finished = '完成';
$lang->personnel->wait = '待處理';
$lang->personnel->resolved = '解決';
$lang->personnel->UR = '用需';
$lang->personnel->SR = '軟需';
$lang->personnel->whitelist = '白名單列表';
$lang->personnel->addWhitelist = '添加白名單';
+37 -52
View File
@@ -94,25 +94,10 @@ class personnelModel extends model
$personnelList[$account]['projects'] = $projects;
$personnelList[$account]['executions'] = zget($executionPairs, $account, 0);
$personnelList[$account]['createdTask'] = $taskInput[$account]['created'];
$personnelList[$account]['finishedTask'] = $taskInput[$account]['finished'];
$personnelList[$account]['pendingTask'] = $taskInput[$account]['pending'];
$personnelList[$account]['consumedTask'] = $taskInput[$account]['consumed'];
$personnelList[$account]['leftTask'] = $taskInput[$account]['left'];
$personnelList[$account]['createdBug'] = $bugAndStoryInput[$account]['created'];
$personnelList[$account]['resolvedBug'] = $bugAndStoryInput[$account]['resolved'];
$personnelList[$account]['pendingBug'] = $bugAndStoryInput[$account]['pending'];
$personnelList[$account]['UR'] = $bugAndStoryInput[$account]['UR'];
$personnelList[$account]['SR'] = $bugAndStoryInput[$account]['SR'];
$personnelList[$account]['createdIssue'] = $issueInput[$account]['created'];
$personnelList[$account]['resolvedIssue'] = $issueInput[$account]['resolved'];
$personnelList[$account]['pendingIssue'] = $issueInput[$account]['pending'];
$personnelList[$account]['createdRisk'] = $riskInput[$account]['created'];
$personnelList[$account]['resolvedRisk'] = $riskInput[$account]['resolved'];
$personnelList[$account]['pendingRisk'] = $riskInput[$account]['pending'];
$personnelList[$account] += $taskInput[$account];
$personnelList[$account] += $bugAndStoryInput[$account];
$personnelList[$account] += $issueInput[$account];
$personnelList[$account] += $riskInput[$account];
}
return $personnelList;
@@ -137,16 +122,16 @@ class personnelModel extends model
$putInto = array();
foreach($accounts as $account => $project)
{
$putInto[$account]['created'] = 0;
$putInto[$account]['resolved'] = 0;
$putInto[$account]['pending'] = 0;
$putInto[$account]['createdRisk'] = 0;
$putInto[$account]['resolvedRisk'] = 0;
$putInto[$account]['pendingRisk'] = 0;
}
foreach($risks as $risk)
{
if($risk->createdBy && isset($putInto[$risk->createdBy])) $putInto[$risk->createdBy]['created'] += 1;
if($risk->resolvedBy && isset($putInto[$risk->resolvedBy])) $putInto[$risk->resolvedBy]['resolved'] += 1;
if($risk->assignedTo && $risk->status == 'active' && isset($putInto[$risk->assignedTo])) $putInto[$risk->assignedTo]['pending'] += 1;
if($risk->createdBy && isset($putInto[$risk->createdBy])) $putInto[$risk->createdBy]['createdRisk'] += 1;
if($risk->resolvedBy && isset($putInto[$risk->resolvedBy])) $putInto[$risk->resolvedBy]['resolvedRisk'] += 1;
if($risk->assignedTo && $risk->status == 'active' && isset($putInto[$risk->assignedTo])) $putInto[$risk->assignedTo]['pendingRisk'] += 1;
}
return $putInto;
@@ -171,16 +156,16 @@ class personnelModel extends model
$putInto = array();
foreach($accounts as $account => $project)
{
$putInto[$account]['created'] = 0;
$putInto[$account]['resolved'] = 0;
$putInto[$account]['pending'] = 0;
$putInto[$account]['createdIssue'] = 0;
$putInto[$account]['resolvedIssue'] = 0;
$putInto[$account]['pendingIssue'] = 0;
}
foreach($issues as $issue)
{
if($issue->createdBy && isset($putInto[$issue->createdBy])) $putInto[$issue->createdBy]['created'] += 1;
if($issue->resolvedBy && isset($putInto[$issue->resolvedBy])) $putInto[$issue->resolvedBy]['resolved'] += 1;
if($issue->assignedTo && in_array($issue->status, array('unconfirmed', 'confirmed', 'active')) && isset($putInto[$issue->assignedTo])) $putInto[$issue->assignedTo]['pending'] += 1;
if($issue->createdBy && isset($putInto[$issue->createdBy])) $putInto[$issue->createdBy]['createdIssue'] += 1;
if($issue->resolvedBy && isset($putInto[$issue->resolvedBy])) $putInto[$issue->resolvedBy]['resolvedIssue'] += 1;
if($issue->assignedTo && in_array($issue->status, array('unconfirmed', 'confirmed', 'active')) && isset($putInto[$issue->assignedTo])) $putInto[$issue->assignedTo]['pendingIssue'] += 1;
}
return $putInto;
@@ -224,11 +209,11 @@ class personnelModel extends model
$putInto = array();
foreach($accounts as $account => $project)
{
$putInto[$account]['created'] = 0;
$putInto[$account]['resolved'] = 0;
$putInto[$account]['pending'] = 0;
$putInto[$account]['UR'] = 0;
$putInto[$account]['SR'] = 0;
$putInto[$account]['createdBug'] = 0;
$putInto[$account]['resolvedBug'] = 0;
$putInto[$account]['pendingBug'] = 0;
$putInto[$account]['UR'] = 0;
$putInto[$account]['SR'] = 0;
}
foreach($requirement as $account => $number) $putInto[$account]['UR'] = $number;
@@ -236,9 +221,9 @@ class personnelModel extends model
foreach($bugs as $bug)
{
if($bug->openedBy && isset($putInto[$bug->openedBy])) $putInto[$bug->openedBy]['created'] += 1;
if($bug->resolvedBy && isset($putInto[$bug->resolvedBy])) $putInto[$bug->resolvedBy]['resolved'] += 1;
if($bug->assignedTo && $bug->status == 'active' && isset($putInto[$bug->assignedTo])) $putInto[$bug->assignedTo]['pending'] += 1;
if($bug->openedBy && isset($putInto[$bug->openedBy])) $putInto[$bug->openedBy]['createdBug'] += 1;
if($bug->resolvedBy && isset($putInto[$bug->resolvedBy])) $putInto[$bug->resolvedBy]['resolvedBug'] += 1;
if($bug->assignedTo && $bug->status == 'active' && isset($putInto[$bug->assignedTo])) $putInto[$bug->assignedTo]['pendingBug'] += 1;
}
return $putInto;
}
@@ -300,11 +285,11 @@ class personnelModel extends model
$putInto = array();
foreach($accounts as $account => $project)
{
$putInto[$account]['created'] = 0;
$putInto[$account]['finished'] = 0;
$putInto[$account]['pending'] = 0;
$putInto[$account]['consumed'] = 0;
$putInto[$account]['left'] = 0;
$putInto[$account]['createdTask'] = 0;
$putInto[$account]['finishedTask'] = 0;
$putInto[$account]['pendingTask'] = 0;
$putInto[$account]['consumedTask'] = 0;
$putInto[$account]['leftTask'] = 0;
}
/* Number of tasks per person. */
@@ -313,20 +298,20 @@ class personnelModel extends model
{
if($task->openedBy && isset($putInto[$task->openedBy]))
{
$putInto[$task->openedBy]['created'] += 1;
$userTasks[$task->openedBy][$task->id] = $task->id;
$putInto[$task->openedBy]['createdTask'] += 1;
$userTasks[$task->openedBy][$task->id] = $task->id;
}
if($task->finishedBy && isset($putInto[$task->finishedBy]))
{
$putInto[$task->finishedBy]['finished'] += 1;
$userTasks[$task->finishedBy][$task->id] = $task->id;
$putInto[$task->finishedBy]['finishedTask'] += 1;
$userTasks[$task->finishedBy][$task->id] = $task->id;
}
if($task->assignedTo && $task->status == 'wait' && isset($putInto[$task->assignedTo]))
{
$putInto[$task->assignedTo]['pending'] += 1;
$userTasks[$task->assignedTo][$task->id] = $task->id;
$putInto[$task->assignedTo]['pendingTask'] += 1;
$userTasks[$task->assignedTo][$task->id] = $task->id;
}
}
@@ -343,8 +328,8 @@ class personnelModel extends model
foreach($userHours as $account => $hours)
{
$putInto[$account]['left'] = $hours->left;
$putInto[$account]['consumed'] = $hours->consumed;
$putInto[$account]['leftTask'] = $hours->left;
$putInto[$account]['consumedTask'] = $hours->consumed;
}
return $putInto;
+1 -1
View File
@@ -70,7 +70,7 @@ js::set('deptID', $deptID);
<?php else:?>
<div class="table-empty-tip">
<p>
<span class="text-muted"><?php echo $acl == 'open' ? $lang->personnel->openedPGMTip : $lang->personnel->emptyTip;?></span>
<span class="text-muted"><?php echo $acl == 'open' ? $lang->personnel->openedPGMTip : $lang->noData;?></span>
</p>
</div>
<?php endif;?>
+7 -7
View File
@@ -27,27 +27,27 @@
<th colspan="2"><?php echo $lang->personnel->workingHours;?></th>
<th colspan="3"><?php echo $lang->personnel->task;?></th>
<th colspan="3"><?php echo $lang->personnel->bug;?></th>
<th colspan="2"><?php echo $lang->personnel->createStory;?></th>
<th colspan="2"><?php echo $lang->personnel->createStories;?></th>
<th colspan="3"><?php echo $lang->personnel->issue;?></th>
<th colspan="3"><?php echo $lang->personnel->risk;?></th>
</tr>
<tr>
<th><?php echo $lang->personnel->putInto;?></th>
<th><?php echo $lang->personnel->surplus;?></th>
<th><?php echo $lang->personnel->left;?></th>
<th><?php echo $lang->personnel->created;?></th>
<th><?php echo $lang->personnel->finished;?></th>
<th><?php echo $lang->personnel->pending;?></th>
<th><?php echo $lang->personnel->wait;?></th>
<th><?php echo $lang->personnel->created;?></th>
<th><?php echo $lang->personnel->resolved;?></th>
<th><?php echo $lang->personnel->pending;?></th>
<th><?php echo $lang->personnel->wait;?></th>
<th><?php echo $lang->personnel->UR;?></th>
<th><?php echo $lang->personnel->SR;?></th>
<th><?php echo $lang->personnel->created;?></th>
<th><?php echo $lang->personnel->resolved;?></th>
<th><?php echo $lang->personnel->pending;?></th>
<th><?php echo $lang->personnel->wait;?></th>
<th><?php echo $lang->personnel->created;?></th>
<th><?php echo $lang->personnel->resolved;?></th>
<th><?php echo $lang->personnel->pending;?></th>
<th><?php echo $lang->personnel->wait;?></th>
</tr>
</thead>
<tbody class="sortable">
@@ -82,7 +82,7 @@
<?php else:?>
<div class="table-empty-tip">
<p>
<span class="text-muted"><?php echo $lang->personnel->emptyTip;?></span>
<span class="text-muted"><?php echo $lang->noData;?></span>
</p>
</div>
<?php endif;?>
+2
View File
@@ -832,6 +832,8 @@ class product extends control
*/
public function all($browseType = 'noclosed', $orderBy = 'order_desc')
{
$this->lang->product->mainMenuAction = html::a('javascript:history.go(-1);', '<i class="icon icon-back"></i> ' . $this->lang->goback, '', "class='btn btn-link'");
/* Load module and set session. */
$this->loadModel('program');
$this->session->set('productList', $this->app->getURI(true));
+8 -2
View File
@@ -493,9 +493,15 @@ class productModel extends model
return $output;
}
/**
* Get product main action.
*
* @access public
* @return string
*/
public function getProductMainAction()
{
return common::hasPriv('product', 'all') ? html::a(helper::createLink('product', 'all'), $this->lang->product->moreProduct, '', "class='btn btn-link'") : '';
return common::hasPriv('product', 'all') ? html::a(helper::createLink('product', 'all'), $this->lang->moreLink, '', "class='btn btn-link'") : '';
}
/**
@@ -1541,7 +1547,7 @@ class productModel extends model
*
* @param int $productID
* @access public
* @return object
* @return void
*/
public function replaceStoryConcept($productID = 0)
{
+49 -64
View File
@@ -66,70 +66,55 @@
$trClass = 'is-top-level table-nest-child-hide';
$trAttrs .= " class='$trClass'";
?>
<?php if($program->name):?>
<tr <?php echo $trAttrs;?>>
<td>
<span class="table-nest-icon icon table-nest-toggle"></span>
<?php echo $program->name?>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<?php endif;?>
<?php foreach($program->products as $product):?>
<?php
$totalStories = $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed'];
$totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed'];
?>
<?php
$trClass = '';
if($product->programName)
{
$trAttrs = "data-id='$product->id' data-parent='program.$product->program'";
$trClass .= ' is-nest-child table-nest-hide';
$trAttrs .= " data-nest-parent='program.$product->program' data-nest-path='program.$product->program,$product->id'";
}
else
{
$trAttrs = "data-id='$product->id' data-parent='0'";
$trClass .= ' no-nest';
}
$trAttrs .= " class='$trClass'";
?>
<tr class="text-center" <?php echo $trAttrs;?>>
<td class="c-name text-left" title='<?php echo $product->name?>'><?php echo html::a($this->createLink('product', 'browse', 'product=' . $product->id), $product->name);?>
</td>
<td><?php echo $product->requirements['active'];?></td>
<td><?php echo $product->requirements['closed'];?></td>
<td><?php echo $product->requirements['draft'];?></td>
<td><?php echo $totalRequirements == 0 ? 0 : round($product->requirements['closed'] / $totalRequirements, 3) * 100;?>%</td>
<td><?php echo $product->stories['active'];?></td>
<td><?php echo $product->stories['closed'];?></td>
<td><?php echo $product->stories['draft'];?></td>
<td><?php echo $totalStories == 0 ? 0 : round($product->stories['closed'] / $totalStories, 3) * 100;?>%</td>
<td><?php echo $product->unResolved;?></td>
<td><?php echo $product->closedBugs;?></td>
<td><?php echo $product->releases;?></td>
<td><?php echo $product->plans;?></td>
<td class='c-actions sort-handler'>
<?php common::printIcon('product', 'edit', "product=$product->id", $product, 'list', 'edit');?>
<?php if($canOrder):?>
<i class="icon icon-move"></i>
<?php endif;?>
</td>
</tr>
<?php endforeach;?>
<?php if($program->name):?>
<tr <?php echo $trAttrs;?>>
<td colspan="14">
<span class="table-nest-icon icon table-nest-toggle"></span>
<?php echo $program->name?>
</td>
</tr>
<?php endif;?>
<?php foreach($program->products as $product):?>
<?php
$totalStories = $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed'];
$totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed'];
$trClass = '';
if($product->programName)
{
$trAttrs = "data-id='$product->id' data-parent='program.$product->program'";
$trClass .= ' is-nest-child table-nest-hide';
$trAttrs .= " data-nest-parent='program.$product->program' data-nest-path='program.$product->program,$product->id'";
}
else
{
$trAttrs = "data-id='$product->id' data-parent='0'";
$trClass .= ' no-nest';
}
$trAttrs .= " class='$trClass'";
?>
<tr class="text-center" <?php echo $trAttrs;?>>
<td class="c-name text-left" title='<?php echo $product->name?>'><?php echo html::a($this->createLink('product', 'browse', 'product=' . $product->id), $product->name);?></td>
<td><?php echo $product->requirements['active'];?></td>
<td><?php echo $product->requirements['closed'];?></td>
<td><?php echo $product->requirements['draft'];?></td>
<td><?php echo $totalRequirements == 0 ? 0 : round($product->requirements['closed'] / $totalRequirements, 3) * 100;?>%</td>
<td><?php echo $product->stories['active'];?></td>
<td><?php echo $product->stories['closed'];?></td>
<td><?php echo $product->stories['draft'];?></td>
<td><?php echo $totalStories == 0 ? 0 : round($product->stories['closed'] / $totalStories, 3) * 100;?>%</td>
<td><?php echo $product->unResolved;?></td>
<td><?php echo $product->closedBugs;?></td>
<td><?php echo $product->releases;?></td>
<td><?php echo $product->plans;?></td>
<td class='c-actions sort-handler'>
<?php common::printIcon('product', 'edit', "product=$product->id", $product, 'list', 'edit');?>
<?php if($canOrder):?>
<i class="icon icon-move"></i>
<?php endif;?>
</td>
</tr>
<?php endforeach;?>
<?php endforeach;?>
</tbody>
</table>
+1 -1
View File
@@ -33,7 +33,7 @@
<tr>
<th class='c-id w-50px'><?php echo $lang->idAB;?></th>
<th><?php echo $lang->program->PRJName;?></th>
<th class='w-150px'><?php echo $lang->program->PRJPGM;?></th>
<th class='w-150px'><?php echo $lang->program->common;?></th>
<th class='w-80px'><?php echo $lang->program->PM;?></th>
<th class='w-100px'><?php echo $lang->program->begin;?></th>
<th class='w-100px'><?php echo $lang->program->end;?></th>
+12 -6
View File
@@ -39,7 +39,7 @@ $config->program->sortFields->PRJBudget = 'budget';
global $lang;
$config->program->datatable = new stdclass();
$config->program->datatable->defaultField = array('idAB', 'PRJName', 'PRJPGM', 'PM', 'begin', 'end', 'PRJBudget', 'teamCount','PRJEstimate','PRJConsume', 'PRJProgress', 'actions');
$config->program->datatable->defaultField = array('idAB', 'PRJName', 'PRJProgram', 'PM', 'PRJStatus', 'begin', 'end', 'PRJBudget', 'teamCount','PRJEstimate','PRJConsume', 'PRJProgress', 'actions');
$config->program->datatable->fieldList['idAB']['title'] = 'idAB';
$config->program->datatable->fieldList['idAB']['fixed'] = 'left';
@@ -52,11 +52,11 @@ $config->program->datatable->fieldList['PRJName']['width'] = 'auto';
$config->program->datatable->fieldList['PRJName']['required'] = 'yes';
$config->program->datatable->fieldList['PRJName']['sort'] = 'no';
$config->program->datatable->fieldList['PRJPGM']['title'] = 'PRJPGM';
$config->program->datatable->fieldList['PRJPGM']['fixed'] = 'left';
$config->program->datatable->fieldList['PRJPGM']['width'] = '140';
$config->program->datatable->fieldList['PRJPGM']['required'] = 'no';
$config->program->datatable->fieldList['PRJPGM']['sort'] = 'no';
$config->program->datatable->fieldList['PRJProgram']['title'] = 'common';
$config->program->datatable->fieldList['PRJProgram']['fixed'] = 'left';
$config->program->datatable->fieldList['PRJProgram']['width'] = '140';
$config->program->datatable->fieldList['PRJProgram']['required'] = 'no';
$config->program->datatable->fieldList['PRJProgram']['sort'] = 'no';
$config->program->datatable->fieldList['PM']['title'] = 'PM';
$config->program->datatable->fieldList['PM']['fixed'] = 'no';
@@ -64,6 +64,12 @@ $config->program->datatable->fieldList['PM']['width'] = '80';
$config->program->datatable->fieldList['PM']['required'] = 'yes';
$config->program->datatable->fieldList['PM']['sort'] = 'no';
$config->program->datatable->fieldList['PRJStatus']['title'] = 'PRJStatus';
$config->program->datatable->fieldList['PRJStatus']['fixed'] = 'left';
$config->program->datatable->fieldList['PRJStatus']['width'] = '80';
$config->program->datatable->fieldList['PRJStatus']['required'] = 'no';
$config->program->datatable->fieldList['PRJStatus']['sort'] = 'yes';
$config->program->datatable->fieldList['begin']['title'] = 'begin';
$config->program->datatable->fieldList['begin']['fixed'] = 'no';
$config->program->datatable->fieldList['begin']['width'] = '100';
+4 -1
View File
@@ -60,7 +60,8 @@ class program extends control
*/
public function PGMBrowse($status = 'all', $orderBy = 'order_asc')
{
$this->lang->navGroup->program = 'program';
$this->lang->navGroup->program = 'program';
$this->lang->program->mainMenuAction = html::a('javascript:history.go(-1);', '<i class="icon icon-back"></i> ' . $this->lang->goback, '', "class='btn btn-link'");
if(common::hasPriv('program', 'pgmcreate')) $this->lang->pageActions = html::a($this->createLink('program', 'pgmcreate'), "<i class='icon icon-sm icon-plus'></i> " . $this->lang->program->PGMCreate, '', "class='btn btn-secondary'");
@@ -166,6 +167,7 @@ class program extends control
$this->view->users = $this->user->getPairs('noclosed|nodeleted');
$this->view->parentProgram = $parentProgramID ? $this->dao->select('*')->from(TABLE_PROGRAM)->where('id')->eq($parentProgramID)->fetch() : 0;
$this->view->parents = $this->program->getParentPairs();
$this->view->PGMList = $this->program->getPGMList();
$this->display();
}
@@ -760,6 +762,7 @@ class program extends control
*/
public function PRJBrowse($programID = 0, $browseType = 'doing', $param = 0, $orderBy = 'order_desc', $recTotal = 0, $recPerPage = 15, $pageID = 1)
{
$this->lang->program->mainMenuAction = html::a('javascript:history.go(-1);', '<i class="icon icon-back"></i> ' . $this->lang->goback, '', "class='btn btn-link'");
$this->app->session->set('PRJBrowse', $this->app->getURI(true));
$this->loadModel('datatable');
+28
View File
@@ -281,3 +281,31 @@ $(function()
}
});
})
/**
* Set budget tips and acl list.
*
* @param int $parentProgramID
* @access public
* @return void
*/
function setBudgetTipsAndAclList(parentProgramID)
{
if(parentProgramID != 0)
{
$('.budgetSpan').removeClass('hidden');
parentProgram = PGMList[parentProgramID];
programBudget = parentProgram.budget;
PGMBudgetUnit = budgetUnitList[parentProgram.budgetUnit];
budgetNotes = programBudget != 0 ? (programBudget + PGMBudgetUnit) : future;
$('.budgetSpan').html(PGMParentBudget + budgetNotes);
$('.aclBox').html($('#subPGMAcl').html());
}
else
{
$('.budgetSpan').addClass('hidden');
$('.aclBox').html($('#PGMAcl').html());
}
}
-34
View File
@@ -1,34 +0,0 @@
$(function()
{
setAclList($("#parent").val());
});
/**
* Set acl list.
*
* @param programID $programID
* @access public
* @return void
*/
function setAclList(programID)
{
if(programID != 0)
{
$('.aclBox').html($('#subPGMAcl').html());
}
else
{
$('.aclBox').html($('#PGMAcl').html());
}
}
/**
* Set parent program.
*
* @access public
* @return void
*/
function setParentProgram(programID)
{
location.href = createLink('program', 'PGMCreate', 'programID=' + programID);
}
-27
View File
@@ -1,27 +0,0 @@
/**
* Set budget tips and acl list.
*
* @param int $parentProgramID
* @access public
* @return void
*/
function setBudgetTipsAndAclList(parentProgramID)
{
if(parentProgramID != 0)
{
$('.budgetSpan').removeClass('hidden');
parentProgram = PGMList[parentProgramID];
programBudget = parentProgram.budget;
PGMBudgetUnit = budgetUnitList[parentProgram.budgetUnit];
budgetNotes = programBudget != 0 ? (programBudget + PGMBudgetUnit) : future;
$('.budgetSpan').html(PGMParentBudget + budgetNotes);
$('.aclBox').html($('#subPGMAcl').html());
}
else
{
$('.budgetSpan').addClass('hidden');
$('.aclBox').html($('#PGMAcl').html());
}
}
-1
View File
@@ -46,7 +46,6 @@ $lang->program->project = 'Project';
$lang->program->stage = 'Stage';
$lang->program->PM = 'Manager';
$lang->program->PRJName = 'Name';
$lang->program->PRJPGM = 'Program';
$lang->program->PRJCategory = 'Category';
$lang->program->PRJDesc = 'Description';
$lang->program->PRJCode = 'Code';
-1
View File
@@ -46,7 +46,6 @@ $lang->program->project = 'Project';
$lang->program->stage = 'Stage';
$lang->program->PM = 'Manager';
$lang->program->PRJName = 'Name';
$lang->program->PRJPGM = 'Program';
$lang->program->PRJCategory = 'Category';
$lang->program->PRJDesc = 'Description';
$lang->program->PRJCode = 'Code';
-1
View File
@@ -46,7 +46,6 @@ $lang->program->project = 'Project';
$lang->program->stage = 'Stage';
$lang->program->PM = 'Manager';
$lang->program->PRJName = 'Name';
$lang->program->PRJPGM = 'Program';
$lang->program->PRJCategory = 'Category';
$lang->program->PRJDesc = 'Description';
$lang->program->PRJCode = 'Code';
-1
View File
@@ -46,7 +46,6 @@ $lang->program->project = 'Project';
$lang->program->stage = 'Stage';
$lang->program->PM = 'Manager';
$lang->program->PRJName = 'Name';
$lang->program->PRJPGM = 'Program';
$lang->program->PRJCategory = 'Category';
$lang->program->PRJDesc = 'Description';
$lang->program->PRJCode = 'Code';
-1
View File
@@ -46,7 +46,6 @@ $lang->program->project = '项目';
$lang->program->stage = '阶段';
$lang->program->PM = '负责人';
$lang->program->PRJName = '项目名称';
$lang->program->PRJPGM = '所属项目集';
$lang->program->PRJCategory = '项目类型';
$lang->program->PRJDesc = '项目描述';
$lang->program->PRJCode = '项目代号';
-1
View File
@@ -46,7 +46,6 @@ $lang->program->project = '項目';
$lang->program->stage = '階段';
$lang->program->PM = '負責人';
$lang->program->PRJName = '項目名稱';
$lang->program->PRJPGM = '所屬項目集';
$lang->program->PRJCategory = '項目類型';
$lang->program->PRJDesc = '項目描述';
$lang->program->PRJCode = '項目代號';
+16 -16
View File
@@ -31,7 +31,7 @@ class programModel extends model
*/
public function getPGMMainAction()
{
return common::hasPriv('program', 'pgmbrowse') ? html::a(helper::createLink('program', 'pgmbrowse'), $this->lang->program->morePGM, '', "class='btn btn-link'") : '';
return common::hasPriv('program', 'pgmbrowse') ? html::a(helper::createLink('program', 'pgmbrowse'), $this->lang->moreLink, '', "class='btn btn-link'") : '';
}
/**
@@ -813,7 +813,7 @@ class programModel extends model
public function getPRJMainAction($module, $method)
{
if($module == 'program' and $method != 'index') return '';
return common::hasPriv('program', 'prjbrowse') ? html::a(helper::createLink('program', 'prjbrowse'), $this->lang->program->morePRJ, '', "class='btn btn-link'") : '';
return common::hasPriv('program', 'prjbrowse') ? html::a(helper::createLink('program', 'prjbrowse'), $this->lang->moreLink, '', "class='btn btn-link'") : '';
}
/**
@@ -1606,9 +1606,8 @@ class programModel extends model
if($col->show)
{
$class = "c-$id";
$title = '';
$PRJPGM = '';
$class = "c-$id";
$title = '';
if($id == 'idAB') $class .= ' cell-id';
@@ -1618,17 +1617,18 @@ class programModel extends model
$title = "title='{$project->name}'";
}
if($id == 'PRJPGM')
$PRJProgram = '';
if($id == 'PRJProgram')
{
$programList = $this->getPGMPairs();
$PGMIndex = strpos($project->path, $programID);
$PRJIndex = strpos($project->path, $project->id);
$PGMPath = explode(',' , substr($project->path, $PGMIndex, $PRJIndex - $PGMIndex));
foreach($PGMPath as $program)
$programList = $this->getPGMPairs();
$programIndex = strpos($project->path, $programID);
$projectIndex = strpos($project->path, $project->id);
$programPath = explode(',' , substr($project->path, $programIndex, $projectIndex - $programIndex));
foreach($programPath as $program)
{
if($program) $PRJPGM .= '/' . zget($programList, $program);
if($program) $PRJProgram .= '/' . zget($programList, $program);
}
$title = "title='{$PRJPGM}'";
$title = "title='{$PRJProgram}'";
}
echo "<td class='c-name " . $class . "' $title>";
@@ -1643,8 +1643,8 @@ class programModel extends model
if($project->model === 'waterfall') echo "<span class='project-type-label label label-outline label-warning'>{$this->lang->program->waterfall}</span>";
if($project->model === 'scrum') echo "<span class='project-type-label label label-outline label-info'>{$this->lang->program->scrum}</span>";
break;
case 'PRJPGM':
echo $PRJPGM;
case 'PRJProgram':
echo $PRJProgram;
break;
case 'PM':
echo zget($users, $project->PM);
@@ -1656,7 +1656,7 @@ class programModel extends model
echo $project->end == LONG_TIME ? $this->lang->program->PRJLongTime : $project->end;
break;
case 'PRJStatus':
echo zget($this->lang->program->statusList, $project->status);
echo "<span class='status-task status-{$project->status}'> " . zget($this->lang->program->statusList, $project->status) . "</span>";
break;
case 'PRJBudget':
echo $project->budget != 0 ? $project->budget . zget($this->lang->program->unitList, $project->budgetUnit) : $this->lang->program->future;
@@ -58,7 +58,7 @@ $programsPinYin = common::convert2Pinyin($programNames);
$('#programTree').tree();
$(function()
{
$('#showClosed1').click(function()
$('input[name^="showClosed"]').click(function()
{
var showClosed = $(this).is(':checked') ? 1 : 0;
$.cookie('showClosed', showClosed, {expires:config.cookieLife, path:config.webRoot});
+9 -4
View File
@@ -35,6 +35,11 @@
<?php js::set('holders', $lang->project->placeholder);?>
<?php js::set('errorSameProducts', $lang->project->errorSameProducts);?>
<?php js::set('longTime', $lang->program->PRJLongTime);?>
<?php js::set('budgetUnitList', $lang->program->unitList);?>
<?php js::set('PGMParentBudget', $lang->program->PGMParentBudget);?>
<?php js::set('future', $lang->program->future);?>
<?php js::set('PGMList', $PGMList);?>
<?php $aclList = $parentProgram ? $lang->program->subPGMAclList : $lang->program->PGMAclList;?>
<?php $requiredFields = $config->program->PGMCreate->requiredFields;?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
@@ -45,7 +50,7 @@
<table class='table table-form'>
<tr>
<th><?php echo $lang->program->PGMParent;?></th>
<td><?php echo html::select('parent', $parents, isset($parentProgram->id) ? $parentProgram->id : 0, "class='form-control chosen' onchange=setParentProgram(this.value)");?>
<td><?php echo html::select('parent', $parents, isset($parentProgram->id) ? $parentProgram->id : 0, "class='form-control chosen' onchange=setBudgetTipsAndAclList(this.value)");?>
<td></td>
</tr>
<tr>
@@ -71,7 +76,7 @@
<input type='checkbox' id='future' name='future' value='1' />
<label for='future'><?php echo $lang->program->future;?></label>
</div>
<span class='muted'><?php if($parentProgram) echo $lang->program->PGMParentBudget . ($parentProgram->budget != 0 ? $parentProgram->budget . zget($lang->program->unitList, $parentProgram->budgetUnit, '') : $lang->program->future);?></span>
<span class='muted budgetSpan'><?php if($parentProgram) echo $lang->program->PGMParentBudget . ($parentProgram->budget != 0 ? $parentProgram->budget . zget($lang->program->unitList, $parentProgram->budgetUnit, '') : $lang->program->future);?></span>
</td>
</tr>
<tr>
@@ -101,9 +106,9 @@
</tr>
<tr>
<th><?php echo $lang->project->acl;?></th>
<td colspan='3' class='aclBox'><?php echo nl2br(html::radio('acl', $lang->program->PGMAclList, 'private', "onclick='setWhite(this.value);'", 'block'));?></td>
<td colspan='3' class='aclBox'><?php echo nl2br(html::radio('acl', $aclList, 'private', "onclick='setWhite(this.value);'", 'block'));?></td>
</tr>
<tr class="hidden" id="whitelistBox">
<tr id="whitelistBox">
<th><?php echo $lang->whitelist;?></th>
<td><?php echo html::select('whitelist[]', $users, '', 'class="form-control chosen" multiple');?></td>
<td></td>
+2 -4
View File
@@ -50,10 +50,8 @@ js::set('browseType', $browseType);
<?php
foreach($setting as $value)
{
if($value->show)
{
$this->datatable->printHead($value, $orderBy, $vars);
}
if($value->id == 'PRJStatus' and $browseType !== 'all') $value->show = false;
if($value->show) $this->datatable->printHead($value, $orderBy, $vars);
}
?>
</tr>
+1
View File
@@ -69,6 +69,7 @@ js::set('browseType', $browseType);
<?php
foreach($setting as $value)
{
if($value->id == 'PRJStatus' and $browseType !== 'all') $value->show = false;
if($value->show) $this->datatable->printHead($value, $orderBy, $vars);
}
?>
+3 -3
View File
@@ -73,7 +73,7 @@ class repo extends control
$this->view->repoID = $repoID;
$this->view->orderBy = $orderBy;
$this->view->pager = $pager;
$this->view->products = $this->loadModel('product')->getProductPairsByProject($this->projectID);
$this->view->products = $this->projectID ? $this->loadModel('product')->getProductPairsByProject($this->projectID) : $this->loadModel('product')->getPairs();
$this->display();
}
@@ -101,7 +101,7 @@ class repo extends control
$this->view->groups = $this->loadModel('group')->getPairs();
$this->view->users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted');
$this->view->products = $this->loadModel('product')->getProductPairsByProject($this->projectID);
$this->view->products = $this->projectID ? $this->loadModel('product')->getProductPairsByProject($this->projectID) : $this->loadModel('product')->getPairs();
$this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->create;
$this->view->position[] = $this->lang->repo->create;
@@ -140,7 +140,7 @@ class repo extends control
$this->view->repoID = $repoID;
$this->view->groups = $this->loadModel('group')->getPairs();
$this->view->users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted');
$this->view->products = $this->loadModel('product')->getProductPairsByProject($this->projectID);
$this->view->products = $this->projectID ? $this->loadModel('product')->getProductPairsByProject($this->projectID) : $this->loadModel('product')->getPairs();
$this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->edit;
$this->view->position[] = html::a(inlink('maintain'), $this->lang->repo->common);
+2 -2
View File
@@ -229,8 +229,8 @@ class risk extends control
$this->action->logHistory($actionID, $changes);
}
$response['locate'] = inlink('browse');
$this->send($response);
if(isonlybody()) die(js::closeModal('parent.parent', 'this'));
$this->send(array('locate' => inlink('browse')));
}
$this->view->title = $this->lang->risk->common . $this->lang->colon . $this->lang->risk->track;
+26 -24
View File
@@ -13,29 +13,31 @@
<?php include "../../common/view/header.html.php";?>
<?php include '../../common/view/kindeditor.html.php';?>
<div id='mainContent' class='main-content'>
<div class='main-header'>
<h2>
<span class='prefix label-id'><strong><?php echo $risk->id;?></strong></span>
<?php echo "<span title='$risk->name'>" . $risk->name . '</span>';?>
</h2>
</div>
<form class='load-indicator main-form' method='post' target='hiddenwin'>
<table class='table table-form'>
<tbody>
<tr>
<th class='w-100px'><?php echo $lang->risk->assignedTo;?></th>
<td><?php echo html::select('assignedTo', $users, $risk->assignedTo, "class='form-control chosen'");?></td>
<td></td>
</tr>
<tr>
<th><?php echo $lang->comment;?></th>
<td colspan='2'><?php echo html::textarea('comment', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
</tr>
<tr>
<td class='text-center form-actions' colspan='3'><?php echo html::submitButton(); ?></td> </tr>
</tbody>
</table>
</form>
<div class="center-block">
<div class='main-header'>
<h2>
<span class='prefix label-id'><strong><?php echo $risk->id;?></strong></span>
<?php echo "<span title='$risk->name'>" . $risk->name . '</span>';?>
</h2>
</div>
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
<table class='table table-form'>
<tbody>
<tr>
<th class='w-100px'><?php echo $lang->risk->assignedTo;?></th>
<td><?php echo html::select('assignedTo', $users, $risk->assignedTo, "class='form-control chosen'");?></td>
<td></td>
</tr>
<tr>
<th><?php echo $lang->comment;?></th>
<td colspan='2'><?php echo html::textarea('comment', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
</tr>
<tr>
<td class='text-center form-actions' colspan='3'><?php echo html::submitButton(); ?></td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
<?php include "../../common/view/footer.html.php";?>
+1 -1
View File
@@ -6,7 +6,7 @@
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yuchun Li <liyuchun@cnezsoft.com>
* @package view
* @version $Id: track.html.php 4903 2020-09-04 09:32:59Z lyc $
* @version $Id
* @link http://www.zentao.net
*/
?>
+2 -2
View File
@@ -1193,7 +1193,7 @@ class testtask extends control
$testTasks = $this->testtask->getUserTestTaskPairs($account, 0, $status);
if($id) die(html::select("testTasks[$id]", $testTasks, '', 'class="form-control"'));
die(html::select('testTask', $testTasks, '', 'class=form-control'));
if($id) die(html::select("testtasks[$id]", $testTasks, '', 'class="form-control"'));
die(html::select('testtask', $testTasks, '', 'class=form-control'));
}
}
+55 -22
View File
@@ -9,8 +9,6 @@
* @version $Id: model.php 5035 2013-07-06 05:21:58Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php
class todoModel extends model
{
/**
@@ -19,24 +17,23 @@ class todoModel extends model
* @param date $date
* @param string $account
* @access public
* @return void
* @return bool|int
*/
public function create($date, $account)
{
$objectType = $this->post->type;
$hasObject = in_array($objectType, array('bug', 'task', 'story', 'issue', 'risk', 'review', 'testtask', 'feedback'));
$todo = fixer::input('post')
->add('account', $this->app->user->account)
->setDefault('idvalue', 0)
->cleanInt('pri, begin, end, private')
->setIF($this->post->type == 'bug' and $this->post->bug, 'idvalue', $this->post->bug)
->setIF($this->post->type == 'task' and $this->post->task, 'idvalue', $this->post->task)
->setIF($this->post->type == 'story' and $this->post->story, 'idvalue', $this->post->story)
->setIF($this->post->type == 'issue' and $this->post->issue, 'idvalue', $this->post->issue)
->setIF($this->post->type == 'feedback' and $this->post->feedback, 'idvalue', $this->post->feedback)
->setIF($hasObject && $objectType, 'idvalue', $this->post->$objectType)
->setIF($this->post->date == false, 'date', '2030-01-01')
->setIF($this->post->begin == false, 'begin', '2400')
->setIF($this->post->begin == false or $this->post->end == false, 'end', '2400')
->stripTags($this->config->todo->editor->create['id'], $this->config->allowedTags)
->remove('bug, task, story, issue, uid, feedback')
->remove('bug, task, story, issue, risk, review, testtask, uid, feedback')
->get();
if($todo->end < $todo->begin)
@@ -76,12 +73,8 @@ class todoModel extends model
$todo = $this->loadModel('file')->processImgURL($todo, $this->config->todo->editor->create['id'], $this->post->uid);
$this->dao->insert(TABLE_TODO)->data($todo)
->autoCheck()
->checkIF(!in_array($todo->type, array('bug', 'task', 'story')), $this->config->todo->create->requiredFields, 'notempty')
->checkIF($todo->type == 'bug' and $todo->idvalue == 0, 'idvalue', 'notempty')
->checkIF($todo->type == 'task' and $todo->idvalue == 0, 'idvalue', 'notempty')
->checkIF($todo->type == 'story' and $todo->idvalue == 0, 'idvalue', 'notempty')
->checkIF($todo->type == 'issue' and $todo->idvalue == 0, 'idvalue', 'notempty')
->checkIF($todo->type == 'feedback' and $todo->idvalue == 0, 'idvalue', 'notempty')
->checkIF(!$hasObject, $this->config->todo->create->requiredFields, 'notempty')
->checkIF($hasObject && $todo->idvalue == 0, 'idvalue', 'notempty')
->exec();
if(!dao::isError())
@@ -107,7 +100,7 @@ class todoModel extends model
$validTodos = array();
for($i = 0; $i < $this->config->todo->batchCreate; $i++)
{
if($todos->names[$i] != '' || isset($todos->bugs[$i + 1]) || isset($todos->tasks[$i + 1]) || isset($todos->stories[$i + 1]))
if($todos->names[$i] != '' || isset($todos->bugs[$i + 1]) || isset($todos->tasks[$i + 1]) || isset($todos->stories[$i + 1]) || isset($todos->issues[$i + 1]) || isset($todos->risks[$i + 1]) || isset($todos->reviews[$i + 1]) || isset($todos->testtask[$i + 1]))
{
$todo = new stdclass();
$todo->account = $this->app->user->account;
@@ -119,6 +112,7 @@ class todoModel extends model
{
$todo->date = $this->post->date;
}
$todo->type = $todos->types[$i];
$todo->pri = $todos->pris[$i];
$todo->name = isset($todos->names[$i]) ? $todos->names[$i] : '';
@@ -128,9 +122,14 @@ class todoModel extends model
$todo->status = "wait";
$todo->private = 0;
$todo->idvalue = 0;
if($todo->type == 'bug') $todo->idvalue = isset($todos->bugs[$i + 1]) ? $todos->bugs[$i + 1] : 0;
if($todo->type == 'task') $todo->idvalue = isset($todos->tasks[$i + 1]) ? $todos->tasks[$i + 1] : 0;
if($todo->type == 'story') $todo->idvalue = isset($todos->stories[$i + 1]) ? $todos->stories[$i + 1] : 0;
if($todo->type == 'bug') $todo->idvalue = isset($todos->bugs[$i + 1]) ? $todos->bugs[$i + 1] : 0;
if($todo->type == 'task') $todo->idvalue = isset($todos->tasks[$i + 1]) ? $todos->tasks[$i + 1] : 0;
if($todo->type == 'story') $todo->idvalue = isset($todos->stories[$i + 1]) ? $todos->stories[$i + 1] : 0;
if($todo->type == 'issue') $todo->idvalue = isset($todos->issues[$i + 1]) ? $todos->issues[$i + 1] : 0;
if($todo->type == 'risk') $todo->idvalue = isset($todos->risks[$i + 1]) ? $todos->risks[$i + 1] : 0;
if($todo->type == 'review') $todo->idvalue = isset($todos->reviews[$i + 1]) ? $todos->reviews[$i + 1] : 0;
if($todo->type == 'testtask') $todo->idvalue = isset($todos->testtasks[$i + 1]) ? $todos->testtasks[$i + 1] : 0;
if($todo->end < $todo->begin) die(js::alert(sprintf($this->lang->error->gt, $this->lang->todo->end, $this->lang->todo->begin)));
@@ -458,6 +457,7 @@ class todoModel extends model
->beginIF($limit > 0)->limit($limit)->fi()
->page($pager)
->query();
/* Set session. */
$sql = explode('WHERE', $this->dao->get());
$sql = explode('ORDER', $sql[1]);
@@ -465,9 +465,13 @@ class todoModel extends model
while($todo = $stmt->fetch())
{
if($todo->type == 'story') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_STORY)->fetch('title');
if($todo->type == 'task') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_TASK)->fetch('name');
if($todo->type == 'bug') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_BUG)->fetch('title');
if($todo->type == 'story') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_STORY)->fetch('title');
if($todo->type == 'task') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_TASK)->fetch('name');
if($todo->type == 'bug') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_BUG)->fetch('title');
if($todo->type == 'issue') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_ISSUE)->fetch('title');
if($todo->type == 'risk') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_RISK)->fetch('name');
if($todo->type == 'review') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_REVIEW)->fetch('title');
if($todo->type == 'testtask') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_TESTTASK)->fetch('name');
$todo->begin = date::formatTime($todo->begin);
$todo->end = date::formatTime($todo->end);
@@ -725,4 +729,33 @@ class todoModel extends model
->markRight(1)
->fetch('count');
}
/**
* Gets the project ID of the to-do object.
*
* @param array $todoList
* @access public
* @return array
*/
public function getTodoProjects($todoList = array())
{
$projectIdList = array();
foreach($todoList as $type => $todos)
{
$todoIdList = array_keys($todos);
if(empty($todoIdList))
{
$projectIdList[$type] = array();
continue;
}
if($type == 'task') $projectIdList[$type] = $this->dao->select('id,PRJ')->from(TABLE_TASK)->where('id')->in($todoIdList)->fetchPairs('id', 'PRJ');
if($type == 'bug') $projectIdList[$type] = $this->dao->select('id,PRJ')->from(TABLE_BUG)->where('id')->in($todoIdList)->fetchPairs('id', 'PRJ');
if($type == 'issue') $projectIdList[$type] = $this->dao->select('id,PRJ')->from(TABLE_ISSUE)->where('id')->in($todoIdList)->fetchPairs('id', 'PRJ');
if($type == 'risk') $projectIdList[$type] = $this->dao->select('id,PRJ')->from(TABLE_RISK)->where('id')->in($todoIdList)->fetchPairs('id', 'PRJ');
if($type == 'review') $projectIdList[$type] = $this->dao->select('id,PRJ')->from(TABLE_REVIEW)->where('id')->in($todoIdList)->fetchPairs('id', 'PRJ');
if($type == 'testtask') $projectIdList[$type] = $this->dao->select('id,PRJ')->from(TABLE_TESTTASK)->where('id')->in($todoIdList)->fetchPairs('id', 'PRJ');
}
return $projectIdList;
}
}
+29 -2
View File
@@ -286,9 +286,8 @@ class upgrade extends control
{
$this->upgrade->initUserView();
$this->upgrade->setDefaultPriv();
$this->loadModel('setting')->deleteItems('owner=system&module=common&section=global&key=upgradeStep');
$this->dao->update(TABLE_CONFIG)->set('value')->eq('0_0')->where('`key`')->eq('productProject')->exec();
die(js::locate($this->createLink('upgrade', 'afterExec', "fromVersion=&processed=no")));
die(js::locate($this->createLink('upgrade', 'mergeRepo')));
}
$this->view->noMergedProductCount = $noMergedProductCount;
@@ -435,6 +434,34 @@ class upgrade extends control
$this->display();
}
/**
* Merge Repos.
*
* @access public
* @return void
*/
public function mergeRepo()
{
if($_POST)
{
$this->upgrade->mergeRepo();
die(js::locate($this->createLink('upgrade', 'mergeRepo'), 'parent'));
}
$repos = $this->dao->select('id, name')->from(TABLE_REPO)->where('deleted')->eq(0)->andWhere('product')->eq('')->fetchPairs();
if(empty($repos))
{
$this->loadModel('setting')->deleteItems('owner=system&module=common&section=global&key=upgradeStep');
die(js::locate($this->createLink('upgrade', 'afterExec', "fromVersion=&processed=no")));
}
$this->view->repos = $repos;
$this->view->products = $this->dao->select('id, name')->from(TABLE_PRODUCT)->where('deleted')->eq(0)->fetchPairs();
$this->view->programs = $this->dao->select('id, name')->from(TABLE_PROGRAM)->where('deleted')->eq(0)->andWhere('type')->eq('program')->fetchPairs();
$this->display();
}
/**
* Get the project of the program it belongs to.
*
+17
View File
@@ -0,0 +1,17 @@
.container {margin: 0 auto;}
.modal-dialog{width:100%;}
.checkbox-primary{overflow:hidden;}
.pgmWidth{width:48% !important;}
#whitelistBox .checkbox-inline {display: inline-block !important; padding-left: 0px !important;}
#whitelistBox .checkbox-inline:first-child {margin-left: 10px !important;}
#budget {border-right:0px;}
.divider{background:#f1f1f1 !important; width:20px !important; padding:1px !important;}
.gray{background:#f1f1f1 !important}
.side-col{padding-right: 0px}
div.divider{vertical-align: middle;}
.main-row{margin-top: 20px; padding: 20px; background: #f1f1f1}
.main-row .side-col .nav li.active a{background: #006af1;color: #fff; border-radius: 4px}
#source .lineGroup-body{padding: 10px}
+9 -6
View File
@@ -77,12 +77,14 @@ $lang->upgrade->mergeProgramDesc = <<<EOD
<p>These iterations can be selected to fall under a new project.</p>
EOD;
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
@@ -90,5 +92,6 @@ $lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
$lang->upgrade->mergeByProject = "Independent iterations: You can select several iterations and merge them into one large project, or merge them independently";
$lang->upgrade->mergeByMoreLink = "Iteration that relates multiple products: select which product the iteration belongs to.";
$lang->upgrade->mergeRepoTips = "Merge the selected version library under the selected product.";
include dirname(__FILE__) . '/version.php';
+9 -6
View File
@@ -77,12 +77,14 @@ $lang->upgrade->mergeProgramDesc = <<<EOD
<p>These iterations can be selected to fall under a new project.</p>
EOD;
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
@@ -90,5 +92,6 @@ $lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
$lang->upgrade->mergeByProject = "Independent iterations: You can select several iterations and merge them into one large project, or merge them independently";
$lang->upgrade->mergeByMoreLink = "Iteration that relates multiple products: select which product the iteration belongs to.";
$lang->upgrade->mergeRepoTips = "Merge the selected version library under the selected product.";
include dirname(__FILE__) . '/version.php';
+9 -6
View File
@@ -77,12 +77,14 @@ $lang->upgrade->mergeProgramDesc = <<<EOD
<p>These iterations can be selected to fall under a new project.</p>
EOD;
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
@@ -90,5 +92,6 @@ $lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
$lang->upgrade->mergeByProject = "Independent iterations: You can select several iterations and merge them into one large project, or merge them independently";
$lang->upgrade->mergeByMoreLink = "Iteration that relates multiple products: select which product the iteration belongs to.";
$lang->upgrade->mergeRepoTips = "Merge the selected version library under the selected product.";
include dirname(__FILE__) . '/version.php';
+1
View File
@@ -133,3 +133,4 @@ $lang->upgrade->fromVersions['12_5'] = '12.5';
$lang->upgrade->fromVersions['12_5_1'] = '12.5.1';
$lang->upgrade->fromVersions['20_0_alpha1'] = '20.0.alpha1';
$lang->upgrade->fromVersions['20_0_beta1'] = '20.0.beta1';
$lang->upgrade->fromVersions['20_0_beta2'] = '20.0.beta2';
+9 -6
View File
@@ -77,12 +77,14 @@ $lang->upgrade->mergeProgramDesc = <<<EOD
<p>These iterations can be selected to fall under a new project.</p>
EOD;
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->line = 'Product Line';
$lang->upgrade->program = 'Merge Project';
$lang->upgrade->existPGM = 'Existing programs';
$lang->upgrade->existPRJ = 'Existing projects';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = 'Iteration';
$lang->upgrade->repo = 'Repo';
$lang->upgrade->mergeRepo = 'Merge Repo';
$lang->upgrade->newProgram = 'Create';
$lang->upgrade->mergeSummary = "Dear users, there are %s products and %s iterations in your system waiting for Migration. By System Calculation, we recommend your migration plan as follows, you can also adjust according to your own situation:";
@@ -90,5 +92,6 @@ $lang->upgrade->mergeByProductLine = "PRODUCTLINE-BASED iterations: Consolidate
$lang->upgrade->mergeByProduct = "PRODUCT-BASED iterations: You can select multiple products and their lower iterations to merge into a large project, or you can select a product to merge its lower iterations into a larger project";
$lang->upgrade->mergeByProject = "Independent iterations: You can select several iterations and merge them into one large project, or merge them independently";
$lang->upgrade->mergeByMoreLink = "Iteration that relates multiple products: select which product the iteration belongs to.";
$lang->upgrade->mergeRepoTips = "Merge the selected version library under the selected product.";
include dirname(__FILE__) . '/version.php';
+9 -6
View File
@@ -77,12 +77,14 @@ $lang->upgrade->mergeProgramDesc = <<<EOD
<p>可以选择这些迭代归属于某个新项目下。</p>
EOD;
$lang->upgrade->line = '产品线';
$lang->upgrade->program = '目标项目集和项目';
$lang->upgrade->existPGM = '已有项目集';
$lang->upgrade->existPRJ = '已有项目';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = '迭代';
$lang->upgrade->line = '产品线';
$lang->upgrade->program = '目标项目集和项目';
$lang->upgrade->existPGM = '已有项目集';
$lang->upgrade->existPRJ = '已有项目';
$lang->upgrade->product = $lang->productCommon;
$lang->upgrade->project = '迭代';
$lang->upgrade->repo = '版本库';
$lang->upgrade->mergeRepo = '归并版本库';
$lang->upgrade->newProgram = '新建';
$lang->upgrade->mergeSummary = "尊敬的用户,您的系统中共有%s个产品,%s个迭代等待迁移。";
@@ -90,5 +92,6 @@ $lang->upgrade->mergeByProductLine = "以产品线组织的产品和迭代:将
$lang->upgrade->mergeByProduct = "以产品组织的迭代:可以选择多个产品及其下面的迭代归并到一个项目集和项目中,也可以选择某一个产品将其下面所属的迭代归并到项目集和项目中。";
$lang->upgrade->mergeByProject = "独立的迭代:可以选择若干迭代归并到一个项目中,也可以独立归并。";
$lang->upgrade->mergeByMoreLink = "关联多个产品的迭代:选择这个迭代归属于哪一个产品。";
$lang->upgrade->mergeRepoTips = "将选中的版本库归并到所选产品下。";
include dirname(__FILE__) . '/version.php';
+36 -3
View File
@@ -655,10 +655,10 @@ class upgradeModel extends model
$this->processBuildTable();
$this->processSprintConcept();
$this->appendExec('20_0_beta1');
case '20_0_beta3':
$this->saveLogs('Execute 20_0_beta3');
case '20_0_beta2':
$this->saveLogs('Execute 20_0_beta2');
$this->adjustBudget();
$this->appendExec('20_0_beta3');
$this->appendExec('20_0_beta2');
}
$this->deletePatch();
@@ -844,6 +844,7 @@ class upgradeModel extends model
case '20_0_alpha' : $confirmContent .= file_get_contents($this->getUpgradeFile('20.0.alpha'));
case '20_0_alpha1': $confirmContent .= file_get_contents($this->getUpgradeFile('20.0.alpha1'));
case '20_0_beta1' : $confirmContent .= file_get_contents($this->getUpgradeFile('20.0.beta1'));
case '20_0_beta2' : $confirmContent .= file_get_contents($this->getUpgradeFile('20.0.beta2'));
}
return str_replace('zt_', $this->config->db->prefix, $confirmContent);
}
@@ -4246,6 +4247,38 @@ class upgradeModel extends model
}
}
public function mergeRepo()
{
$data = fixer::input('post')
->join('products', ',')
->get();
foreach($data->repos as $repoID)
{
/* If have no products, add it. */
if(isset($data->name))
{
$product = new stdclass();
$product->program = $data->program;
$product->name = $data->name;
$product->acl = 'open';
$product->PO = isset($this->app->user->account) ? $this->app->user->account : '';
$product->createdBy = isset($this->app->user->account) ? $this->app->user->account : '';
$product->createdDate = helper::now();
$product->status = 'normal';
$this->dao->insert(TABLE_PRODUCT)->data($product)->exec();
$productID = $this->dao->lastInsertID();
$this->dao->update(TABLE_REPO)->set('product')->eq($productID)->where('id')->eq($repoID)->exec();
}
else
{
$this->dao->update(TABLE_REPO)->set('product')->eq($data->products)->where('id')->eq($repoID)->exec();
}
}
}
/**
* Set program default priv.
*
+65
View File
@@ -0,0 +1,65 @@
<?php
/**
* The mergerepo view file of upgrade module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yidong Wang <yidong@cnezsoft.com>
* @package upgrade
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.lite.html.php';?>
<div class='container'>
<form method='post' target='hiddenwin'>
<div class='modal-dialog'>
<div class='modal-header'>
<strong><?php echo $lang->upgrade->mergeRepo;?></strong>
</div>
<div class='modal-body'>
<div class='alert alert-info'>
<?php echo $lang->upgrade->mergeRepoTips;?>
</div>
<div class='main-row'>
<div class='table-col' id='source'>
<div class='cell'>
<div class='lineGroup-title'>
<div class='item'><strong><?php echo $lang->upgrade->repo;?></strong></div>
</div>
<div class='lineGroup-body'>
<?php echo html::checkBox("repos", $repos, "class='form-control'");?>
</div>
</div>
</div>
<div class='table-col divider strong'></div>
<div class='table-col pgmWidth' id='programBox'>
<div class='cell'>
<table class='table table-form'>
<?php if($products):?>
<tr>
<th class='w-70px'><?php echo $lang->upgrade->product;?></th>
<td><?php echo html::select("products[]", $products, '', "class='form-control chosen' multiple");?></td>
</tr>
<?php else:?>
<tr>
<th class='w-100px'><?php echo $lang->upgrade->existPGM;?></th>
<td><?php echo html::select("program", $programs, '', "class='form-control chosen'");?></td>
</tr>
<tr>
<th><?php echo $lang->upgrade->product;?></th>
<td><?php echo html::input("name", '', "class='form-control'");?></td>
</tr>
<?php endif;?>
<tr>
<td colspan='2' class='text-center form-actions'><?php echo html::submitButton();?></td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
<?php include '../../common/view/footer.lite.html.php';?>
+1 -1
View File
@@ -54,7 +54,7 @@ a.showMoreImage:hover {opacity: 1;}
.table-actions .btn{border: 1px solid #1183fb; color: #1183fb}
.table-actions .btn:hover{background: #b3d4fc}
#header #toolbar a{color: #fff; font-size: 14px; line-height: 15px;}
#header #toolbar a{color: #84a2e2; font-size: 14px; line-height: 15px; border: #84a2e2 1px solid}
#navbar .nav>li.divider {margin: 15px 8px 15px 8px;}
#navbar .nav>li>a { padding: 10px 10px;}