Merge branch '15.6'

This commit is contained in:
王怡栋
2021-11-01 15:23:15 +08:00
107 changed files with 1865 additions and 256 deletions
+1 -1
View File
@@ -1 +1 @@
15.5
15.6
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '15.5'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '15.6'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
$config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php.
+8 -8
View File
@@ -377,16 +377,16 @@ INSERT INTO `zt_module` (`id`, `root`, `branch`, `name`, `parent`, `path`, `grad
(13, 1, 0, '合作洽谈', 0, ',13,', 1, 60, 'bug', '', '', '', '0'),
(14, 1, 0, '关于我们', 0, ',14,', 1, 70, 'bug', '', '', '', '0'),
(15, 6, 0, '企业管理', 0, ',15,', 1, 0, 'line', '', '', '', '0');
INSERT INTO `zt_product` (`id`, `program`, `name`, `code`, `bind`, `line`, `type`, `status`, `subStatus`, `desc`, `PO`, `QD`, `RD`, `acl`, `whitelist`, `createdBy`, `createdDate`, `createdVersion`, `order`, `deleted`, `storyConcept`) VALUES
(1, 6, '公司企业网站建设', 'companyWebsite', '0', 0, 'normal', 'normal', '', '建立公司企业网站,可以更好对外展示。<br />', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 09:57:07', '', 5, '0', 0),
(2, 6, '企业内部工时管理系统', 'workhourManage', '0', 0, 'normal', 'normal', '', '', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 11:15:20', '5.2.1', 10, '0', 0);
INSERT INTO `zt_product` (`id`, `program`, `name`, `code`, `bind`, `line`, `type`, `status`, `subStatus`, `desc`, `PO`, `QD`, `RD`, `acl`, `whitelist`, `createdBy`, `createdDate`, `createdVersion`, `order`, `deleted`) VALUES
(1, 6, '公司企业网站建设', 'companyWebsite', '0', 0, 'normal', 'normal', '', '建立公司企业网站,可以更好对外展示。<br />', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 09:57:07', '', 5, '0'),
(2, 6, '企业内部工时管理系统', 'workhourManage', '0', 0, 'normal', 'normal', '', '', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 11:15:20', '5.2.1', 10, '0');
INSERT INTO `zt_productplan` (`id`, `product`, `branch`, `parent`, `title`, `desc`, `begin`, `end`, `order`, `deleted`) VALUES
(1, 1, 0, 0, '1.0版本', '开发出企业网站1.0版本。<br />', '2020-06-05', '2021-06-04', '', '0');
INSERT INTO `zt_project` (`id`, `project`, `model`, `type`, `product`, `lifetime`, `budget`, `budgetUnit`, `attribute`, `percent`, `milestone`, `output`, `auth`, `parent`, `path`, `grade`, `name`, `code`, `begin`, `end`, `realBegan`, `realEnd`, `days`, `status`, `subStatus`, `statge`, `pri`, `desc`, `version`, `parentVersion`, `planDuration`, `realDuration`, `openedBy`, `openedDate`, `openedVersion`, `lastEditedBy`, `lastEditedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`, `storyConcept`) VALUES
(1, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,1,', 1, '企业网站第一期', 'coWeb1', '2020-06-05', '2021-12-04', '0000-00-00', '0000-00-00', 391, 'doing', '', '1', '1', '开发企业网站的基本雏形。<br />', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 5, '0', 0),
(2, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,2,', 1, '企业网站第二期', 'coWebsite2', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 260, 'wait', '', '1', '1', '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 10, '0', 0),
(7, 0, 'scrum', 'project', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', 'extend', 6, ',6,7,', 2, '企业管理系统', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', 'admin', '2021-04-28 11:22:04', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'projectManager', '', '', '', 'open', ',tester3,admin', 35, '0', 0),
(6, 0, '', 'program', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 0, ',6,', 1, '企业管理', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '', '', '', 'open', '', 30, '0', 0);
INSERT INTO `zt_project` (`id`, `project`, `model`, `type`, `lifetime`, `budget`, `budgetUnit`, `attribute`, `percent`, `milestone`, `output`, `auth`, `parent`, `path`, `grade`, `name`, `code`, `begin`, `end`, `realBegan`, `realEnd`, `days`, `status`, `subStatus`, `pri`, `desc`, `version`, `parentVersion`, `planDuration`, `realDuration`, `openedBy`, `openedDate`, `openedVersion`, `lastEditedBy`, `lastEditedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`) VALUES
(1, 7, '', 'sprint', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,1,', 1, '企业网站第一期', 'coWeb1', '2020-06-05', '2021-12-04', '0000-00-00', '0000-00-00', 391, 'doing', '', '1', '开发企业网站的基本雏形。<br />', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 5, '0'),
(2, 7, '', 'sprint', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,2,', 1, '企业网站第二期', 'coWebsite2', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 260, 'wait', '', '1', '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 10, '0'),
(7, 0, 'scrum', 'project', 'sprint', '0', 'CNY', '', 0, '0', '', 'extend', 6, ',6,7,', 2, '企业管理系统', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', 'admin', '2021-04-28 11:22:04', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'projectManager', '', '', '', 'open', ',tester3,admin', 35, '0'),
(6, 0, '', 'program', 'sprint', '0', 'CNY', '', 0, '0', '', '', 0, ',6,', 1, '企业管理', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '', '', '', 'open', '', 30, '0');
INSERT INTO `zt_projectcase` (`project`, `product`, `case`, `count`, `version`, `order`) VALUES
(1, 1, 2, 1, 1, 4),
(7, 1, 1, 1, 1, 5),
File diff suppressed because it is too large Load Diff
+33
View File
@@ -1,3 +1,36 @@
2021-10-12 15.6
修复的BUG
15263 项目文档库自定义权限问题
15248 产品计划截至时间为当日时项目集看板不显示该计划
15229 删除项目集,产品列表显示有问题
15186 产品计划关联研发需求界面搜索功能按条件搜索不到
15167 新手教程的提Bug任务没有需要输入的内容
15143 手册中搜索的下一页链接不正确
15089 项目集看板中未过期计划和正常发布中无数字显示
15088 使用指令修改任务状态无效
15065 点击完bug所属产品后再点击其他模块报错
14983 后台-二次开发-数据库很多字段描述是空的
14970 禅道页面加载十几秒
14929 创建产品时不选择项目集,重新编辑时不能修改所属项目集
14862 执行-测试-用例 页面展示了未和执行和需求相关的用例
14851 新手教程创建项目集没有提示保存
14785 集成gitlab时,gitlab列表不显示数据
14748 产品提交需求界面创建计划多次点击保存会生成多条数据
14690 新手教程语言项显示问题
14679 等保三级扫描的pro10.1版本漏洞
14674 普通用户帮助手册页点击下拉无响应
14632 浏览器通知只在地盘-仪表盘页面显示,不能在任意禅道页面推送显示。
14629 升级后下载附件提示乱码
14607 搜索条件保存后修改条件再次搜索无效
14594 顶级项目添加执行不能复制当前项目团队成员
14528 从我近期参与的项目页返回后显示空白页
14523 视野维护中移除可访问项目集后,该项目集可访问人员中没同步移除相关用户
14487 无用php记录太多拉低禅道整体性能
14486 需求搜索数据错误
14018 项目集排序权限没有登记
13907 已延期的产品添加迭代,迭代时间只能选择过去时间
13815 项目设置权限不生效
2021-09-14 15.5
完成的需求
28102 在项目集中添加批量编辑项目功能
+2 -2
View File
@@ -88,11 +88,11 @@ class api extends router
}
else
{
$this->path = trim((strpos($_SERVER['REQUEST_URI'], '?') > 0 ? strstr($_SERVER['REQUEST_URI'], '?', true) : $_SERVER['REQUEST_URI']), '/');
$this->path = rtrim((strpos($_SERVER['REQUEST_URI'], '?') > 0 ? strstr($_SERVER['REQUEST_URI'], '?', true) : $_SERVER['REQUEST_URI']), '/');
}
$dir = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/');
if($dir != '') $this->path = substr($this->path, strlen($dir));
if($dir != '' and strpos($this->path, $dir) === 0) $this->path = substr($this->path, strlen($dir));
$subPos = strpos($this->path, '/', 1);
+1 -1
View File
@@ -12,7 +12,7 @@
$lang->action->common = 'Log';
$lang->action->product = $lang->productCommon;
$lang->action->project = 'Project';
$lang->action->execution = $lang->executionCommon;
$lang->action->execution = $lang->execution->common;
$lang->action->objectType = 'Object Type';
$lang->action->objectID = 'ID';
$lang->action->objectName = 'Objekt Name';
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->action->common = 'Log';
$lang->action->id = 'ID';
$lang->action->product = $lang->productCommon;
$lang->action->project = 'Project';
$lang->action->execution = $lang->executionCommon;
$lang->action->execution = $lang->execution->common;
$lang->action->objectType = 'Object Type';
$lang->action->objectID = 'ID';
$lang->action->objectName = 'Object Name';
+2 -2
View File
@@ -11,8 +11,8 @@
*/
$lang->action->common = 'Log';
$lang->action->product = $lang->productCommon;
$lang->action->project = $lang->executionCommon;
$lang->action->execution = $lang->executionCommon;
$lang->action->project = 'Project';
$lang->action->execution = $lang->execution->common;
$lang->action->objectType = "Type d'objet";
$lang->action->objectID = 'ID';
$lang->action->objectName = "Nom de l'object";
+1 -1
View File
@@ -12,7 +12,7 @@
$lang->action->common = 'Nhật ký';
$lang->action->product = $lang->productCommon;
$lang->action->project = 'Project';
$lang->action->execution = $lang->executionCommon;
$lang->action->execution = $lang->execution->common;
$lang->action->objectType = 'Loại đối tượng';
$lang->action->objectID = 'ID';
$lang->action->objectName = 'Tên đối tượng';
+1 -1
View File
@@ -15,7 +15,7 @@ $lang->action->common = '系统日志';
$lang->action->id = '编号';
$lang->action->product = $lang->productCommon;
$lang->action->project = '项目';
$lang->action->execution = $lang->executionCommon;
$lang->action->execution = $lang->execution->common;
$lang->action->objectType = '对象类型';
$lang->action->objectID = '对象ID';
$lang->action->objectName = '对象名称';
+18 -13
View File
@@ -11,19 +11,24 @@
*/
global $config;
$lang->action->common = '系統日誌';
$lang->action->product = $lang->productCommon;
$lang->action->project = '項目';
$lang->action->execution = $lang->executionCommon;
$lang->action->objectType = '對象類型';
$lang->action->objectID = '對象ID';
$lang->action->objectName = '對象名稱';
$lang->action->actor = '操作者';
$lang->action->action = '動作';
$lang->action->actionID = '記錄ID';
$lang->action->date = '日期';
$lang->action->extra = '附加值';
$lang->action->system = '系統';
$lang->action->common = '系統日誌';
$lang->action->id = '編號';
$lang->action->product = $lang->productCommon;
$lang->action->project = '項目';
$lang->action->execution = $lang->executionCommon;
$lang->action->objectType = '對象類型';
$lang->action->objectID = '對象ID';
$lang->action->objectName = '對象名稱';
$lang->action->actor = '操作者';
$lang->action->action = '動作';
$lang->action->actionID = '記錄ID';
$lang->action->date = '日期';
$lang->action->extra = '附加值';
$lang->action->system = '系統';
$lang->action->url = '網址';
$lang->action->contentType = '內容類型';
$lang->action->data = '數據';
$lang->action->result = '結果';
$lang->action->trash = '資源回收筒';
$lang->action->undelete = '還原';
+2 -2
View File
@@ -864,8 +864,8 @@ class actionModel extends model
}
if($this->session->actionQuery == false) $this->session->set('actionQuery', ' 1 = 1');
$allProducts = "`product` = 'all'";
$allProjects = "`project` = 'all'";
$allProducts = "`product` = 'all'";
$allProjects = "`project` = 'all'";
$allExecutions = "`execution` = 'all'";
$actionQuery = $this->session->actionQuery;
+3 -5
View File
@@ -12,6 +12,8 @@
global $config;
$lang->block = new stdclass();
$lang->block->common = '區塊';
$lang->block->id = '編號';
$lang->block->params = '參數';
$lang->block->name = '區塊名稱';
$lang->block->style = '外觀';
$lang->block->grid = '位置';
@@ -76,10 +78,6 @@ $lang->block->selectProduct = '選擇產品';
$lang->block->of = '的';
$lang->block->remain = '剩餘工時';
$lang->block->params = new stdclass();
$lang->block->params->name = '參數名稱';
$lang->block->params->value = '參數值';
$lang->block->createBlock = '添加區塊';
$lang->block->editBlock = '編輯區塊';
$lang->block->ordersSaved = '排序已保存';
@@ -538,7 +536,7 @@ $lang->block->typeList->testtask['done'] = '已測版本';
$lang->block->typeList->testtask['all'] = '全部';
$lang->block->modules['project']->moreLinkList = new stdclass();
$lang->block->modules['project']->moreLinkList->recentproject = 'project|browse|';
$lang->block->modules['project']->moreLinkList->recentproject = $config->systemMode == 'new' ? 'project|browse|' : 'execution|all|';
$lang->block->modules['project']->moreLinkList->statistic = 'project|browse|';
$lang->block->modules['project']->moreLinkList->project = 'project|browse|';
$lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|';
+1 -1
View File
@@ -17,7 +17,7 @@
.table .c-burn {width: 150px;}
</style>
<?php if(empty($executionStats)): ?>
<div class='empty-tip'><?php common::printLink('execution', 'create', '', "<i class='icon-plus'></i> " . $lang->execution->create, '', "class='btn btn-primary'")?></div>
<div class='empty-tip'><?php common::printLink('execution', 'create', '', "<i class='icon-plus'></i> " . $lang->execution->create, '', "class='btn btn-primary' data-app='execution'")?></div>
<?php else:?>
<div class="panel-body has-table scrollbar-hover">
<table class='table table-borderless table-hover table-fixed table-fixed-head tablesorter block-projects tablesorter'>
+1 -1
View File
@@ -724,7 +724,7 @@ class bug extends control
/* Judge bug exits or not. */
$bugID = (int)$bugID;
$bug = $this->bug->getById($bugID, true);
if(!$bug) die(js::error($this->lang->notFound) . js::locate('back'));
if(!$bug) die(js::error($this->lang->notFound) . js::locate($this->createLink('qa', 'index')));
$this->session->set('storyList', '', 'product');
$this->session->set('projectList', $this->app->getURI(true) . "#app={$this->app->tab}", 'project');
+1
View File
@@ -44,3 +44,4 @@ html[lang='en'] #deadlineTd .input-group-addon {padding: 5px 18px;}
#typeBox .required:after {right: 1px;}
#osBox .required:after {right: 1px;}
#osBox {width: 190px;}
#projectBox .required:after {right: 1px;}
+7
View File
@@ -30,6 +30,13 @@ $lang->bug->pri = '優先順序';
$lang->bug->type = 'Bug類型';
$lang->bug->os = '操作系統';
$lang->bug->browser = '瀏覽器';
$lang->bug->hardware = '硬件';
$lang->bug->result = '結果';
$lang->bug->repo = '所屬版本庫';
$lang->bug->lines = '代碼行';
$lang->bug->v1 = '版本1';
$lang->bug->v2 = '版本2';
$lang->bug->repoType = '版本庫類型';
$lang->bug->steps = '重現步驟';
$lang->bug->status = 'Bug狀態';
$lang->bug->statusAB = '狀態';
+1 -1
View File
@@ -188,7 +188,7 @@ class build extends control
if(!$build)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
die(js::error($this->lang->notFound) . js::locate($this->createLink('execution', 'all')));
}
$this->session->project = $build->project;
+2
View File
@@ -29,6 +29,7 @@ $lang->build->basicInfo = '基本信息';
$lang->build->id = 'ID';
$lang->build->product = $lang->productCommon;
$lang->build->project = '所屬項目';
$lang->build->branch = '平台/分支';
$lang->build->execution = '所屬' . $lang->executionCommon;
$lang->build->name = '名稱編號';
@@ -37,6 +38,7 @@ $lang->build->builder = '構建者';
$lang->build->scmPath = '原始碼地址';
$lang->build->filePath = '下載地址';
$lang->build->desc = '描述';
$lang->build->mailto = 'Mailto';
$lang->build->files = '上傳發行包';
$lang->build->last = '上個版本';
$lang->build->packageType = '包類型';
+1 -1
View File
@@ -377,7 +377,7 @@ class caselib extends control
{
$libID = (int)$libID;
$lib = $this->caselib->getById($libID, true);
if(!isset($lib->id)) die(js::error($this->lang->notFound) . js::locate('back'));
if(!isset($lib->id)) die(js::error($this->lang->notFound) . js::locate($this->createLink('qa', 'index')));
/* Set lib menu. */
$libraries = $this->caselib->getLibraries();
+14 -2
View File
@@ -361,9 +361,21 @@ class commonModel extends model
$html .= "<i class='icon icon-plus-solid-circle text-secondary'></i>";
$html .= "</a><ul class='dropdown-menu pull-right create-list'>";
/* Initialize the default values. */
$showCreateList = $needPrintDivider = false;
$productID = isset($_SESSION['product']) ? $_SESSION['product'] : 0;
if(!$productID and $app->user->view->products) $productID = current(explode(',', $app->user->view->products));
/* Get default product id. */
$deletedProducts = $app->dbh->query("SELECT id FROM " . TABLE_PRODUCT . " WHERE `deleted` = '1'")->fetchAll();
$deletedProductIds = array();
foreach($deletedProducts as $product) $deletedProductIds[] = $product->id;
$productID = (isset($_SESSION['product']) and !in_array($_SESSION['product'], $deletedProductIds)) ? $_SESSION['product'] : 0;
if(!$productID and $app->user->view->products)
{
$viewProducts = explode(',', $app->user->view->products);
$viewProducts = array_diff($viewProducts, $deletedProductIds);
$productID = current($viewProducts);
}
/* Check whether the creation permission is available, and print create buttons. */
foreach($lang->createIcons as $objectType => $objectIcon)
+4 -2
View File
@@ -216,8 +216,7 @@ class company extends control
/* Get projects' list.*/
$projects = $this->loadModel('project')->getPairsByProgram(0);
$projects = array($this->lang->company->project) + $projects;
$this->view->projects = $projects;
$this->view->projects = array($this->lang->company->project) + $projects;;
/* Get executions' list.*/
$executions = $this->loadModel('execution')->getPairs(0, 'all', 'nocode');
@@ -255,10 +254,13 @@ class company extends control
/* Build search form. */
$executions[0] = '';
$products[0] = '';
$projects[0] = '';
ksort($executions);
ksort($products);
ksort($projects);
$executions['all'] = $this->lang->execution->allExecutions;
$products['all'] = $this->lang->product->allProduct;
$projects['all'] = $this->lang->project->all;
foreach($this->lang->action->search->label as $action => $name)
{
+2
View File
@@ -18,6 +18,7 @@ $lang->company->browse = "用戶列表";
$lang->company->dynamic = "組織動態";
$lang->company->orgView = '組織視圖';
$lang->company->id = '編號';
$lang->company->name = '公司名稱';
$lang->company->phone = '聯繫電話';
$lang->company->fax = '傳真';
@@ -27,6 +28,7 @@ $lang->company->website = '官網';
$lang->company->backyard = '內網';
$lang->company->guest = '匿名登錄';
$lang->company->admins = '管理員';
$lang->company->deleted = '已刪除';
$lang->company->product = $lang->productCommon;
$lang->company->project = '項目';
+17 -7
View File
@@ -3,13 +3,23 @@ $lang->compile->common = '構建';
$lang->compile->browse = '構建歷史';
$lang->compile->logs = '構建日誌';
$lang->compile->id = 'ID';
$lang->compile->name = '構建名稱';
$lang->compile->buildType = '構建引擎';
$lang->compile->status = '構建狀態';
$lang->compile->time = '構建時間';
$lang->compile->result = '構建結果';
$lang->compile->refresh = '刷新';
$lang->compile->id = 'ID';
$lang->compile->name = '構建名稱';
$lang->compile->buildType = '構建引擎';
$lang->compile->status = '構建狀態';
$lang->compile->time = '構建時間';
$lang->compile->result = '構建結果';
$lang->compile->refresh = '刷新';
$lang->compile->job = '構建任務';
$lang->compile->queue = '隊列';
$lang->compile->atTime = '執行時間';
$lang->compile->testtask = '測試單';
$lang->compile->tag = '標籤';
$lang->compile->times = '次數';
$lang->compile->createdBy = '由誰創建';
$lang->compile->createdDate = '創建日期';
$lang->compile->updateDate = '編輯日期';
$lang->compile->deleted = '已刪除';
$lang->compile->statusList['success'] = '成功';
$lang->compile->statusList['failure'] = '失敗';
+2
View File
@@ -1,5 +1,7 @@
<?php
$lang->cron->common = '定時任務';
$lang->cron->id = '編號';
$lang->cron->buildin = '內置';
$lang->cron->index = '首頁';
$lang->cron->list = '任務列表';
$lang->cron->create = '添加';
+1 -1
View File
@@ -2,7 +2,7 @@
global $config;
$lang->custom->common = 'Custom';
$lang->custom->ID = 'ID';
$lang->custom->id = 'ID';
$lang->custom->index = 'Home';
$lang->custom->set = 'Customize';
$lang->custom->restore = 'Reset';
+1
View File
@@ -2,6 +2,7 @@
global $config;
$lang->custom->common = '自定義';
$lang->custom->id = '編號';
$lang->custom->index = '首頁';
$lang->custom->set = '自定義配置';
$lang->custom->restore = '恢復預設';
+3
View File
@@ -10,6 +10,9 @@
* @link http://www.zentao.net
*/
$lang->dept->common = '部門結構';
$lang->dept->id = '編號';
$lang->dept->path = '路徑';
$lang->dept->position = '職位';
$lang->dept->manageChild = "下級部門";
$lang->dept->edit = "編輯部門";
$lang->dept->delete = "刪除部門";
+2 -2
View File
@@ -475,7 +475,7 @@ class doc extends control
/* Get doc. */
$docID = (int)$docID;
$doc = $this->doc->getById($docID, $version, true);
if(!$doc) die(js::error($this->lang->notFound) . js::locate('back'));
if(!$doc) die(js::error($this->lang->notFound) . js::locate($this->createLink('doc', 'index')));
/* The global search opens in the document library. */
if(!isonlybody())
@@ -914,7 +914,7 @@ class doc extends control
if($docID)
{
$doc = $this->doc->getById($docID, $version, true);
if(!$doc) die(js::error($this->lang->notFound) . js::locate('back'));
if(!$doc) die(js::error($this->lang->notFound));
if($doc->keywords)
{
+6
View File
@@ -53,6 +53,12 @@ $lang->doc->searchResult = '搜索結果';
$lang->doc->mailto = '抄送給';
$lang->doc->noModule = '文檔庫下沒有目錄和文檔,請維護目錄或者創建文檔';
$lang->doc->noChapter = '手冊下沒有章節和文章,請維護手冊';
$lang->doc->views = '瀏覽次數';
$lang->doc->draft = '草稿';
$lang->doc->collector = '收藏者';
$lang->doc->main = '文檔主庫';
$lang->doc->order = '排序';
$lang->doc->doc = '文檔';
$lang->doc->moduleDoc = '按模組瀏覽';
$lang->doc->searchDoc = '搜索';
+3
View File
@@ -154,6 +154,7 @@ class docModel extends model
if(strpos($trimedUsers, ',' . $this->app->user->account . ',') === false) $lib->users .= ',' . $this->app->user->account;
}
$lib->name = trim($lib->name); //Temporary treatment: Code for bug #15528.
$this->dao->insert(TABLE_DOCLIB)->data($lib)->autoCheck()
->batchCheck($this->config->doc->createlib->requiredFields, 'notempty')
->exec();
@@ -183,6 +184,8 @@ class docModel extends model
$libCreatedBy = $this->dao->select('*')->from(TABLE_ACTION)->where('objectType')->eq('doclib')->andWhere('objectID')->eq($libID)->andWhere('action')->eq('created')->fetch('actor');
$lib->users = $libCreatedBy ? $libCreatedBy : $this->app->user->account;
}
$lib->name = trim($lib->name); //Temporary treatment: Code for bug #15528.
$this->dao->update(TABLE_DOCLIB)->data($lib)->autoCheck()
->batchCheck($this->config->doc->editlib->requiredFields, 'notempty')
->where('id')->eq($libID)
+1 -1
View File
@@ -25,7 +25,7 @@
<?php echo $lib->type != 'book' ? $lang->doc->editLib : $lang->doc->editBook;?>
</h2>
</div>
<form method='post' class='form-ajax'>
<form method='post' target="hiddenwin">
<table class='table table-form'>
<?php if(!empty($lib->product)):?>
<tr>
+3
View File
@@ -26,6 +26,9 @@ $lang->entry->editedby = '最後編輯';
$lang->entry->editedDate = '編輯時間';
$lang->entry->date = '請求時間';
$lang->entry->url = '請求地址';
$lang->entry->calledTime = '調用時間';
$lang->entry->editedBy = '由誰編輯';
$lang->entry->deleted = '已刪除';
$lang->entry->confirmDelete = '您確認要刪除該應用嗎?';
$lang->entry->help = '使用說明';
+1 -1
View File
@@ -10,7 +10,7 @@
* @link http://www.zentao.net
*/
/* Fields. */
$lang->execution->allExecutions = 'All ' . $lang->executionCommon . 's';
$lang->execution->allExecutions = 'All ' . $lang->execution->common . 's';
$lang->execution->allExecutionAB = 'Execution List';
$lang->execution->id = $lang->executionCommon . ' ID';
$lang->execution->type = $lang->executionCommon . 'Type';
+1 -1
View File
@@ -10,7 +10,7 @@
* @link https://www.zentao.pm
*/
/* Fields. */
$lang->execution->allExecutions = 'Tous les ' . $lang->executionCommon . 's';
$lang->execution->allExecutions = 'Tous les ' . $lang->execution->common . 's';
$lang->execution->allExecutionAB = 'Execution List';
$lang->execution->id = $lang->executionCommon . ' ID';
$lang->execution->type = $lang->executionCommon . 'Type';
+1 -1
View File
@@ -10,7 +10,7 @@
* @link http://www.zentao.net
*/
/* Fields. */
$lang->execution->allExecutions = 'Tất cả ' . $lang->executionCommon;
$lang->execution->allExecutions = 'Tất cả ' . $lang->execution->common;
$lang->execution->allExecutionAB = 'Execution List';
$lang->execution->id = 'ID '.$lang->executionCommon;
$lang->execution->type = 'Loại';
+1 -1
View File
@@ -10,7 +10,7 @@
* @link http://www.zentao.net
*/
/* 字段列表。*/
$lang->execution->allExecutions = '所有' . $lang->executionCommon;
$lang->execution->allExecutions = '所有' . $lang->execution->common;
$lang->execution->allExecutionAB = "{$lang->execution->common}列表";
$lang->execution->id = $lang->executionCommon . '编号';
$lang->execution->type = $lang->executionCommon . '类型';
+7 -1
View File
@@ -102,6 +102,12 @@ $lang->execution->noTeam = '暫時沒有團隊成員';
$lang->execution->or = '或';
$lang->execution->selectProject = '請選擇項目';
/* Fields of zt_team. */
$lang->execution->root = '源ID';
$lang->execution->estimate = '預計';
$lang->execution->consumed = '消耗';
$lang->execution->left = '剩餘';
if($this->config->systemMode == 'new') $lang->execution->copyTeamTip = "可以選擇複製項目或{$lang->execution->common}團隊的成員";
if($this->config->systemMode == 'classic') $lang->execution->copyTeamTip = "可以選擇複製{$lang->executionCommon}團隊的成員";
@@ -315,7 +321,7 @@ if($config->systemMode == 'new') $lang->execution->copyTeamTitle = "選擇
/* 交互提示。*/
$lang->execution->confirmDelete = "您確定刪除{$lang->executionCommon}[%s]嗎?";
$lang->execution->confirmUnlinkMember = "您確定從該{$lang->executionCommon}中移除該用戶嗎?";
$lang->execution->confirmUnlinkStory = "移除該{$lang->SRCommon}后,該{$lang->SRCommon}關联的用例将被移除,該{$lang->SRCommon}关联的任務将被取消,請確認。";
$lang->execution->confirmUnlinkStory = "移除該{$lang->SRCommon}後,該{$lang->SRCommon}關聯的用例將被移除,該{$lang->SRCommon}關聯的任務將被取消,請確認。";
$lang->execution->confirmSyncStories = "修改所屬項目後,執行關聯的{$lang->SRCommon}是否同步到新項目中?";
$lang->execution->confirmUnlinkExecutionStory = "您確定從該項目中移除該{$lang->SRCommon}嗎?";
$lang->execution->notAllowedUnlinkStory = "該{$lang->SRCommon}已經與項目下{$lang->executionCommon}相關聯,請從{$lang->executionCommon}中移除後再操作。";
+3 -1
View File
@@ -49,7 +49,7 @@ class executionModel extends model
$loginLink = $this->config->requestType == 'GET' ? "?{$this->config->moduleVar}=user&{$this->config->methodVar}=login" : "user{$this->config->requestFix}login";
if(strpos($this->server->http_referer, $loginLink) !== false) die(js::locate(helper::createLink('execution', 'index')));
die(js::locate('back'));
die(js::locate(helper::createLink('execution', 'all')));
}
/**
@@ -1180,6 +1180,8 @@ class executionModel extends model
*/
public function getByProject($projectID, $status = 'all', $limit = 0, $pairs = false)
{
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getExecutionPairs();
$project = $this->loadModel('project')->getByID($projectID);
$orderBy = (isset($project->model) and $project->model == 'waterfall') ? 'begin_asc,id_asc' : 'begin_desc,id_desc';
+1
View File
@@ -10,6 +10,7 @@
* @link http://www.zentao.net
*/
$lang->extension->common = '插件管理';
$lang->extension->id = '編號';
$lang->extension->browse = '瀏覽插件';
$lang->extension->install = '安裝插件';
$lang->extension->installAuto = '自動安裝';
+1
View File
@@ -114,6 +114,7 @@ class file extends control
{
if(session_id() != $this->app->sessionID) helper::restartSession($this->app->sessionID);
$file = $this->file->getById($fileID);
if(empty($file)) die("<html><head><meta charset='utf-8'></head><body>{$this->lang->file->fileNotFound}</body></html>");
/* Judge the mode, down or open. */
$mode = 'down';
+4
View File
@@ -11,6 +11,10 @@
*/
$lang->file = new stdclass();
$lang->file->common = '附件';
$lang->file->id = '編號';
$lang->file->objectType = '對象類型';
$lang->file->objectID = '對象ID';
$lang->file->deleted = '已刪除';
$lang->file->uploadImages = '多圖上傳';
$lang->file->download = '下載附件';
$lang->file->uploadDate = '上傳時間:';
+2
View File
@@ -34,6 +34,8 @@ $lang->group->dynamic = '可查看動態';
$lang->group->noticeVisit = '空代表沒有訪問限制';
$lang->group->noneProgram = "暫時沒有項目集";
$lang->group->noneProduct = "暫時沒有{$lang->productCommon}";
$lang->group->project = '項目';
$lang->group->group = '分組';
global $config;
if($config->systemMode == 'new') $lang->group->noneProject = '暫時沒有項目';
+3 -2
View File
@@ -233,10 +233,11 @@ class install extends control
*/
public function step6()
{
$this->view->title = $this->lang->install->success;
$installFileDeleted = unlink($this->app->getAppRoot() . 'www/install.php');
$this->view->installFileDeleted = $installFileDeleted;
$this->view->title = $this->lang->install->success;
$this->display();
unlink($this->app->getAppRoot() . 'www/install.php');
unlink($this->app->getAppRoot() . 'www/upgrade.php');
unset($_SESSION['installing']);
session_destroy();
+13
View File
@@ -8,3 +8,16 @@ function showVideo()
{
$('video').removeClass('hidden');
}
$(function()
{
$('#modeclassic').click(function()
{
$('#selectedModeTips').show();
});
$('#modenew').click(function()
{
$('#selectedModeTips').hide();
});
})
+4 -2
View File
@@ -174,8 +174,10 @@ $lang->install->success = "Installiert!";
$lang->install->login = 'Login ZenTao';
$lang->install->register = 'Bei ZenTao registieren';
$lang->install->joinZentao = <<<EOT
<p>Sie haben ZenTao %s installiert.<strong class='text-danger'> Bitte löschen Sie die install.php schnellstmöglich</strong>.</p><p>Hinweis: Wenn Sie über ZenTao informiert bleiben möchten, registieren Sie sich bitte unter (<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
$lang->install->successLabel = "<p>Sie haben ZenTao %s installiert.</p>";
$lang->install->successNoticeLabel = "<p>Sie haben ZenTao %s installiert.<strong class='text-danger'> Bitte löschen Sie die install.php schnellstmöglich</strong>.</p>";
$lang->install->joinZentao = <<<EOT
<p>Hinweis: Wenn Sie über ZenTao informiert bleiben möchten, registieren Sie sich bitte unter (<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
EOT;
$lang->install->product = array('chanzhi', 'zdoo');
+4 -2
View File
@@ -206,8 +206,10 @@ $lang->install->success = "Installed!";
$lang->install->login = 'ZenTao Login';
$lang->install->register = 'ZenTao Community Signup';
$lang->install->joinZentao = <<<EOT
<p>You have installed ZenTao %s.<strong class='text-danger'> Please delete install.php</strong>.</p><p>Note: In order to get the latest news of ZenTao, please sign up on ZenTao Community(<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
$lang->install->successLabel = "<p>You have installed ZenTao %s.</p>";
$lang->install->successNoticeLabel = "<p>You have installed ZenTao %s.<strong class='text-danger'> Please delete install.php</strong>.</p>";
$lang->install->joinZentao = <<<EOT
<p>Note: In order to get the latest news of ZenTao, please sign up on ZenTao Community(<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
EOT;
$lang->install->product = array('chanzhi', 'zdoo', 'ydisk', 'meshiot');
+4 -2
View File
@@ -174,8 +174,10 @@ $lang->install->success = "Installé !";
$lang->install->login = 'Login ZenTao';
$lang->install->register = "S'enregistrer sur la Communauté ZenTao";
$lang->install->joinZentao = <<<EOT
<p>Vous avez installé ZenTao %s.<strong class='text-danger'> Supprimez install.php asap</strong>.</p><p>Note : Afin d'obtenir les dernières infos de ZenTao, enregistrz-vous chez ZenTao(<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
$lang->install->successLabel = "<p>Vous avez installé ZenTao %s.</p>";
$lang->install->successNoticeLabel = "<p>Vous avez installé ZenTao %s.<strong class='text-danger'> Supprimez install.php asap</strong>.</p>";
$lang->install->joinZentao = <<<EOT
<p>Note : Afin d'obtenir les dernières infos de ZenTao, enregistrz-vous chez ZenTao(<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
EOT;
$lang->install->product = array('chanzhi', 'zdoo');
+4 -2
View File
@@ -174,8 +174,10 @@ $lang->install->success = "Đã được cài đặt!";
$lang->install->login = 'Đăng nhập ZenTao';
$lang->install->register = 'Đăng ký cộng đồng ZenTao';
$lang->install->joinZentao = <<<EOT
<p>Bạn đã cài đặt ZenTao %s.<strong class='text-danger'> Vui lòng xóa install.php</strong>.</p><p>Chú ý: Để nhận tin tức mới nhất về ZenTao, vui lòng đăng ký trên Cộng đồng ZenTao(<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
$lang->install->successLabel = "<p>Bạn đã cài đặt ZenTao %s.</p>";
$lang->install->successNoticeLabel = "<p>Bạn đã cài đặt ZenTao %s.<strong class='text-danger'> Vui lòng xóa install.php</strong>.</p>";
$lang->install->joinZentao = <<<EOT
<p>Chú ý: Để nhận tin tức mới nhất về ZenTao, vui lòng đăng ký trên Cộng đồng ZenTao(<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
EOT;
$lang->install->product = array('chanzhi', 'zdoo', 'ydisk', 'meshiot');
+4 -2
View File
@@ -206,8 +206,10 @@ $lang->install->success = "安装成功";
$lang->install->login = '登录禅道管理系统';
$lang->install->register = '禅道社区注册';
$lang->install->joinZentao = <<<EOT
<p>您已经成功安装禅道管理系统%s,<strong class='text-danger'>请及时删除install.php</strong>。</p><p>友情提示:为了您及时获得禅道的最新动态,请在禅道社区(<a href='https://www.zentao.net' class='alert-link' target='_blank'>www.zentao.net</a>)进行登记。</p>
$lang->install->successLabel = "<p>您已经成功安装禅道管理系统%s。</p>";
$lang->install->successNoticeLabel = "<p>您已经成功安装禅道管理系统%s,<strong class='text-danger'>请及时删除install.php</strong>。</p>";
$lang->install->joinZentao = <<<EOT
<p>友情提示:为了您及时获得禅道的最新动态,请在禅道社区(<a href='https://www.zentao.net' class='alert-link' target='_blank'>www.zentao.net</a>)进行登记。</p>
EOT;
$lang->install->product = array('chanzhi', 'zdoo', 'xuanxuan', 'ydisk', 'meshiot');
+5 -3
View File
@@ -58,7 +58,7 @@ $lang->install->introductionContent = <<<EOT
<p>項目用來組織相應的人力進行研發,做好項目過程的跟蹤管理,多快好省地完成項目。</p>
</div>
<div class='block-details block-right'>
<p class='block-title'><i class='icon icon-product'></i><strong>執行</strong></p>
<p class='block-title'><i class='icon icon-run'></i><strong>執行</strong></p>
<p>執行用來做任務的分解、指派和跟蹤,保證項目目標可以落實到人來執行。<p>
</div>
</div>
@@ -206,8 +206,10 @@ $lang->install->success = "安裝成功";
$lang->install->login = '登錄禪道管理系統';
$lang->install->register = '禪道社區註冊';
$lang->install->joinZentao = <<<EOT
<p>您已經成功安裝禪道管理系統%s,<strong class='text-danger'>請及時刪除install.php</strong>。</p><p>友情提示:為了您及時獲得禪道的最新動態,請在禪道社區(<a href='https://www.zentao.net' class='alert-link' target='_blank'>www.zentao.net</a>)進行登記。</p>
$lang->install->successLabel = "<p>您已經成功安裝禪道管理系統%s。</p>";
$lang->install->successNoticeLabel = "<p>您已經成功安裝禪道管理系統%s,<strong class='text-danger'>請及時刪除install.php</strong>。</p>";
$lang->install->joinZentao = <<<EOT
<p>友情提示:為了您及時獲得禪道的最新動態,請在禪道社區(<a href='https://www.zentao.net' class='alert-link' target='_blank'>www.zentao.net</a>)進行登記。</p>
EOT;
$lang->install->product = array('chanzhi', 'zdoo', 'xuanxuan', 'ydisk', 'meshiot');
+4 -1
View File
@@ -18,7 +18,10 @@
<div class='modal-body'>
<div class='alert with-icon alert-pure'>
<i class='icon-check-circle'></i>
<div class='content'><?php echo nl2br(sprintf($lang->install->joinZentao, $config->version, $this->createLink('admin', 'register'), $this->createLink('admin', 'bind'), inlink('step6')));?></div>
<div class='content'>
<?php $joinZentao = ($installFileDeleted ? $lang->install->successLabel : $lang->install->successNoticeLabel) . $lang->install->joinZentao;?>
<?php echo nl2br(sprintf($joinZentao, $config->version, $this->createLink('admin', 'register'), $this->createLink('admin', 'bind'), inlink('step6')));?>
</div>
</div>
</div>
<div class='modal-footer'>
+6
View File
@@ -38,6 +38,12 @@ $lang->job->customParam = '自定義構建參數';
$lang->job->paramName = '名稱';
$lang->job->paramValue = '值';
$lang->job->custom = '自定義';
$lang->job->createdBy = '由誰創建';
$lang->job->createdDate = '創建日期';
$lang->job->editedBy = '由誰編輯';
$lang->job->editedDate = '編輯日期';
$lang->job->lastTag = '最後標籤';
$lang->job->deleted = '已刪除';
$lang->job->lblBasic = '基本信息';
+2
View File
@@ -92,6 +92,7 @@ $lang->misc->feature->downloadFile = 'Download introduction';
$lang->misc->feature->tutorialDesc = '<p>ZenTao 15.0 has new functions, and you know how to use it through the "<strong>Tutorial</strong>".</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
$lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme, the pages are more beautiful and the experience is more friendly.</p><p>Click your [<span style="color: #0c60e1">Avatar-Theme-Young Blue</span>] to set it.</p>';
$lang->misc->releaseDate['15.6'] = '2021-10-12';
$lang->misc->releaseDate['15.5'] = '2021-09-14';
$lang->misc->releaseDate['15.4'] = '2021-08-23';
$lang->misc->releaseDate['15.3'] = '2021-08-04';
@@ -157,6 +158,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['15.6'][] = array('title' => 'Fix bug.', 'desc' => '');
$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => '');
$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => '');
$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => '');
+2
View File
@@ -92,6 +92,7 @@ $lang->misc->feature->downloadFile = '下载新版本功能介绍文档';
$lang->misc->feature->tutorialDesc = "<p>禅道15系列新增了多项功能,您可以通过“<strong>新手引导教程</strong>”快速了解禅道的基本使用方法。</p><p>通过鼠标经过 [<span style='color: #0c60e1'>头像-新手引导</span>],点击新手引导,即可进入新手引导教程。</p>";
$lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“青春蓝”主题,页面呈现更加美观,体验更加友好。</p><p>通过鼠标经过 [<span style='color: #0c60e1'>头像-主题-青春蓝</span>],点击青春蓝,即可设置成功。</p>";
$lang->misc->releaseDate['15.6'] = '2021-10-12';
$lang->misc->releaseDate['15.5'] = '2021-09-14';
$lang->misc->releaseDate['15.4'] = '2021-08-23';
$lang->misc->releaseDate['15.3'] = '2021-08-04';
@@ -157,6 +158,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['15.6'][] = array('title' => '修复Bug。', 'desc' => '');
$lang->misc->feature->all['15.5'][] = array('title' => '增加项目集/产品/项目看板视图、全局添加功能、新手引导。 修复Bug。', 'desc' => '');
$lang->misc->feature->all['15.4'][] = array('title' => '修复Bug', 'desc' => '');
$lang->misc->feature->all['15.3'][] = array('title' => '实现界面风格改动和文档优化,修复Bug', 'desc' => '');
+2
View File
@@ -92,6 +92,7 @@ $lang->misc->feature->downloadFile = '下載新版本功能介紹文檔';
$lang->misc->feature->tutorialDesc = "<p>禪道15系列新增了多項功能,您可以通過“<strong>新手引導教程</strong>”快速瞭解禪道的基本使用方法。</p><p>通過滑鼠經過 [<span style='color: #0c60e1'>頭像-新手引導</span>],點擊新手引導,即可進入新手引導教程。</p>";
$lang->misc->feature->themeDesc = "<p>禪道15系列上線了全新的“青春藍”主題,頁面呈現更加美觀,體驗更加友好。</p><p>通過滑鼠經過 [<span style='color: #0c60e1'>頭像-主題-青春藍</span>],點擊青春藍,即可設置成功。</p>";
$lang->misc->releaseDate['15.6'] = '2021-10-12';
$lang->misc->releaseDate['15.5'] = '2021-09-14';
$lang->misc->releaseDate['15.4'] = '2021-08-23';
$lang->misc->releaseDate['15.3'] = '2021-08-04';
@@ -157,6 +158,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['15.6'][] = array('title' => '修復Bug。', 'desc' => '');
$lang->misc->feature->all['15.5'][] = array('title' => '增加項目集/產品/項目看板視圖、全局添加功能、新手引導。 修復Bug。', 'desc' => '');
$lang->misc->feature->all['15.4'][] = array('title' => '修復Bug', 'desc' => '');
$lang->misc->feature->all['15.3'][] = array('title' => '實現界面風格改動和文檔優化,修復Bug', 'desc' => '');
+5 -1
View File
@@ -243,7 +243,11 @@ class personnel extends control
$this->dao->update($objectTable)->set('whitelist')->eq($newWhitelist)->where('id')->eq($acl->objectID)->exec();
$this->dao->delete()->from(TABLE_ACL)->where('id')->eq($id)->exec();
if($acl->objectType == 'product') $this->personnel->deleteProgramWhitelist($acl->objectID, $acl->account);
if($acl->objectType == 'product')
{
$product = $this->loadModel('product')->getByID($acl->objectID);
if($product->program) $this->personnel->deleteProgramWhitelist($product->program, $acl->account);
}
if($acl->objectType == 'sprint') $this->personnel->deleteProjectWhitelist($acl->objectID, $acl->account);
$this->loadModel('user')->updateUserView($acl->objectID, $acl->objectType, array($acl->account));
+52 -9
View File
@@ -670,18 +670,33 @@ class personnelModel extends model
/**
* Delete product whitelist.
*
* @param int $objectID
* @param int $productID
* @param string $account
* @access public
* @return void
*/
public function deleteProductWhitelist($objectID, $account = '')
public function deleteProductWhitelist($productID, $account = '')
{
$product = $this->dao->select('id,whitelist')->from(TABLE_PRODUCT)->where('id')->eq($objectID)->fetch('whitelist');
$product = $this->dao->select('id,whitelist')->from(TABLE_PRODUCT)->where('id')->eq($productID)->fetch();
if(empty($product)) return false;
$newWhitelist = str_replace(',' . $acl->account, '', $product->whitelist);
$this->dao->update(TABLE_PRODUCT)->set('whitelist')->eq($newWhitelist)->where('id')->eq($objectID)->exec();
$newWhitelist = str_replace(',' . $account, '', $product->whitelist);
$this->dao->update(TABLE_PRODUCT)->set('whitelist')->eq($newWhitelist)->where('id')->eq($productID)->exec();
$result = $this->dao->delete()->from(TABLE_ACL)
->where('objectID')->eq($productID)
->andWhere('account')->eq($account)
->andWhere('objectType')->eq('product')
->andWhere('source')->eq('sync')
->exec();
/* Update user view when delete success. */
if($result)
{
$viewProducts = $this->dao->select('products')->from(TABLE_USERVIEW)->where('account')->eq($account)->fetch('products');
$newViewProducts = trim(str_replace(",$productID,", '', ",$viewProducts,"), ',');
$this->dao->update(TABLE_USERVIEW)->set('products')->eq($newViewProducts)->where('account')->eq($account)->exec();
}
}
/**
@@ -694,7 +709,9 @@ class personnelModel extends model
*/
public function deleteProgramWhitelist($programID = 0, $account = '')
{
$program = $this->loadModel('program')->getByID($programID);
$program = $this->loadModel('program')->getByID($programID);
if(empty($program)) return false;
$products = $this->dao->select('id')->from(TABLE_PRODUCT)->where('program')->eq($programID)->andWhere('deleted')->eq('0')->fetchPairs('id');
$whitelist = $this->dao->select('*')->from(TABLE_ACL)->where('objectID')->in($products)->andWhere('account')->eq($account)->andWhere('objectType')->eq('product')->fetch();
@@ -703,7 +720,20 @@ class personnelModel extends model
{
$newWhitelist = str_replace(',' . $account, '', $program->whitelist);
$this->dao->update(TABLE_PROGRAM)->set('whitelist')->eq($newWhitelist)->where('id')->eq($programID)->exec();
$this->dao->delete()->from(TABLE_ACL)->where('objectID')->eq($programID)->andWhere('account')->eq($account)->andWhere('objectType')->eq('program')->exec();
$result = $this->dao->delete()->from(TABLE_ACL)
->where('objectID')->eq($programID)
->andWhere('account')->eq($account)
->andWhere('objectType')->eq('program')
->andWhere('source')->eq('sync')
->exec();
/* Update user view when delete success. */
if($result)
{
$viewPrograms = $this->dao->select('programs')->from(TABLE_USERVIEW)->where('account')->eq($account)->fetch('programs');
$newViewPrograms = trim(str_replace(",$programID,", '', ",$viewPrograms,"), ',');
$this->dao->update(TABLE_USERVIEW)->set('programs')->eq($newViewPrograms)->where('account')->eq($account)->exec();
}
}
$this->loadModel('user')->updateUserView($programID, 'program', array($account));
}
@@ -721,7 +751,7 @@ class personnelModel extends model
$project = $this->dao->select('id,project,whitelist')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
if(empty($project)) return false;
$projectID = $project->project;
$projectID = $project->project ? $project->project : $objectID;
$sprints = $this->dao->select('id')->from(TABLE_PROJECT)->where('project')->eq($projectID)->andWhere('deleted')->eq('0')->fetchPairs('id');
$whitelist = $this->dao->select('*')->from(TABLE_ACL)->where('objectID')->in($sprints)->andWhere('account')->eq($account)->andWhere('objectType')->eq('sprint')->fetch();
@@ -730,7 +760,20 @@ class personnelModel extends model
{
$newWhitelist = str_replace(',' . $account, '', $project->whitelist);
$this->dao->update(TABLE_PROJECT)->set('whitelist')->eq($newWhitelist)->where('id')->eq($projectID)->exec();
$this->dao->delete()->from(TABLE_ACL)->where('objectID')->eq($projectID)->andWhere('account')->eq($account)->andWhere('objectType')->eq('project')->exec();
$result = $this->dao->delete()->from(TABLE_ACL)
->where('objectID')->eq($projectID)
->andWhere('account')->eq($account)
->andWhere('objectType')->eq('project')
->andWhere('source')->eq('sync')
->exec();
/* Update user view when delete success. */
if($result)
{
$viewProjects = $this->dao->select('projects')->from(TABLE_USERVIEW)->where('account')->eq($account)->fetch('projects');
$newViewProjects = trim(str_replace(",$projectID,", '', ",$viewProjects,"), ',');
$this->dao->update(TABLE_USERVIEW)->set('projects')->eq($newViewProjects)->where('account')->eq($account)->exec();
}
}
$this->loadModel('user')->updateUserView($projectID, 'project', array($account));
}
+1 -1
View File
@@ -697,7 +697,7 @@ class product extends control
if(!$product)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
die(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index')));
}
$product->desc = $this->loadModel('file')->setImgSize($product->desc);
+4
View File
@@ -93,6 +93,7 @@ $lang->product->code = "{$lang->productCommon}代號";
$lang->product->line = "{$lang->productCommon}綫";
$lang->product->lineName = "{$lang->productCommon}綫名稱";
$lang->product->order = '排序';
$lang->product->bind = '是否獨立產品';
$lang->product->type = "{$lang->productCommon}類型";
$lang->product->typeAB = "類型";
$lang->product->status = '狀態';
@@ -102,6 +103,7 @@ $lang->product->manager = '負責人';
$lang->product->PO = "{$lang->productCommon}負責人";
$lang->product->QD = '測試負責人';
$lang->product->RD = '發佈負責人';
$lang->product->feedback = '反饋負責人';
$lang->product->acl = '訪問控制';
$lang->product->whitelist = '白名單';
$lang->product->branch = '所屬%s';
@@ -116,6 +118,8 @@ $lang->product->iterationInfo = '迭代 %s 次';
$lang->product->iterationView = '查看詳情';
$lang->product->createdBy = '由誰創建';
$lang->product->createdDate = '創建日期';
$lang->product->createdVersion = '創建版本';
$lang->product->mailto = '抄送給';
$lang->product->searchStory = '搜索';
$lang->product->assignedToMe = '指給我';
+1 -1
View File
@@ -542,7 +542,7 @@ class productModel extends model
$line->parent = 0;
$line->grade = 1;
$line->name = $this->post->lineName;
$line->root = $product->program;
$line->root = $this->config->systemMode == 'new' ? $product->program : 0;
$line->order = $maxOrder;
$this->dao->insert(TABLE_MODULE)->data($line)->exec();
+1 -1
View File
@@ -29,7 +29,7 @@
<?php endif;?>
<tr>
<th class='w-140px'><?php echo $lang->product->line;?></th>
<?php if($programID):?>
<?php if($config->systemMode == 'classic' or $programID):?>
<td>
<div class='input-group'>
<?php echo html::select("line", $lines, '', "class='form-control hidden line-exist'");?>
+1 -1
View File
@@ -261,7 +261,7 @@ class productplan extends control
if(!$plan)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
die(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index')));
}
$this->session->set('storyList', $this->app->getURI(true) . '&type=' . 'story', 'product');
+1
View File
@@ -67,6 +67,7 @@ $lang->productplan->children = "子計劃";
$lang->productplan->childrenAB = "子";
$lang->productplan->order = "排序";
$lang->productplan->deleted = "已刪除";
$lang->productplan->mailto = "抄送給";
$lang->productplan->endList[7] = '一星期';
$lang->productplan->endList[14] = '兩星期';
+2 -2
View File
@@ -347,7 +347,7 @@ class productplanModel extends model
->data($plan)
->autoCheck()
->batchCheck($this->config->productplan->create->requiredFields, 'notempty')
->checkIF(!$this->post->future && !empty($_POST['begin']) && !empty($_POST['end']), 'end', 'gt', $plan->begin)
->checkIF(!$this->post->future && !empty($_POST['begin']) && !empty($_POST['end']), 'end', 'ge', $plan->begin)
->exec();
if(!dao::isError())
{
@@ -389,7 +389,7 @@ class productplanModel extends model
->data($plan)
->autoCheck()
->batchCheck($this->config->productplan->edit->requiredFields, 'notempty')
->checkIF(!$this->post->future && !empty($_POST['begin']) && !empty($_POST['end']), 'end', 'gt', $plan->begin)
->checkIF(!$this->post->future && !empty($_POST['begin']) && !empty($_POST['end']), 'end', 'ge', $plan->begin)
->where('id')->eq((int)$planID)
->exec();
if(!dao::isError())
+1 -1
View File
@@ -85,7 +85,7 @@ $lang->program->beginGreateChild = "子項目集的最小開始日期:%s,
$lang->program->endLetterChild = "子項目的最大完成日期:%s,父項目的完成日期不能小於子項目的最大完成日期";
$lang->program->closeErrorMessage = '存在子項目集或項目為未關閉狀態';
$lang->program->hasChildren = '該項目集有子項目集或項目存在,不能刪除。';
$lang->program->hasChildren = '該項目集有產品存在,不能刪除。';
$lang->program->hasProduct = '該項目集有產品存在,不能刪除。';
$lang->program->confirmDelete = "您確定要刪除嗎?";
$lang->program->readjustTime = '重新調整項目集起止時間';
$lang->program->accessDenied = '你無權訪問該項目集';
+12 -8
View File
@@ -1247,9 +1247,13 @@ class programModel extends model
$hour = (object)$emptyHour;
foreach($projectTasks as $task)
{
$hour->totalConsumed += $task->consumed;
if(isset($executions[$task->execution])) $hour->totalEstimate += $task->estimate;
if($task->status != 'cancel' and $task->status != 'closed' and isset($executions[$task->execution])) $hour->totalLeft += $task->left;
if(isset($executions[$task->execution]))
{
$hour->totalConsumed += $task->consumed;
$hour->totalEstimate += $task->estimate;
if(strpos('cancel,closed', $task->status) !== false) $hour->totalLeft += $task->left;
}
}
$hours[$projectID] = $hour;
}
@@ -1267,11 +1271,11 @@ class programModel extends model
/* Get the number of left tasks. */
if($this->cookie->projectType and $this->cookie->projectType == 'bycard')
{
$leftTasks = $this->dao->select('project,count(*) as tasks')->from(TABLE_TASK)
->where('project')->in($projectKeys)
->andWhere('status')->notIn('cancel,closed')
->andWhere('execution')->in(array_keys($executions))
->groupBy('project')
$leftTasks = $this->dao->select('t2.parent as project, count(*) as tasks')->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution = t2.id')
->where('t1.execution')->in(array_keys($executions))
->andWhere('t1.status')->notIn('cancel,closed')
->groupBy('t2.parent')
->fetchAll('project');
}
+5 -3
View File
@@ -633,7 +633,7 @@ class project extends control
if(empty($project) || strpos('scrum,waterfall', $project->model) === false)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
die(js::error($this->lang->notFound) . js::locate($this->createLink('project', 'browse')));
}
$this->project->setMenu($projectID);
@@ -1544,10 +1544,12 @@ class project extends control
/* Delete the execution under the project. */
$executionIdList = $this->loadModel('execution')->getByProject($projectID);
$url = $this->createLink('project', 'browse');
if(empty($executionIdList))
{
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess));
die(js::reload('parent'));
die(js::locate($url, 'parent'));
}
$this->dao->update(TABLE_EXECUTION)->set('deleted')->eq(1)->where('id')->in(array_keys($executionIdList))->exec();
@@ -1557,7 +1559,7 @@ class project extends control
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess));
$this->session->set('project', '');
die(js::reload('parent'));
die(js::locate($url, 'parent'));
}
}
+1 -2
View File
@@ -82,7 +82,6 @@ $lang->project->milestone = 'Milestone';
$lang->project->output = 'Output';
$lang->project->path = 'Path';
$lang->project->grade = 'Grade';
$lang->project->statge = '';
$lang->project->version = 'Version';
$lang->project->parentVersion = 'Parent Version';
$lang->project->planDuration = 'Plan Duration';
@@ -90,9 +89,9 @@ $lang->project->realDuration = 'Real Duration';
$lang->project->openedVersion = 'Opened Version';
$lang->project->pri = 'Priority';
$lang->project->openedBy = 'OpenedBy';
$lang->project->openedDate = 'OpenedDate';
$lang->project->lastEditedBy = 'Last EditedBy';
$lang->project->lastEditedDate = 'Last EditedDate';
$lang->project->openedDate = 'OpenedDate';
$lang->project->closedBy = 'ClosedBy';
$lang->project->closedDate = 'ClosedDate';
$lang->project->canceledBy = 'CanceledBy';
+19
View File
@@ -58,6 +58,7 @@ $lang->project->copyTeamTitle = '選擇一個項目團隊來複制';
/* Fields. */
$lang->project->common = '項目';
$lang->project->id = '項目編號';
$lang->project->project = '所屬項目';
$lang->project->stage = '階段';
$lang->project->model = '項目管理方式';
$lang->project->PM = '負責人';
@@ -74,9 +75,23 @@ $lang->project->end = '計劃完成';
$lang->project->status = '狀態';
$lang->project->subStatus = '子狀態';
$lang->project->type = '項目類型';
$lang->project->lifetime = '項目周期';
$lang->project->attribute = '階段類型';
$lang->project->percent = '工作量占比';
$lang->project->milestone = '里程碑';
$lang->project->output = '輸出';
$lang->project->path = '路徑';
$lang->project->grade = '層級';
$lang->project->version = '版本';
$lang->project->parentVersion = '父版本';
$lang->project->planDuration = '計劃周期天數';
$lang->project->realDuration = '實際周期天數';
$lang->project->openedVersion = '創建版本';
$lang->project->pri = '優先順序';
$lang->project->openedBy = '由誰創建';
$lang->project->openedDate = '創建日期';
$lang->project->lastEditedBy = '最後編輯人';
$lang->project->lastEditedDate = '最後編輯日期';
$lang->project->closedBy = '由誰關閉';
$lang->project->closedDate = '關閉日期';
$lang->project->canceledBy = '由誰取消';
@@ -132,7 +147,11 @@ $lang->project->longTime = '長期';
$lang->project->future = '待定';
$lang->project->moreProject = '更多項目';
$lang->project->days = '可用工作日';
$lang->project->mailto = '抄送給';
$lang->project->etc = "等";
$lang->project->product = '所屬產品';
$lang->project->branch = '所屬分支';
$lang->project->plan = '所屬計劃';
/* Project Kanban. */
$lang->project->typeList = array();
+19 -26
View File
@@ -124,7 +124,7 @@ class projectModel extends model
if(!isset($projects[$this->session->project]))
{
$this->session->set('project', key($projects), $this->app->tab);
if($projectID && strpos(",{$this->app->user->view->projects},", ",{$this->session->project},") === false) $this->accessDenied();
if($projectID and strpos(",{$this->app->user->view->projects},", ",{$this->session->project},") === false and !empty($projects)) $this->accessDenied();
}
/* Reset program priv. */
@@ -213,10 +213,11 @@ class projectModel extends model
->groupBy('root')
->fetchAll('root');
$estimates = $this->dao->select('project, sum(estimate) as estimate')->from(TABLE_TASK)
->where('project')->in($projectIdList)
->andWhere('deleted')->eq(0)
->andWhere('parent')->lt(1)
$estimates = $this->dao->select('t2.parent as project, sum(estimate) as estimate')->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution = t2.id')
->where('t2.parent')->in($projectIdList)
->andWhere('t1.deleted')->eq(0)
->andWhere('t1.parent')->lt(1)
->groupBy('project')
->fetchAll('project');
@@ -283,26 +284,20 @@ class projectModel extends model
->andWhere('type')->eq('project')
->groupBy('root')->fetchPairs();
$executionIdList = $this->dao->select('id')->from(TABLE_PROJECT)
->where('parent')->in($projectIdList)
->andWhere('deleted')->eq(0)
->fetchPairs();
$hours = $this->dao->select('project,
sum(consumed) as consumed,
sum(estimate) as estimate')
->from(TABLE_TASK)
->where('execution')->in($executionIdList)
->andWhere('deleted')->eq(0)
->andWhere('parent')->lt(1)
->groupBy('project')
$hours = $this->dao->select('t2.parent as project, sum(t1.consumed) as consumed, sum(t1.estimate) as estimate')->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution = t2.id')
->where('t2.parent')->in($projectIdList)
->andWhere('t1.deleted')->eq(0)
->andWhere('t1.parent')->lt(1)
->groupBy('t2.parent')
->fetchAll('project');
$leftTasks = $this->dao->select('project, count(*) as tasks')->from(TABLE_TASK)
->where('execution')->in($executionIdList)
->andWhere('deleted')->eq(0)
->andWhere('status')->in('wait,doing,pause')
->groupBy('project')
$leftTasks = $this->dao->select('t2.parent as project, count(*) as tasks')->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution = t2.id')
->where('t2.parent')->in($projectIdList)
->andWhere('t1.deleted')->eq(0)
->andWhere('t1.status')->in('wait,doing,pause')
->groupBy('t2.parent')
->fetchPairs();
$this->loadModel('product');
@@ -379,21 +374,18 @@ class projectModel extends model
ROUND(SUM(`left`), 2) AS totalLeft')
->from(TABLE_TASK)
->where('execution')->in(array_keys($executions))
->andWhere('project')->eq($projectID)
->andWhere('deleted')->eq(0)
->andWhere('parent')->lt(1)
->fetch();
$totalConsumed = $this->dao->select('ROUND(SUM(consumed), 1) AS totalConsumed')->from(TABLE_TASK)
->where('execution')->in(array_keys($executions))
->andWhere('project')->eq($projectID)
->andWhere('deleted')->eq(0)
->andWhere('parent')->lt(1)
->fetch('totalConsumed');
$closedTotalLeft = $this->dao->select('ROUND(SUM(`left`), 2) AS totalLeft')->from(TABLE_TASK)
->where('execution')->in(array_keys($executions))
->andWhere('project')->eq($projectID)
->andWhere('deleted')->eq(0)
->andWhere('parent')->lt(1)
->andWhere('status')->in('closed,cancel')
@@ -476,6 +468,7 @@ class projectModel extends model
*/
public function getPairsByProgram($programID = 0, $status = 'all')
{
if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProjectPairs();
return $this->dao->select('id, name')->from(TABLE_PROJECT)
->where('type')->eq('project')
->andWhere('deleted')->eq(0)
+6
View File
@@ -1,5 +1,11 @@
<?php
/* Field. */
$lang->projectstory->project = "項目ID";
$lang->projectstory->product = "產品ID";
$lang->projectstory->story = "需求ID";
$lang->projectstory->version = "版本";
$lang->projectstory->order = "排序";
$lang->projectstory->common = "項目{$lang->SRCommon}";
$lang->projectstory->index = "{$lang->SRCommon}主頁";
$lang->projectstory->view = "{$lang->SRCommon}詳情";
+1 -1
View File
@@ -160,7 +160,7 @@ class release extends control
{
$releaseID = (int)$releaseID;
$release = $this->release->getByID($releaseID, true);
if(!$release) die(js::error($this->lang->notFound) . js::locate('back'));
if(!$release) die(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index')));
if($type == 'story') $this->session->set('storyList', $this->app->getURI(true), 'product');
if($type == 'bug' or $type == 'leftBug') $this->session->set('bugList', $this->app->getURI(true), 'qa');
+4
View File
@@ -19,6 +19,10 @@ $lang->repo->deleteBug = '刪除評審';
$lang->repo->addComment = '添加備註';
$lang->repo->editComment = '編輯備註';
$lang->repo->deleteComment = '刪除備註';
$lang->repo->encrypt = '加密方式';
$lang->repo->repo = '代碼庫';
$lang->repo->parent = '父檔案夾';
$lang->repo->branch = '分支';
$lang->repo->browseAction = '瀏覽版本庫';
$lang->repo->createAction = '創建版本庫';
+4
View File
@@ -10,6 +10,10 @@
* @link http://www.zentao.net
*/
$lang->search->common = '搜索';
$lang->search->id = '編號';
$lang->search->editedDate = '編輯時間';
$lang->search->key = '鍵';
$lang->search->value = '值';
$lang->search->reset = '重置';
$lang->search->saveQuery = '保存查詢';
$lang->search->myQuery = '我的查詢';
+1 -1
View File
@@ -907,7 +907,7 @@ class story extends control
$storyID = (int)$storyID;
$story = $this->story->getById($storyID, $version, true);
if(!$story) die(js::error($this->lang->notFound) . js::locate('back'));
if(!$story) die(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index')));
$story = $this->story->mergeReviewer($story, true);
+1
View File
@@ -98,6 +98,7 @@ $lang->story->source = "來源";
$lang->story->sourceNote = '來源備註';
$lang->story->fromBug = '來源Bug';
$lang->story->title = "{$lang->SRCommon}名稱";
$lang->story->type = "需求類型";
$lang->story->category = "類型";
$lang->story->color = '標題顏色';
$lang->story->toBug = '轉Bug';
+2 -2
View File
@@ -502,11 +502,11 @@
<td class='pd-0'>
<ul class='list-unstyled'>
<?php
$misc = isonlybody() ? "" : "class='iframe' data-width='80%'";
$misc = isonlybody() ? "showinonlybody" : "class='iframe' data-width='80%'";
foreach($cases as $case)
{
echo "<li title='[C]$case->id $case->title'>" . html::a($this->createLink('testcase', 'view', "caseID=$case->id", '', true), "[C] #$case->id $case->title", '',"data-toggle='modal'") . '</li>';
echo "<li title='[C]$case->id $case->title'>" . html::a($this->createLink('testcase', 'view', "caseID=$case->id", '', true), "[C] #$case->id $case->title", '', $misc) . '</li>';
}
?>
</ul>
+2 -4
View File
@@ -85,7 +85,6 @@ class task extends control
$execution = $this->execution->getById($executionID);
$taskLink = $this->createLink('execution', 'browse', "executionID=$executionID&tab=task");
$storyLink = $this->session->storyList ? $this->session->storyList : $this->createLink('execution', 'story', "executionID=$executionID");
/* Set menu. */
$this->execution->setMenu($execution->id);
@@ -167,7 +166,7 @@ class task extends control
}
elseif($this->post->after == 'toStoryList')
{
$response['locate'] = $storyLink;
$response['locate'] = $this->createLink('execution', 'story', "executionID=$executionID");
return $this->send($response);
}
else
@@ -280,7 +279,6 @@ class task extends control
{
$taskLink = $this->createLink('execution', 'browse', "executionID=$executionID");
}
$storyLink = $this->session->storyList ? $this->session->storyList : $this->createLink('execution', 'story', "executionID=$executionID");
/* Set menu. */
$this->execution->setMenu($execution->id);
@@ -692,7 +690,7 @@ class task extends control
if(!$task)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
die(js::error($this->lang->notFound) . js::locate($this->createLink('execution', 'all')));
}
$this->session->project = $task->project;
+8 -5
View File
@@ -178,12 +178,15 @@ function setStoryModule()
var link = createLink('story', 'ajaxGetInfo', 'storyID=' + storyID);
$.getJSON(link, function(storyInfo)
{
$('#module').val(storyInfo.moduleID);
$("#module").trigger("chosen:updated");
if(storyInfo)
{
$('#module').val(storyInfo.moduleID);
$("#module").trigger("chosen:updated");
$('#storyEstimate').val(storyInfo.estimate);
$('#storyPri' ).val(storyInfo.pri);
$('#storyDesc' ).val(storyInfo.spec);
$('#storyEstimate').val(storyInfo.estimate);
$('#storyPri' ).val(storyInfo.pri);
$('#storyDesc' ).val(storyInfo.spec);
}
});
}
}
+3 -2
View File
@@ -58,8 +58,8 @@ $lang->task->id = 'ID';
$lang->task->project = 'Project';
$lang->task->execution = $lang->executionCommon;
$lang->task->module = 'Module';
$lang->task->design = 'Design';
$lang->task->moduleAB = 'Module';
$lang->task->design = 'Design';
$lang->task->story = 'Story';
$lang->task->storyAB = 'Story';
$lang->task->storySpec = 'Story Description';
@@ -98,6 +98,7 @@ $lang->task->estimateStartDate = 'Estimate Start Date';
$lang->task->actualStartDate = 'Actual Start Date';
$lang->task->planDuration = 'Plan Duration';
$lang->task->realDuration = 'Real Duration';
$lang->task->version = 'Version';
$lang->task->assign = 'Assign';
$lang->task->assignAction = 'Assign Task';
$lang->task->assignTo = $lang->task->assign;
@@ -105,10 +106,10 @@ $lang->task->batchAssignTo = 'Batch Assign';
$lang->task->assignedTo = 'AssignTo';
$lang->task->assignedToAB = 'AssignedTo';
$lang->task->assignedDate = 'AssignedDate';
$lang->task->activatedDate = 'Activated Date';
$lang->task->openedBy = 'CreatedBy';
$lang->task->openedDate = 'CreatedDate';
$lang->task->openedDateAB = 'CreatedOn';
$lang->task->activatedDate = 'Activated Date';
$lang->task->finishedBy = 'FinishedBy';
$lang->task->finishedByAB = 'FinishedBy';
$lang->task->finishedDate = 'ActualFinished';
+93 -79
View File
@@ -53,85 +53,99 @@ $lang->task->copy = '複製任務';
$lang->task->waitTask = '未開始的任務';
$lang->task->allModule = '所有模組';
$lang->task->common = '任務';
$lang->task->id = '編號';
$lang->task->project = '所屬項目';
$lang->task->execution = '所屬' . $lang->execution->common;
$lang->task->module = '所屬模組';
$lang->task->moduleAB = '模組';
$lang->task->story = "相關{$lang->SRCommon}";
$lang->task->storyAB = $lang->SRCommon;
$lang->task->storySpec = "{$lang->SRCommon}描述";
$lang->task->storyVerify = '驗收標準';
$lang->task->storyVersion = "{$lang->SRCommon}版本";
$lang->task->color = '標題顏色';
$lang->task->name = '任務名稱';
$lang->task->type = '任務類型';
$lang->task->typeAB = '類型';
$lang->task->sync2Gitlab = '同步到Gitlab';
$lang->task->pri = '優先順序';
$lang->task->mailto = '抄送給';
$lang->task->estimate = '最初預計';
$lang->task->estimateAB = '預計';
$lang->task->left = '預計剩餘';
$lang->task->leftAB = '剩餘';
$lang->task->consumed = '總計消耗';
$lang->task->currentConsumed = '本次消耗';
$lang->task->myConsumed = '我的總消耗';
$lang->task->consumedAB = '消耗';
$lang->task->hour = '小時';
$lang->task->consumedThisTime = '工時';
$lang->task->leftThisTime = '剩餘';
$lang->task->datePlan = '日程規劃';
$lang->task->estStarted = '預計開始';
$lang->task->realStarted = '實際開始';
$lang->task->date = '日期';
$lang->task->deadline = '截止日期';
$lang->task->deadlineAB = '截止';
$lang->task->status = '任務狀態';
$lang->task->subStatus = '子狀態';
$lang->task->desc = '任務描述';
$lang->task->assign = '指派';
$lang->task->assignAction = '指派任務';
$lang->task->assignTo = $lang->task->assign;
$lang->task->batchAssignTo = '批量指派';
$lang->task->assignedTo = '指派給';
$lang->task->assignedToAB = '指派給';
$lang->task->assignedDate = '指派日期';
$lang->task->openedBy = '由誰創建';
$lang->task->openedDate = '創建日期';
$lang->task->openedDateAB = '創建';
$lang->task->finishedBy = '由誰完成';
$lang->task->finishedByAB = '完成者';
$lang->task->finishedDate = '實際完成';
$lang->task->finishedDateAB = '實際完成';
$lang->task->finishedList = '完成者列表';
$lang->task->canceledBy = '由誰取消';
$lang->task->canceledDate = '取消時間';
$lang->task->closedBy = '由誰關閉';
$lang->task->closedDate = '關閉時間';
$lang->task->closedReason = '關閉原因';
$lang->task->lastEditedBy = '最後修改';
$lang->task->lastEditedDate = '最後修改日期';
$lang->task->lastEdited = '最後編輯';
$lang->task->recordEstimate = '工時';
$lang->task->editEstimate = '編輯工時';
$lang->task->deleteEstimate = '刪除工時';
$lang->task->colorTag = '顏色標籤';
$lang->task->files = '附件';
$lang->task->hasConsumed = '之前消耗';
$lang->task->multiple = '多人任務';
$lang->task->multipleAB = '多人';
$lang->task->team = '團隊';
$lang->task->transfer = '轉交';
$lang->task->transferTo = '轉交給';
$lang->task->children = '子任務';
$lang->task->childrenAB = '子';
$lang->task->parent = '父任務';
$lang->task->parentAB = '父';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->lblTestStory = "測試{$lang->SRCommon}";
$lang->task->common = '任務';
$lang->task->id = '編號';
$lang->task->project = '所屬項目';
$lang->task->execution = '所屬' . $lang->execution->common;
$lang->task->module = '所屬模組';
$lang->task->moduleAB = '模組';
$lang->task->design = '相關設計';
$lang->task->story = "相關{$lang->SRCommon}";
$lang->task->storyAB = $lang->SRCommon;
$lang->task->storySpec = "{$lang->SRCommon}描述";
$lang->task->storyVerify = '驗收標準';
$lang->task->storyVersion = "{$lang->SRCommon}版本";
$lang->task->designVersion = "設計版本";
$lang->task->color = '標題顏色';
$lang->task->name = '任務名稱';
$lang->task->type = '任務類型';
$lang->task->typeAB = '類型';
$lang->task->sync2Gitlab = '同步到Gitlab';
$lang->task->pri = '優先順序';
$lang->task->mailto = '抄送給';
$lang->task->estimate = '最初預計';
$lang->task->estimateAB = '預計';
$lang->task->left = '預計剩餘';
$lang->task->leftAB = '剩餘';
$lang->task->consumed = '總計消耗';
$lang->task->currentConsumed = '本次消耗';
$lang->task->myConsumed = '我的總消耗';
$lang->task->consumedAB = '消耗';
$lang->task->hour = '小時';
$lang->task->consumedThisTime = '工時';
$lang->task->leftThisTime = '剩餘';
$lang->task->datePlan = '日程規劃';
$lang->task->estStarted = '預計開始';
$lang->task->realStarted = '實際開始';
$lang->task->date = '日期';
$lang->task->deadline = '截止日期';
$lang->task->deadlineAB = '截止';
$lang->task->status = '任務狀態';
$lang->task->subStatus = '子狀態';
$lang->task->desc = '任務描述';
$lang->task->version = '版本';
$lang->task->estimateStartDate = '預計開始日期';
$lang->task->actualStartDate = '實際開始日期';
$lang->task->planDuration = '計劃持續天數';
$lang->task->realDuration = '實際持續天數';
$lang->task->version = '版本';
$lang->task->assign = '指派';
$lang->task->assignAction = '指派任務';
$lang->task->assignTo = $lang->task->assign;
$lang->task->batchAssignTo = '批量指派';
$lang->task->assignedTo = '指派給';
$lang->task->assignedToAB = '指派給';
$lang->task->assignedDate = '指派日期';
$lang->task->openedBy = '由誰創建';
$lang->task->openedDate = '創建日期';
$lang->task->openedDateAB = '創建';
$lang->task->activatedDate = '激活日期';
$lang->task->finishedBy = '由誰完成';
$lang->task->finishedByAB = '完成者';
$lang->task->finishedDate = '實際完成';
$lang->task->finishedDateAB = '實際完成';
$lang->task->finishedList = '完成者列表';
$lang->task->canceledBy = '由誰取消';
$lang->task->canceledDate = '取消時間';
$lang->task->closedBy = '由誰關閉';
$lang->task->closedDate = '關閉時間';
$lang->task->closedReason = '關閉原因';
$lang->task->lastEditedBy = '最後修改';
$lang->task->lastEditedDate = '最後修改日期';
$lang->task->lastEdited = '最後編輯';
$lang->task->recordEstimate = '工時';
$lang->task->editEstimate = '編輯工時';
$lang->task->deleteEstimate = '刪除工時';
$lang->task->colorTag = '顏色標籤';
$lang->task->files = '附件';
$lang->task->hasConsumed = '之前消耗';
$lang->task->multiple = '多人任務';
$lang->task->multipleAB = '多人';
$lang->task->team = '團隊';
$lang->task->transfer = '轉交';
$lang->task->transferTo = '轉交給';
$lang->task->children = '子任務';
$lang->task->childrenAB = '子';
$lang->task->parent = '父任務';
$lang->task->parentAB = '父';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->lblTestStory = "測試{$lang->SRCommon}";
/* Fields of zt_taskestimate. */
$lang->task->task = '任務';
$lang->task->account = '用戶名';
$lang->task->work = '工作內容';
$lang->task->recordEstimateAction = '添加工時';
+1 -1
View File
@@ -2495,7 +2495,7 @@ class taskModel extends model
/* Delayed or not?. */
if($task->status !== 'done' and $task->status !== 'cancel' and $task->status != 'closed')
{
if(!helper::isZeroDate($task->deadline))
if(!empty($taks->deadline) and !helper::isZeroDate($task->deadline))
{
$delay = helper::diffDate($today, $task->deadline);
if($delay > 0) $task->delay = $delay;
+1 -1
View File
@@ -614,7 +614,7 @@ class testcase extends control
if(!$case)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
die(js::error($this->lang->notFound) . js::locate($this->createLink('qa', 'index')));
}
if($case->auto == 'unit')
{
+9 -4
View File
@@ -1,15 +1,20 @@
/* Set the story priview link. */
function setPreview()
{
if(!$('#story').val())
if($('#story').val() == 0)
{
$('#preview').addClass('hidden');
}
else
{
storyLink = createLink('story', 'view', "storyID=" + $('#story').val());
var concat = config.requestType != 'GET' ? '?' : '&';
storyLink = storyLink + concat + 'onlybody=yes';
if(!isonlybody)
{
var concat = config.requestType != 'GET' ? '?' : '&';
storyLink = storyLink + concat + 'onlybody=yes';
}
$('#preview').addClass('iframe');
$('#preview').removeClass('hidden');
$('#preview').attr('href', storyLink);
}
@@ -131,7 +136,7 @@ $(function()
else if(e.keyCode == 13) selectItem($selected);
});
$("#preview").modalTrigger({width:960, type:'iframe'});
if(!isonlybody) $("#preview").modalTrigger({width:960, type:'iframe'});
$('[data-toggle=tooltip]').tooltip();
+16
View File
@@ -11,7 +11,14 @@
*/
$lang->testcase->id = '用例編號';
$lang->testcase->product = "所屬{$lang->productCommon}";
$lang->testcase->project = '所屬項目';
$lang->testcase->execution = '所屬執行';
$lang->testcase->module = '所屬模組';
$lang->testcase->auto = '自動化測試用例';
$lang->testcase->frame = '自動化測試框架';
$lang->testcase->howRun = '測試方式';
$lang->testcase->frequency = '使用頻率';
$lang->testcase->path = '路徑';
$lang->testcase->lib = "所屬庫";
$lang->testcase->branch = "分支/平台";
$lang->testcase->moduleAB = '模組';
@@ -37,6 +44,10 @@ $lang->testcase->linkCase = '相關用例';
$lang->testcase->linkCases = '關聯相關用例';
$lang->testcase->unlinkCase = '移除相關用例';
$lang->testcase->stage = '適用階段';
$lang->testcase->scriptedBy = '腳本由誰創建';
$lang->testcase->scriptedDate = '腳本創建日期';
$lang->testcase->scriptStatus = '腳本狀態';
$lang->testcase->scriptLocation = '腳本地址';
$lang->testcase->reviewedBy = '由誰評審';
$lang->testcase->reviewedDate = '評審時間';
$lang->testcase->reviewResult = '評審結果';
@@ -54,6 +65,7 @@ $lang->testcase->assignedTo = '指派給';
$lang->testcase->colorTag = '顏色標籤';
$lang->testcase->lastRunResult = '結果';
$lang->testcase->desc = '步驟';
$lang->testcase->parent = '上級步驟';
$lang->testcase->xml = 'XML';
$lang->testcase->expect = '預期';
$lang->testcase->allProduct = "所有{$lang->productCommon}";
@@ -73,8 +85,12 @@ $lang->testcase->sync = '同步';
$lang->testcase->ignore = '忽略';
$lang->testcase->fromTesttask = '來自測試單用例';
$lang->testcase->fromCaselib = '來自用例庫用例';
$lang->testcase->fromCaseID = '用例來源ID';
$lang->testcase->fromCaseVersion = '用例來源版本';
$lang->testcase->mailto = '抄送給';
$lang->testcase->deleted = '是否刪除';
$lang->testcase->browseUnits = '單元測試';
$lang->testcase->suite = '套件';
$lang->case = $lang->testcase; // 用於DAO檢查時使用。因為case是系統關鍵字,所以無法定義該模組為case,只能使用testcase,但表還是使用的case。
+3 -1
View File
@@ -15,6 +15,7 @@
<?php js::set('lblDelete', $lang->testcase->deleteStep);?>
<?php js::set('lblBefore', $lang->testcase->insertBefore);?>
<?php js::set('lblAfter', $lang->testcase->insertAfter);?>
<?php js::set('isonlybody', isonlybody());?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
@@ -80,7 +81,8 @@
<?php if($storyID == 0): ?>
<a href='' id='preview' class='btn hidden'><?php echo $lang->preview;?></a>
<?php else:?>
<?php echo html::a($this->createLink('story', 'view', "storyID=$storyID", '', true), $lang->preview, '', "class='btn' id='preview'");?>
<?php $class = isonlybody() ? "showinonlybody" : "iframe";?>
<?php echo html::a($this->createLink('story', 'view', "storyID=$storyID", '', true), $lang->preview, '', "class='btn $class' id='preview'");?>
<?php endif;?>
</span>
</div>
+1 -1
View File
@@ -479,7 +479,7 @@ class testreport extends control
{
$reportID = (int)$reportID;
$report = $this->testreport->getById($reportID);
if(!$report) die(js::error($this->lang->notFound) . js::locate('back'));
if(!$report) die(js::error($this->lang->notFound) . js::locate($this->createLink('qa', 'index')));
$this->session->project = $report->project;
$browseLink = '';
+1
View File
@@ -1,5 +1,6 @@
<?php
$lang->testreport->common = '測試報告';
$lang->testreport->id = '編號';
$lang->testreport->browse = '報告列表';
$lang->testreport->create = '創建報告';
$lang->testreport->edit = '編輯報告';
-1
View File
@@ -26,7 +26,6 @@ $lang->testsuite->successSaved = 'Saved';
$lang->testsuite->id = 'ID';
$lang->testsuite->common = 'Test Suite';
$lang->testsuite->project = 'Project';
$lang->testsuite->suite = 'Test Suite';
$lang->testsuite->product = $lang->productCommon;
$lang->testsuite->name = 'Name';
$lang->testsuite->type = 'Type';
+2
View File
@@ -25,10 +25,12 @@ $lang->testsuite->successSaved = '保存成功';
$lang->testsuite->id = '編號';
$lang->testsuite->common = '套件';
$lang->testsuite->project = '所屬項目';
$lang->testsuite->product = '所屬' . $lang->productCommon;
$lang->testsuite->name = '名稱';
$lang->testsuite->type = '類型';
$lang->testsuite->desc = '描述';
$lang->testsuite->mailto = '抄送給';
$lang->testsuite->author = '訪問權限';
$lang->testsuite->addedBy = '由誰創建';
$lang->testsuite->addedDate = '創建時間';
+1 -1
View File
@@ -290,7 +290,7 @@ class testtask extends control
if(!$task)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'message' => '404 Not found'));
die(js::error($this->lang->notFound) . js::locate('back'));
die(js::error($this->lang->notFound) . js::locate($this->createLink('qa', 'index')));
}
/* When the session changes, you need to query the related products again. */
+6
View File
@@ -47,6 +47,12 @@ $lang->testtask->all = "全部" . $lang->productCommon;
$lang->testtask->allTasks = '所有測試';
$lang->testtask->collapseAll = '全部摺疊';
$lang->testtask->expandAll = '全部展開';
$lang->testtask->auto = '自動化';
$lang->testtask->task = '測試單';
$lang->testtask->run = '執行編號';
$lang->testtask->job = '構建任務';
$lang->testtask->compile = '構建';
$lang->testtask->duration = '持續時間';
$lang->testtask->viewAction = "測試單概況";
$lang->testtask->casesAction = '查看用例';
+1
View File
@@ -56,6 +56,7 @@ $lang->todo->pri = '優先順序';
$lang->todo->name = '待辦名稱';
$lang->todo->status = '狀態';
$lang->todo->desc = '描述';
$lang->todo->config = '配置';
$lang->todo->private = '私人事務';
$lang->todo->cycleDay = '天';
$lang->todo->cycleWeek = '周';
+7 -7
View File
@@ -52,25 +52,25 @@ $lang->tutorial->tasks['createStory'] = array('title' => "創建{$lang->
$lang->tutorial->tasks['createStory']['nav'] = array('app' => 'product', 'module' => 'story', 'method' => 'create', 'menuModule' => 'story', 'menu' => '#productTableList>tr:not(.has-nest-child):first>.c-name>a,#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-story-btn', 'target' => '.create-story-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => "提{$lang->SRCommon}");
$lang->tutorial->tasks['createStory']['desc'] = "<p>在系統創建一個新的{$lang->SRCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i> {$lang->SRCommon} <i class='icon icon-angle-right'></i> 提{$lang->SRCommon}</span> 頁面;</li><li data-target='form'>在{$lang->productCommon}表單中填寫要創建的{$lang->SRCommon}信息;</li><li data-target='submit'>保存{$lang->SRCommon}信息。</li></ul>";
$lang->tutorial->tasks['createProject'] = array('title' => '創建' . $lang->projectCommon);
$lang->tutorial->tasks['createProject'] = array('title' => '創建項目');
$lang->tutorial->tasks['createProject']['mode'] = 'new';
$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['desc'] = "<p>在系統創建一個新的{$lang->projectCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->projectCommon}列表 <i class='icon icon-angle-right'></i> 創建{$lang->projectCommon}</span> 頁面;</li><li data-target='form'>在{$lang->projectCommon}表單中填寫要創建的{$lang->projectCommon}信息;</li><li data-target='submit'>保存{$lang->projectCommon}信息。</li></ul>";
$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加項目');
$lang->tutorial->tasks['createProject']['desc'] = "<p>在系統創建一個新的項目:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> 項目列表 <i class='icon icon-angle-right'></i> 創建項目</span> 頁面;</li><li data-target='form'>在項目表單中填寫要創建的項目信息;</li><li data-target='submit'>保存項目信息。</li></ul>";
$lang->tutorial->tasks['manageTeam'] = array('title' => "管理{$lang->projectCommon}團隊");
$lang->tutorial->tasks['manageTeam'] = array('title' => "管理項目團隊");
$lang->tutorial->tasks['manageTeam']['mode'] = 'new';
$lang->tutorial->tasks['manageTeam']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="members"],.manage-team-btn', 'target' => '.manage-team-btn', 'vars' => 'projectID=0', 'form' => '#teamForm', 'requiredFields' => 'accounts1', 'submit' => '#submit', 'targetPageName' => '團隊管理');
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>管理{$lang->projectCommon}團隊成員:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> 設置 <i class='icon icon-angle-right'></i> 團隊 <i class='icon icon-angle-right'></i> 團隊管理</span> 頁面;</li><li data-target='form'>選擇要加入{$lang->projectCommon}團隊的成員;</li><li data-target='submit'>保存團隊成員信息。</li></ul>";
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>管理項目團隊成員:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> 設置 <i class='icon icon-angle-right'></i> 團隊 <i class='icon icon-angle-right'></i> 團隊管理</span> 頁面;</li><li data-target='form'>選擇要加入項目團隊的成員;</li><li data-target='submit'>保存團隊成員信息。</li></ul>";
$lang->tutorial->tasks['createProjectExecution'] = array('title' => '添加' . $lang->executionCommon);
$lang->tutorial->tasks['createProjectExecution']['mode'] = 'new';
$lang->tutorial->tasks['createProjectExecution']['nav'] = array('app' => 'project', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="execution"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => '添加' . $lang->executionCommon);
$lang->tutorial->tasks['createProjectExecution']['desc'] = "<p>在系統創建一個新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon} <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 頁面;</li><li data-target='form'>在{$lang->executionCommon}表單中填寫要創建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['createProjectExecution']['desc'] = "<p>在系統創建一個新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> {$lang->executionCommon} <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 頁面;</li><li data-target='form'>在{$lang->executionCommon}表單中填寫要創建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['createExecution'] = array('title' => '創建' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['mode'] = 'classic';
$lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => '添加' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['desc'] = "<p>在系統創建一個新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['createExecution']['desc'] = "<p>在系統創建一個新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> {$lang->executionCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "管理團隊");
$lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic';
+11
View File
@@ -155,6 +155,17 @@ class tutorialModel extends model
return $project;
}
/**
* Get tutorial project pairs.
*
* @access public
* @return array
*/
public function getProjectPairs()
{
return array(2 => 'Test Project');
}
/**
* Get project stats for tutorial
*
+28 -6
View File
@@ -341,7 +341,7 @@ class upgrade extends control
/* When upgrading historical data as a project, handle products that are not linked with the project. */
if(!empty($singleProducts)) $this->upgrade->computeProductAcl($singleProducts, $programID);
}
elseif($type == 'sprint')
elseif($type == 'sprint' or $type == 'noProject')
{
$linkedSprints = $this->post->sprints;
@@ -350,17 +350,22 @@ class upgrade extends control
if(dao::isError()) die(js::error(dao::getError()));
/* Process merged independent projects. */
$productIdList = array();
if($type == 'noProject')
{
$productIdList = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->in($linkedSprints)->fetchPairs();
}
if($_POST['projectType'] == 'execution')
{
/* Use historical projects as execution upgrades. */
$this->upgrade->processMergedData($programID, $projectList, $lineID, array(), $linkedSprints);
$this->upgrade->processMergedData($programID, $projectList, $lineID, $productIdList, $linkedSprints);
}
else
{
/* Use historical projects as project upgrades. */
foreach($linkedSprints as $sprint)
{
$this->upgrade->processMergedData($programID, $projectList[$sprint], $lineID, array(), array($sprint => $sprint));
$this->upgrade->processMergedData($programID, $projectList[$sprint], $lineID, $productIdList, array($sprint => $sprint));
}
}
}
@@ -453,6 +458,7 @@ class upgrade extends control
$this->view->lineGroups = $lineGroups;
$this->view->productGroups = $productGroups;
}
/* Get projects group by product. */
if($type == 'product')
{
@@ -486,7 +492,6 @@ class upgrade extends control
if(empty($noMergedProducts)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=sprint&programID=0&projectType=$projectType"));
/* Group project by product. */
$productGroups = array();
foreach($noMergedSprints as $sprint)
@@ -501,6 +506,7 @@ class upgrade extends control
$this->view->noMergedProducts = $noMergedProducts;
$this->view->productGroups = $productGroups;
}
/* Get no merged projects than is not linked product. */
if($type == 'sprint')
{
@@ -508,10 +514,26 @@ class upgrade extends control
$projectProducts = $this->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('project')->in(array_keys($noMergedSprints))->fetchGroup('project', 'product');
foreach($projectProducts as $sprintID => $products) unset($noMergedSprints[$sprintID]);
if(empty($noMergedSprints)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=moreLink"));
if(empty($noMergedSprints)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=noProject"));
$this->view->noMergedSprints = $noMergedSprints;
}
/* Get one no merged sprint that link more then two products and no project in the system. */
if($type == 'noProject')
{
$project = $this->dao->select('*')->from(TABLE_PROJECT)->where('type')->eq('project')->fetch();
if($project) $this->locate($this->createLink('upgrade', 'mergeProgram', 'type=moreLink'));
$noMergedSprints = $this->dao->select('*')->from(TABLE_PROJECT)->where('parent')->eq(0)->andWhere('path')->eq('')->orderBy('id_desc')->limit(1)->fetchAll('id');
$productPrograms = $this->dao->select('t3.id as id, t3.name as name')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
->leftJoin(TABLE_PROGRAM)->alias('t3')->on('t2.program=t3.id')
->where('t1.project')->eq(key($noMergedSprints))
->fetchPairs();
$this->view->noMergedSprints = $noMergedSprints;
}
/* Get no merged projects that link more then two products. */
if($type == 'moreLink')
{
@@ -549,7 +571,7 @@ class upgrade extends control
$currentProgramID = $programID ? $programID : key($programs);
$this->view->title = $this->lang->upgrade->mergeProgram;
$this->view->programs = $programs;
$this->view->programs = $type == 'noProject' ? $productPrograms : $programs;
$this->view->programID = $programID;
$this->view->projects = array('' => '') + $this->upgrade->getProjectPairsByProgram($currentProgramID);
$this->view->lines = $currentProgramID ? array('' => '') + $this->loadModel('product')->getLinePairs($currentProgramID) : array('' => '');
+9 -1
View File
@@ -522,6 +522,7 @@ $(function()
setProgramBegin(programBegin);
setProgramEnd(programEnd);
setProjectPM();
toggleProgram();
hiddenProject();
})
@@ -638,7 +639,7 @@ function getLineByProgram()
function toggleProgram(obj)
{
var $obj = $(obj);
if($obj.length == 0) return false;
if($obj.length == 0 && type != 'noProject') return false;
var $programs = $obj.closest('table').find('#programs');
if($obj.prop('checked'))
@@ -647,6 +648,8 @@ function toggleProgram(obj)
$('form .pgm-exist').addClass('hidden');
$programs.attr('disabled', 'disabled');
$('.programStatus').show();
$('#programStatus').val('wait');
$('#programStatus').removeAttr('disabled').trigger("chosen:updated");
$('form #newProject0').prop('checked', true);
$('form #newLine0').prop('checked', true);
@@ -658,6 +661,7 @@ function toggleProgram(obj)
$('form .pgm-exist').removeClass('hidden');
$('form .pgm-no-exist').addClass('hidden');
$('.programStatus').hide();
$('#programStatus').attr('disabled', 'disabled');
if(!$('#newProgram0').prop('disabled'))
{
@@ -827,12 +831,16 @@ function setProgramByProduct(product)
{
$(this).prop('checked', false);
$(this).attr('disabled', 'disabled');
$('#checkAllProducts').attr('disabled', 'disabled');
$('#checkAllProjects').attr('disabled', 'disabled');
$('[data-product=' + currentProductID + ']').prop('checked', false);
$('[data-product=' + currentProductID + ']').attr('disabled', 'disabled');
}
else if($(':checkbox:checked[data-programid=' + programID + ']').length == 0)
{
$(this).removeAttr('disabled');
$('#checkAllProducts').removeAttr('disabled');
$('#checkAllProjects').removeAttr('disabled');
$('[data-product=' + currentProductID + ']').removeAttr('disabled');
}
}
+1
View File
@@ -143,3 +143,4 @@ $lang->upgrade->fromVersions['15_0_3'] = '15.0.3';
$lang->upgrade->fromVersions['15_2'] = '15.2';
$lang->upgrade->fromVersions['15_3'] = '15.3';
$lang->upgrade->fromVersions['15_4'] = '15.4';
$lang->upgrade->fromVersions['15_5'] = '15.5';

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