Merge branch '15.6'
This commit is contained in:
+1
-1
@@ -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
@@ -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
@@ -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 在项目集中添加批量编辑项目功能
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 = '对象名称';
|
||||
|
||||
@@ -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 = '還原';
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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|';
|
||||
|
||||
@@ -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'>
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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 = '狀態';
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 = '包類型';
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 = '項目';
|
||||
|
||||
@@ -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'] = '失敗';
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
$lang->cron->common = '定時任務';
|
||||
$lang->cron->id = '編號';
|
||||
$lang->cron->buildin = '內置';
|
||||
$lang->cron->index = '首頁';
|
||||
$lang->cron->list = '任務列表';
|
||||
$lang->cron->create = '添加';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
global $config;
|
||||
|
||||
$lang->custom->common = '自定義';
|
||||
$lang->custom->id = '編號';
|
||||
$lang->custom->index = '首頁';
|
||||
$lang->custom->set = '自定義配置';
|
||||
$lang->custom->restore = '恢復預設';
|
||||
|
||||
@@ -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 = "刪除部門";
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 = '搜索';
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 = '使用說明';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 . '类型';
|
||||
|
||||
@@ -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}中移除後再操作。";
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->extension->common = '插件管理';
|
||||
$lang->extension->id = '編號';
|
||||
$lang->extension->browse = '瀏覽插件';
|
||||
$lang->extension->install = '安裝插件';
|
||||
$lang->extension->installAuto = '自動安裝';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 = '上傳時間:';
|
||||
|
||||
@@ -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 = '暫時沒有項目';
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -8,3 +8,16 @@ function showVideo()
|
||||
{
|
||||
$('video').removeClass('hidden');
|
||||
}
|
||||
|
||||
$(function()
|
||||
{
|
||||
$('#modeclassic').click(function()
|
||||
{
|
||||
$('#selectedModeTips').show();
|
||||
});
|
||||
|
||||
$('#modenew').click(function()
|
||||
{
|
||||
$('#selectedModeTips').hide();
|
||||
});
|
||||
})
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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'>
|
||||
|
||||
@@ -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 = '基本信息';
|
||||
|
||||
|
||||
@@ -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' => '');
|
||||
|
||||
@@ -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' => '');
|
||||
|
||||
@@ -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' => '');
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 = '指給我';
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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'");?>
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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] = '兩星期';
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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 = '你無權訪問該項目集';
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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}詳情";
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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 = '創建版本庫';
|
||||
|
||||
@@ -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 = '我的查詢';
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 = '添加工時';
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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')
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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。
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
<?php
|
||||
$lang->testreport->common = '測試報告';
|
||||
$lang->testreport->id = '編號';
|
||||
$lang->testreport->browse = '報告列表';
|
||||
$lang->testreport->create = '創建報告';
|
||||
$lang->testreport->edit = '編輯報告';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 = '創建時間';
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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 = '查看用例';
|
||||
|
||||
@@ -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 = '周';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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('' => '');
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user