Merge branch 'sprint/244' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/241_tianshujie_70015

This commit is contained in:
tianshujie
2022-09-26 10:48:15 +08:00
137 changed files with 4616 additions and 335 deletions
+5
View File
@@ -102,6 +102,11 @@ zentaoxx:
mkdir zentaoxx/db/
cp zentaoxx/db_bak/upgradexuanxuan*.sql zentaoxx/db_bak/xuanxuan.sql zentaoxx/db/
rm -rf zentaoxx/db_bak/
sed -i "s/\$$accountAdmin = \$$this->dao->select('account, admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();/\$$accountAdmin = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();\n\$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$adminArray = explode(',', \$$admins);\n\$$accountAdmin->admin = in_array(\$$accountAdmin->account, \$$adminArray) ? 'super' : '';\n/" zentaoxx/extension/xuan/im/model/chat.php
sed -i "/->on('tc.ownedBy=tu.account')/{ N ; s/type/tc.type/}" zentaoxx/extension/xuan/im/model/chat.php
sed -i "s/\$$super = \$$this->dao->select('admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('admin');/\$$account = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('account');\n\$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$adminArray = explode(',', \$$admins);\n\$$super = in_array(\$$account, \$$adminArray) ? 'super' : '';/g" zentaoxx/extension/xuan/im/control.php
sed -i "/foreach(\$$users as \$$user)/i \$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\$$adminArray = explode(',', \$$admins);" zentaoxx/extension/xuan/im/model/user.php
sed -i "/if(\!isset(\$$user->signed)) \$$user->signed = 0;/a \$$user->admin = in_array(\$$user->account, \$$adminArray) ? 'super' : '';" zentaoxx/extension/xuan/im/model/user.php
sed -i 's/XXBVERSION/$(XVERSION)/g' zentaoxx/config/ext/_0_xuanxuan.php
sed -i "/\$$config->xuanxuan->backend /c\\\$$config->xuanxuan->backend = 'zentao';" zentaoxx/config/ext/_0_xuanxuan.php
sed -i 's/site,//' zentaoxx/extension/xuan/im/model/user.php
+1 -1
View File
@@ -1 +1 @@
17.6.1
17.6.2
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '17.6.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '17.6.2'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
+2
View File
@@ -169,6 +169,7 @@ $filter->execution->export = new stdclass();
$filter->tree->browse = new stdclass();
$filter->productplan->browse = new stdclass();
$filter->kanban->space = new stdclass();
$filter->execution->kanban = new stdclass();
$filter->index->index->get['open'] = 'reg::base64';
@@ -300,6 +301,7 @@ $filter->execution->story->cookie['storyProductParam'] = 'int';
$filter->execution->story->cookie['storyBranchParam'] = 'int';
$filter->execution->story->cookie['executionStoryOrder'] = 'code';
$filter->execution->export->cookie['checkedItem'] = 'reg::checked';
$filter->execution->kanban->cookie['taskToOpen'] = 'int';
$filter->testcase->browse->cookie['caseModule'] = 'int';
$filter->testcase->browse->cookie['caseSuite'] = 'int';
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
UPDATE `zt_workflowlabel` SET `label` = '全部' where `label` = '所有' AND `action` = 'browse';
+37
View File
@@ -1,3 +1,40 @@
2022-09-23 17.6.2
完成的需求
开源版:
37324 敏捷项目下的迭代列表没有任务时中,隐藏名称前的展开、收起按钮
36946 私有产品的访问权限增加项目集负责人(反馈)
32322 Bug批量导入页面中先校验必填字段再校验重复数据
36977 增加全局头像下拉菜单的点击热区面积
67327 实现禅道中文件上传组件支持选择一次性多个文件(反馈)
37262 列表中“所有”标签修改为“全部”
37866 项目集列表中名称字段样式优化
37869 删除项目集列表中项目的图标
37862 项目集列表删除“显示已关闭”的勾选按钮
37868 项目集列表操作列的更多按钮调整
37861 用例列表操作列交换开始和结果按钮的位置
37854 bug列表确认字段的内容颜色调整
37864 项目集列表中延期标签位置调整
37833 叶兰绿主题风格更新
37842 禅道蓝主题风格更新
37813 列表中优先级颜色调整
37816 列表检索标签选中样式优化
38002 多人串行任务中,团队日志页去掉操作区域
38006 多人串行任务开始任务的弹窗,总计消耗改名为我的总消耗
37997 多人串行任务,用户打开工时填写页,默认打开我的日志页
37993 工时记录页,日期、工作内容、消耗、剩余增加必填项校验(开源版不校验工作内容)
37218 调整看板区域标题栏名称的对齐方式
37207 去掉看板中选中单个产品规划的背景
37206 调整看板区域检索标签组件样式
37132 将指派他人的待办列表中“由谁指派”字段修改为“指派给”
37831 项目统计报表增加权限判断,过滤掉没有访问权限的项目
32626 产品统计报表增加权限判断,过滤掉没有访问权限的产品
37064 长期项目的概况上计划完成显示“长期”
企业版:
37221 组织日志列表增加项目字段
35025 需求导入模板增加由谁评审字段
旗舰版:
35042 旗舰版周报3个工作项列表能显示总数
2022-09-08 17.6.1
完成的需求
开源版:
@@ -19,6 +19,7 @@
<?php js::set('projectID', $projectID);?>
<?php js::set('productID', $productID);?>
<?php js::set('teamMemberError', $lang->task->error->teamMember);?>
<?php js::set('estimateNotEmpty', sprintf($lang->error->gt, $lang->task->estimate, '0'))?>
<?php if(!empty($storyID)):?>
<style> .title-group.required > .required:after {right: 110px;}</style>
<?php endif;?>
+1 -1
View File
@@ -82,7 +82,7 @@ $lang->action->dynamic->all = '所有';
$lang->action->dynamic->hidden = '已隐藏';
$lang->action->dynamic->search = '搜索';
$lang->action->periods['all'] = $lang->action->dynamic->all;
$lang->action->periods['all'] = '全部';
$lang->action->periods['today'] = $lang->action->dynamic->today;
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
+1 -1
View File
@@ -14,7 +14,7 @@
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<?php $activeClass = $currentObjectType == 'all' ? 'btn-active-text' : '';?>
<?php echo html::a($this->createLink('action', 'trash', "objectType=all&type=$type"), "<span class='text'>" . $lang->all . "</span>", '', "class='btn btn-link $activeClass'");?>
<?php echo html::a($this->createLink('action', 'trash', "objectType=all&type=$type"), "<span class='text'>" . $lang->action->periods['all'] . "</span>", '', "class='btn btn-link $activeClass'");?>
<?php
/* Output the objectType order by preferredTypeConfig. */
foreach($preferredTypeConfig as $objectType)
+1 -1
View File
@@ -57,6 +57,6 @@ $lang->branch->statusList = array();
$lang->branch->statusList['active'] = '激活';
$lang->branch->statusList['closed'] = '已关闭';
$lang->branch->featureBar['manage']['all'] = '所有';
$lang->branch->featureBar['manage']['all'] = '全部';
$lang->branch->featureBar['manage']['active'] = '激活';
$lang->branch->featureBar['manage']['closed'] = '已关闭';
+1 -1
View File
@@ -188,7 +188,7 @@ $config->bug->datatable->fieldList['pri']['name'] = $lang->bug->pri;
$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
$config->bug->datatable->fieldList['confirmed']['fixed'] = 'left';
$config->bug->datatable->fieldList['confirmed']['width'] = '50';
$config->bug->datatable->fieldList['confirmed']['width'] = '100';
$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
$config->bug->datatable->fieldList['title']['title'] = 'title';
+15
View File
@@ -503,6 +503,8 @@ class bug extends control
$type = 'codeerror';
$pri = 3;
$color = '';
$feedbackBy = '';
$notifyEmail = '';
/* Parse the extras. extract fix php7.2. */
$extras = str_replace(array(',', ' '), array('&', ''), $extras);
@@ -528,6 +530,8 @@ class bug extends control
$deadline = helper::isZeroDate($bug->deadline) ? '' : $bug->deadline;
$color = $bug->color;
$testtask = $bug->testtask;
$feedbackBy = $bug->feedbackBy;
$notifyEmail = $bug->notifyEmail;
if($pri == 0) $pri = '3';
}
@@ -688,6 +692,8 @@ class bug extends control
$this->view->stepsRequired = strpos($this->config->bug->create->requiredFields, 'steps');
$this->view->isStepsTemplate = $steps == $this->lang->bug->tplStep . $this->lang->bug->tplResult . $this->lang->bug->tplExpect ? true : false;
$this->view->issueKey = $from == 'sonarqube' ? $output['sonarqubeID'] . ':' . $output['issueKey'] : '';
$this->view->feedbackBy = $feedbackBy;
$this->view->notifyEmail = $notifyEmail;
$this->display();
}
@@ -2313,6 +2319,15 @@ class bug extends control
{
$this->loadModel('port');
$this->session->set('bugPortParams', array('productID' => $productID, 'executionID' => $executionID, 'branch' => 'all'));
if(!$productID)
{
$this->config->bug->datatable->fieldList['module']['dataSource']['method'] = 'getAllModulePairs';
$this->config->bug->datatable->fieldList['module']['dataSource']['params'] = 'bug';
$this->config->bug->datatable->fieldList['project']['dataSource'] = array('module' => 'project', 'method' => 'getPairsByIdList', 'params' => $executionID);
$this->config->bug->datatable->fieldList['execution']['dataSource'] = array('module' => 'execution', 'method' => 'getPairs', 'params' => $executionID);
}
$this->port->export('bug');
$this->fetch('file', 'export2' . $_POST['fileType'], $_POST);
}
-2
View File
@@ -2,8 +2,6 @@
.closed, .closed a {color: gray; text-decoration:line-through;}
.resolved, .resolved a {color: #8EC21F; text-decoration: none;}
.tree .closed, .tree .closed a {color: #003366; text-decoration: none;}
.confirm0 {color: gray;}
.confirm1 {color: green;}
td.delayed {color: #fff; background: #e84e0f !important;}
#bugForm .setting {height: 25px;}
+2 -2
View File
@@ -1,2 +1,2 @@
.confirm0 {color:gray; font-size:9px}
.confirm1 {color:green; font-size:9px}
.confirm0 {font-size:9px}
.confirm1 {font-size:9px}
+2 -2
View File
@@ -285,8 +285,8 @@ $lang->bug->statusList['resolved'] = 'Resolved';
$lang->bug->statusList['closed'] = 'Closed';
$lang->bug->confirmedList[''] = '';
$lang->bug->confirmedList[1] = 'Yes';
$lang->bug->confirmedList[0] = 'No';
$lang->bug->confirmedList[1] = 'confirmed';
$lang->bug->confirmedList[0] = 'unconfirmed';
$lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = 'As Designed';
+2 -2
View File
@@ -285,8 +285,8 @@ $lang->bug->statusList['resolved'] = 'Résolu';
$lang->bug->statusList['closed'] = 'Fermé';
$lang->bug->confirmedList[''] = '';
$lang->bug->confirmedList[1] = 'Oui';
$lang->bug->confirmedList[0] = 'Non';
$lang->bug->confirmedList[1] = 'confirmé';
$lang->bug->confirmedList[0] = 'non confirmé';
$lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = 'Du Design';
+2 -2
View File
@@ -265,8 +265,8 @@ $lang->bug->statusList['active'] = 'Kích hoạt';
$lang->bug->statusList['resolved'] = 'Đã giải quyết';
$lang->bug->statusList['closed'] = 'Đã đóng';
$lang->bug->confirmedList[1] = 'Có';
$lang->bug->confirmedList[0] = 'Không';
$lang->bug->confirmedList[1] = 'đã xác nhận';
$lang->bug->confirmedList[0] = 'chưa được xác nhận';
$lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = 'Như thiết kế';
+3 -3
View File
@@ -285,8 +285,8 @@ $lang->bug->statusList['resolved'] = '已解决';
$lang->bug->statusList['closed'] = '已关闭';
$lang->bug->confirmedList[''] = '';
$lang->bug->confirmedList[1] = '是';
$lang->bug->confirmedList[0] = '否';
$lang->bug->confirmedList[1] = '已确认';
$lang->bug->confirmedList[0] = '未确认';
$lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = '设计如此';
@@ -413,7 +413,7 @@ $lang->bug->placeholder = new stdclass();
$lang->bug->placeholder->chooseBuilds = '选择相关版本...';
$lang->bug->placeholder->newBuildName = '新版本名称';
$lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs;
$lang->bug->featureBar['browse']['all'] = '全部';
$lang->bug->featureBar['browse']['unclosed'] = $lang->bug->unclosed;
$lang->bug->featureBar['browse']['openedbyme'] = $lang->bug->openedByMe;
$lang->bug->featureBar['browse']['assigntome'] = $lang->bug->assignToMe;
+2 -2
View File
@@ -283,8 +283,8 @@ $lang->bug->statusList['resolved'] = '已解決';
$lang->bug->statusList['closed'] = '已關閉';
$lang->bug->confirmedList[''] = '';
$lang->bug->confirmedList[1] = '是';
$lang->bug->confirmedList[0] = '否';
$lang->bug->confirmedList[1] = '已確認';
$lang->bug->confirmedList[0] = '未確認';
$lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = '設計如此';
+8 -6
View File
@@ -704,7 +704,7 @@ class bugModel extends model
->setDefault('browser', '')
->setDefault('plan', 0)
->setDefault('deadline', '0000-00-00')
->setDefault('resolvedDate', '0000-00-00 00:00:00')
->setDefault('resolvedDate', '')
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('mailto', '')
->setDefault('deleteFiles', array())
@@ -3485,15 +3485,17 @@ class bugModel extends model
public function printAssignedHtml($bug, $users)
{
$btnTextClass = '';
$btnClass = '';
$assignedToText = !empty($bug->assignedTo) ? zget($users, $bug->assignedTo) : $this->lang->bug->noAssigned;
$btnTextClass = 'text-primary';
if($bug->assignedTo == $this->app->user->account) $btnTextClass = 'text-red';
if(empty($bug->assignedTo)) $btnClass = $btnTextClass = 'assigned-none';
if($bug->assignedTo == $this->app->user->account) $btnClass = $btnTextClass = 'assigned-current';
if(!empty($bug->assignedTo) and $bug->assignedTo != $this->app->user->account) $btnClass = $btnTextClass = 'assigned-other';
$btnClass = $bug->assignedTo == 'closed' ? ' disabled' : '';
$btnClass = "iframe btn btn-icon-left btn-sm {$btnClass}";
$btnClass .= $bug->assignedTo == 'closed' ? ' disabled' : '';
$btnClass .= ' iframe btn btn-icon-left btn-sm';
$assignToLink = helper::createLink('bug', 'assignTo', "bugID=$bug->id", '', true);
$assignToHtml = html::a($assignToLink, "<i class='icon icon-hand-right'></i> <span title='" . zget($users, $bug->assignedTo) . "' class='{$btnTextClass}'>{$assignedToText}</span>", '', "class='$btnClass'");
$assignToHtml = html::a($assignToLink, "<i class='icon icon-hand-right'></i> <span title='" . zget($users, $bug->assignedTo) . "'>{$assignedToText}</span>", '', "class='$btnClass'");
echo !common::hasPriv('bug', 'assignTo', $bug) ? "<span style='padding-left: 21px' class='{$btnTextClass}'>{$assignedToText}</span>" : $assignToHtml;
}
+4 -4
View File
@@ -160,11 +160,11 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
<?php if($showNoticefeedbackBy):?>
<tr>
<th><nobr><?php echo $lang->bug->feedbackBy;?></nobr></th>
<td><?php echo html::input('feedbackBy', '', "class='form-control'");?></td>
<td><?php echo html::input('feedbackBy', $feedbackBy, "class='form-control'");?></td>
<td id='notifyEmailTd'>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->bug->notifyEmail?></span>
<span><?php echo html::input('notifyEmail', '', "class='form-control'");?></span>
<span><?php echo html::input('notifyEmail', $notifyEmail, "class='form-control'");?></span>
</div>
</td>
</tr>
@@ -173,9 +173,9 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
<td>
<div class='input-group' id='feedback'>
<span class="input-group-addon"><?php echo $lang->bug->feedbackBy?></span>
<?php echo html::input('feedbackBy', '', "class='form-control'");?>
<?php echo html::input('feedbackBy', $feedbackBy, "class='form-control'");?>
<span class="input-group-addon"><?php echo $lang->bug->notifyEmail?></span>
<?php echo html::input('notifyEmail', '', "class='form-control'");?>
<?php echo html::input('notifyEmail', $notifyEmail, "class='form-control'");?>
</div>
</td>
</tr>
+1 -1
View File
@@ -393,7 +393,7 @@
<?php if($bug->case):?>
<tr>
<th><?php echo $lang->bug->fromCase;?></th>
<td><?php echo html::a($this->createLink('testcase', 'view', "caseID=$bug->case&caseVersion=" . ($bug->testtask ? "&from=testtask&taskID={$bug->testtask}" : ''), '', true), "#$bug->case $bug->caseTitle", '', "class='iframe' data-width='80%'");?></td>
<td><?php echo html::a($this->createLink('testcase', 'view', "caseID=$bug->case&caseVersion=$bug->caseVersion", '', true), "#$bug->case $bug->caseTitle", '', "class='iframe' data-width='80%'");?></td>
</tr>
<?php endif;?>
<?php if($bug->toCases):?>
+1 -1
View File
@@ -45,5 +45,5 @@ $lang->caselib->legendDesc = '描述';
$lang->caselib->libraryDelete = '您确认要删除该用例库吗?';
$lang->caselib->noModule = '<div>您现在还没有模块信息</div><div>请维护用例库模块</div>';
$lang->caselib->featureBar['browse']['all'] = '所有';
$lang->caselib->featureBar['browse']['all'] = '全部';
$lang->caselib->featureBar['browse']['wait'] = '待评审';
+10 -2
View File
@@ -1460,9 +1460,17 @@ class commonModel extends model
echo '<li>' . html::a(helper::createLink('misc', 'downloadClient', '', '', true), $lang->downloadClient, '', "title='$lang->downloadClient' class='iframe text-ellipsis' data-width='600'") . '</li>';
echo "<li class='dropdown-submenu' id='downloadMobile'><a href='javascript:;'>" . $lang->downloadMobile . "</a><ul class='dropdown-menu pull-left''>";
$appqrcode = self::http('https://www.zentao.net/page/appqrcode.json');
/* Intranet users use local pictures. */
if(!empty($appqrcode))
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://www.zentao.net/page/appqrcode.json');
curl_setopt($curl, CURLOPT_TIMEOUT_MS, 200);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 200);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
$connected = curl_exec($curl);
curl_close($curl);
if($connected)
{
echo "<li><div class='mobile-qrcode'><iframe src='https://www.zentao.net/page/appqrcode.html?v={$config->version}' frameborder='0' scrolling='no' seamless></iframe></div></li>";
}
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "No Department";
$lang->dept->confirmDelete = " Möchten Sie diese Abteilung löschen?";
$lang->dept->successSave = " Gespeichert!";
$lang->dept->repeatDepart = " Es gibt einen doppelten Abteilungsnamen, möchten Sie ihn wirklich hinzufügen?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'Diese Abteilung hat Unterabteilungen und kann daher nicht gelöscht werden!';
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "No Department";
$lang->dept->confirmDelete = " Do you want to delete this department?";
$lang->dept->successSave = " Saved!";
$lang->dept->repeatDepart = " There is a duplicate department name, are you sure to add it?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'This Department has child departments. You cannot delete it!';
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "No Department";
$lang->dept->confirmDelete = " Confirmez que vous voulez bien supprimer ce Compartiment ?";
$lang->dept->successSave = " Sauvé !";
$lang->dept->repeatDepart = " Il y a un nom de département en double, êtes-vous sûr de l'ajouter ?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'Ce Compartiment possède des domaines. Vous ne pouvez pas le supprimer !';
+1
View File
@@ -26,6 +26,7 @@ $lang->dept->dragAndSort = "Drag để sắp xếp";
$lang->dept->confirmDelete = " Bạn có muốn xóa this department?";
$lang->dept->successSave = " Saved!";
$lang->dept->repeatDepart = " Có một tên bộ phận trùng lặp, bạn có chắc chắn thêm nó không?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'This Department has child departments. You cannot xóa it!';
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "无部门";
$lang->dept->confirmDelete = " 您确定删除该部门吗?";
$lang->dept->successSave = " 修改成功。";
$lang->dept->repeatDepart = " 存在部门名称重复,您确认添加吗?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = '该部门有子部门,不能删除!';
+1
View File
@@ -29,6 +29,7 @@ $lang->dept->dragAndSort = "拖動排序";
$lang->dept->confirmDelete = " 您確定刪除該部門嗎?";
$lang->dept->successSave = " 修改成功。";
$lang->dept->repeatDepart = " 存在部門名稱重複,您確認添加嗎?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = '該部門有子部門,不能刪除!';
+41 -4
View File
@@ -11,6 +11,7 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php js::set('repeatDepart', $lang->dept->repeatDepart);?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->dept->common;?></span></span>
@@ -33,7 +34,7 @@
<div class='panel-title'><?php echo $lang->dept->manageChild;?></div>
</div>
<div class='panel-body'>
<form method='post' target='hiddenwin' action='<?php echo $this->createLink('dept', 'manageChild');?>'>
<form method='post' target='hiddenwin' action='<?php echo $this->createLink('dept', 'manageChild');?>' id="dataForm">
<table class='table table-form'>
<tr>
<td>
@@ -49,7 +50,7 @@
?>
</nobr>
</td>
<td class='w-300px'>
<td class='w-300px'>
<?php
$maxOrder = 0;
foreach($sons as $sonDept)
@@ -85,7 +86,7 @@ $(function()
name: 'deptTree',
initialState: 'preserve',
data: data,
sortable:
sortable:
{
lazy: true,
nested: true,
@@ -105,7 +106,7 @@ $(function()
$li.append($toggle);
return true;
},
actions:
actions:
{
sort:
{
@@ -172,6 +173,42 @@ $(function()
$(this).addClass('hover');
e.stopPropagation();
});
$("#dataForm").submit(function(e)
{
var postDept = new Array();
var depts = new Array();
$.each($('input[name*="depts[]"]'), function(index, value)
{
if($(this).val()) postDept.push($(this).val());
});
$.each($('input[name*="depts[id"]'), function(index, value)
{
if($(this).val()) depts.push($(this).val());
});
for(var i = 0; i < postDept.length; i++)
{
if(depts.indexOf(postDept[i]) > -1 || postDept[i] == postDept[i + 1])
{
if(confirm(repeatDepart))
{
var link = createLink('dept', 'manageChild');
break;
}
else
{
setTimeout(function()
{
$('#submit').removeAttr('disabled');
},10)
return false;
}
}
}
});
});
</script>
<?php include '../../common/view/footer.html.php';?>
+7 -5
View File
@@ -467,19 +467,21 @@ class designModel extends model
public function printAssignedHtml($design = '', $users = '')
{
$btnTextClass = '';
$btnClass = '';
$assignedToText = zget($users, $design->assignedTo);
if(empty($design->assignedTo))
{
$btnTextClass = 'text-primary';
$btnClass = $btnTextClass = 'assigned-none';
$assignedToText = $this->lang->design->noAssigned;
}
if($design->assignedTo == $this->app->user->account) $btnTextClass = 'text-red';
if($design->assignedTo == $this->app->user->account) $btnClass = $btnTextClass = 'assigned-current';
if(!empty($design->assignedTo) and $design->assignedTo != $this->app->user->account) $btnClass = $btnTextClass = 'assigned-other';
$btnClass = $design->assignedTo == 'closed' ? ' disabled' : '';
$btnClass = "iframe btn btn-icon-left btn-sm {$btnClass}";
$btnClass .= $design->assignedTo == 'closed' ? ' disabled' : '';
$btnClass .= ' iframe btn btn-icon-left btn-sm';
$assignToLink = helper::createLink('design', 'assignTo', "designID=$design->id", '', true);
$assignToHtml = html::a($assignToLink, "<i class='icon icon-hand-right'></i> <span title='" . zget($users, $design->assignedTo) . "' class='{$btnTextClass}'>{$assignedToText}</span>", '', "class='$btnClass'");
$assignToHtml = html::a($assignToLink, "<i class='icon icon-hand-right'></i> <span title='" . zget($users, $design->assignedTo) . "'>{$assignedToText}</span>", '', "class='$btnClass'");
echo !common::hasPriv('design', 'assignTo', $design) ? "<span style='padding-left: 21px' class='{$btnTextClass}'>{$assignedToText}</span>" : $assignToHtml;
}
+8 -5
View File
@@ -2365,10 +2365,10 @@ class execution extends control
/**
* Kanban.
*
* @param int $executionID
* @param string $browseType
* @param string $orderBy
* @param string $groupBy
* @param int $executionID
* @param string $browseType
* @param string $orderBy
* @param string $groupBy
* @access public
* @return void
*/
@@ -2422,7 +2422,6 @@ class execution extends control
}
foreach($products as $product) $productNames[$product->id] = $product->name;
$plans = $this->execution->getPlans($products, 'skipParent', $executionID);
$allPlans = array('' => '');
if(!empty($plans))
@@ -2430,6 +2429,9 @@ class execution extends control
foreach($plans as $plan) $allPlans += $plan;
}
$taskToOpen = !empty($_COOKIE['taskToOpen']) ? $_COOKIE['taskToOpen'] : 0;
setcookie('taskToOpen', 0, time() - 3600, $this->config->webRoot, '', $this->config->cookieSecure, true);
$this->view->title = $this->lang->kanban->view;
$this->view->users = $users;
$this->view->regions = $kanbanData;
@@ -2448,6 +2450,7 @@ class execution extends control
$this->view->kanbanData = $kanbanData;
$this->view->executionActions = $executionActions;
$this->view->kanban = $this->lang->execution->kanban;
$this->view->taskToOpen = $taskToOpen;
$this->display();
}
+7 -7
View File
@@ -317,12 +317,12 @@ $lang->execution->groups['finishedBy'] = '完成者分组';
$lang->execution->groups['closedBy'] = '关闭者分组';
$lang->execution->groups['type'] = '类型分组';
$lang->execution->groupFilter['story']['all'] = '所有';
$lang->execution->groupFilter['story']['all'] = '全部';
$lang->execution->groupFilter['story']['linked'] = "已关联{$lang->SRCommon}的任务";
$lang->execution->groupFilter['pri']['all'] = '所有';
$lang->execution->groupFilter['pri']['all'] = '全部';
$lang->execution->groupFilter['pri']['noset'] = '未设置';
$lang->execution->groupFilter['assignedTo']['undone'] = '未完成';
$lang->execution->groupFilter['assignedTo']['all'] = '所有';
$lang->execution->groupFilter['assignedTo']['all'] = '全部';
$lang->execution->byQuery = '搜索';
@@ -501,7 +501,7 @@ $lang->execution->typeList['stage'] = '阶段';
$lang->execution->typeList['sprint'] = $lang->executionCommon;
$lang->execution->typeList['kanban'] = '看板';
$lang->execution->featureBar['task']['all'] = $lang->execution->allTasks;
$lang->execution->featureBar['task']['all'] = '全部';
$lang->execution->featureBar['task']['unclosed'] = $lang->execution->unclosed;
$lang->execution->featureBar['task']['assignedtome'] = $lang->execution->assignedToMe;
$lang->execution->featureBar['task']['myinvolved'] = $lang->execution->myInvolved;
@@ -509,17 +509,17 @@ $lang->execution->featureBar['task']['assignedbyme'] = $lang->execution->assigne
$lang->execution->featureBar['task']['needconfirm'] = "{$lang->SRCommon}变更";
$lang->execution->featureBar['task']['status'] = $lang->execution->statusSelects[''];
$lang->execution->featureBar['all']['all'] = $lang->execution->all;
$lang->execution->featureBar['all']['all'] = '全部';
$lang->execution->featureBar['all']['undone'] = $lang->execution->undone;
$lang->execution->featureBar['all']['wait'] = $lang->execution->statusList['wait'];
$lang->execution->featureBar['all']['doing'] = $lang->execution->statusList['doing'];
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
$lang->execution->featureBar['bug']['all'] = '所有';
$lang->execution->featureBar['bug']['all'] = '全部';
$lang->execution->featureBar['bug']['unresolved'] = '未解决';
$lang->execution->featureBar['build']['all'] = '所有版本';
$lang->execution->featureBar['build']['all'] = '全部版本';
$lang->execution->myExecutions = '我参与的';
$lang->execution->doingProject = '进行中的项目';
+1 -1
View File
@@ -33,7 +33,7 @@
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy&filter=$filterKey"), $name, '', "class='btn btn-link $active'");?>
<?php endforeach;?>
<?php else:?>
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy"), "<span class='text'>{$lang->execution->allTasks}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link btn-active-text'");?>
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy"), "<span class='text'>{$lang->execution->featureBar['task']['all']}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link btn-active-text'");?>
<?php endif;?>
</div>
<div class="btn-toolbar pull-right">
+1 -1
View File
@@ -73,7 +73,7 @@
<div class='table-footer'>
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
<div class="table-actions btn-toolbar show-always">
<?php echo html::submitButton('<i class="icon icon-import icon-sm"></i> ' . $lang->import, '', 'btn');?>
<?php echo html::submitButton('<i class="icon icon-import icon-sm"></i> ' . $lang->import, '', 'btn btn-primary');?>
</div>
<div class='btn-toolbar'>
<?php if(isonlybody()):?>
+29
View File
@@ -304,4 +304,33 @@ js::set('priv',
</div>
</div>
</div>
<?php js::set('taskToOpen', $taskToOpen);?>
<script>
$(function()
{
/* Open the task details popup from dynamic. */
if(taskToOpen)
{
var kanban = document.querySelector('#kanban');
var observer = new MutationObserver(function (mutationsList, observer)
{
for(var mutation of mutationsList)
{
var target = mutation.target;
if(mutation.type == 'childList' && target.tagName.toLowerCase() == 'a' && target.classList.contains('title') && target.parentElement.parentElement.dataset.id == taskToOpen && target.parentElement.className.includes('kanban-item-task'))
{
var a = document.querySelector('[data-id="' + taskToOpen +'"] a.title');
if(a)
{
observer.disconnect();
a.click();
break;
}
}
}
});
observer.observe(kanban, {subtree: true, childList: true});
}
})
</script>
<?php include '../../common/view/footer.html.php';?>
+1 -1
View File
@@ -13,7 +13,7 @@
</div>
</div>
<div class="btn-toolbar pull-left">
<?php echo html::a(inlink('testcase', "executionID=$executionID&productID=$productID&branchID=$branchID&type=$type&moduleID=$moduleID&orderBy=$orderBy"), "<span class='text'>{$lang->execution->all}</span>", '', "class='btn btn-link btn-active-text'");?>
<?php echo html::a(inlink('testcase', "executionID=$executionID&productID=$productID&branchID=$branchID&type=$type&moduleID=$moduleID&orderBy=$orderBy"), "<span class='text'>{$lang->execution->featureBar['all']['all']}</span>", '', "class='btn btn-link btn-active-text'");?>
</div>
<div class="btn-toolbar pull-right">
<?php if(common::canModify('execution', $execution)) echo html::a(helper::createLink('testcase', 'create', "productID=$productID&branch=0&moduleID=0&from=execution&param=$execution->id", '', '', '', true), "<i class='icon icon-plus'></i> " . $lang->testcase->create, '', "class='btn btn-primary' data-app='{$this->app->tab}'");?>
+9 -6
View File
@@ -12,14 +12,17 @@
?>
<?php
echo '"'. implode('","', $fields) . '"' . "\n";
foreach($rows as $row)
if($rows)
{
echo '"';
foreach($fields as $fieldName => $fieldLabel)
foreach($rows as $row)
{
isset($row->$fieldName) ? print(str_replace(array('"', '&nbsp;'), array('“', ' '), htmlspecialchars_decode(strip_tags($row->$fieldName, '<img>')))) : print('');
echo '","';
echo '"';
foreach($fields as $fieldName => $fieldLabel)
{
isset($row->$fieldName) ? print(str_replace(array('"', '&nbsp;'), array('“', ' '), htmlspecialchars_decode(strip_tags($row->$fieldName, '<img>')))) : print('');
echo '","';
}
echo '"' . "\n";
}
echo '"' . "\n";
}
if($this->post->kind == 'task' && $config->vision != 'lite') echo $this->lang->file->childTaskTips;
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = 'Create';
$lang->gitlab->branch->lastCommitter = 'Last Committer';
$lang->gitlab->branch->lastCommittedDate = 'Last Committed Date';
$lang->gitlab->branch->accessLevel = "Branch protection list";
$lang->gitlab->branch->mergeAllowed = "Merge Allowed";
$lang->gitlab->branch->pushAllowed = "Push Allowed";
$lang->gitlab->branch->mergeAllowed = "Allowed to merge";
$lang->gitlab->branch->pushAllowed = "Allowed to push";
$lang->gitlab->branch->placeholderSearch = "Branch name";
$lang->gitlab->branch->placeholderSelect = "Branch name";
$lang->gitlab->branch->confirmDelete = 'Branch will be writable for developers. Are you sure?';
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = 'Create';
$lang->gitlab->branch->lastCommitter = 'Last Committer';
$lang->gitlab->branch->lastCommittedDate = 'Last Committed Date';
$lang->gitlab->branch->accessLevel = "Branch protection list";
$lang->gitlab->branch->mergeAllowed = "Merge Allowed";
$lang->gitlab->branch->pushAllowed = "Push Allowed";
$lang->gitlab->branch->mergeAllowed = "Allowed to merge";
$lang->gitlab->branch->pushAllowed = "Allowed to push";
$lang->gitlab->branch->placeholderSearch = "Branch name";
$lang->gitlab->branch->placeholderSelect = "Branch name";
$lang->gitlab->branch->confirmDelete = 'Branch will be writable for developers. Are you sure?';
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = 'Create';
$lang->gitlab->branch->lastCommitter = 'Last Committer';
$lang->gitlab->branch->lastCommittedDate = 'Last Committed Date';
$lang->gitlab->branch->accessLevel = "Branch protection list";
$lang->gitlab->branch->mergeAllowed = "Merge Allowed";
$lang->gitlab->branch->pushAllowed = "Push Allowed";
$lang->gitlab->branch->mergeAllowed = "Allowed to merge";
$lang->gitlab->branch->pushAllowed = "Allowed to push";
$lang->gitlab->branch->placeholderSearch = "Branch name";
$lang->gitlab->branch->placeholderSelect = "Branch name";
$lang->gitlab->branch->confirmDelete = 'Branch will be writable for developers. Are you sure?';
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = '创建';
$lang->gitlab->branch->lastCommitter = '最后提交';
$lang->gitlab->branch->lastCommittedDate = '最后修改时间';
$lang->gitlab->branch->accessLevel = "分支保护列表";
$lang->gitlab->branch->mergeAllowed = "允许合并到";
$lang->gitlab->branch->pushAllowed = "允许推送到";
$lang->gitlab->branch->mergeAllowed = "允许合并";
$lang->gitlab->branch->pushAllowed = "允许推送";
$lang->gitlab->branch->placeholderSearch = "请输入分支名称";
$lang->gitlab->branch->placeholderSelect = "请选择分支";
$lang->gitlab->branch->confirmDelete = '确定删除分支保护?';
+1
View File
@@ -1666,6 +1666,7 @@ $lang->resource->report->bugCreate = 'bugCreate';
$lang->resource->report->bugAssign = 'bugAssign';
$lang->resource->report->workload = 'workload';
$lang->resource->report->annualData = 'annual';
$lang->resource->report->allAnnualData = 'viewEveryoneAnnual';
$lang->report->methodOrder[0] = 'index';
$lang->report->methodOrder[5] = 'projectDeviation';
+2 -3
View File
@@ -1,13 +1,12 @@
body {padding-left: 96px;}
#menu {position: fixed; left: 0; top: 0; bottom: 0; background-color: #3C495C; width: 96px; z-index: 1015;}
#menu {position: fixed; left: 0; top: 0; bottom: 0; width: 96px; z-index: 1015;}
.menu-show .menu-tip {display: none!important;}
#menuNav {position: absolute; top: 5px; bottom: 40px; width: 100%;}
#menu .nav > li {float: none; padding: 2px 8px;}
#menu .nav > li > a {color: #fff; line-height: 24px; padding: 6px; border-radius: 2px; white-space: nowrap; height: 36px;}
#menu .nav > li > a > .icon {display: inline-block; font-size: 16px; position: relative; top: -1px}
#menu .nav > li > a > .icon + .text {margin-left: 4px; position: relative; top: -1px}
#menu .nav > li.active > a, #menu .nav > li > a:hover, #menu .nav > li > a:focus {background-color: #0c64eb;}
#menu .nav > li.active > a, #menu .nav > li > a:hover, #menu .nav > li > a:focus {background-color: #3785ff;}
#menu .nav > li.divider {margin: 8px; background-color: #fff; opacity: 0.24; height: 1px; padding: 0 !important;}
#menuFooter {position: absolute; bottom: 0; left: 0; right: 0;}
#menu .nav > li.has-avatar {padding: 1px 6px;}
+3 -2
View File
@@ -165,7 +165,7 @@
.leftBtn.hidden + #regionNavTabs {padding-left: 10px;}
#regionNavTabs > ul {display: inline-flex; border-bottom: none; margin-bottom: -3px;}
#regionNavTabs > ul > li {padding: 0; text-align: center;}
#regionNavTabs > ul > li > a {min-width: 134px; overflow: hidden; white-space: nowrap; z-index: 0; position: relative; padding: 1.7rem; margin-left: -20px; background: none; outline: 0;}
#regionNavTabs > ul > li > a {min-width: 134px; overflow: hidden; white-space: nowrap; z-index: 0; position: relative; padding: 1.7rem; margin-left: -20px; background: none; outline: 0; cursor: pointer !important;}
#regionNavTabs > ul > li:first-child > a {margin-left: 0;}
#regionNavTabs > ul > li.active > a {z-index: 1;}
#regionNavTabs > ul > li.active > a::before {background-color: #fff;}
@@ -173,8 +173,9 @@
#regionNavTabs > ul > li > a > span {vertical-align: bottom; overflow: hidden; max-width: 6em; white-space: nowrap; display: inline-block;}
#regionNavTabs > ul > li.active > a > span {color: #2b80ff!important;}
#regionTabs.affixed {margin-bottom: 5px; position: fixed; top: 0px;}
#regionTabs.affixed + #kanbanContainer .kanban-board.kanban-affixed > .kanban-header {margin-top: 30px;}
#regionTabs.affixed + #kanbanContainer .kanban-board.kanban-affixed > .kanban-header {margin-top: 43px;}
#regionTabs.affixed + #kanbanContainer .kanban-board.kanban-affixed > .kanban-header + .kanban-lane {margin-top: 38px;}
#regionTabs.affixed ul {margin-bottom: -10px;}
#regionTabs.affixed ul > li {margin-bottom: 0px !important;}
#regionTabs .region-actions .dropdown-menu {top: 25px;}
#region-tab-actions {display: none;}
+6
View File
@@ -1972,6 +1972,11 @@ $('[data-tab]').on('shown.zui.tab', function(e)
{
$regions.addClass('active').removeClass('notAll');
if(hasActions) $regionActions.removeClass('active');
$regions.each(function()
{
var isFold = $(this).find('.region-header i').hasClass('icon-angle-down');
if(isFold) $(this).find('.kanban').css('display', 'none');
});
}
else
{
@@ -1991,6 +1996,7 @@ $('[data-tab]').on('shown.zui.tab', function(e)
if($(this).hasClass('archivedColumn')) $(this).find('a').attr('href', "javascript:loadMore(\"Column\", " + regionID + ')');
});
}
window.scrollTo(0, 0);
/* To manually refresh stay under the current tab, save the ID of the current region. */
var url = createLink('kanban', 'ajaxSaveRegionID', 'regionID=' + regionID);
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
$lang->misc->releaseDate['17.6'] = '2022-08-26';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
@@ -189,6 +190,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['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
$lang->misc->releaseDate['17.6'] = '2022-08-26';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
@@ -189,6 +190,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['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
$lang->misc->releaseDate['17.6'] = '2022-08-26';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
@@ -189,6 +190,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['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => '');
$lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => '');
+2
View File
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[迅捷界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png';
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
$lang->misc->releaseDate['17.6'] = '2022-08-26';
$lang->misc->releaseDate['17.5'] = '2022-08-11';
@@ -189,6 +190,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['17.6.2'][] = array('title' => '禅道更新叶兰绿、禅道蓝、青春蓝三大主题。实现附件批量上传功能。修复Bug。', 'desc' => '');
$lang->misc->feature->all['17.6.1'][] = array('title' => '优化了多人任务的处理逻辑,修复Bug。', 'desc' => '');
$lang->misc->feature->all['17.6'][] = array('title' => '优化了需求的处理逻辑,拆分了用需和软需的权限。甘特图支持手动拖拽维护任务关系。修复Bug。', 'desc' => '');
$lang->misc->feature->all['17.5'][] = array('title' => '提供高效的可视化统计工具。优化禅道性能,数据库引擎从MyISAM调整为InnoDB。甘特图优化升级,旗舰版的复制项目可以复制任务等更多信息。修复Bug。', 'desc' => '');
+1 -1
View File
@@ -77,7 +77,7 @@ $lang->mr->assignedToMe = '指派给我';
$lang->mr->createdByMe = '由我创建';
$lang->mr->statusList = array();
$lang->mr->statusList['all'] = '所有';
$lang->mr->statusList['all'] = '全部';
$lang->mr->statusList['opened'] = '开放中';
$lang->mr->statusList['merged'] = '已合并';
$lang->mr->statusList['closed'] = '已关闭';
+2 -3
View File
@@ -1,4 +1,3 @@
td.delayed {color: #fff; background: #e84e0f !important;}
.confirmed {color: #008000;}
.unconfirmed {color: #808080;}
.c-confirm {width:50px;}
.c-confirm {width:60px;}
+1 -1
View File
@@ -88,7 +88,7 @@
<?php common::printIcon('project', 'group', "projectID=$project->id", $project, 'list', 'lock', '', '', false, "data-group='project'", '', $project->id);?>
<?php if(common::hasPriv('project','manageProducts') || common::hasPriv('project','whitelist') || common::hasPriv('project','delete')):?>
<div class='btn-group'>
<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title="<?php echo $this->lang->more;?>"><i class='icon-more-alt'></i></button>
<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title="<?php echo $this->lang->more;?>"><i class='icon-ellipsis-v'></i></button>
<ul class='dropdown-menu pull-right text-center' role='menu'>
<?php common::printIcon('project', 'manageProducts', "projectID=$project->id", $project, 'list', 'link', '', '', false, "data-group='project'", '', $project->id);?>
<?php common::printIcon('project', 'whitelist', "projectID=$project->id&module=project", $project, 'list', 'shield-check', '', '', false, "data-group='project'", '', $project->id);?>
+1 -4
View File
@@ -147,10 +147,7 @@ class port extends control
{
$filter = '';
if($model == 'task') $filter = 'estimate';
if($model == 'story')
{
if($this->session->storyType) $this->loadModel('story')->replaceUserRequirementLang();
}
if($model == 'story' and $this->session->storyType) $this->loadModel('story')->replaceUserRequirementLang();
$this->loadModel($model);
$importFields = !empty($_SESSION[$model . 'TemplateFields']) ? $_SESSION[$model . 'TemplateFields'] : $this->config->$model->templateFields;
+7 -3
View File
@@ -259,6 +259,8 @@ class portModel extends model
foreach($fields as $key => $field)
{
$field = trim($field);
if($model == 'bug' and $this->session->currentProductType == 'normal' and $field == 'branch') continue;
$modelFieldList = isset($this->modelFieldList[$field]) ? $this->modelFieldList[$field] : array();
foreach($portFieldList as $portField => $value)
@@ -472,9 +474,7 @@ class portModel extends model
if(!$tmpFile)
{
$rows = $this->getRowsFromExcel();
$modelData = $this->processRows4Fields($rows, $fields);
$modelData = $this->getNatureDatas($model, $modelData, $filter, $fields);
$this->createTmpFile($modelData);
@@ -554,6 +554,10 @@ class portModel extends model
if(!empty($pairs[0])) $valuePairs[$value[$pairs[0]]] = $value[$pairs[1]];
}
$values = $valuePairs;
if(reset($values))
{
if(current($values) or (current($values) == 0)) $values[0] = '';
}
}
return $values;
@@ -624,7 +628,7 @@ class portModel extends model
}
/* if value = 0 or value = 0000:00:00 set value = ''*/
if(helper::isZeroDate($value))
if(helper::isZeroDate($rows[$id]->$field))
{
$rows[$id]->$field = '';
}
+1 -1
View File
@@ -24,7 +24,7 @@ thead > tr > th{width:150px;}
.c-id{width:50px}
.c-team {width:100px; padding:0px 0px 8px 0px !important;}
.c-estimate-1 {width:50px;padding:0px 0px 8px 8px !important;}
.load-indicator{width: 100px; height: 500px;}
#showData .load-indicator{width: 100px; height: 500px;}
</style>
<?php if(!empty($suhosinInfo)):?>
<div class='alert alert-info'><?php echo $suhosinInfo?></div>
+1 -1
View File
@@ -186,7 +186,7 @@ $lang->product->statusList['closed'] = 'Geschlossen';
global $config;
if($config->systemMode == 'new')
{
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Stakeholders and owner of the respective program, team members and stakeholders of the associated project can access)";
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Manager and Stakeholders of the respective program, team members and stakeholders of the associated project can access)";
}
else
{
+1 -1
View File
@@ -186,7 +186,7 @@ $lang->product->statusList['closed'] = 'Closed';
global $config;
if($config->systemMode == 'new')
{
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Stakeholders and owner of the respective program, team members and stakeholders of the associated project can access)";
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Manager and Stakeholders of the respective program, team members and stakeholders of the associated project can access)";
}
else
{
+1 -1
View File
@@ -186,7 +186,7 @@ $lang->product->statusList['closed'] = 'Fermé';
global $config;
if($config->systemMode == 'new')
{
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Stakeholders and owner of the respective program, team members and stakeholders of the associated project can access)";
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Manager and Stakeholders of the respective program, team members and stakeholders of the associated project can access)";
}
else
{
+2 -2
View File
@@ -207,7 +207,7 @@ $lang->product->noModule = "<div>您现在还没有模块信息</div><div>
$lang->product->noProduct = "暂时没有{$lang->productCommon}。";
$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon;
$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory;
$lang->product->featureBar['browse']['allstory'] = '全部';
$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed;
$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe;
$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe;
@@ -216,7 +216,7 @@ $lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByM
$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory;
$lang->product->featureBar['browse']['more'] = $lang->more;
$lang->product->featureBar['all']['all'] = '所有' . $lang->productCommon;
$lang->product->featureBar['all']['all'] = '全部' . $lang->productCommon;
$lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed;
$lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed'];
+5 -2
View File
@@ -41,6 +41,7 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
.btn-group a i.icon-plus, .btn-group a i.icon-link {font-size: 16px;}
.btn-group a.btn-secondary, .btn-group a.btn-primary {border-right: 1px solid rgba(255,255,255,0.2);}
.btn-group button.dropdown-toggle.btn-secondary, .btn-group button.dropdown-toggle.btn-primary {padding:6px;}
#productStoryForm table tbody tr td.c-actions {overflow: visible;}
#productStoryForm table tbody tr td.c-actions .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #E4E4E4; margin: 0 4px 0 0;}
</style>
@@ -387,8 +388,10 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
<div class="table-actions btn-toolbar">
<div class='btn-group dropup'>
<?php
$disabled = $canBatchEdit ? '' : "disabled='disabled'";
$actionLink = $this->createLink('story', 'batchEdit', "productID=$productID&projectID=$projectID&branch=$branch&storyType=$storyType");
foreach($stories as $story) $storyProductIds[$story->product] = $story->product;
$storyProductID = count($storyProductIds) > 1 ? 0 : $productID;
$disabled = $canBatchEdit ? '' : "disabled='disabled'";
$actionLink = $this->createLink('story', 'batchEdit', "productID=$storyProductID&projectID=$projectID&branch=$branch&storyType=$storyType");
?>
<?php if($canBatchEdit or $canBatchClose or $canBatchUnlink or $canBatchReview or $canBatchChangeStage or $canBatchChangeBranch) echo html::commonButton($lang->edit, "data-form-action='$actionLink' $disabled");?>
<?php if($canBatchEdit or $canBatchClose or $canBatchUnlink or $canBatchReview or $canBatchChangeStage or $canBatchChangeBranch):?>
+1 -1
View File
@@ -135,7 +135,7 @@ $lang->productplan->endLetterChildTip = "父计划[%s]的完成日期:%s,
$lang->productplan->beginLetterParentTip = "子计划[%s]的开始日期:%s,不能小于父计划的开始日期: %s";
$lang->productplan->endGreaterParentTip = "子计划[%s]的完成日期:%s,不能大于父计划的完成日期: %s";
$lang->productplan->featureBar['browse']['all'] = '所有';
$lang->productplan->featureBar['browse']['all'] = '全部';
$lang->productplan->featureBar['browse']['undone'] = '未完成';
$lang->productplan->featureBar['browse']['wait'] = '未开始';
$lang->productplan->featureBar['browse']['doing'] = '进行中';
+1 -1
View File
@@ -26,7 +26,7 @@ class program extends control
* @access public
* @return void
*/
public function browse($status = 'all', $orderBy = 'order_asc', $recTotal = 0, $recPerPage = 10, $pageID = 1, $param = 0)
public function browse($status = 'unclosed', $orderBy = 'order_asc', $recTotal = 0, $recPerPage = 10, $pageID = 1, $param = 0)
{
if(common::hasPriv('program', 'create')) $this->lang->pageActions = html::a($this->createLink('program', 'create'), "<i class='icon icon-plus'></i> " . $this->lang->program->create, '', "class='btn btn-primary create-program-btn'");
+5 -2
View File
@@ -12,9 +12,12 @@ tbody.sortable > tr > td.sort-handler {color: #3c4353 !important;}
.has-prefix > span {flex: none;}
.has-prefix > a {padding-left: 5px;}
.has-suffix > a {max-width: calc(100% - 100px); padding-right: 5px; color: #0c60e1; display: inline-block; max-width: calc(100% - 50px);}
.has-suffix > a {padding-right: 5px; color: #0c60e1; display: inline-block; max-width: calc(100% - 50px);}
tr[data-type="project"] span.table-nest-icon {visibility: hidden; width: 0;}
tr[data-type="project"].no-nest .c-name {padding-left: 12px;}
div.checkbox-primary + span.table-nest-icon {margin-left: 0px !important;}
#checkAll + label.hover:after {border-width: 0px;}
.c-budget {width:100px; text-align: right; padding-right:16px !important;}
.c-status {width: 65px !important;}
.c-status {width: 65px !important;}
-7
View File
@@ -1,12 +1,5 @@
$(function()
{
$('input[name^="showClosed"]').click(function()
{
var showClosed = $(this).is(':checked') ? 1 : 0;
$.cookie('showClosed', showClosed, {expires:config.cookieLife, path:config.webRoot});
window.location.reload();
});
$('input#editProject1').click(function()
{
var editProject = $(this).is(':checked') ? 1 : 0;
+1 -1
View File
@@ -143,7 +143,7 @@ $lang->program->statusList['doing'] = '进行中';
$lang->program->statusList['suspended'] = '已挂起';
$lang->program->statusList['closed'] = '已关闭';
$lang->program->featureBar['browse']['all'] = '所有';
$lang->program->featureBar['browse']['all'] = '全部';
$lang->program->featureBar['browse']['unclosed'] = '未关闭';
$lang->program->featureBar['browse']['wait'] = '未开始';
$lang->program->featureBar['browse']['doing'] = '进行中';
+2 -4
View File
@@ -167,7 +167,6 @@ class programModel extends model
->andWhere('deleted')->eq(0)
->andWhere('vision')->eq($this->config->vision)
->beginIF($status != 'all')->andWhere('status')->in($status)->fi()
->beginIF(!$this->cookie->showClosed and $status == 'all')->andWhere('status')->ne('closed')->fi()
->beginIF($this->app->rawMethod == 'browse' and $type === 'top')->andWhere('parent')->eq(0)->fi()
->beginIF($this->app->rawMethod == 'browse' and ($type === 'child' or !$this->app->user->admin))->andWhere('id')->in($objectIdList)->fi()
->beginIF(!$this->app->user->admin and $this->app->rawMethod != 'browse')->andWhere('id')->in($userViewIdList)->fi()
@@ -226,7 +225,6 @@ class programModel extends model
->where('deleted')->eq(0)
->andWhere('vision')->eq($this->config->vision)
->andWhere('type')->eq('program')
->beginIF(!$this->cookie->showClosed)->andWhere('status')->ne('closed')->fi()
->beginIF($query)->andWhere($query)->fi()
->beginIF(!$this->app->user->admin)->andWhere('id')->in($objectIdList)->fi()
->orderBy($orderBy)
@@ -1184,7 +1182,7 @@ class programModel extends model
$childGrade = $parentProgram->grade + 1;
$childSumBudget = $this->dao->select("sum(budget) as sumBudget")->from(TABLE_PROGRAM)
->where('path')->like("%{$parentProgram->id}%")
->where('path')->like("%,{$parentProgram->id},%")
->andWhere('grade')->eq($childGrade)
->andWhere('deleted')->eq('0')
->fetch('sumBudget');
@@ -1579,7 +1577,7 @@ class programModel extends model
if(common::hasPriv('project', 'manageProducts') || common::hasPriv('project', 'whitelist') || common::hasPriv('project', 'delete'))
{
$menu .= "<div class='btn-group'>";
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title='{$this->lang->more}'><i class='icon-more-alt'></i></button>";
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title='{$this->lang->more}'><i class='icon-ellipsis-v'></i></button>";
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu'>";
$menu .= $this->buildMenu('project', 'manageProducts', "$params&from=program", $program, $type, 'link', '', '', '', "data-app='project'");
-1
View File
@@ -29,7 +29,6 @@
<?php $label = "<span class='text'>$label</span>";?>
<?php echo html::a(inlink('browse', "status=$key&orderBy=$orderBy"), $label, '', "class='btn btn-link $active'");?>
<?php endforeach;?>
<?php if($status == 'all' or $status == 'bySearch') echo html::checkbox('showClosed', array('1' => $lang->program->showClosed), '', $this->cookie->showClosed ? 'checked=checked' : '');?>
<?php if(common::hasPriv('project', 'batchEdit') and $programType != 'bygrid' and $hasProject === true) echo html::checkbox('editProject', array('1' => $lang->project->edit), '', $this->cookie->editProject ? 'checked=checked' : '');?>
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->user->search;?></a>
</div>
+6 -1
View File
@@ -48,7 +48,7 @@
$originOrders[] = $program->order;
?>
<tr <?php echo $trAttrs;?>>
<tr <?php echo $trAttrs;?> data-type="<?php echo $program->type;?>">
<td class='c-name text-left <?php if($canOrder) echo 'sort-handler';?> has-prefix has-suffix' title='<?php echo $program->name?>'>
<?php
$icon = '';
@@ -58,6 +58,7 @@
?>
<span class="table-nest-icon icon <?php echo $class . $icon;?>"></span>
<?php if($program->type == 'program'):?>
&nbsp;<span class="icon icon-cards-view" style="color: #888fa1;"></span>
<?php echo ($app->user->admin or strpos(",{$app->user->view->programs},", ",$program->id,") !== false) ? html::a($this->createLink('program', 'product', "programID=$program->id"), $program->name) : $program->name;?>
<?php else:?>
<?php echo html::a($this->createLink('project', 'index', "projectID=$program->id", '', '', $program->id), $program->name, '', 'class="text-ellipsis text-primary"');?>
@@ -108,6 +109,7 @@
#programTableList.sortable-sorting > tr.drag-row {opacity: 1;}
#programTableList > tr.drop-not-allowed {opacity: 0.1!important}
#programList .c-actions {overflow: visible;}
#programList .c-actions .btn-group:last-child {margin-left: -4px;}
#programList > thead > tr > th .table-nest-toggle-global {top: 6px}
#programList > thead > tr > th .table-nest-toggle-global:before {color: #a6aab8;}
#programTableList > tr:last-child .c-actions .dropdown-menu {top: auto; bottom: 100%; margin-bottom: -5px;}
@@ -116,6 +118,9 @@
#programTableList .icon-scrum:before {content: '\e9a2';}
#programTableList .icon-waterfall:before {content: '\e9a4';}
#programTableList .icon-kanban:before {content: '\e983';}
/* #programTableList .has-nest-child > .c-name > a {color: #0b0f18!important;}
#programTableList .is-nest-child > .c-name > a {color: #2463c7!important;} */
#programTableList .c-name .label-danger {position: absolute; right: 10px; padding: 2px 4px;}
</style>
<?php js::set('originOrders', $originOrders);?>
<script>
+1 -1
View File
@@ -144,7 +144,7 @@
<h4 class="modal-title"><?php echo $lang->program->changePRJUnit;?></h4>
</div>
<div class="modal-body">
<form method='post'>
<form method='post' class='not-watch'>
<table class='table table-form'>
<tr>
<td colspan='3'><div class='alert alert-info no-margin'><?php echo $lang->program->confirmChangePRJUint;?></div></td>
+10
View File
@@ -143,6 +143,16 @@ function setParentProgram(parentProgram)
$('#plansBox .col-sm-4').prepend(planSelect);
$('#plansBox .col-sm-4 select').chosen();
}
if(parentProgram != 0)
{
$('.aclBox').html($('#programAcl').html());
}
else
{
$('.aclBox').html($('#projectAcl').html());
}
budgetOverrunTips();
outOfDateTip();
refreshBudgetUnit(data);
+2 -2
View File
@@ -245,14 +245,14 @@ $lang->project->modelList['scrum'] = "Scrum";
$lang->project->modelList['waterfall'] = "瀑布";
$lang->project->modelList['kanban'] = "看板";
$lang->project->featureBar['browse']['all'] = '所有';
$lang->project->featureBar['browse']['all'] = '全部';
$lang->project->featureBar['browse']['undone'] = '未完成';
$lang->project->featureBar['browse']['wait'] = '未开始';
$lang->project->featureBar['browse']['doing'] = '进行中';
$lang->project->featureBar['browse']['suspended'] = '已挂起';
$lang->project->featureBar['browse']['closed'] = '已关闭';
$lang->project->featureBar['build']['all'] = '所有版本';
$lang->project->featureBar['build']['all'] = '全部版本';
$lang->project->aclList['private'] = "私有 (只有项目负责人、团队成员和干系人可访问)";
$lang->project->aclList['open'] = "公开 (有项目视图权限即可访问)";
+1 -1
View File
@@ -2612,7 +2612,7 @@ class projectModel extends model
if(common::hasPriv($moduleName, 'manageProducts') || common::hasPriv($moduleName, 'whitelist') || common::hasPriv($moduleName, 'delete'))
{
$menu .= "<div class='btn-group'>";
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}'><i class='icon-more-alt'></i></button>";
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}'><i class='icon-ellipsis-v'></i></button>";
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu'>";
$menu .= $this->buildMenu($moduleName, 'manageProducts', $params . "&from={$this->app->tab}", $project, 'browse', 'link', '', 'btn-action', '', '', $this->lang->project->manageProducts);
if($this->config->systemMode == 'new') $menu .= $this->buildMenu('project', 'whitelist', "$params&module=project&from=$from", $project, 'browse', 'shield-check', '', 'btn-action', '', $dataApp);
+1 -1
View File
@@ -17,7 +17,7 @@
.project-name {position: relative; display: flex; align-items: center;}
.project-name > span,
.project-name > span {flex: none;}
.project-name > a {color: #0c60e1; display: inline-block; max-width: calc(100% - 50px);}
.project-name > a {display: inline-block; max-width: calc(100% - 50px);}
.project-name.has-prefix > a,
.project-name.has-suffix > a {max-width: calc(100% - 100px);}
.project-name.has-prefix > a {padding-left: 5px;}
+1 -1
View File
@@ -34,7 +34,7 @@
<?php
$buildName = $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';
$module = $type != 'bysearch' ? "&param=$param" : '';
echo html::a($this->inlink('bug', "projectID={$project->id}&productID={$productID}&branch=$branchID&orderBy=status,id_desc&build=$buildID&type=all$module"), "<span class='text'>{$lang->bug->allBugs}</span>" . ($type == 'all' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='allTab' class='btn btn-link" . ('all' == $type ? ' btn-active-text' : '') . "'");
echo html::a($this->inlink('bug', "projectID={$project->id}&productID={$productID}&branch=$branchID&orderBy=status,id_desc&build=$buildID&type=all$module"), "<span class='text'>{$lang->bug->featureBar['browse']['all']}</span>" . ($type == 'all' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='allTab' class='btn btn-link" . ('all' == $type ? ' btn-active-text' : '') . "'");
echo html::a($this->inlink('bug', "projectID={$project->id}&productID={$productID}&branch=$branchID&orderBy=status,id_desc&build=$buildID&type=unresolved$module"), "<span class='text'>{$lang->bug->unResolved}</span>" . ($type == 'unresolved' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='unresolvedTab' class='btn btn-link" . ('unresolved' == $type ? ' btn-active-text' : '') . "'");
?>
<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> <?php echo $lang->bug->search;?></a>
+1 -1
View File
@@ -51,7 +51,7 @@
</tr>
<?php endif;?>
<tr>
<th class='w-120px'><?php echo $lang->program->parent;?></th>
<th class='w-120px'><?php echo $lang->project->parent;?></th>
<?php
$attr = '';
if(!isset($programList[$project->parent]))
+2
View File
@@ -246,6 +246,8 @@
<td><?php echo $statData->taskCount;?></td>
<th><?php echo $lang->bug->common;?></th>
<td><?php echo $statData->bugCount;?></td>
<th><?php echo $lang->project->budget;?></th>
<td><?php echo $project->budget;?></td>
</tr>
</tbody>
</table>
+4
View File
@@ -37,6 +37,10 @@ class projectStory extends control
public function story($projectID = 0, $productID = 0, $branch = 0, $browseType = '', $param = 0, $storyType = 'story', $orderBy = '', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->products = $this->loadModel('product')->getProductPairsByProject($projectID);
/* Set product list for export. */
$this->session->set('exportProductList', $this->products);
if(empty($this->products)) return print($this->locate($this->createLink('product', 'showErrorNone', 'moduleName=project&activeMenu=story&projectID=' . $projectID)));
echo $this->fetch('product', 'browse', "productID=$productID&branch=$branch&browseType=$browseType&param=$param&storyType=$storyType&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID&projectID=$projectID");
}
+1 -1
View File
@@ -24,7 +24,7 @@ $lang->projectstory->batchUnlinkTip = '其他需求已经移除,如下需求
global $app;
$app->loadLang('product');
$lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory;
$lang->projectstory->featureBar['story']['allstory'] = '全部';
$lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed;
$lang->projectstory->featureBar['story']['draft'] = $lang->product->draftStory;
$lang->projectstory->featureBar['story']['reviewing'] = $lang->product->reviewingStory;
+1 -1
View File
@@ -140,7 +140,7 @@ class release extends control
$this->commonAction($release->product, $release->branch);
$build = $this->build->getById($release->build);
$builds = $this->loadModel('build')->getBuildPairs($release->product, $release->branch, 'notrunk|withbranch', 0, 'execution', '', false);
$builds = $this->loadModel('build')->getBuildPairs($release->product, $release->branch, 'notrunk|withbranch', 0, 'execution', $release->build, false);
$releasedBuilds = $this->release->getReleasedBuilds($release->product, $release->branch);
foreach($releasedBuilds as $releasedBuild)
{
+1 -1
View File
@@ -95,6 +95,6 @@ $lang->release->notifyList['ET'] = "所在{$lang->execution->common}团队成员
$lang->release->notifyList['PT'] = "所在项目团队成员";
$lang->release->notifyList['CT'] = "抄送给";
$lang->release->featureBar['browse']['all'] = $lang->release->all;
$lang->release->featureBar['browse']['all'] = '全部';
$lang->release->featureBar['browse']['normal'] = $lang->release->statusList['normal'];
$lang->release->featureBar['browse']['terminate'] = $lang->release->statusList['terminate'];
+3 -1
View File
@@ -292,6 +292,8 @@ class report extends control
$this->loadModel('dept');
$this->loadModel('user');
$super = common::hasPriv('report', 'allAnnualData');
$firstAction = $this->dao->select('*')->from(TABLE_ACTION)->orderBy('id')->limit(1)->fetch();
$currentYear = date('Y');
$firstYear = empty($firstAction) ? $currentYear : substr($firstAction->date, 0, 4);
@@ -329,7 +331,7 @@ class report extends control
$noDepartment = array('0' => '/' . $this->lang->dept->noDepartment);
$depts = $this->dept->getOptionMenu();
if(!$this->app->user->admin)
if(!$super)
{
$depts = ($dept and isset($depts[$dept])) ? array($dept => $depts[$dept]) : $noDepartment;
}
+11 -10
View File
@@ -9,16 +9,17 @@
* @version $Id: en.php 5080 2013-07-10 00:46:59Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
$lang->report->index = 'Home';
$lang->report->list = 'Liste';
$lang->report->item = 'Eintrag';
$lang->report->value = 'Wert';
$lang->report->percent = '%';
$lang->report->undefined = 'Undefiniert';
$lang->report->query = 'Abfrage';
$lang->report->annual = 'Annual Summary';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->index = 'Home';
$lang->report->list = 'Liste';
$lang->report->item = 'Eintrag';
$lang->report->value = 'Wert';
$lang->report->percent = '%';
$lang->report->undefined = 'Undefiniert';
$lang->report->query = 'Abfrage';
$lang->report->annual = 'Annual Summary';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->viewEveryoneAnnual = 'View everyone annual summary';
$lang->report->colors[] = 'AFD8F8';
$lang->report->colors[] = 'AFD8F8';
+11 -10
View File
@@ -9,16 +9,17 @@
* @version $Id: en.php 5080 2013-07-10 00:46:59Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
$lang->report->index = 'Report Home';
$lang->report->list = 'Report';
$lang->report->item = 'Item';
$lang->report->value = 'Value';
$lang->report->percent = '%';
$lang->report->undefined = 'Undefined';
$lang->report->query = 'Query';
$lang->report->annual = 'Annual Summary';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->index = 'Report Home';
$lang->report->list = 'Report';
$lang->report->item = 'Item';
$lang->report->value = 'Value';
$lang->report->percent = '%';
$lang->report->undefined = 'Undefined';
$lang->report->query = 'Query';
$lang->report->annual = 'Annual Summary';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->viewEveryoneAnnual = 'View everyone annual summary';
$lang->report->colors[] = 'AFD8F8';
$lang->report->colors[] = 'F6BD0F';
+11 -10
View File
@@ -9,16 +9,17 @@
* @version $Id: en.php 5080 2013-07-10 00:46:59Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
$lang->report->index = 'Accueil Rapports';
$lang->report->list = 'Rapports';
$lang->report->item = 'Item';
$lang->report->value = 'Valeur';
$lang->report->percent = '%';
$lang->report->undefined = 'N/D';
$lang->report->query = 'Requête';
$lang->report->annual = 'Résumé Annuel';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->index = 'Accueil Rapports';
$lang->report->list = 'Rapports';
$lang->report->item = 'Item';
$lang->report->value = 'Valeur';
$lang->report->percent = '%';
$lang->report->undefined = 'N/D';
$lang->report->query = 'Requête';
$lang->report->annual = 'Résumé Annuel';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->viewEveryoneAnnual = 'View everyone annual summary';
$lang->report->colors[] = 'AFD8F8';
$lang->report->colors[] = 'AFD8F8';
+11 -10
View File
@@ -9,16 +9,17 @@
* @version $Id: zh-cn.php 5080 2013-07-10 00:46:59Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
$lang->report->index = '统计首页';
$lang->report->list = '统计报表';
$lang->report->item = '条目';
$lang->report->value = '值';
$lang->report->percent = '百分比';
$lang->report->undefined = '未设定';
$lang->report->query = '查询';
$lang->report->annual = '年度总结';
$lang->report->project = '项目';
$lang->report->PO = 'PO';
$lang->report->index = '统计首页';
$lang->report->list = '统计报表';
$lang->report->item = '条目';
$lang->report->value = '值';
$lang->report->percent = '百分比';
$lang->report->undefined = '未设定';
$lang->report->query = '查询';
$lang->report->annual = '年度总结';
$lang->report->project = '项目';
$lang->report->PO = 'PO';
$lang->report->viewEveryoneAnnual = '查看所有人年度总结';
$lang->report->colors[] = 'AFD8F8';
$lang->report->colors[] = 'F6BD0F';
+6 -4
View File
@@ -98,12 +98,13 @@ class reportModel extends model
*/
public function getExecutions($begin = 0, $end = 0)
{
$tasks = $this->dao->select('t1.*, t2.name as executionName, t3.name as projectName')->from(TABLE_TASK)->alias('t1')
$permission = common::hasPriv('report', 'showProject') or $this->app->user->admin;
$tasks = $this->dao->select('t1.*, t2.name as executionName, t3.name as projectName')->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.execution = t2.id')
->leftJoin(TABLE_PROJECT)->alias('t3')->on('t1.project = t3.id')
->where('t1.status')->ne('cancel')
->andWhere('t1.deleted')->eq(0)
->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi()
->beginIF(!$permission)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi()
->andWhere('t2.deleted')->eq(0)
->andWhere('t1.parent')->lt(1)
->andWhere('t2.status')->eq('closed')
@@ -140,11 +141,12 @@ class reportModel extends model
*/
public function getProducts($conditions, $storyType = 'story')
{
$products = $this->dao->select('t1.id as id, t1.code, t1.name, t1.PO')->from(TABLE_PRODUCT)->alias('t1')
$permission = common::hasPriv('report', 'showProduct') or $this->app->user->admin;
$products = $this->dao->select('t1.id as id, t1.code, t1.name, t1.PO')->from(TABLE_PRODUCT)->alias('t1')
->leftJoin(TABLE_PROGRAM)->alias('t2')->on('t1.program = t2.id')
->where('t1.deleted')->eq(0)
->beginIF(strpos($conditions, 'closedProduct') === false)->andWhere('t1.status')->ne('closed')->fi()
->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->products)->fi()
->beginIF(!$permission)->andWhere('t1.id')->in($this->app->user->view->products)->fi()
->orderBy('t2.order_asc, t1.line_desc, t1.order_asc')
->fetchAll('id');
+60 -65
View File
@@ -54,14 +54,8 @@ $config->story->excludeCheckFileds = ',uploadImage,category,reviewer,reviewDitto
global $lang, $app;
$config->story->datatable = new stdclass();
if($app->tab == 'execution')
{
$config->story->datatable->defaultField = array('id','order', 'pri', 'title', 'plan', 'openedBy', 'assignedTo', 'estimate', 'status', 'stage', 'taskCount', 'actions');
}
else
{
$config->story->datatable->defaultField = array('id', 'pri', 'title', 'plan', 'openedBy', 'assignedTo', 'estimate', 'status', 'stage', 'taskCount', 'actions');
}
$config->story->datatable->defaultField = array('id', 'title', 'plan', 'pri', 'status', 'openedBy', 'estimate', 'reviewedBy', 'stage', 'assignedTo', 'taskCount', 'actions');
$config->story->datatable->fieldList['id']['title'] = 'idAB';
$config->story->datatable->fieldList['id']['fixed'] = 'left';
@@ -78,16 +72,70 @@ if($app->tab == 'execution')
$config->story->datatable->fieldList['order']['name'] = $this->lang->story->order;
}
$config->story->datatable->fieldList['title']['title'] = 'title';
$config->story->datatable->fieldList['title']['fixed'] = 'left';
$config->story->datatable->fieldList['title']['width'] = 'auto';
$config->story->datatable->fieldList['title']['required'] = 'yes';
$config->story->datatable->fieldList['plan']['title'] = 'planAB';
$config->story->datatable->fieldList['plan']['fixed'] = 'no';
$config->story->datatable->fieldList['plan']['width'] = '90';
$config->story->datatable->fieldList['plan']['required'] = 'no';
$config->story->datatable->fieldList['plan']['control'] = 'select';
$config->story->datatable->fieldList['plan']['dataSource'] = array('module' => 'productplan', 'method' => 'getPairs', 'params' => '$productID');
$config->story->datatable->fieldList['pri']['title'] = 'priAB';
$config->story->datatable->fieldList['pri']['fixed'] = 'left';
$config->story->datatable->fieldList['pri']['width'] = '35';
$config->story->datatable->fieldList['pri']['required'] = 'no';
$config->story->datatable->fieldList['pri']['name'] = $this->lang->story->pri;
$config->story->datatable->fieldList['title']['title'] = 'title';
$config->story->datatable->fieldList['title']['fixed'] = 'left';
$config->story->datatable->fieldList['title']['width'] = 'auto';
$config->story->datatable->fieldList['title']['required'] = 'yes';
$config->story->datatable->fieldList['status']['title'] = 'statusAB';
$config->story->datatable->fieldList['status']['fixed'] = 'no';
$config->story->datatable->fieldList['status']['width'] = '60';
$config->story->datatable->fieldList['status']['required'] = 'no';
$config->story->datatable->fieldList['openedBy']['title'] = 'openedByAB';
$config->story->datatable->fieldList['openedBy']['fixed'] = 'no';
$config->story->datatable->fieldList['openedBy']['width'] = '60';
$config->story->datatable->fieldList['openedBy']['required'] = 'no';
$config->story->datatable->fieldList['estimate']['title'] = 'estimateAB';
$config->story->datatable->fieldList['estimate']['fixed'] = 'no';
$config->story->datatable->fieldList['estimate']['width'] = '50';
$config->story->datatable->fieldList['estimate']['required'] = 'no';
$config->story->datatable->fieldList['reviewer']['title'] = 'reviewedBy';
$config->story->datatable->fieldList['reviewer']['control'] = 'multiple';
$config->story->datatable->fieldList['reviewer']['dataSource'] = array('module' => 'story', 'method' => 'getStoriesReviewer', 'params' => '$productID');
$config->story->datatable->fieldList['reviewedBy']['title'] = 'reviewedBy';
$config->story->datatable->fieldList['reviewedBy']['fixed'] = 'no';
$config->story->datatable->fieldList['reviewedBy']['width'] = '100';
$config->story->datatable->fieldList['reviewedBy']['required'] = 'no';
$config->story->datatable->fieldList['reviewedBy']['control'] = 'multiple';
$config->story->datatable->fieldList['reviewedBy']['dataSource'] = array('module' => 'story', 'method' => 'getStoriesReviewer', 'params' => '$productID');
$config->story->datatable->fieldList['reviewedDate']['title'] = 'reviewedDate';
$config->story->datatable->fieldList['reviewedDate']['fixed'] = 'no';
$config->story->datatable->fieldList['reviewedDate']['width'] = '90';
$config->story->datatable->fieldList['reviewedDate']['required'] = 'no';
$config->story->datatable->fieldList['stage']['title'] = 'stageAB';
$config->story->datatable->fieldList['stage']['fixed'] = 'no';
$config->story->datatable->fieldList['stage']['width'] = '85';
$config->story->datatable->fieldList['stage']['required'] = 'no';
$config->story->datatable->fieldList['assignedTo']['title'] = 'assignedTo';
$config->story->datatable->fieldList['assignedTo']['fixed'] = 'no';
$config->story->datatable->fieldList['assignedTo']['width'] = '90';
$config->story->datatable->fieldList['assignedTo']['required'] = 'no';
$config->story->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
$config->story->datatable->fieldList['assignedDate']['fixed'] = 'no';
$config->story->datatable->fieldList['assignedDate']['width'] = '90';
$config->story->datatable->fieldList['assignedDate']['required'] = 'no';
$config->story->datatable->fieldList['product']['title'] = 'product';
$config->story->datatable->fieldList['product']['control'] = 'hidden';
@@ -109,13 +157,6 @@ $config->story->datatable->fieldList['keywords']['fixed'] = 'no';
$config->story->datatable->fieldList['keywords']['width'] = '100';
$config->story->datatable->fieldList['keywords']['required'] = 'no';
$config->story->datatable->fieldList['plan']['title'] = 'planAB';
$config->story->datatable->fieldList['plan']['fixed'] = 'no';
$config->story->datatable->fieldList['plan']['width'] = '90';
$config->story->datatable->fieldList['plan']['required'] = 'no';
$config->story->datatable->fieldList['plan']['control'] = 'select';
$config->story->datatable->fieldList['plan']['dataSource'] = array('module' => 'productplan', 'method' => 'getPairs', 'params' => '$productID');
$config->story->datatable->fieldList['source']['title'] = 'source';
$config->story->datatable->fieldList['source']['fixed'] = 'no';
$config->story->datatable->fieldList['source']['width'] = '90';
@@ -131,57 +172,11 @@ $config->story->datatable->fieldList['category']['fixed'] = 'no';
$config->story->datatable->fieldList['category']['width'] = '60';
$config->story->datatable->fieldList['category']['required'] = 'no';
$config->story->datatable->fieldList['status']['title'] = 'statusAB';
$config->story->datatable->fieldList['status']['fixed'] = 'no';
$config->story->datatable->fieldList['status']['width'] = '60';
$config->story->datatable->fieldList['status']['required'] = 'no';
$config->story->datatable->fieldList['estimate']['title'] = 'estimateAB';
$config->story->datatable->fieldList['estimate']['fixed'] = 'no';
$config->story->datatable->fieldList['estimate']['width'] = '50';
$config->story->datatable->fieldList['estimate']['required'] = 'no';
$config->story->datatable->fieldList['stage']['title'] = 'stageAB';
$config->story->datatable->fieldList['stage']['fixed'] = 'no';
$config->story->datatable->fieldList['stage']['width'] = '85';
$config->story->datatable->fieldList['stage']['required'] = 'no';
$config->story->datatable->fieldList['openedBy']['title'] = 'openedByAB';
$config->story->datatable->fieldList['openedBy']['fixed'] = 'no';
$config->story->datatable->fieldList['openedBy']['width'] = '60';
$config->story->datatable->fieldList['openedBy']['required'] = 'no';
$config->story->datatable->fieldList['openedDate']['title'] = 'openedDate';
$config->story->datatable->fieldList['openedDate']['fixed'] = 'no';
$config->story->datatable->fieldList['openedDate']['width'] = '90';
$config->story->datatable->fieldList['openedDate']['required'] = 'no';
$config->story->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
$config->story->datatable->fieldList['assignedTo']['fixed'] = 'no';
$config->story->datatable->fieldList['assignedTo']['width'] = '90';
$config->story->datatable->fieldList['assignedTo']['required'] = 'no';
$config->story->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
$config->story->datatable->fieldList['assignedDate']['fixed'] = 'no';
$config->story->datatable->fieldList['assignedDate']['width'] = '90';
$config->story->datatable->fieldList['assignedDate']['required'] = 'no';
$config->story->datatable->fieldList['reviewedBy']['title'] = 'reviewedBy';
$config->story->datatable->fieldList['reviewedBy']['fixed'] = 'no';
$config->story->datatable->fieldList['reviewedBy']['width'] = '80';
$config->story->datatable->fieldList['reviewedBy']['required'] = 'no';
$config->story->datatable->fieldList['reviewedBy']['control'] = 'multiple';
$config->story->datatable->fieldList['reviewedBy']['dataSource'] = array('module' => 'story', 'method' => 'getStoriesReviewer', 'params' => '$productID');
$config->story->datatable->fieldList['reviewer']['title'] = 'reviewedBy';
$config->story->datatable->fieldList['reviewer']['control'] = 'multiple';
$config->story->datatable->fieldList['reviewer']['dataSource'] = array('module' => 'story', 'method' => 'getStoriesReviewer', 'params' => '$productID');
$config->story->datatable->fieldList['reviewedDate']['title'] = 'reviewedDate';
$config->story->datatable->fieldList['reviewedDate']['fixed'] = 'no';
$config->story->datatable->fieldList['reviewedDate']['width'] = '90';
$config->story->datatable->fieldList['reviewedDate']['required'] = 'no';
$config->story->datatable->fieldList['needReview']['title'] = 'needReview';
$config->story->datatable->fieldList['needReview']['control'] = 'select';
$config->story->datatable->fieldList['needReview']['dataSource'] = array('lang' => 'reviewList');
+14
View File
@@ -2528,6 +2528,20 @@ class story extends control
{
$this->session->set('storyPortParams', array('productID' => $productID, 'executionID' => $executionID));
/* Create field lists. */
if(!$productID)
{
$this->config->story->datatable->fieldList['branch']['dataSource'] = array('module' => 'branch', 'method' => 'getAllPairs', 'params' => 1);
$this->config->story->datatable->fieldList['module']['dataSource']['method'] = 'getAllModulePairs';
$this->config->story->datatable->fieldList['module']['dataSource']['params'] = 'story';
$this->config->story->datatable->fieldList['project']['dataSource'] = array('module' => 'project', 'method' => 'getPairsByIdList', 'params' => $executionID);
$this->config->story->datatable->fieldList['execution']['dataSource'] = array('module' => 'execution', 'method' => 'getPairs', 'params' => $executionID);
$productIdList = implode(',', array_flip($this->session->exportProductList));
$this->config->story->datatable->fieldList['plan']['dataSource'] = array('module' => 'productplan', 'method' => 'getPairs', 'params' => $productIdList);
}
$this->post->set('rows', $this->story->getExportStorys($executionID, $orderBy));
$this->fetch('port', 'export', 'model=story');
}
+2 -2
View File
@@ -3,9 +3,9 @@
.tab-pane h6, .tab-pane table {border: 1px solid #ddd; border-top: none;}
.tab-pane .table-data.table-borderless {border: none !important;}
.input-group .control-product + .chosen-container-single .chosen-single {border-radius: 2px 0 0 2px; border-right-width: 0; padding-right: 1px;}
.input-group .control-product + .chosen-container-single .chosen-single {border-radius: 2px 0 0 2px; border-right-width: 1px; padding-right: 1px;}
.input-group .control-product + .chosen-container-active .chosen-single {border-right-width: 1px; padding-right: 0;}
.input-group .control-branch + .chosen-container-single .chosen-single {border-radius: 0 2px 2px 0;}
.input-group .control-branch + .chosen-container-single .chosen-single {border-radius: 0 2px 2px 0; border-left-width: 0px;}
#batchCreateForm .input-group, #batchEditForm .input-group,
#batchCreateForm .input-group .form-control, #batchEditForm .input-group .form-control {position: static;}
+3 -3
View File
@@ -126,7 +126,7 @@ $lang->story->stageAB = '阶段';
$lang->story->stagedBy = '设置阶段者';
$lang->story->mailto = '抄送给';
$lang->story->openedBy = '由谁创建';
$lang->story->openedByAB = '创建';
$lang->story->openedByAB = '创建者';
$lang->story->openedDate = '创建日期';
$lang->story->assignedTo = '指派给';
$lang->story->assignedToAB = '指派';
@@ -139,7 +139,7 @@ $lang->story->closedReason = '关闭原因';
$lang->story->rejectedReason = '拒绝原因';
$lang->story->changedBy = '由谁变更';
$lang->story->changedDate = '变更时间';
$lang->story->reviewedBy = '由谁评审';
$lang->story->reviewedBy = '评审者';
$lang->story->reviewer = $lang->story->reviewedBy;
$lang->story->reviewers = '评审人员';
$lang->story->reviewedDate = '评审时间';
@@ -460,7 +460,7 @@ $lang->story->subDivideTip['subStory'] = '子需求无法细分';
$lang->story->subDivideTip['notWait'] = '该需求%s,无法进行细分操作';
$lang->story->subDivideTip['notActive'] = '需求不是激活状态,无法进行细分操作';
$lang->story->featureBar['browse']['all'] = $lang->all;
$lang->story->featureBar['browse']['all'] = '全部';
$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed;
$lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft'];
$lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing'];
+9 -6
View File
@@ -4931,21 +4931,24 @@ class storyModel extends model
public function printAssignedHtml($story, $users)
{
$btnTextClass = '';
$btnClass = '';
$assignedToText = zget($users, $story->assignedTo);
if(empty($story->assignedTo))
{
$btnTextClass = 'text-primary';
$btnClass = $btnTextClass = 'assigned-none';
$assignedToText = $this->lang->task->noAssigned;
}
if($story->assignedTo == $this->app->user->account) $btnTextClass = 'text-red';
$btnClass = $story->assignedTo == 'closed' ? ' disabled' : '';
$btnClass = "iframe btn btn-icon-left btn-sm {$btnClass}";
if($story->assignedTo == $this->app->user->account) $btnClass = $btnTextClass = 'assigned-current';
if(!empty($story->assignedTo) and $story->assignedTo != $this->app->user->account) $btnClass = $btnTextClass = 'assigned-other';
$btnClass .= $story->assignedTo == 'closed' ? ' disabled' : '';
$btnClass .= ' iframe btn btn-icon-left btn-sm';
$assignToLink = helper::createLink('story', 'assignTo', "storyID=$story->id&kanbanGroup=default&from=&storyType=$story->type", '', true);
$assignToHtml = html::a($assignToLink, "<i class='icon icon-hand-right'></i> <span class='{$btnTextClass}'>{$assignedToText}</span>", '', "class='$btnClass'");
$assignToHtml = html::a($assignToLink, "<i class='icon icon-hand-right'></i> <span>{$assignedToText}</span>", '', "class='$btnClass'");
echo !common::hasPriv($story->type, 'assignTo', $story) ? "<span style='padding-left: 21px'>{$assignedToText}</span>" : $assignToHtml;
echo !common::hasPriv($story->type, 'assignTo', $story) ? "<span style='padding-left: 21px' class='$btnTextClass'>{$assignedToText}</span>" : $assignToHtml;
}
/**
+1 -1
View File
@@ -38,7 +38,7 @@
<th class='c-title'><?php echo $lang->story->title;?></th>
<th class='c-status'><?php echo $lang->story->statusAB;?></th>
<th class='c-user'><?php echo $lang->story->openedByAB;?></th>
<th class='c-user'><?php echo $lang->story->assignedToAB;?></th>
<th class='c-user'><?php echo $lang->story->assignedTo;?></th>
</tr>
</thead>
<tbody>
+1 -1
View File
@@ -45,7 +45,7 @@ $config->task->defaultLoadCount = 50;
$config->task->custom = new stdclass();
$config->task->custom->createFields = $config->task->customCreateFields;
$config->task->custom->batchCreateFields = 'module,story,assignedTo,estimate,desc,pri';
$config->task->custom->batchCreateFields = 'module,story,assignedTo,estimate,estStarted,deadline,desc,pri';
$config->task->custom->batchEditFields = 'module,assignedTo,status,pri,estimate,record,left';
$config->task->excludeCheckFileds = ',pri,estStartedDitto,deadlineDitto,parent,regions,lanes,vision,region,';
+5 -1
View File
@@ -941,7 +941,11 @@ class task extends control
}
$execution = $this->execution->getById($task->execution);
if(!isonlybody() and $execution->type == 'kanban') return print(js::locate($this->createLink('execution', 'kanban', "executionID=$execution->id")));
if(!isonlybody() and $execution->type == 'kanban')
{
setcookie('taskToOpen', $taskID, 0, $this->config->webRoot, '', false, true);
return print(js::locate($this->createLink('execution', 'kanban', "executionID=$execution->id")));
}
$this->session->project = $task->project;
+2
View File
@@ -1,3 +1,4 @@
#mainContent {min-height: 500px;}
.table-recorded thead{background: rgb(245 245 245);}
.form-condensed .table-form {margin-bottom: 20px;}
.hours {display: flex; float: left; transform: translate(0, 50%); margin: 0;}
@@ -16,3 +17,4 @@
.main-header ul.hours:before{content:"("}
.main-header ul.hours:after{content:")"}
.body-modal .main-header>h2 { max-width: 70% !important; margin-right:0px;}
.table-record .form-date {border-right: none;}
-1
View File
@@ -6,7 +6,6 @@
#assignedTo a {border-color: transparent;}
#assignedTo a:hover {border-color: rgba(0,0,0,.2);}
#childrenTable tbody > tr:nth-child(odd) {background-color: #f5f5f5;}
.c-id {width: 50px;}
.c-pri {width: 40px;}
+1 -1
View File
@@ -583,7 +583,7 @@ $('#modalTeam tfoot .btn').click(function()
estimate = parseFloat($(this).parents('td').next('td').find('[name^=teamEstimate]').val());
if(!isNaN(estimate) && estimate > 0) time += estimate;
if(account != '' && (isNaN(estimate) || estimate == 0))
if(account != '' && (isNaN(estimate) || estimate <= 0))
{
bootbox.alert(account + ' ' + estimateNotEmpty);
error = true;

Some files were not shown because too many files have changed in this diff Show More