Merge branch 'sprint/244' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/241_tianshujie_70015
This commit is contained in:
@@ -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
@@ -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.
|
||||
|
||||
@@ -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
@@ -0,0 +1 @@
|
||||
UPDATE `zt_workflowlabel` SET `label` = '全部' where `label` = '所有' AND `action` = 'browse';
|
||||
@@ -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;?>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'] = '已关闭';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,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;}
|
||||
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
.confirm0 {color:gray; font-size:9px}
|
||||
.confirm1 {color:green; font-size:9px}
|
||||
.confirm0 {font-size:9px}
|
||||
.confirm1 {font-size:9px}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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ế';
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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'] = '設計如此';
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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):?>
|
||||
|
||||
@@ -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
@@ -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>";
|
||||
}
|
||||
|
||||
@@ -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!';
|
||||
|
||||
@@ -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!';
|
||||
|
||||
@@ -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 !';
|
||||
|
||||
@@ -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!';
|
||||
|
||||
@@ -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 = '该部门有子部门,不能删除!';
|
||||
|
||||
@@ -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 = '該部門有子部門,不能刪除!';
|
||||
|
||||
@@ -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';?>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = '进行中的项目';
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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()):?>
|
||||
|
||||
@@ -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';?>
|
||||
|
||||
@@ -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¶m=$execution->id", '', '', '', true), "<i class='icon icon-plus'></i> " . $lang->testcase->create, '', "class='btn btn-primary' data-app='{$this->app->tab}'");?>
|
||||
|
||||
@@ -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('"', ' '), array('“', ' '), htmlspecialchars_decode(strip_tags($row->$fieldName, '<img>')))) : print('');
|
||||
echo '","';
|
||||
echo '"';
|
||||
foreach($fields as $fieldName => $fieldLabel)
|
||||
{
|
||||
isset($row->$fieldName) ? print(str_replace(array('"', ' '), 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;
|
||||
|
||||
@@ -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?';
|
||||
|
||||
@@ -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?';
|
||||
|
||||
@@ -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?';
|
||||
|
||||
@@ -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 = '确定删除分支保护?';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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' => '');
|
||||
|
||||
@@ -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' => '');
|
||||
|
||||
@@ -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' => '');
|
||||
|
||||
@@ -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' => '');
|
||||
|
||||
@@ -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'] = '已关闭';
|
||||
|
||||
@@ -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;}
|
||||
|
||||
|
||||
@@ -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);?>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 = '';
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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'];
|
||||
|
||||
|
||||
@@ -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):?>
|
||||
|
||||
@@ -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'] = '进行中';
|
||||
|
||||
@@ -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'");
|
||||
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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'] = '进行中';
|
||||
|
||||
@@ -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'");
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'):?>
|
||||
<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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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'] = "公开 (有项目视图权限即可访问)";
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<?php
|
||||
$buildName = $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';
|
||||
$module = $type != 'bysearch' ? "¶m=$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>
|
||||
|
||||
@@ -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]))
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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¶m=$param&storyType=$storyType&orderBy=$orderBy&recTotal=$recTotal&recPerPage=$recPerPage&pageID=$pageID&projectID=$projectID");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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'];
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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'];
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,';
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user