Merge branch 'master' of https://github.com/easysoft/zentaopms
This commit is contained in:
@@ -19,7 +19,8 @@ if($argc != 2) die('Usage: ' . basename(__FILE__) . " <request>\n");
|
||||
|
||||
/* Parse the request into params. */
|
||||
$request = parse_url(trim($argv[1]));
|
||||
$_SERVER['HTTP_HOST'] = $request['host'];
|
||||
$_SERVER['HTTP_HOST'] = $request['host'];
|
||||
$_SERVER['SCRIPT_NAME'] = $request['path'];
|
||||
|
||||
/* Load the framework. */
|
||||
chdir(dirname(dirname(__FILE__)));
|
||||
@@ -27,7 +28,10 @@ include './framework/router.class.php';
|
||||
include './framework/control.class.php';
|
||||
include './framework/model.class.php';
|
||||
include './framework/helper.class.php';
|
||||
include realpath('./config/config.php');
|
||||
|
||||
/* Instance the app and run it. */
|
||||
$app = router::createApp('pms', dirname(dirname(__FILE__)), 'router');
|
||||
$common = $app->loadCommon();
|
||||
|
||||
/* Set the PATH_INFO variable. */
|
||||
if($config->requestType == 'PATH_INFO')
|
||||
@@ -62,8 +66,5 @@ else
|
||||
$_SERVER['REQUEST_URI'] = isset($request['query']) ? $request['query'] : '';
|
||||
}
|
||||
|
||||
/* Instance the app and run it. */
|
||||
$app = router::createApp('pms', dirname(dirname(__FILE__)), 'router');
|
||||
$common = $app->loadCommon();
|
||||
$app->parseRequest();
|
||||
$app->loadModule();
|
||||
|
||||
+9
-9
@@ -16,20 +16,20 @@ if(!class_exists('config')){class config{}}
|
||||
if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* 基本设置。Basic settings. */
|
||||
$config->version = '9.4'; // 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->version = '9.5'; // 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.
|
||||
$config->webRoot = ''; // URL根目录。 The root path of the url.
|
||||
|
||||
/* 框架路由相关设置。Routing settings. */
|
||||
$config->requestType = 'PATH_INFO'; // 请求类型:PATH_INFO|PATHINFO2|GET。 The request type: PATH_INFO|PATH_INFO2|GET.
|
||||
$config->requestFix = '-'; // PATH_INFO和PATH_INFO2模式的分隔符。 The divider in the url when PATH_INFO|PATH_INFO2.
|
||||
$config->moduleVar = 'm'; // 请求类型为GET:模块变量名。 requestType=GET: the module var name.
|
||||
$config->methodVar = 'f'; // 请求类型为GET:模块变量名。 requestType=GET: the method var name.
|
||||
$config->viewVar = 't'; // 请求类型为GET:视图变量名。 requestType=GET: the view var name.
|
||||
$config->sessionVar = 'zentaosid'; // 请求类型为GET:session变量名。 requestType=GET: the session var name.
|
||||
$config->views = ',html,json,mhtml,'; // 支持的视图类型。 Supported view formats.
|
||||
$config->requestFix = '-'; // PATH_INFO和PATH_INFO2模式的分隔符。 The divider in the url when PATH_INFO|PATH_INFO2.
|
||||
$config->moduleVar = 'm'; // 请求类型为GET:模块变量名。 requestType=GET: the module var name.
|
||||
$config->methodVar = 'f'; // 请求类型为GET:模块变量名。 requestType=GET: the method var name.
|
||||
$config->viewVar = 't'; // 请求类型为GET:视图变量名。 requestType=GET: the view var name.
|
||||
$config->sessionVar = 'zentaosid'; // 请求类型为GET:session变量名。 requestType=GET: the session var name.
|
||||
$config->views = ',html,json,mhtml,'; // 支持的视图类型。 Supported view formats.
|
||||
|
||||
/* 支持的主题和语言。Supported thems and languages. */
|
||||
$config->themes['default'] = 'default';
|
||||
|
||||
+25
-13
@@ -1,17 +1,29 @@
|
||||
2017-08-25 9.5.stable
|
||||
3124 取消工时记录的255字数限制
|
||||
3123 导出增加对个数字段的支持
|
||||
3122 文档附件库默认按照时间从新到旧的顺序显示
|
||||
3121 测试bug增加批量激活功能 已完成
|
||||
3120 测试报告导出功能增加相应的权限
|
||||
3119 每日提醒异步邮件列表中的发送人改成后台发信配置中的发信人
|
||||
3118 测试-用例 从用例库导入用例的时候增加搜索功能
|
||||
3117 已删除用户默认不再列出
|
||||
3116 文档库的附件库增加列表展示方式
|
||||
以及修改了大量的已知BUG。
|
||||
|
||||
2017-07-24 9.4
|
||||
3078 将跳回然之框架的功能默认设置为关闭
|
||||
3077 bug导出增加对 截止日期 字段的支持
|
||||
3076 把禅道数据库中所有的mailto字段都修改成 text 类型
|
||||
3075 增加bug提交和编辑表单编辑器的高度
|
||||
3074 数据库受损修复增加超级管理员验证
|
||||
3073 计划列表默认显示全部。
|
||||
3071 集成到然之之后右上角个人中心的菜单向左展开
|
||||
3070 批量操作的滚动条将选择和编辑按钮的边框去掉
|
||||
3069 测试-版本关联用例的时候过滤掉未评审的用例
|
||||
3068 发布关联需求的时候给默认的推荐列表
|
||||
3067 调整产品发布关联需求页面的排版
|
||||
3066 创建计划时提示之前的计划名称
|
||||
3065 附件库继承产品或者项目的访问权限
|
||||
3078 将跳回然之框架的功能默认设置为关闭
|
||||
3077 bug导出增加对 截止日期 字段的支持
|
||||
3076 把禅道数据库中所有的mailto字段都修改成 text 类型
|
||||
3075 增加bug提交和编辑表单编辑器的高度
|
||||
3074 数据库受损修复增加超级管理员验证
|
||||
3073 计划列表默认显示全部。
|
||||
3071 集成到然之之后右上角个人中心的菜单向左展开
|
||||
3070 批量操作的滚动条将选择和编辑按钮的边框去掉
|
||||
3069 测试-版本关联用例的时候过滤掉未评审的用例
|
||||
3068 发布关联需求的时候给默认的推荐列表
|
||||
3067 调整产品发布关联需求页面的排版
|
||||
3066 创建计划时提示之前的计划名称
|
||||
3065 附件库继承产品或者项目的访问权限
|
||||
|
||||
2017-06-21 9.3.beta
|
||||
3038 修改loadModel改为单例模式,提升性能
|
||||
|
||||
@@ -1924,6 +1924,8 @@ class baseSQL
|
||||
$pos = stripos($order, 'limit');
|
||||
$orders = $pos ? substr($order, 0, $pos) : $order;
|
||||
$limit = $pos ? substr($order, $pos) : '';
|
||||
if($limit and !preg_match('/^[0-9]+ *(, *[0-9]+)?$/', $limit)) $limit = '';
|
||||
|
||||
$orders = trim($orders);
|
||||
if(empty($orders)) return $this;
|
||||
if(!preg_match('/^(\w+\.)?(`\w+`|\w+)( +(desc|asc))?( *(, *(\w+\.)?(`\w+`|\w+)( +(desc|asc))?)?)*$/i', $orders)) die("Order is bad request, The order is $orders");
|
||||
|
||||
@@ -1724,16 +1724,16 @@ class PHPMailer {
|
||||
|
||||
switch (strtolower($position)) {
|
||||
case 'phrase':
|
||||
$encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
|
||||
$encoded = preg_replace_callback("/([^A-Za-z0-9!*+\/ -])/", array(&$this, 'ordChar'), $encoded);
|
||||
break;
|
||||
case 'comment':
|
||||
$encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
|
||||
$encoded = preg_replace_callback("/([\(\)\"])/", array(&$this, 'ordChar'), $encoded);
|
||||
case 'text':
|
||||
default:
|
||||
// Replace every high ascii, control =, ? and _ characters
|
||||
//TODO using /e (equivalent to eval()) is probably not a good idea
|
||||
$encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',
|
||||
"'='.sprintf('%02X', ord('\\1'))", $encoded);
|
||||
$encoded = preg_replace_callback('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/',
|
||||
array(&$this, 'ordChar'), $encoded);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2309,6 +2309,11 @@ class PHPMailer {
|
||||
call_user_func_array($this->action_function,$params);
|
||||
}
|
||||
}
|
||||
|
||||
public function ordChar($match)
|
||||
{
|
||||
return '=' . sprintf('%02X', ord($match[1]));
|
||||
}
|
||||
}
|
||||
|
||||
class phpmailerException extends Exception {
|
||||
|
||||
@@ -33,6 +33,13 @@ $lang->action->confirmHideAll = 'Do you want to hide all the records?';
|
||||
$lang->action->needEdit = '%s you want to restore has already existed. Please edit it.';
|
||||
$lang->action->historyEdit = 'The history editor cannot be empty.';
|
||||
|
||||
$lang->action->history = new stdclass();
|
||||
$lang->action->history->action = 'Bound action';
|
||||
$lang->action->history->field = 'Field';
|
||||
$lang->action->history->old = 'Old value';
|
||||
$lang->action->history->new = 'New value';
|
||||
$lang->action->history->diff = 'Diff';
|
||||
|
||||
$lang->action->dynamic = new stdclass();
|
||||
$lang->action->dynamic->today = 'Today';
|
||||
$lang->action->dynamic->yesterday = 'Yesterday';
|
||||
@@ -106,6 +113,7 @@ $lang->action->desc->paused = '$date, paused by <strong>$actor</strong>.
|
||||
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> has been changed. Its value was "%s" and the new value is "%s".<br />' . "\n";
|
||||
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> has been changed. The difference is ' . "\n" . "<blockquote>%s</blockquote>" . "\n<div class='hidden'>%s</div>";
|
||||
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
|
||||
$lang->action->desc->linked2bug = '$date Link to build <strong>$extra</strong> by <strong>$actor</strong>';
|
||||
|
||||
/* 关联用例和移除用例时的历史操作记录。*/
|
||||
$lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> linked relevant use case <strong>$extra</strong>.' . "\n";
|
||||
@@ -168,6 +176,8 @@ $lang->action->label->suspended = 'Suspended';
|
||||
$lang->action->label->login = 'Login';
|
||||
$lang->action->label->logout = "Logout";
|
||||
$lang->action->label->deleteestimate = "Deleted Man-Hour";
|
||||
$lang->action->label->linked2build = "Linked";
|
||||
$lang->action->label->linked2bug = "Linked";
|
||||
|
||||
/* 用来生成相应对象的链接。*/
|
||||
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
|
||||
|
||||
@@ -33,6 +33,13 @@ $lang->action->confirmHideAll = '您确定要全部隐藏这些记录吗?';
|
||||
$lang->action->needEdit = '要还原%s的名称或代号已经存在,请编辑更改。';
|
||||
$lang->action->historyEdit = '历史记录编辑不能为空。';
|
||||
|
||||
$lang->action->history = new stdclass();
|
||||
$lang->action->history->action = '关联日志';
|
||||
$lang->action->history->field = '字段';
|
||||
$lang->action->history->old = '旧值';
|
||||
$lang->action->history->new = '新值';
|
||||
$lang->action->history->diff = '不同';
|
||||
|
||||
$lang->action->dynamic = new stdclass();
|
||||
$lang->action->dynamic->today = '今天';
|
||||
$lang->action->dynamic->yesterday = '昨天';
|
||||
@@ -106,6 +113,7 @@ $lang->action->desc->paused = '$date, 由 <strong>$actor</strong> 暂停
|
||||
$lang->action->desc->diff1 = '修改了 <strong><i>%s</i></strong>,旧值为 "%s",新值为 "%s"。<br />' . "\n";
|
||||
$lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,区别为:' . "\n" . "<blockquote>%s</blockquote>" . "\n<div class='hidden'>%s</div>";
|
||||
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
|
||||
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>';
|
||||
|
||||
/* 关联用例和移除用例时的历史操作记录。*/
|
||||
$lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 关联相关用例 <strong>$extra</strong>。' . "\n";
|
||||
@@ -168,8 +176,8 @@ $lang->action->label->suspended = '挂起';
|
||||
$lang->action->label->login = '登录系统';
|
||||
$lang->action->label->logout = "退出登录";
|
||||
$lang->action->label->deleteestimate = "删除了工时";
|
||||
$lang->action->label->linked2build = "关联版本";
|
||||
$lang->action->label->linked2bug = "关联BUG";
|
||||
$lang->action->label->linked2build = "关联了";
|
||||
$lang->action->label->linked2bug = "关联了";
|
||||
|
||||
/* 用来生成相应对象的链接。*/
|
||||
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
|
||||
|
||||
@@ -33,6 +33,13 @@ $lang->action->confirmHideAll = '您確定要全部隱藏這些記錄嗎?';
|
||||
$lang->action->needEdit = '要還原%s的名稱或代號已經存在,請編輯更改。';
|
||||
$lang->action->historyEdit = '歷史記錄編輯不能為空。';
|
||||
|
||||
$lang->action->history = new stdclass();
|
||||
$lang->action->history->action = '關聯日誌';
|
||||
$lang->action->history->field = '欄位';
|
||||
$lang->action->history->old = '舊值';
|
||||
$lang->action->history->new = '新值';
|
||||
$lang->action->history->diff = '不同';
|
||||
|
||||
$lang->action->dynamic = new stdclass();
|
||||
$lang->action->dynamic->today = '今天';
|
||||
$lang->action->dynamic->yesterday = '昨天';
|
||||
@@ -106,6 +113,7 @@ $lang->action->desc->paused = '$date, 由 <strong>$actor</strong> 暫停
|
||||
$lang->action->desc->diff1 = '修改了 <strong><i>%s</i></strong>,舊值為 "%s",新值為 "%s"。<br />' . "\n";
|
||||
$lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,區別為:' . "\n" . "<blockquote>%s</blockquote>" . "\n<div class='hidden'>%s</div>";
|
||||
$lang->action->desc->diff3 = '將檔案名 %s 改為 %s 。' . "\n";
|
||||
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 關聯到版本 <strong>$extra</strong>';
|
||||
|
||||
/* 關聯用例和移除用例時的歷史操作記錄。*/
|
||||
$lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 關聯相關用例 <strong>$extra</strong>。' . "\n";
|
||||
@@ -168,6 +176,8 @@ $lang->action->label->suspended = '掛起';
|
||||
$lang->action->label->login = '登錄系統';
|
||||
$lang->action->label->logout = "退出登錄";
|
||||
$lang->action->label->deleteestimate = "刪除了工時";
|
||||
$lang->action->label->linked2build = "關聯了";
|
||||
$lang->action->label->linked2bug = "關聯了";
|
||||
|
||||
/* 用來生成相應對象的連結。*/
|
||||
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
|
||||
|
||||
@@ -242,6 +242,11 @@ class actionModel extends model
|
||||
$name = $this->dao->select('name')->from(TABLE_BUILD)->where('id')->eq($action->extra)->fetch('name');
|
||||
if($name) $action->extra = html::a(helper::createLink('build', 'view', "builID=$action->extra&type={$action->objectType}"), $name);
|
||||
}
|
||||
elseif($actionName == 'linked2bug')
|
||||
{
|
||||
$name = $this->dao->select('name')->from(TABLE_BUILD)->where('id')->eq($action->extra)->fetch('name');
|
||||
if($name) $action->extra = html::a(helper::createLink('build', 'view', "builID=$action->extra&type={$action->objectType}"), $name);
|
||||
}
|
||||
elseif($actionName == 'linked2release')
|
||||
{
|
||||
$name = $this->dao->select('name')->from(TABLE_RELEASE)->where('id')->eq($action->extra)->fetch('name');
|
||||
|
||||
@@ -21,7 +21,7 @@ class block extends control
|
||||
{
|
||||
parent::__construct($moduleName, $methodName);
|
||||
/* Mark the call from zentao or ranzhi. */
|
||||
$this->selfCall = strpos($this->server->http_referer, common::getSysURL()) === 0 || $this->session->blockModule;
|
||||
$this->selfCall = strpos($this->server->http_referer, common::getSysURL() . $this->config->webRoot) === 0 || $this->session->blockModule;
|
||||
if($this->methodName != 'admin' and $this->methodName != 'dashboard' and !$this->selfCall and !$this->loadModel('sso')->checkKey()) die('');
|
||||
}
|
||||
|
||||
@@ -197,7 +197,7 @@ class block extends control
|
||||
*/
|
||||
public function dashboard($module)
|
||||
{
|
||||
$this->session->set('blockModule', $module);
|
||||
if($this->loadModel('user')->isLogon()) $this->session->set('blockModule', $module);
|
||||
$blocks = $this->block->getBlockList($module);
|
||||
$inited = empty($this->config->$module->common->blockInited) ? '' : $this->config->$module->common->blockInited;
|
||||
|
||||
@@ -605,7 +605,7 @@ class block extends control
|
||||
public function printProductBlock()
|
||||
{
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
$num = isset($this->params->num) ? (int)$this->params->num : 0;
|
||||
$type = isset($this->params->type) ? $this->params->type : '';
|
||||
$pager = pager::init(0, $num , 1);
|
||||
@@ -621,7 +621,7 @@ class block extends control
|
||||
public function printProjectBlock()
|
||||
{
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
|
||||
$num = isset($this->params->num) ? (int)$this->params->num : 0;
|
||||
$type = isset($this->params->type) ? $this->params->type : 'all';
|
||||
$pager = pager::init(0, $num, 1);
|
||||
|
||||
@@ -16,6 +16,14 @@ $lang->block->style = 'Style';
|
||||
$lang->block->grid = 'Grid';
|
||||
$lang->block->color = 'Color';
|
||||
|
||||
$lang->block->account = 'Account';
|
||||
$lang->block->module = 'Module';
|
||||
$lang->block->title = 'Title';
|
||||
$lang->block->source = 'Source module';
|
||||
$lang->block->block = 'Source block';
|
||||
$lang->block->order = 'Order';
|
||||
$lang->block->height = 'Height';
|
||||
|
||||
$lang->block->lblModule = 'Module';
|
||||
$lang->block->lblBlock = 'Widget';
|
||||
$lang->block->lblNum = 'Number';
|
||||
|
||||
@@ -16,6 +16,14 @@ $lang->block->style = '外观';
|
||||
$lang->block->grid = '宽度';
|
||||
$lang->block->color = '颜色';
|
||||
|
||||
$lang->block->account = '所属用户';
|
||||
$lang->block->module = '所属模块';
|
||||
$lang->block->title = '区块名称';
|
||||
$lang->block->source = '来源模块';
|
||||
$lang->block->block = '来源区块';
|
||||
$lang->block->order = '排序';
|
||||
$lang->block->height = '高度';
|
||||
|
||||
$lang->block->lblModule = '模块';
|
||||
$lang->block->lblBlock = '区块';
|
||||
$lang->block->lblNum = '条数';
|
||||
|
||||
@@ -16,6 +16,14 @@ $lang->block->style = '外觀';
|
||||
$lang->block->grid = '寬度';
|
||||
$lang->block->color = '顏色';
|
||||
|
||||
$lang->block->account = '所屬用戶';
|
||||
$lang->block->module = '所屬模組';
|
||||
$lang->block->title = '區塊名稱';
|
||||
$lang->block->source = '來源模組';
|
||||
$lang->block->block = '來源區塊';
|
||||
$lang->block->order = '排序';
|
||||
$lang->block->height = '高度';
|
||||
|
||||
$lang->block->lblModule = '模組';
|
||||
$lang->block->lblBlock = '區塊';
|
||||
$lang->block->lblNum = '條數';
|
||||
|
||||
@@ -7,5 +7,10 @@ $lang->branch->delete = 'Delete Branch';
|
||||
$lang->branch->manageTitle = '%s Management';
|
||||
$lang->branch->all = 'All';
|
||||
|
||||
$lang->branch->id = 'ID';
|
||||
$lang->branch->product = 'Product';
|
||||
$lang->branch->name = 'Name';
|
||||
$lang->branch->order = 'Order';
|
||||
|
||||
$lang->branch->confirmDelete = 'Do you want to delete this @branch@?';
|
||||
$lang->branch->canNotDelete = 'There is data in @branch@. It cannot be deleted.';
|
||||
|
||||
@@ -7,5 +7,10 @@ $lang->branch->delete = '分支删除';
|
||||
$lang->branch->manageTitle = '%s管理';
|
||||
$lang->branch->all = '所有';
|
||||
|
||||
$lang->branch->id = '编号';
|
||||
$lang->branch->product = '所属产品';
|
||||
$lang->branch->name = '名称';
|
||||
$lang->branch->order = '排序';
|
||||
|
||||
$lang->branch->confirmDelete = '是否删除该@branch@?';
|
||||
$lang->branch->canNotDelete = '该@branch@下已经有数据,不能删除!';
|
||||
|
||||
@@ -7,5 +7,10 @@ $lang->branch->delete = '分支刪除';
|
||||
$lang->branch->manageTitle = '%s管理';
|
||||
$lang->branch->all = '所有';
|
||||
|
||||
$lang->branch->id = '編號';
|
||||
$lang->branch->product = '所屬產品';
|
||||
$lang->branch->name = '名稱';
|
||||
$lang->branch->order = '排序';
|
||||
|
||||
$lang->branch->confirmDelete = '是否刪除該@branch@?';
|
||||
$lang->branch->canNotDelete = '該@branch@下已經有數據,不能刪除!';
|
||||
|
||||
+31
-28
@@ -513,18 +513,18 @@ class bug extends control
|
||||
}
|
||||
|
||||
$bug = $this->bug->getById($bugID);
|
||||
if($bug->toTask != 0)
|
||||
if($bug->toTask != 0)
|
||||
{
|
||||
foreach($changes as $change)
|
||||
{
|
||||
if($change['field'] == 'status')
|
||||
if($change['field'] == 'status')
|
||||
{
|
||||
$confirmURL = $this->createLink('task', 'view', "taskID=$bug->toTask");
|
||||
$cancelURL = $this->server->HTTP_REFERER;
|
||||
die(js::confirm(sprintf($this->lang->bug->remindTask, $bug->Task), $confirmURL, $cancelURL, 'parent', 'parent'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
die(js::locate($this->createLink('bug', 'view', "bugID=$bugID"), 'parent'));
|
||||
}
|
||||
|
||||
@@ -587,8 +587,8 @@ class bug extends control
|
||||
|
||||
/**
|
||||
* Batch edit bug.
|
||||
*
|
||||
* @param int $productID
|
||||
*
|
||||
* @param int $productID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -618,7 +618,7 @@ class bug extends control
|
||||
die(js::confirm(sprintf($this->lang->bug->remindTask, $bug->task), $confirmURL, $cancelURL, 'parent', 'parent'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
die(js::locate($this->session->bugList, 'parent'));
|
||||
}
|
||||
@@ -933,8 +933,8 @@ class bug extends control
|
||||
|
||||
/**
|
||||
* Activate a bug.
|
||||
*
|
||||
* @param int $bugID
|
||||
*
|
||||
* @param int $bugID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -1122,36 +1122,39 @@ class bug extends control
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch activate bugs.
|
||||
*
|
||||
* Batch activate bugs.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function batchActivate()
|
||||
public function batchActivate($productID, $branch = 0)
|
||||
{
|
||||
if($this->post->bugIDList)
|
||||
if($this->post->statusList)
|
||||
{
|
||||
$bugIDList = $this->post->bugIDList;
|
||||
|
||||
/* Reset $_POST. Do not unset that because the function of close need that in model. */
|
||||
$_POST = array();
|
||||
|
||||
$bugs = $this->bug->getByList($bugIDList);
|
||||
foreach($bugs as $bugID => $bug)
|
||||
$activateBugs = $this->bug->batchActivate();
|
||||
foreach($activateBugs as $bugID => $bug)
|
||||
{
|
||||
if($bug->status == 'active')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->bug->activate($bugID);
|
||||
|
||||
$actionID = $this->action->create('bug', $bugID, 'Activated');
|
||||
$actionID = $this->action->create('bug', $bugID, 'Activated', $bug['comment']);
|
||||
$this->bug->sendmail($bugID, $actionID);
|
||||
}
|
||||
|
||||
die(js::locate($this->session->bugList, 'parent'));
|
||||
}
|
||||
|
||||
die(js::reload('parent'));
|
||||
$bugIDList = $this->post->bugIDList ? $this->post->bugIDList : die(js::locate($this->session->bugList, 'parent'));
|
||||
$bugs = $this->dao->select('id, title, status, resolvedBy, openedBuild')->from(TABLE_BUG)->where('id')->in($bugIDList)->fetchAll('id');
|
||||
|
||||
$this->bug->setMenu($this->products, $productID, $branch);
|
||||
|
||||
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->batchActivate;
|
||||
$this->view->position[] = html::a($this->createLink('bug', 'browse', "productID=$productID"), $this->products[$productID]);
|
||||
$this->view->position[] = $this->lang->bug->batchActivate;
|
||||
|
||||
$this->view->bugs = $bugs;
|
||||
$this->view->users = $this->user->getPairs();
|
||||
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $branch, 'noempty');
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
$(function()
|
||||
$(function()
|
||||
{
|
||||
setModal4List('iframe', 'bugList');
|
||||
|
||||
|
||||
@@ -342,9 +342,9 @@ $lang->bug->report->bugHistories->graph->xAxisName = '处理步骤';
|
||||
|
||||
/* 操作记录。*/
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, 由 <strong>$actor</strong> 解决,方案为 <strong>$extra</strong> $appendLink。', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 转为<strong>需求</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = array('main' => '$date, 由 <strong>$actor</strong> 导入为<strong>任务</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->resolved = array('main' => '$date, 由 <strong>$actor</strong> 解决,方案为 <strong>$extra</strong> $appendLink。', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 转为<strong>需求</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = array('main' => '$date, 由 <strong>$actor</strong> 导入为<strong>任务</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, 由 <strong>$actor</strong> 关联到计划 <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, 由 <strong>$actor</strong> 从计划 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>。');
|
||||
|
||||
@@ -150,9 +150,9 @@ $lang->bug->applyTemplate = '應用模板';
|
||||
$lang->bug->confirmDeleteTemplate = '您確認要刪除該模板嗎?';
|
||||
|
||||
/* 模板。*/
|
||||
$lang->bug->tplStep = "<p>[步驟]</p>\n";
|
||||
$lang->bug->tplResult = "<p>[結果]</p>\n";
|
||||
$lang->bug->tplExpect = "<p>[期望]</p>";
|
||||
$lang->bug->tplStep = "<p>[步驟]</p>";
|
||||
$lang->bug->tplResult = "</br><p>[結果]</p>";
|
||||
$lang->bug->tplExpect = "</br><p>[期望]</p>";
|
||||
|
||||
/* 各個欄位取值列表。*/
|
||||
$lang->bug->severityList[3] = '3';
|
||||
@@ -342,9 +342,9 @@ $lang->bug->report->bugHistories->graph->xAxisName = '處理步驟';
|
||||
|
||||
/* 操作記錄。*/
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, 由 <strong>$actor</strong> 解決,方案為 <strong>$extra</strong> $appendLink。', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 轉為<strong>需求</strong>,編號為 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = array('main' => '$date, 由 <strong>$actor</strong> 導入為<strong>任務</strong>,編號為 <strong>$extra</strong>。');
|
||||
$lang->bug->action->resolved = array('main' => '$date, 由 <strong>$actor</strong> 解決,方案為 <strong>$extra</strong> $appendLink。', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 轉為<strong>需求</strong>,編號為 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = array('main' => '$date, 由 <strong>$actor</strong> 導入為<strong>任務</strong>,編號為 <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, 由 <strong>$actor</strong> 關聯到計劃 <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, 由 <strong>$actor</strong> 從計劃 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, 由 <strong>$actor</strong> 關聯到版本 <strong>$extra</strong>。');
|
||||
|
||||
+53
-2
@@ -658,6 +658,57 @@ class bugModel extends model
|
||||
return $allChanges;
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch active bugs.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function batchActivate()
|
||||
{
|
||||
$now = helper::now();
|
||||
$data = fixer::input('post')->get();
|
||||
|
||||
$activateBugs = array();
|
||||
$bugIDList = $data->bugIDList ? $data->bugIDList : array();
|
||||
|
||||
if(empty($bugIDList)) return $activateBugs;
|
||||
|
||||
foreach($bugIDList as $bugID)
|
||||
{
|
||||
if($data->statusList[$bugID] == 'active') continue;
|
||||
|
||||
$activateBugs[$bugID]['assignedTo'] = $data->assignedToList[$bugID];
|
||||
$activateBugs[$bugID]['openedBuild'] = $data->openedBuildList[$bugID];
|
||||
$activateBugs[$bugID]['comment'] = $data->commentList[$bugID];
|
||||
|
||||
$activateBugs[$bugID]['assignedDate'] = $now;
|
||||
$activateBugs[$bugID]['resolution'] = '';
|
||||
$activateBugs[$bugID]['status'] = 'active';
|
||||
$activateBugs[$bugID]['resolvedDate'] = '0000-00-00';
|
||||
$activateBugs[$bugID]['resolvedBy'] = '';
|
||||
$activateBugs[$bugID]['resolvedBuild'] = '';
|
||||
$activateBugs[$bugID]['closedBy'] = '';
|
||||
$activateBugs[$bugID]['closedDate'] = '0000-00-00';
|
||||
$activateBugs[$bugID]['duplicateBug'] = 0;
|
||||
$activateBugs[$bugID]['toTask'] = 0;
|
||||
$activateBugs[$bugID]['toStory'] = 0;
|
||||
$activateBugs[$bugID]['lastEditedBy'] = $this->app->user->account;
|
||||
$activateBugs[$bugID]['lastEditedDate'] = $now;
|
||||
}
|
||||
|
||||
/* Update bugs. */
|
||||
foreach($activateBugs as $bugID => $bug)
|
||||
{
|
||||
$this->dao->update(TABLE_BUG)->data($bug, $skipFields = 'comment')->autoCheck()->where('id')->eq((int)$bugID)->exec();
|
||||
if(dao::isError()) die(js::error('bug#' . $bugID . dao::getError(true)));
|
||||
|
||||
$this->dao->update(TABLE_BUG)->set('activatedCount = activatedCount + 1')->where('id')->eq((int)$bugID)->exec();
|
||||
}
|
||||
|
||||
return $activateBugs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign a bug to a user again.
|
||||
*
|
||||
@@ -1506,7 +1557,7 @@ class bugModel extends model
|
||||
{
|
||||
foreach($openBuildIDList as $buildID)
|
||||
{
|
||||
if(isset($datas[$buildID]))
|
||||
if(isset($datas[$buildID]))
|
||||
{
|
||||
$datas[$buildID]->value += $data->value;
|
||||
}
|
||||
@@ -1538,7 +1589,7 @@ class bugModel extends model
|
||||
{
|
||||
$datas = $this->dao->select('module as name, count(module) as value')->from(TABLE_BUG)->where($this->reportCondition())->groupBy('module')->orderBy('value DESC')->fetchAll('name');
|
||||
if(!$datas) return array();
|
||||
$modules = $this->loadModel('tree')->getModulesName(array_keys($datas),true,true);
|
||||
$modules = $this->loadModel('tree')->getModulesName(array_keys($datas), true, true);
|
||||
foreach($datas as $moduleID => $data) $data->name = isset($modules[$moduleID]) ? $modules[$moduleID] : '/';
|
||||
return $datas;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->files;?></th>
|
||||
<td colspan='2' class='text-left'><?php echo $this->fetch('file', 'buildform');?></td>
|
||||
</tr>
|
||||
</tr>
|
||||
<tr>
|
||||
<th></th><td colspan='2'><?php echo html::submitButton() . html::linkButton($lang->goback, $this->session->bugList);?></td>
|
||||
</tr>
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
/**
|
||||
* The batch activate view of bug module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Congzhi Chen <congzhi@cnezsoft.com>
|
||||
* @package bug
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<strong><small class='text-muted'></small> <?php echo $lang->bug->common . $lang->colon . $lang->bug->batchActivate;?></strong>
|
||||
</div>
|
||||
</div>
|
||||
<form class='form-condensed' method='post' target='hiddenwin' action="<?php echo inLink('batchActivate', "productID=$productID");?>">
|
||||
<table class='table table-fixed with-border'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='w-20px'><?php echo $lang->idAB;?></th>
|
||||
<th class='w-50px'><?php echo $lang->bug->title;?></th>
|
||||
<th class='w-70px'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<th class='w-70px'><?php echo $lang->bug->openedBuild;?></th>
|
||||
<th class='w-150px'><?php echo $lang->bug->legendComment;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='text-left'>
|
||||
<?php foreach($bugs as $bug):?>
|
||||
<tr>
|
||||
<td class='text-center'><?php echo $bug->id . html::hidden("bugIDList[$bug->id]", $bug->id);?></td>
|
||||
<td><?php echo $bug->title . html::hidden("statusList[$bug->id]", $bug->status);?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("assignedToList[$bug->id]", $users, $bug->resolvedBy, "class='form-control chosen'");?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("openedBuildList[$bug->id]", $builds, $bug->openedBuild, 'size=4 multiple=multiple class="form-control chosen"');?></td>
|
||||
<td><?php echo html::input("commentList[$bug->id]", '', "class='form-control'");?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan='5' class='text-center'><?php echo html::submitButton();?></td></tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -193,15 +193,15 @@ js::set('branch', $branch);
|
||||
<?php
|
||||
$class = "class='disabled'";
|
||||
$actionLink = $this->createLink('bug', 'batchConfirm');
|
||||
$misc = common::hasPriv('bug', 'batchConfirm') ? "onclick=\"setFormAction('$actionLink','hiddenwin')\"" : $class;
|
||||
$misc = common::hasPriv('bug', 'batchConfirm') ? "onclick=\"setFormAction('$actionLink', 'hiddenwin')\"" : $class;
|
||||
if($misc) echo "<li>" . html::a('javascript:;', $lang->bug->confirmBug, '', $misc) . "</li>";
|
||||
|
||||
$actionLink = $this->createLink('bug', 'batchClose');
|
||||
$misc = common::hasPriv('bug', 'batchClose') ? "onclick=\"setFormAction('$actionLink','hiddenwin')\"" : $class;
|
||||
$misc = common::hasPriv('bug', 'batchClose') ? "onclick=\"setFormAction('$actionLink', 'hiddenwin')\"" : $class;
|
||||
if($misc) echo "<li>" . html::a('javascript:;', $lang->bug->close, '', $misc) . "</li>";
|
||||
|
||||
$actionLink = $this->createLink('bug', 'batchActivate');
|
||||
$misc = common::hasPriv('bug', 'batchActivate') ? "onclick=\"setFormAction('$actionLink','hiddenwin')\"" : $class;
|
||||
$actionLink = $this->createLink('bug', 'batchActivate', "productID=$productID&branch=$branch");
|
||||
$misc = common::hasPriv('bug', 'batchActivate') ? "onclick=\"setFormAction('$actionLink')\"" : $class;
|
||||
if($misc) echo "<li>" . html::a('javascript:;', $lang->bug->activate, '', $misc) . "</li>";
|
||||
|
||||
if(common::hasPriv('bug', 'batchChangeModule'))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?php
|
||||
<?php
|
||||
/**
|
||||
* The create view of bug module of ZenTaoPMS.
|
||||
*
|
||||
|
||||
@@ -39,6 +39,7 @@ class build extends control
|
||||
$product = $this->loadModel('product')->getByID($projectID);
|
||||
$products = $this->product->getPairs();
|
||||
$this->product->setMenu($products, $projectID);
|
||||
$this->lang->build->menu = $this->lang->product->menu;
|
||||
|
||||
$productGroups = array();
|
||||
$product->branch = 0;
|
||||
@@ -112,6 +113,7 @@ class build extends control
|
||||
$product = $this->loadModel('product')->getById($build->product);
|
||||
$products = $this->product->getPairs();
|
||||
$this->product->setMenu($products, $build->product);
|
||||
$this->lang->build->menu = $this->lang->product->menu;
|
||||
|
||||
$productGroups = array();
|
||||
$product->branch = 0;
|
||||
@@ -193,6 +195,7 @@ class build extends control
|
||||
{
|
||||
$products = $this->loadModel('product')->getPairs();
|
||||
$this->product->setMenu($products, $build->product);
|
||||
$this->lang->build->menu = $this->lang->product->menu;
|
||||
|
||||
$this->view->title = "BUILD #$build->id $build->name - " . $build->productName;
|
||||
$this->view->position[] = html::a($this->createLink('product', 'build', "productID=$build->product"), $build->productName);
|
||||
|
||||
+13
-10
@@ -14,15 +14,18 @@ function showLink(buildID, type, param)
|
||||
}
|
||||
$(function()
|
||||
{
|
||||
if(link == 'true') showLink(buildID, type, param);
|
||||
fixedTfootAction($('#' + type + 'List').closest('form'));
|
||||
$('.nav.nav-tabs a[data-toggle="tab"]').on('shown.zui.tab', function(e)
|
||||
if(flow != 'onlyTest')
|
||||
{
|
||||
var href = $(e.target).attr('href');
|
||||
var tabPane = $(href + '.tab-pane');
|
||||
if(tabPane.size() == 0) return;
|
||||
var formID = tabPane.find('.linkBox').find('form:last');
|
||||
if(formID.size() == 0) formID = tabPane.find('form:last');
|
||||
setTimeout(function(){fixedTfootAction(formID)}, 100);
|
||||
});
|
||||
if(link == 'true') showLink(buildID, type, param);
|
||||
fixedTfootAction($('#' + type + 'List').closest('form'));
|
||||
$('.nav.nav-tabs a[data-toggle="tab"]').on('shown.zui.tab', function(e)
|
||||
{
|
||||
var href = $(e.target).attr('href');
|
||||
var tabPane = $(href + '.tab-pane');
|
||||
if(tabPane.size() == 0) return;
|
||||
var formID = tabPane.find('.linkBox').find('form:last');
|
||||
if(formID.size() == 0) formID = tabPane.find('form:last');
|
||||
setTimeout(function(){fixedTfootAction(formID)}, 100);
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
@@ -13,7 +13,6 @@ $lang->build->common = "Build";
|
||||
$lang->build->create = "Create";
|
||||
$lang->build->edit = "Edit";
|
||||
$lang->build->linkStory = "Link Story";
|
||||
$lang->build->linked2build = "Link build";
|
||||
$lang->build->linkBug = "Link Bug";
|
||||
$lang->build->delete = "Delete Build";
|
||||
$lang->build->deleted = "Deleted";
|
||||
@@ -30,6 +29,7 @@ $lang->build->basicInfo = 'Basic Info';
|
||||
|
||||
$lang->build->id = 'ID';
|
||||
$lang->build->product = $lang->productCommon;
|
||||
$lang->build->branch = 'Platform/Branch';
|
||||
$lang->build->project = $lang->projectCommon;
|
||||
$lang->build->name = 'Name';
|
||||
$lang->build->date = 'Date';
|
||||
@@ -39,6 +39,7 @@ $lang->build->filePath = 'File Path';
|
||||
$lang->build->desc = 'Description';
|
||||
$lang->build->files = 'Upload Files';
|
||||
$lang->build->last = 'Last Build';
|
||||
$lang->build->packageType = 'Package Type';
|
||||
$lang->build->unlinkStory = 'Unlink Story';
|
||||
$lang->build->unlinkBug = 'Unlink Bug';
|
||||
$lang->build->stories = 'Finished Story';
|
||||
|
||||
@@ -29,6 +29,7 @@ $lang->build->basicInfo = '基本信息';
|
||||
|
||||
$lang->build->id = 'ID';
|
||||
$lang->build->product = $lang->productCommon;
|
||||
$lang->build->branch = '平台/分支';
|
||||
$lang->build->project = '所属' . $lang->projectCommon;
|
||||
$lang->build->name = '名称编号';
|
||||
$lang->build->date = '打包日期';
|
||||
@@ -38,6 +39,7 @@ $lang->build->filePath = '下载地址';
|
||||
$lang->build->desc = '描述';
|
||||
$lang->build->files = '上传发行包';
|
||||
$lang->build->last = '上个版本';
|
||||
$lang->build->packageType = '包类型';
|
||||
$lang->build->unlinkStory = '移除需求';
|
||||
$lang->build->unlinkBug = '移除Bug';
|
||||
$lang->build->stories = '完成的需求';
|
||||
|
||||
@@ -13,7 +13,6 @@ $lang->build->common = "版本";
|
||||
$lang->build->create = "創建版本";
|
||||
$lang->build->edit = "編輯版本";
|
||||
$lang->build->linkStory = "關聯需求";
|
||||
$lang->build->linked2build = "关联關聯版本";
|
||||
$lang->build->linkBug = "關聯Bug";
|
||||
$lang->build->delete = "刪除版本";
|
||||
$lang->build->deleted = "已刪除";
|
||||
@@ -30,6 +29,7 @@ $lang->build->basicInfo = '基本信息';
|
||||
|
||||
$lang->build->id = 'ID';
|
||||
$lang->build->product = $lang->productCommon;
|
||||
$lang->build->branch = '平台/分支';
|
||||
$lang->build->project = '所屬' . $lang->projectCommon;
|
||||
$lang->build->name = '名稱編號';
|
||||
$lang->build->date = '打包日期';
|
||||
@@ -39,6 +39,7 @@ $lang->build->filePath = '下載地址';
|
||||
$lang->build->desc = '描述';
|
||||
$lang->build->files = '上傳發行包';
|
||||
$lang->build->last = '上個版本';
|
||||
$lang->build->packageType = '包類型';
|
||||
$lang->build->unlinkStory = '移除需求';
|
||||
$lang->build->unlinkBug = '移除Bug';
|
||||
$lang->build->stories = '完成的需求';
|
||||
|
||||
@@ -66,7 +66,7 @@ class buildModel extends model
|
||||
->where('t1.project')->eq((int)$projectID)
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->orderBy('t1.date DESC, t1.id desc')
|
||||
->fetchAll();
|
||||
->fetchAll('id');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -200,6 +200,7 @@ class buildModel extends model
|
||||
->stripTags($this->config->build->editor->create['id'], $this->config->allowedTags)
|
||||
->remove('resolvedBy,allchecker,files,labels,uid')
|
||||
->get();
|
||||
if($this->config->global->flow == 'onlyTest') $build->project = 0;
|
||||
|
||||
$build = $this->loadModel('file')->processImgURL($build, $this->config->build->editor->create['id'], $this->post->uid);
|
||||
$this->dao->insert(TABLE_BUILD)->data($build)
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php js::set('confirmUnlinkStory', $lang->build->confirmUnlinkStory)?>
|
||||
<?php js::set('confirmUnlinkBug', $lang->build->confirmUnlinkBug)?>
|
||||
<?php js::set('flow', $this->config->global->flow)?>
|
||||
<?php if(isonlybody()):?>
|
||||
<style>
|
||||
#stories .action{display:none;}
|
||||
|
||||
+12
-12
@@ -124,7 +124,7 @@ $lang->searchObjects['release'] = 'Release';
|
||||
$lang->searchObjects['productplan'] = $lang->productCommon . 'Plan';
|
||||
$lang->searchObjects['testtask'] = 'Test Task';
|
||||
$lang->searchObjects['doc'] = 'Document';
|
||||
$lang->searchObjects['caselib'] = 'Case Library';
|
||||
$lang->searchObjects['testcase'] = 'Case Library';
|
||||
$lang->searchObjects['testreport'] = 'Test Report';
|
||||
$lang->searchTips = 'ID (ctrl+g)';
|
||||
|
||||
@@ -249,7 +249,7 @@ $lang->bug = new stdclass();
|
||||
$lang->bug->menu = new stdclass();
|
||||
|
||||
$lang->bug->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,batchactivate,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->testsuite = array('link' => 'Suite|testsuite|browse|productID=%s');
|
||||
@@ -449,16 +449,16 @@ $lang->browserNotice = 'Your current browser might not show the best effect
|
||||
$lang->noticePasteImg = "Paste image to editor.";
|
||||
|
||||
/* 时间格式设置。*/
|
||||
define('DT_DATETIME1', 'Y-m-d H:i:s');
|
||||
define('DT_DATETIME2', 'y-m-d H:i');
|
||||
define('DT_MONTHTIME1', 'n/d H:i');
|
||||
define('DT_MONTHTIME2', 'M d H:i');
|
||||
define('DT_DATE1', 'Y-m-d');
|
||||
define('DT_DATE2', 'Ymd');
|
||||
define('DT_DATE3', 'Y年m月d日');
|
||||
define('DT_DATE4', 'n月j日');
|
||||
define('DT_TIME1', 'H:i:s');
|
||||
define('DT_TIME2', 'H:i');
|
||||
if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s');
|
||||
if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i');
|
||||
if(!defined('DT_MONTHTIME1'))define('DT_MONTHTIME1', 'n/d H:i');
|
||||
if(!defined('DT_MONTHTIME2'))define('DT_MONTHTIME2', 'n月d日 H:i');
|
||||
if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d');
|
||||
if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd');
|
||||
if(!defined('DT_DATE3')) define('DT_DATE3', 'Y年m月d日');
|
||||
if(!defined('DT_DATE4')) define('DT_DATE4', 'n月j日');
|
||||
if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s');
|
||||
if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i');
|
||||
|
||||
/* datepicker 时间*/
|
||||
$lang->datepicker = new stdclass();
|
||||
|
||||
@@ -249,7 +249,7 @@ $lang->bug = new stdclass();
|
||||
$lang->bug->menu = new stdclass();
|
||||
|
||||
$lang->bug->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,batchactivate,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
@@ -449,16 +449,16 @@ $lang->browserNotice = '你目前使用的浏览器可能无法得到最佳
|
||||
$lang->noticePasteImg = "可以在编辑器直接贴图。";
|
||||
|
||||
/* 时间格式设置。*/
|
||||
define('DT_DATETIME1', 'Y-m-d H:i:s');
|
||||
define('DT_DATETIME2', 'y-m-d H:i');
|
||||
define('DT_MONTHTIME1', 'n/d H:i');
|
||||
define('DT_MONTHTIME2', 'n月d日 H:i');
|
||||
define('DT_DATE1', 'Y-m-d');
|
||||
define('DT_DATE2', 'Ymd');
|
||||
define('DT_DATE3', 'Y年m月d日');
|
||||
define('DT_DATE4', 'n月j日');
|
||||
define('DT_TIME1', 'H:i:s');
|
||||
define('DT_TIME2', 'H:i');
|
||||
if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s');
|
||||
if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i');
|
||||
if(!defined('DT_MONTHTIME1'))define('DT_MONTHTIME1', 'n/d H:i');
|
||||
if(!defined('DT_MONTHTIME2'))define('DT_MONTHTIME2', 'n月d日 H:i');
|
||||
if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d');
|
||||
if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd');
|
||||
if(!defined('DT_DATE3')) define('DT_DATE3', 'Y年m月d日');
|
||||
if(!defined('DT_DATE4')) define('DT_DATE4', 'n月j日');
|
||||
if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s');
|
||||
if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i');
|
||||
|
||||
/* datepicker 时间*/
|
||||
$lang->datepicker = new stdclass();
|
||||
|
||||
@@ -124,7 +124,7 @@ $lang->searchObjects['release'] = '發佈';
|
||||
$lang->searchObjects['productplan'] = $lang->productCommon . '計劃';
|
||||
$lang->searchObjects['testtask'] = '測試版本';
|
||||
$lang->searchObjects['doc'] = '文檔';
|
||||
$lang->searchObjects['caselib'] = '用例庫';
|
||||
$lang->searchObjects['testcase'] = '用例庫';
|
||||
$lang->searchObjects['testreport'] = '測試報告';
|
||||
$lang->searchTips = '編號(ctrl+g)';
|
||||
|
||||
@@ -249,7 +249,7 @@ $lang->bug = new stdclass();
|
||||
$lang->bug->menu = new stdclass();
|
||||
|
||||
$lang->bug->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,batchactivate,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
@@ -449,16 +449,16 @@ $lang->browserNotice = '你目前使用的瀏覽器可能無法得到最佳
|
||||
$lang->noticePasteImg = "可以在編輯器直接貼圖。";
|
||||
|
||||
/* 時間格式設置。*/
|
||||
define('DT_DATETIME1', 'Y-m-d H:i:s');
|
||||
define('DT_DATETIME2', 'y-m-d H:i');
|
||||
define('DT_MONTHTIME1', 'n/d H:i');
|
||||
define('DT_MONTHTIME2', 'n月d日 H:i');
|
||||
define('DT_DATE1', 'Y-m-d');
|
||||
define('DT_DATE2', 'Ymd');
|
||||
define('DT_DATE3', 'Y年m月d日');
|
||||
define('DT_DATE4', 'n月j日');
|
||||
define('DT_TIME1', 'H:i:s');
|
||||
define('DT_TIME2', 'H:i');
|
||||
if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s');
|
||||
if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i');
|
||||
if(!defined('DT_MONTHTIME1'))define('DT_MONTHTIME1', 'n/d H:i');
|
||||
if(!defined('DT_MONTHTIME2'))define('DT_MONTHTIME2', 'n月d日 H:i');
|
||||
if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d');
|
||||
if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd');
|
||||
if(!defined('DT_DATE3')) define('DT_DATE3', 'Y年m月d日');
|
||||
if(!defined('DT_DATE4')) define('DT_DATE4', 'n月j日');
|
||||
if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s');
|
||||
if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i');
|
||||
|
||||
/* datepicker 時間*/
|
||||
$lang->datepicker = new stdclass();
|
||||
|
||||
@@ -249,9 +249,7 @@ class commonModel extends model
|
||||
echo "<li class='divider'></li>";
|
||||
}
|
||||
|
||||
$isLeft = ($app->company->website and $app->company->backyard) ? '' : ' left';
|
||||
|
||||
echo "<li class='dropdown-submenu{$isLeft}'>";
|
||||
echo "<li class='dropdown-submenu left'>";
|
||||
echo "<a href='javascript:;'>" . $lang->theme . "</a><ul class='dropdown-menu'>";
|
||||
foreach ($app->lang->themes as $key => $value)
|
||||
{
|
||||
@@ -259,7 +257,7 @@ class commonModel extends model
|
||||
}
|
||||
echo '</ul></li>';
|
||||
|
||||
echo "<li class='dropdown-submenu{$isLeft}'>";
|
||||
echo "<li class='dropdown-submenu left'>";
|
||||
echo "<a href='javascript:;'>" . $lang->lang . "</a><ul class='dropdown-menu'>";
|
||||
foreach ($app->config->langs as $key => $value)
|
||||
{
|
||||
@@ -1132,7 +1130,7 @@ class commonModel extends model
|
||||
global $app, $lang;
|
||||
|
||||
/* Check is the super admin or not. */
|
||||
if($app->user->admin) return true;
|
||||
if(!empty($app->user->admin)) return true;
|
||||
|
||||
/* If not super admin, check the rights. */
|
||||
$rights = $app->user->rights['rights'];
|
||||
|
||||
@@ -25,6 +25,7 @@ $lang->company->zipcode = 'Zip Code';
|
||||
$lang->company->website = 'Website';
|
||||
$lang->company->backyard = 'Intranet';
|
||||
$lang->company->guest = 'Guest Login';
|
||||
$lang->company->admins = 'Administrators';
|
||||
|
||||
$lang->company->product = $lang->productCommon;
|
||||
$lang->company->project = $lang->projectCommon;
|
||||
|
||||
@@ -25,6 +25,7 @@ $lang->company->zipcode = '邮政编码';
|
||||
$lang->company->website = '官网';
|
||||
$lang->company->backyard = '内网';
|
||||
$lang->company->guest = '匿名登录';
|
||||
$lang->company->admins = '管理员';
|
||||
|
||||
$lang->company->product = $lang->productCommon;
|
||||
$lang->company->project = $lang->projectCommon;
|
||||
|
||||
@@ -25,6 +25,7 @@ $lang->company->zipcode = '郵政編碼';
|
||||
$lang->company->website = '官網';
|
||||
$lang->company->backyard = '內網';
|
||||
$lang->company->guest = '匿名登錄';
|
||||
$lang->company->admins = '管理員';
|
||||
|
||||
$lang->company->product = $lang->productCommon;
|
||||
$lang->company->project = $lang->projectCommon;
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
class custom extends control
|
||||
{
|
||||
/**
|
||||
* Index
|
||||
*
|
||||
* Index
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -23,11 +23,11 @@ class custom extends control
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom
|
||||
*
|
||||
* @param string $module
|
||||
* @param string $field
|
||||
* @param string $lang
|
||||
* Custom
|
||||
*
|
||||
* @param string $module
|
||||
* @param string $field
|
||||
* @param string $lang
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -107,7 +107,7 @@ class custom extends control
|
||||
/* Fix bug #942. */
|
||||
if($field == 'priList' and !is_numeric($key)) die(js::alert($this->lang->custom->notice->priListKey));
|
||||
if($module == 'bug' and $field == 'severityList' and !is_numeric($key)) die(js::alert($this->lang->custom->notice->severityListKey));
|
||||
if($module == 'bug' and $field == 'resolutionList' and !empty($key) and !validater::checkCode($key)) die(js::alert($this->lang->custom->notice->resolutionList));
|
||||
if(!empty($key) and !validater::checkCode($key)) die(js::alert($this->lang->custom->notice->keyList));
|
||||
|
||||
/* the length of role is 20, check it when save. */
|
||||
if($module == 'user' and $field == 'roleList' and strlen($key) > 20) die(js::alert($this->lang->custom->notice->userRole));
|
||||
|
||||
@@ -9,6 +9,10 @@ $lang->custom->flow = 'Process';
|
||||
$lang->custom->working = 'Working';
|
||||
$lang->custom->select = 'Select Process';
|
||||
$lang->custom->branch = 'Multi Branch';
|
||||
$lang->custom->owner = 'Owner';
|
||||
$lang->custom->module = 'Module';
|
||||
$lang->custom->section = 'Section';
|
||||
$lang->custom->lang = 'Language';
|
||||
|
||||
$lang->custom->object['story'] = 'Story';
|
||||
$lang->custom->object['task'] = 'Task';
|
||||
@@ -79,7 +83,7 @@ $lang->custom->notice->canNotAdd = 'This item will be processed, so c
|
||||
$lang->custom->notice->forceReview = 'Review is required for %s submitted by certain assignee.';
|
||||
$lang->custom->notice->longlife = 'List "Undone" bugs that are older than hold days from "Longlife" bugs.';
|
||||
$lang->custom->notice->priListKey = 'Priority list key should be numbers!';
|
||||
$lang->custom->notice->resolutionList = 'Solution list key should be English or digital!';
|
||||
$lang->custom->notice->keyList = 'key should be English or digital!';
|
||||
$lang->custom->notice->severityListKey = 'Bug severity list key should be numbers.';
|
||||
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Homepage. Do you want to enter Product Homepage?";
|
||||
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Homepage. Do you want to enter Project Homepage?";
|
||||
|
||||
@@ -9,6 +9,10 @@ $lang->custom->flow = '流程';
|
||||
$lang->custom->working = '工作方式';
|
||||
$lang->custom->select = '请选择流程:';
|
||||
$lang->custom->branch = '多分支';
|
||||
$lang->custom->owner = '所有者';
|
||||
$lang->custom->module = '模块';
|
||||
$lang->custom->section = '附加部分';
|
||||
$lang->custom->lang = '所属语言';
|
||||
|
||||
$lang->custom->object['story'] = '需求';
|
||||
$lang->custom->object['task'] = '任务';
|
||||
@@ -79,7 +83,7 @@ $lang->custom->notice->canNotAdd = '该项参与运算,不提供自
|
||||
$lang->custom->notice->forceReview = "指定人提交的%s必须评审。";
|
||||
$lang->custom->notice->longlife = 'Bug列表页面的久未处理标签中,列出设置天数之前未处理的Bug。';
|
||||
$lang->custom->notice->priListKey = '优先级的键应当为数字!';
|
||||
$lang->custom->notice->resolutionList = '解决方案的键值应当为英文或数字';
|
||||
$lang->custom->notice->keyList = '键值应当为英文或数字';
|
||||
$lang->custom->notice->severityListKey = 'Bug严重程度的键应当为数字!';
|
||||
$lang->custom->notice->indexPage['product'] = "从8.2版本起增加了产品主页视图,是否默认进入产品主页?";
|
||||
$lang->custom->notice->indexPage['project'] = "从8.2版本起增加了项目主页视图,是否默认进入项目主页?";
|
||||
|
||||
@@ -9,6 +9,10 @@ $lang->custom->flow = '流程';
|
||||
$lang->custom->working = '工作方式';
|
||||
$lang->custom->select = '請選擇流程:';
|
||||
$lang->custom->branch = '多分支';
|
||||
$lang->custom->owner = '所有者';
|
||||
$lang->custom->module = '模組';
|
||||
$lang->custom->section = '附加部分';
|
||||
$lang->custom->lang = '所屬語言';
|
||||
|
||||
$lang->custom->object['story'] = '需求';
|
||||
$lang->custom->object['task'] = '任務';
|
||||
@@ -79,7 +83,7 @@ $lang->custom->notice->canNotAdd = '該項參與運算,不提供自
|
||||
$lang->custom->notice->forceReview = "指定人提交的%s必須評審。";
|
||||
$lang->custom->notice->longlife = 'Bug列表頁面的久未處理標籤中,列出設置天數之前未處理的Bug。';
|
||||
$lang->custom->notice->priListKey = '優先順序的鍵應當為數字!';
|
||||
$lang->custom->notice->resolutionList = '解決方案的鍵值應當為英文或數字';
|
||||
$lang->custom->notice->keyList = '鍵值應當為英文或數字';
|
||||
$lang->custom->notice->severityListKey = 'Bug嚴重程度的鍵應當為數字!';
|
||||
$lang->custom->notice->indexPage['product'] = "從8.2版本起增加了產品主頁視圖,是否預設進入產品主頁?";
|
||||
$lang->custom->notice->indexPage['project'] = "從8.2版本起增加了項目主頁視圖,是否預設進入項目主頁?";
|
||||
|
||||
@@ -25,6 +25,7 @@ $config->dev->group['testreport'] = 'qa';
|
||||
$config->dev->group['testsuite'] = 'qa';
|
||||
$config->dev->group['testresult'] = 'qa';
|
||||
$config->dev->group['testrun'] = 'qa';
|
||||
$config->dev->group['suitecase'] = 'qa';
|
||||
$config->dev->group['doc'] = 'doc';
|
||||
$config->dev->group['doccontent'] = 'doc';
|
||||
$config->dev->group['doclib'] = 'doc';
|
||||
@@ -48,3 +49,28 @@ $config->dev->group['mail'] = 'admin';
|
||||
$config->dev->group['backup'] = 'admin';
|
||||
$config->dev->group['cron'] = 'admin';
|
||||
$config->dev->group['dev'] = 'admin';
|
||||
|
||||
$config->dev->tableMap['storyspec'] = 'story';
|
||||
$config->dev->tableMap['storystage'] = 'story';
|
||||
$config->dev->tableMap['burn'] = 'task';
|
||||
$config->dev->tableMap['projectproduct'] = 'project';
|
||||
$config->dev->tableMap['projectstory'] = 'story';
|
||||
$config->dev->tableMap['taskestimate'] = 'task';
|
||||
$config->dev->tableMap['team'] = 'project';
|
||||
$config->dev->tableMap['case'] = 'testcase';
|
||||
$config->dev->tableMap['casestep'] = 'testcase';
|
||||
$config->dev->tableMap['testresult'] = 'testtask';
|
||||
$config->dev->tableMap['testrun'] = 'testtask';
|
||||
$config->dev->tableMap['doccontent'] = 'doc';
|
||||
$config->dev->tableMap['doclib'] = 'doc';
|
||||
$config->dev->tableMap['grouppriv'] = 'group';
|
||||
$config->dev->tableMap['usercontact'] = 'user-contacts';
|
||||
$config->dev->tableMap['usergroup'] = 'user';
|
||||
$config->dev->tableMap['userquery'] = 'search';
|
||||
$config->dev->tableMap['usertpl'] = 'user-tpl';
|
||||
$config->dev->tableMap['history'] = 'action-history';
|
||||
$config->dev->tableMap['lang'] = 'custom';
|
||||
$config->dev->tableMap['config'] = 'custom';
|
||||
$config->dev->tableMap['mailqueue'] = 'mail';
|
||||
$config->dev->tableMap['module'] = 'tree';
|
||||
$config->dev->tableMap['suitecase'] = 'testcase';
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
/**
|
||||
* The control file of dev module of ZenTaoPMS.
|
||||
*
|
||||
*
|
||||
* @copyright Copyright 2009-2010 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @author chunsheng wang <chunsheng@cnezsoft.com>
|
||||
* @package
|
||||
* @package
|
||||
* @uses control
|
||||
* @license LGPL
|
||||
* @version $Id$
|
||||
@@ -14,7 +14,7 @@ class dev extends control
|
||||
{
|
||||
/**
|
||||
* Get API of system.
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -31,11 +31,11 @@ class dev extends control
|
||||
$this->view->modules = $this->dev->getModules();
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get schema of database.
|
||||
*
|
||||
* @param string $table
|
||||
*
|
||||
* @param string $table
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
|
||||
@@ -89,13 +89,13 @@ $lang->dev->tableList['branch'] = 'Branch';
|
||||
$lang->dev->tableList['doccontent'] = 'Doc Content';
|
||||
$lang->dev->tableList['storystage'] = 'Story Stage';
|
||||
$lang->dev->tableList['tutorial'] = 'Tutorial';
|
||||
$lang->dev->tableList['suitecase'] = 'Suite Case';
|
||||
|
||||
$lang->dev->groupList['my'] = 'Dashboard';
|
||||
$lang->dev->groupList['product'] = $lang->productCommon;
|
||||
$lang->dev->groupList['project'] = $lang->projectCommon;
|
||||
$lang->dev->groupList['qa'] = 'Testing';
|
||||
$lang->dev->groupList['doc'] = 'Document';
|
||||
$lang->dev->groupList['report'] = 'Report';
|
||||
$lang->dev->groupList['company'] = 'Company';
|
||||
$lang->dev->groupList['admin'] = 'Admin';
|
||||
$lang->dev->groupList['other'] = 'Others';
|
||||
|
||||
@@ -89,13 +89,13 @@ $lang->dev->tableList['branch'] = '平台/分支';
|
||||
$lang->dev->tableList['doccontent'] = '文档内容';
|
||||
$lang->dev->tableList['storystage'] = '需求阶段';
|
||||
$lang->dev->tableList['tutorial'] = '新手教程';
|
||||
$lang->dev->tableList['suitecase'] = '套件用例';
|
||||
|
||||
$lang->dev->groupList['my'] = '我的地盘';
|
||||
$lang->dev->groupList['product'] = $lang->productCommon;
|
||||
$lang->dev->groupList['project'] = $lang->projectCommon;
|
||||
$lang->dev->groupList['qa'] = '测试';
|
||||
$lang->dev->groupList['doc'] = '文档';
|
||||
$lang->dev->groupList['report'] = '统计';
|
||||
$lang->dev->groupList['company'] = '组织';
|
||||
$lang->dev->groupList['admin'] = '后台';
|
||||
$lang->dev->groupList['other'] = '其他模块';
|
||||
|
||||
@@ -89,13 +89,13 @@ $lang->dev->tableList['branch'] = '平台/分支';
|
||||
$lang->dev->tableList['doccontent'] = '文檔內容';
|
||||
$lang->dev->tableList['storystage'] = '需求階段';
|
||||
$lang->dev->tableList['tutorial'] = '新手教程';
|
||||
$lang->dev->tableList['suitecase'] = '套件用例';
|
||||
|
||||
$lang->dev->groupList['my'] = '我的地盤';
|
||||
$lang->dev->groupList['product'] = $lang->productCommon;
|
||||
$lang->dev->groupList['project'] = $lang->projectCommon;
|
||||
$lang->dev->groupList['qa'] = '測試';
|
||||
$lang->dev->groupList['doc'] = '文檔';
|
||||
$lang->dev->groupList['report'] = '統計';
|
||||
$lang->dev->groupList['company'] = '組織';
|
||||
$lang->dev->groupList['admin'] = '後台';
|
||||
$lang->dev->groupList['other'] = '其他模組';
|
||||
|
||||
+12
-6
@@ -35,11 +35,13 @@ class devModel extends model
|
||||
*/
|
||||
public function getFields($table)
|
||||
{
|
||||
$module = substr($table, strpos($table, '_') + 1);
|
||||
$module = substr($table, strpos($table, '_') + 1);
|
||||
$aliasModule = $subLang = '';
|
||||
try
|
||||
{
|
||||
if($module == 'case') $module = 'testcase';
|
||||
$this->app->loadLang($module);
|
||||
if(isset($this->config->dev->tableMap[$module])) $aliasModule = $this->config->dev->tableMap[$module];
|
||||
if(strpos($aliasModule, '-') !== false) list($aliasModule, $subLang) = explode('-', $aliasModule);
|
||||
$this->app->loadLang($aliasModule ? $aliasModule : $module);
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
@@ -57,6 +59,7 @@ class devModel extends model
|
||||
{
|
||||
$this->sqlError($e);
|
||||
}
|
||||
|
||||
foreach($rawFields as $rawField)
|
||||
{
|
||||
$firstPOS = strpos($rawField->type, '(');
|
||||
@@ -64,6 +67,9 @@ class devModel extends model
|
||||
$type = str_replace(array('big', 'small', 'medium', 'tiny'), '', $type);
|
||||
$field = array();
|
||||
$field['name'] = isset($this->lang->$module->{$rawField->field}) ? $this->lang->$module->{$rawField->field} : '';
|
||||
if(empty($field['name']) and $aliasModule) $field['name'] = isset($this->lang->$aliasModule->{$rawField->field}) ? $this->lang->$aliasModule->{$rawField->field} : '';
|
||||
if($subLang) $field['name'] = isset($this->lang->$aliasModule->$subLang->{$rawField->field}) ? $this->lang->$aliasModule->$subLang->{$rawField->field} : $field['name'];
|
||||
if(!is_string($field['name'])) $field['name'] = '';
|
||||
$field['null'] = $rawField->null;
|
||||
|
||||
if($type == 'enum' or $type == 'set')
|
||||
@@ -226,18 +232,18 @@ class devModel extends model
|
||||
|
||||
/**
|
||||
* Get all modules.
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getModules()
|
||||
{
|
||||
{
|
||||
$moduleList = glob($this->app->getModuleRoot() . '*');
|
||||
$modules = array();
|
||||
foreach($moduleList as $module)
|
||||
{
|
||||
$module = basename($module);
|
||||
if($module == 'editor' or $module == 'help' or $module == 'setting') continue;
|
||||
if($module == 'editor' or $module == 'help' or $module == 'setting' or $module == 'common') continue;
|
||||
$group = zget($this->config->dev->group, $module, 'other');
|
||||
$modules[$group][] = $module;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<?php foreach($lang->dev->groupList as $group => $groupName):?>
|
||||
<div class='modulegroup'><?php echo $groupName?></div>
|
||||
<?php foreach($modules[$group] as $module):?>
|
||||
<?php
|
||||
<?php
|
||||
$active = ($module == $selectedModule) ? 'active' : '';
|
||||
$moduleName = zget($lang->dev->tableList, $module, $module);
|
||||
?>
|
||||
@@ -18,7 +18,7 @@
|
||||
<?php if($selectedModule):?>
|
||||
<?php foreach($apis as $api):?>
|
||||
<table class='table table-condensed table-striped table-bordered tablesorter table-fixed active-disabled' id="api">
|
||||
<?php
|
||||
<?php
|
||||
$params = array();
|
||||
if(isset($api['param']))
|
||||
{
|
||||
@@ -28,7 +28,7 @@
|
||||
?>
|
||||
<tr>
|
||||
<th colspan="3">
|
||||
<?php
|
||||
<?php
|
||||
echo $api['post'] ? 'GET/POST' : 'GET';
|
||||
echo ' ' . $this->createLink($selectedModule, $api['name'], $params, 'json');
|
||||
?>
|
||||
|
||||
@@ -655,8 +655,6 @@ class doc extends control
|
||||
$this->view->viewType = $viewType;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->objectID = $objectID;
|
||||
$this->view->recTotal = $recTotal;
|
||||
$this->view->recPerPage = $recPerPage;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -40,6 +40,9 @@ $lang->doc->filePath = 'File Path';
|
||||
$lang->doc->extension = 'Extension';
|
||||
$lang->doc->size = 'Size';
|
||||
$lang->doc->download = 'Download';
|
||||
$lang->doc->acl = 'Right';
|
||||
$lang->doc->groups = 'Groups';
|
||||
$lang->doc->users = 'Users';
|
||||
|
||||
$lang->doc->moduleDoc = 'By Module';
|
||||
$lang->doc->searchDoc = 'By Search';
|
||||
@@ -107,6 +110,7 @@ $lang->doc->browseType = 'Categories';
|
||||
$lang->doc->browseTypeList['list'] = 'List';
|
||||
$lang->doc->browseTypeList['menu'] = 'Menu';
|
||||
$lang->doc->browseTypeList['tree'] = 'Tree';
|
||||
$lang->doc->browseTypeList['card'] = 'Card';
|
||||
|
||||
$lang->doc->confirmDelete = "Do you want to delete this document?";
|
||||
$lang->doc->confirmDeleteLib = "Do you want to delete this Doc Lib?";
|
||||
|
||||
@@ -40,6 +40,9 @@ $lang->doc->filePath = '地址';
|
||||
$lang->doc->extension = '类型';
|
||||
$lang->doc->size = '大小';
|
||||
$lang->doc->download = '下载';
|
||||
$lang->doc->acl = '权限';
|
||||
$lang->doc->groups = '分组';
|
||||
$lang->doc->users = '用户';
|
||||
|
||||
$lang->doc->moduleDoc = '按模块浏览';
|
||||
$lang->doc->searchDoc = '搜索';
|
||||
@@ -107,6 +110,7 @@ $lang->doc->browseType = '浏览方式';
|
||||
$lang->doc->browseTypeList['list'] = '列表';
|
||||
$lang->doc->browseTypeList['menu'] = '目录';
|
||||
$lang->doc->browseTypeList['tree'] = '树状图';
|
||||
$lang->doc->browseTypeList['card'] = '卡片';
|
||||
|
||||
$lang->doc->confirmDelete = "您确定删除该文档吗?";
|
||||
$lang->doc->confirmDeleteLib = "您确定删除该文档库吗?";
|
||||
|
||||
@@ -40,6 +40,9 @@ $lang->doc->filePath = '地址';
|
||||
$lang->doc->extension = '類型';
|
||||
$lang->doc->size = '大小';
|
||||
$lang->doc->download = '下載';
|
||||
$lang->doc->acl = '權限';
|
||||
$lang->doc->groups = '分組';
|
||||
$lang->doc->users = '用戶';
|
||||
|
||||
$lang->doc->moduleDoc = '按模組瀏覽';
|
||||
$lang->doc->searchDoc = '搜索';
|
||||
@@ -107,6 +110,7 @@ $lang->doc->browseType = '瀏覽方式';
|
||||
$lang->doc->browseTypeList['list'] = '列表';
|
||||
$lang->doc->browseTypeList['menu'] = '目錄';
|
||||
$lang->doc->browseTypeList['tree'] = '樹狀圖';
|
||||
$lang->doc->browseTypeList['card'] = '卡片';
|
||||
|
||||
$lang->doc->confirmDelete = "您確定刪除該文檔嗎?";
|
||||
$lang->doc->confirmDeleteLib = "您確定刪除該文檔庫嗎?";
|
||||
|
||||
@@ -28,72 +28,67 @@
|
||||
echo html::hidden('pageID', isset($this->get->pageID) ? $this->get->pageID : 0);
|
||||
}
|
||||
?>
|
||||
<div class='input-group input-group-sm'>
|
||||
<div class='input-group input-group-sm w-200px'>
|
||||
<?php echo html::input('title', $this->get->title, "class='form-control search-query' placeholder='{$lang->doc->fileTitle}'");?>
|
||||
<span class='input-group-btn'>
|
||||
<?php echo html::submitButton($lang->doc->search);?>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
<?php echo html::backButton();?>
|
||||
<div class='text-right pull-right'>
|
||||
<?php
|
||||
$changeType = "type=$type&objectID=$objectID&viewType=" . ($viewType == 'list' ? 'card' : 'list');
|
||||
echo html::a(inLink('showFiles', $changeType), "<i class='icon icon-th-list icon-4x'></i> 切换界面布局");
|
||||
?>
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn dropdown-toggle" data-toggle="dropdown"><i class='icon <?php echo $viewType == 'list' ? 'icon-list' : 'icon-th'?>'></i> <?php echo $lang->doc->browseTypeList[$viewType]?> <span class="caret"></span></button>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><?php echo html::a(inlink('showFiles', "type=$type&objectID=$objectID&viewType=card"), "<i class='icon icon-th'></i> {$lang->doc->browseTypeList['card']}");?></li>
|
||||
<li><?php echo html::a(inlink('showFiles', "type=$type&objectID=$objectID&viewType=list"), "<i class='icon icon-list'></i> {$lang->doc->browseTypeList['list']}");?></li>
|
||||
</ul>
|
||||
</div>
|
||||
<?php echo html::backButton();?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if($viewType == 'list'):?>
|
||||
<form method='post' id='ajaxForm'>
|
||||
<table class='table table-hover table-striped tablesorter table-fixed' id='orderList'>
|
||||
<thead>
|
||||
<?php $vars = "type=$type&objectID=$objectID&viewType=list&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage";?>
|
||||
<tr class='text-center'>
|
||||
<th class='w-80px'> <?php common::printOrderLink('t1.id', $orderBy, $vars, $lang->doc->id);?> </th>
|
||||
<th> <?php common::printOrderLink('title', $orderBy, $vars, $lang->doc->fileTitle);?> </th>
|
||||
<th> <?php common::printOrderLink('pathname', $orderBy, $vars, $lang->doc->filePath);?> </th>
|
||||
<th class='w-60px'> <?php common::printOrderLink('extension', $orderBy, $vars, $lang->doc->extension);?> </th>
|
||||
<th class='w-80px'> <?php common::printOrderLink('size', $orderBy, $vars, $lang->doc->size);?> </th>
|
||||
<th class='w-100px'> <?php common::printOrderLink('addedBy', $orderBy, $vars, $lang->doc->addedBy);?> </th>
|
||||
<th class='w-160px'> <?php common::printOrderLink('addedDate', $orderBy, $vars, $lang->doc->addedDate);?> </th>
|
||||
<th class='w-80px'> <?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($files as $file):?>
|
||||
<?php if(empty($file->pathname)) continue;?>
|
||||
<tr class='text-center text-middle'>
|
||||
<td>
|
||||
<?php echo $file->id;?>
|
||||
</td>
|
||||
<td class='text-left'>
|
||||
<?php echo $file->title;?>
|
||||
</td>
|
||||
<td class='text-left'> <?php echo $file->pathname;?> </td>
|
||||
<td><?php echo $file->extension;?></td>
|
||||
<td><?php echo number_format($file->size / 1024 , 1) . 'K';?></td>
|
||||
<td><?php echo isset($file->addedBy) ? $file->addedBy : '';?></td>
|
||||
<td><?php echo isset($file->addedDate) ? substr($file->addedDate, 0, 10) : '';?></td>
|
||||
<td class='text-center'>
|
||||
<?php
|
||||
common::printLink('file', 'download', "fileID=$file->id", $lang->doc->download, "data-toggle='modal'");
|
||||
common::printLink('file', 'delete', "fileID=$file->id", $lang->delete, 'hiddenwin');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='8'>
|
||||
<?php $pager->show();?>
|
||||
<table class='table table-hover table-striped tablesorter table-fixed' id='orderList'>
|
||||
<thead>
|
||||
<?php $vars = "type=$type&objectID=$objectID&viewType=list&orderBy=%s&recTotal=$pager->recTotal&recPerPage=$pager->recPerPage";?>
|
||||
<tr class='text-center'>
|
||||
<th class='w-80px'> <?php common::printOrderLink('t1.id', $orderBy, $vars, $lang->doc->id);?> </th>
|
||||
<th> <?php common::printOrderLink('title', $orderBy, $vars, $lang->doc->fileTitle);?> </th>
|
||||
<th> <?php common::printOrderLink('pathname', $orderBy, $vars, $lang->doc->filePath);?> </th>
|
||||
<th class='w-60px'> <?php common::printOrderLink('extension', $orderBy, $vars, $lang->doc->extension);?> </th>
|
||||
<th class='w-80px'> <?php common::printOrderLink('size', $orderBy, $vars, $lang->doc->size);?> </th>
|
||||
<th class='w-100px'> <?php common::printOrderLink('addedBy', $orderBy, $vars, $lang->doc->addedBy);?> </th>
|
||||
<th class='w-160px'> <?php common::printOrderLink('addedDate', $orderBy, $vars, $lang->doc->addedDate);?> </th>
|
||||
<th class='w-80px'> <?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($files as $file):?>
|
||||
<?php if(empty($file->pathname)) continue;?>
|
||||
<tr class='text-center text-middle'>
|
||||
<td><?php echo $file->id;?></td>
|
||||
<td class='text-left'>
|
||||
<a href='<?php echo $this->createLink($file->objectType, 'view', "objectID=$file->objectID");?>'><?php echo $file->title . '.' . $file->extension . ' [' . strtoupper($file->objectType) . ' #' . $file->objectID . ']';?></a>
|
||||
</td>
|
||||
<td class='text-left'> <?php echo $file->pathname;?> </td>
|
||||
<td><?php echo $file->extension;?></td>
|
||||
<td><?php echo number_format($file->size / 1024 , 1) . 'K';?></td>
|
||||
<td><?php echo isset($file->addedBy) ? $file->addedBy : '';?></td>
|
||||
<td><?php echo isset($file->addedDate) ? substr($file->addedDate, 0, 10) : '';?></td>
|
||||
<td class='text-center'>
|
||||
<?php
|
||||
common::printLink('file', 'download', "fileID=$file->id", $lang->doc->download, "data-toggle='modal'");
|
||||
common::printLink('file', 'delete', "fileID=$file->id", $lang->delete, 'hiddenwin');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='8'> <?php $pager->show();?> </td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php else:?>
|
||||
<div class='lib-files cards'>
|
||||
<?php foreach($files as $file):?>
|
||||
|
||||
@@ -30,8 +30,14 @@ $lang->extension->installed = 'Installed';
|
||||
$lang->extension->deactivated = 'Deactivated';
|
||||
$lang->extension->available = 'Downloaded';
|
||||
|
||||
$lang->extension->name = 'Extension Name';
|
||||
$lang->extension->code = 'Code';
|
||||
$lang->extension->desc = 'Describe';
|
||||
$lang->extension->type = 'Type';
|
||||
$lang->extension->dirs = 'Directories';
|
||||
$lang->extension->files = 'Files';
|
||||
$lang->extension->status = 'Status';
|
||||
$lang->extension->version = 'Version';
|
||||
$lang->extension->compatible = 'Compatible';
|
||||
$lang->extension->latest = '<small>Latest:<strong><a href="%s" target="_blank" class="extension">%s</a></strong>,need zentao <a href="http://api.zentao.net/goto.php?item=latest" target="_blank"><strong>%s</strong></small>';
|
||||
$lang->extension->author = 'Author';
|
||||
$lang->extension->license = 'License';
|
||||
@@ -40,6 +46,8 @@ $lang->extension->downloads = 'Downloads';
|
||||
$lang->extension->compatible = 'Compatibility';
|
||||
$lang->extension->grade = 'Score';
|
||||
$lang->extension->depends = 'Dependent';
|
||||
$lang->extension->zentaoCompatible = 'Compatible Version';
|
||||
$lang->extension->installedTime = 'Installed Time';
|
||||
|
||||
$lang->extension->publicList[0] = 'Manually';
|
||||
$lang->extension->publicList[1] = 'Auto';
|
||||
|
||||
@@ -30,8 +30,14 @@ $lang->extension->installed = '已安装';
|
||||
$lang->extension->deactivated = '被禁用';
|
||||
$lang->extension->available = '已下载';
|
||||
|
||||
$lang->extension->name = '插件名称';
|
||||
$lang->extension->code = '代号';
|
||||
$lang->extension->desc = '描述';
|
||||
$lang->extension->type = '类型';
|
||||
$lang->extension->dirs = '安装目录';
|
||||
$lang->extension->files = '安装文件';
|
||||
$lang->extension->status = '状态';
|
||||
$lang->extension->version = '版本';
|
||||
$lang->extension->compatible = '适用版本';
|
||||
$lang->extension->latest = '<small>最新版本<strong><a href="%s" target="_blank" class="extension">%s</a></strong>,兼容禅道<a href="http://api.zentao.net/goto.php?item=latest" target="_blank" class="alert-link"><strong>%s</strong></a></small>';
|
||||
$lang->extension->author = '作者';
|
||||
$lang->extension->license = '授权';
|
||||
@@ -40,6 +46,8 @@ $lang->extension->downloads = '下载量';
|
||||
$lang->extension->compatible = '兼容性';
|
||||
$lang->extension->grade = '评分';
|
||||
$lang->extension->depends = '依赖';
|
||||
$lang->extension->zentaoCompatible = '适用版本';
|
||||
$lang->extension->installedTime = '安装时间';
|
||||
|
||||
$lang->extension->publicList[0] = '手工下载';
|
||||
$lang->extension->publicList[1] = '直接下载';
|
||||
|
||||
@@ -30,8 +30,14 @@ $lang->extension->installed = '已安裝';
|
||||
$lang->extension->deactivated = '被禁用';
|
||||
$lang->extension->available = '已下載';
|
||||
|
||||
$lang->extension->name = '插件名稱';
|
||||
$lang->extension->code = '代號';
|
||||
$lang->extension->desc = '描述';
|
||||
$lang->extension->type = '類型';
|
||||
$lang->extension->dirs = '安裝目錄';
|
||||
$lang->extension->files = '安裝檔案';
|
||||
$lang->extension->status = '狀態';
|
||||
$lang->extension->version = '版本';
|
||||
$lang->extension->compatible = '適用版本';
|
||||
$lang->extension->latest = '<small>最新版本<strong><a href="%s" target="_blank" class="extension">%s</a></strong>,兼容禪道<a href="http://api.zentao.net/goto.php?item=latest" target="_blank" class="alert-link"><strong>%s</strong></a></small>';
|
||||
$lang->extension->author = '作者';
|
||||
$lang->extension->license = '授權';
|
||||
@@ -40,6 +46,8 @@ $lang->extension->downloads = '下載量';
|
||||
$lang->extension->compatible = '兼容性';
|
||||
$lang->extension->grade = '評分';
|
||||
$lang->extension->depends = '依賴';
|
||||
$lang->extension->zentaoCompatible = '適用版本';
|
||||
$lang->extension->installedTime = '安裝時間';
|
||||
|
||||
$lang->extension->publicList[0] = '手工下載';
|
||||
$lang->extension->publicList[1] = '直接下載';
|
||||
|
||||
@@ -30,6 +30,15 @@ $lang->file->addFile = 'Add File';
|
||||
$lang->file->beginUpload = 'Start uploading';
|
||||
$lang->file->uploadSuccess = 'uploaded Successfully';
|
||||
|
||||
$lang->file->pathname = 'Path Name';
|
||||
$lang->file->title = 'Title';
|
||||
$lang->file->extension = 'Extension';
|
||||
$lang->file->size = 'Size';
|
||||
$lang->file->addedBy = 'Added By';
|
||||
$lang->file->addedDate = 'Added Date';
|
||||
$lang->file->downloads = 'Downloads';
|
||||
$lang->file->extra = 'Extra';
|
||||
|
||||
$lang->file->dragFile = 'Please drag here.';
|
||||
$lang->file->errorNotExists = "<span class='red'>'%s' is not found.</span>";
|
||||
$lang->file->errorCanNotWrite = "<span class='red'>'%s' is not writable. Please change its permission. Enter sudo chmod -R 777 '%s'</span> in Linux.";
|
||||
|
||||
@@ -30,6 +30,15 @@ $lang->file->addFile = '添加文件';
|
||||
$lang->file->beginUpload = '开始上传';
|
||||
$lang->file->uploadSuccess = '上传成功';
|
||||
|
||||
$lang->file->pathname = '路径';
|
||||
$lang->file->title = '标题';
|
||||
$lang->file->extension = '扩展名';
|
||||
$lang->file->size = '大小';
|
||||
$lang->file->addedBy = '由谁添加';
|
||||
$lang->file->addedDate = '添加时间';
|
||||
$lang->file->downloads = '下载次数';
|
||||
$lang->file->extra = '备注';
|
||||
|
||||
$lang->file->dragFile = '请拖拽文件到此处';
|
||||
$lang->file->errorNotExists = "<span class='red'>文件夹 '%s' 不存在</span>";
|
||||
$lang->file->errorCanNotWrite = "<span class='red'>文件夹 '%s' 不可写,请改变文件夹的权限。在linux中输入指令:sudo chmod -R 777 %s</span>";
|
||||
|
||||
@@ -30,9 +30,18 @@ $lang->file->addFile = '添加檔案';
|
||||
$lang->file->beginUpload = '開始上傳';
|
||||
$lang->file->uploadSuccess = '上傳成功';
|
||||
|
||||
$lang->file->pathname = '路徑';
|
||||
$lang->file->title = '標題';
|
||||
$lang->file->extension = '副檔名';
|
||||
$lang->file->size = '大小';
|
||||
$lang->file->addedBy = '由誰添加';
|
||||
$lang->file->addedDate = '添加時間';
|
||||
$lang->file->downloads = '下載次數';
|
||||
$lang->file->extra = '備註';
|
||||
|
||||
$lang->file->dragFile = '請拖拽檔案到此處';
|
||||
$lang->file->errorNotExists = "<span class='red'>檔案夾 '%s' 不存在</span>";
|
||||
$lang->file->errorCanNotWrite = "<span class='red'>檔案夾 '%s' 不可寫,請改變檔案夾的權限。在linux中輸入指令:sudo chmod -R 777 '%s'</span>";
|
||||
$lang->file->errorCanNotWrite = "<span class='red'>檔案夾 '%s' 不可寫,請改變檔案夾的權限。在linux中輸入指令:sudo chmod -R 777 %s</span>";
|
||||
$lang->file->confirmDelete = " 您確定刪除該附件嗎?";
|
||||
$lang->file->errorFileSize = " 檔案大小已經超過限制,可能不能成功上傳!";
|
||||
$lang->file->errorFileUpload = " 檔案上傳失敗,檔案大小可能超出限制";
|
||||
@@ -41,4 +50,4 @@ $lang->file->errorFileMove = " 檔案上傳失敗,移動檔案時出錯";
|
||||
$lang->file->dangerFile = " 您選擇的檔案存在安全風險,系統將不予上傳。";
|
||||
$lang->file->errorSuffix = '壓縮包格式錯誤,只能上傳zip壓縮包!';
|
||||
$lang->file->errorExtract = '解壓縮失敗!可能檔案已經損壞,或壓縮包裡含有非法上傳檔案。';
|
||||
$lang->file->uploadImagesExplain = '註:請上傳"jpg|jpeg|gif|png"格式的圖片,程序會以檔案名作為標題,以圖片作為內容。';
|
||||
$lang->file->uploadImagesExplain = '註:請上傳"jpg, jpeg, gif, png"格式的圖片,程序會以檔案名作為標題,以圖片作為內容。';
|
||||
|
||||
@@ -627,6 +627,8 @@ class fileModel extends model
|
||||
public function processImgURL($data, $editorList, $uid = '')
|
||||
{
|
||||
if(is_string($editorList)) $editorList = explode(',', str_replace(' ', '', $editorList));
|
||||
if(empty($editorList)) return $data;
|
||||
|
||||
$readLinkReg = helper::createLink('file', 'read', 'fileID=(%fileID%)', '(%viewType%)');
|
||||
$readLinkReg = str_replace(array('%fileID%', '%viewType%', '?', '/'), array('[0-9]+', '\w+', '\?', '\/'), $readLinkReg);
|
||||
$imageIdList = array();
|
||||
|
||||
@@ -18,7 +18,8 @@ $config->git->encodings = 'utf-8';
|
||||
$config->git->client = '';
|
||||
|
||||
$i = 1;
|
||||
$config->git->repos[$i]['path'] = '';
|
||||
$config->git->repos[$i]['path'] = '';
|
||||
$config->git->repos[$i]['encoding'] = 'utf-8';
|
||||
|
||||
/*
|
||||
$i ++;
|
||||
|
||||
+26
-6
@@ -426,13 +426,23 @@ class gitModel extends model
|
||||
exec("{$this->client} config core.quotepath false");
|
||||
$subPath = substr($path, strlen($repo->path));
|
||||
if($subPath{0} == '/' or $subPath{0} == '\\') $subPath = substr($subPath, 1);
|
||||
|
||||
$encodings = explode(',', $this->config->git->encodings);
|
||||
foreach($encodings as $encoding)
|
||||
{
|
||||
$encoding = trim($encoding);
|
||||
if($encoding == 'utf-8') continue;
|
||||
$subPath = helper::convertEncoding($subPath, 'utf-8', $encoding);
|
||||
if($subPath) break;
|
||||
}
|
||||
|
||||
exec("$this->client rev-list -n 2 $revision -- $subPath", $lists);
|
||||
if(count($lists) == 2) list($nowRevision, $preRevision) = $lists;
|
||||
$cmd = "$this->client diff $preRevision $nowRevision -- $subPath";
|
||||
$cmd = "$this->client diff $preRevision $nowRevision -- $subPath 2>&1";
|
||||
$diff = `$cmd`;
|
||||
|
||||
$encodings = isset($repo->encodings) ? $repo->encodings : $this->config->svn->encodings;
|
||||
if($encodings or $encodings != 'utf-8') $diff = helper::convertEncoding($diff, $encodings);
|
||||
$encoding = isset($repo->encoding) ? $repo->encoding : 'utf-8';
|
||||
if($encoding and $encoding != 'utf-8') $diff = helper::convertEncoding($diff, $encoding);
|
||||
|
||||
return $diff;
|
||||
}
|
||||
@@ -457,13 +467,23 @@ class gitModel extends model
|
||||
|
||||
$subPath = substr($path, strlen($repo->path));
|
||||
if($subPath{0} == '/' or $subPath{0} == '\\') $subPath = substr($subPath, 1);
|
||||
|
||||
$encodings = explode(',', $this->config->git->encodings);
|
||||
foreach($encodings as $encoding)
|
||||
{
|
||||
$encoding = trim($encoding);
|
||||
if($encoding == 'utf-8') continue;
|
||||
$subPath = helper::convertEncoding($subPath, 'utf-8', $encoding);
|
||||
if($subPath) break;
|
||||
}
|
||||
|
||||
chdir($repo->path);
|
||||
exec("{$this->client} config core.quotepath false");
|
||||
$cmd = "$this->client show $revision:$subPath";
|
||||
$cmd = "$this->client show $revision:$subPath 2>&1";
|
||||
$code = `$cmd`;
|
||||
|
||||
$encodings = isset($repo->encodings) ? $repo->encodings : $this->config->git->encodings;
|
||||
if($encodings or $encodings != 'utf-8') $code = helper::convertEncoding($code, $encodings);
|
||||
$encoding = isset($repo->encoding) ? $repo->encoding : 'utf-8';
|
||||
if($encoding and $encoding != 'utf-8') $code = helper::convertEncoding($code, $encoding);
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ $lang->group->noticeVisit = 'N/A means access is not restricted.';
|
||||
$lang->group->id = 'ID';
|
||||
$lang->group->name = 'Name';
|
||||
$lang->group->desc = 'Description';
|
||||
$lang->group->role = 'Role';
|
||||
$lang->group->acl = 'Right';
|
||||
$lang->group->users = 'Users';
|
||||
$lang->group->module = 'Module';
|
||||
$lang->group->method = 'Method';
|
||||
|
||||
@@ -32,6 +32,8 @@ $lang->group->noticeVisit = '空代表访问没有访问限制';
|
||||
$lang->group->id = '编号';
|
||||
$lang->group->name = '分组名称';
|
||||
$lang->group->desc = '分组描述';
|
||||
$lang->group->role = '角色';
|
||||
$lang->group->acl = '权限';
|
||||
$lang->group->users = '用户列表';
|
||||
$lang->group->module = '模块';
|
||||
$lang->group->method = '方法';
|
||||
|
||||
@@ -32,6 +32,8 @@ $lang->group->noticeVisit = '空代表訪問沒有訪問限制';
|
||||
$lang->group->id = '編號';
|
||||
$lang->group->name = '分組名稱';
|
||||
$lang->group->desc = '分組描述';
|
||||
$lang->group->role = '角色';
|
||||
$lang->group->acl = '權限';
|
||||
$lang->group->users = '用戶列表';
|
||||
$lang->group->module = '模組';
|
||||
$lang->group->method = '方法';
|
||||
|
||||
@@ -375,16 +375,17 @@ class groupModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* Check menu have module
|
||||
*
|
||||
* @param string $menu
|
||||
* @param string $moduleName
|
||||
* Check menu have module
|
||||
*
|
||||
* @param string $menu
|
||||
* @param string $moduleName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function checkMenuModule($menu, $moduleName)
|
||||
{
|
||||
if(empty($menu)) return true;
|
||||
if($menu == 'caselib' and $moduleName == 'testsuite') return true;
|
||||
if($menu == 'other' and (isset($this->lang->menugroup->$moduleName) or isset($this->lang->menu->$moduleName))) return false;
|
||||
if($menu != 'other' and !($moduleName == $menu or (isset($this->lang->menugroup->$moduleName) and $this->lang->menugroup->$moduleName == $menu))) return false;
|
||||
return true;
|
||||
@@ -392,8 +393,8 @@ class groupModel extends model
|
||||
|
||||
/**
|
||||
* Get modules in menu
|
||||
*
|
||||
* @param string $menu
|
||||
*
|
||||
* @param string $menu
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
}
|
||||
?>
|
||||
<tr class='<?php echo cycle('even, bg-gray');?>'>
|
||||
<th class='text-right w-150px'><?php echo $this->lang->$moduleName->common;?><?php echo html::selectAll($moduleName, 'checkbox')?></th>
|
||||
<th class='text-right w-150px'><?php echo $lang->$moduleName->common;?><?php echo html::selectAll($moduleName, 'checkbox')?></th>
|
||||
<td id='<?php echo $moduleName;?>' class='pv-10px'>
|
||||
<?php $i = 1;?>
|
||||
<?php if($moduleName == 'caselib') $moduleName = 'testsuite';?>
|
||||
@@ -77,7 +77,7 @@
|
||||
<tr>
|
||||
<th class='text-right'><?php echo $lang->selectAll . html::selectAll('', 'checkbox')?></th>
|
||||
<td>
|
||||
<?php
|
||||
<?php
|
||||
echo html::submitButton($lang->save, "onclick='setNoChecked()'");
|
||||
echo html::linkButton($lang->goback, $this->createLink('group', 'browse'));
|
||||
echo html::hidden('foo'); // Just a hidden var, to make sure $_POST is not empty.
|
||||
|
||||
@@ -265,7 +265,7 @@ class mail extends control
|
||||
}
|
||||
}
|
||||
|
||||
$this->mail->send($this->post->to, $this->lang->mail->subject, $this->lang->mail->content, "", true);
|
||||
$this->mail->send($this->post->to, $this->lang->mail->testSubject, $this->lang->mail->testContent, "", true);
|
||||
if($this->mail->isError())
|
||||
{
|
||||
$this->view->error = $this->mail->getError();
|
||||
|
||||
@@ -42,7 +42,8 @@ $lang->mail->sync = 'Synchronize';
|
||||
$lang->mail->remove = 'Remove';
|
||||
|
||||
$lang->mail->toList = 'Addressee';
|
||||
$lang->mail->subjectName = 'Subject';
|
||||
$lang->mail->ccList = 'Copy to';
|
||||
$lang->mail->subject = 'Subject';
|
||||
$lang->mail->addedBy = 'Sender';
|
||||
$lang->mail->addedDate = 'Added Date';
|
||||
$lang->mail->sendTime = 'Send Date';
|
||||
@@ -74,8 +75,8 @@ $lang->mail->noticeResend = 'Sent it again!';
|
||||
$lang->mail->inputFromEmail = 'Enter Email Address';
|
||||
$lang->mail->nextStep = 'Next';
|
||||
$lang->mail->successSaved = 'Configuration has been saved.';
|
||||
$lang->mail->subject = 'Testing Email';
|
||||
$lang->mail->content = 'Email configured!';
|
||||
$lang->mail->testSubject = 'Testing Email';
|
||||
$lang->mail->testContent = 'Email configured!';
|
||||
$lang->mail->successSended = 'Sent!';
|
||||
$lang->mail->confirmDelete = 'Do you want to delete it?';
|
||||
$lang->mail->sendmailTips = 'Note: Email author will not receive this email.';
|
||||
|
||||
@@ -42,7 +42,8 @@ $lang->mail->sync = '同步';
|
||||
$lang->mail->remove = '移除';
|
||||
|
||||
$lang->mail->toList = '收信人';
|
||||
$lang->mail->subjectName = '主题';
|
||||
$lang->mail->ccList = '抄送给';
|
||||
$lang->mail->subject = '主题';
|
||||
$lang->mail->addedBy = '发送者';
|
||||
$lang->mail->addedDate = '创建时间';
|
||||
$lang->mail->sendTime = '发送时间';
|
||||
@@ -74,8 +75,8 @@ $lang->mail->noticeResend = '已经重新发信!';
|
||||
$lang->mail->inputFromEmail = '请输入发信邮箱:';
|
||||
$lang->mail->nextStep = '下一步';
|
||||
$lang->mail->successSaved = '配置信息已经成功保存。';
|
||||
$lang->mail->subject = '测试邮件';
|
||||
$lang->mail->content = '邮箱设置成功';
|
||||
$lang->mail->testSubject = '测试邮件';
|
||||
$lang->mail->testContent = '邮箱设置成功';
|
||||
$lang->mail->successSended = '成功发送!';
|
||||
$lang->mail->confirmDelete = '是否删除邮件?';
|
||||
$lang->mail->sendmailTips = '提示:系统不会为当前操作者发信。';
|
||||
|
||||
@@ -42,7 +42,8 @@ $lang->mail->sync = '同步';
|
||||
$lang->mail->remove = '移除';
|
||||
|
||||
$lang->mail->toList = '收信人';
|
||||
$lang->mail->subjectName = '主題';
|
||||
$lang->mail->ccList = '抄送給';
|
||||
$lang->mail->subject = '主題';
|
||||
$lang->mail->addedBy = '發送者';
|
||||
$lang->mail->addedDate = '創建時間';
|
||||
$lang->mail->sendTime = '發送時間';
|
||||
@@ -74,8 +75,8 @@ $lang->mail->noticeResend = '已經重新發信!';
|
||||
$lang->mail->inputFromEmail = '請輸入發信郵箱:';
|
||||
$lang->mail->nextStep = '下一步';
|
||||
$lang->mail->successSaved = '配置信息已經成功保存。';
|
||||
$lang->mail->subject = '測試郵件';
|
||||
$lang->mail->content = '郵箱設置成功';
|
||||
$lang->mail->testSubject = '測試郵件';
|
||||
$lang->mail->testContent = '郵箱設置成功';
|
||||
$lang->mail->successSended = '成功發送!';
|
||||
$lang->mail->confirmDelete = '是否刪除郵件?';
|
||||
$lang->mail->sendmailTips = '提示:系統不會為當前操作者發信。';
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<tr>
|
||||
<th class='w-id'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
|
||||
<th class='w-80px'> <?php common::printOrderLink('toList', $orderBy, $vars, $lang->mail->toList);?></th>
|
||||
<th class='w-150px'> <?php common::printOrderLink('subject', $orderBy, $vars, $lang->mail->subjectName);?></th>
|
||||
<th class='w-150px'> <?php common::printOrderLink('subject', $orderBy, $vars, $lang->mail->subject);?></th>
|
||||
<th class='w-80px'> <?php common::printOrderLink('addedBy', $orderBy, $vars, $lang->mail->addedBy);?></th>
|
||||
<th class='w-150px'> <?php common::printOrderLink('addedDate', $orderBy, $vars, $lang->mail->addedDate);?></th>
|
||||
<th class='w-150px'> <?php common::printOrderLink('sendTime', $orderBy, $vars, $lang->mail->sendTime);?></th>
|
||||
|
||||
@@ -62,7 +62,7 @@ $lang->misc->tableName = "Table Name";
|
||||
$lang->misc->tableStatus = "Status";
|
||||
$lang->misc->novice = "First time to ZenTao? Do you want to start rookie mode?";
|
||||
|
||||
$lang->user->noticeResetFile = "<h5>If you are not Administrator, please contact Administrator to repair table.</h5>
|
||||
$lang->misc->noticeRepair = "<h5>If you are not Administrator, please contact Administrator to repair table.</h5>
|
||||
<h5>If you are, please login into your Zentao host and create the <span>%s</span> file.</h5>
|
||||
<p>Note:</p>
|
||||
<ol>
|
||||
|
||||
@@ -62,13 +62,13 @@ $lang->misc->tableName = "表名";
|
||||
$lang->misc->tableStatus = "狀態";
|
||||
$lang->misc->novice = "您可能初次使用禪道,是否進入新手模式?";
|
||||
|
||||
$lang->user->noticeResetFile = "<h5>普通用戶請聯繫管理員進行修復</h5>
|
||||
$lang->misc->noticeRepair = "<h5>普通用戶請聯繫管理員進行修復</h5>
|
||||
<h5>管理員請登錄禪道所在的伺服器,創建<span>%s</span>檔案。</h5>
|
||||
<p>注意:</p>
|
||||
<ol>
|
||||
<li>檔案內容為空。</li>
|
||||
<li>如果之前檔案存在,刪除之後重新創建。</li>
|
||||
</ol>";
|
||||
</ol>";
|
||||
|
||||
$lang->misc->feature = new stdclass();
|
||||
$lang->misc->feature->lastest = '最新版本';
|
||||
|
||||
+15
-9
@@ -53,9 +53,12 @@ class my extends control
|
||||
{
|
||||
/* Save session. */
|
||||
$uri = $this->app->getURI(true);
|
||||
$this->session->set('todoList', $uri);
|
||||
$this->session->set('bugList', $uri);
|
||||
$this->session->set('taskList', $uri);
|
||||
if($this->app->viewType != 'json')
|
||||
{
|
||||
$this->session->set('todoList', $uri);
|
||||
$this->session->set('bugList', $uri);
|
||||
$this->session->set('taskList', $uri);
|
||||
}
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -98,7 +101,7 @@ class my extends control
|
||||
public function story($type = 'assignedTo', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Save session. */
|
||||
$this->session->set('storyList', $this->app->getURI(true));
|
||||
if($this->app->viewType != 'json') $this->session->set('storyList', $this->app->getURI(true));
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -136,8 +139,11 @@ class my extends control
|
||||
public function task($type = 'assignedTo', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Save session. */
|
||||
$this->session->set('taskList', $this->app->getURI(true));
|
||||
$this->session->set('storyList', $this->app->getURI(true));
|
||||
if($this->app->viewType != 'json')
|
||||
{
|
||||
$this->session->set('taskList', $this->app->getURI(true));
|
||||
$this->session->set('storyList', $this->app->getURI(true));
|
||||
}
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -176,7 +182,7 @@ class my extends control
|
||||
public function bug($type = 'assignedTo', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Save session. load Lang. */
|
||||
$this->session->set('bugList', $this->app->getURI(true));
|
||||
if($this->app->viewType != 'json') $this->session->set('bugList', $this->app->getURI(true));
|
||||
$this->app->loadLang('bug');
|
||||
|
||||
/* Load pager. */
|
||||
@@ -219,7 +225,7 @@ class my extends control
|
||||
$pager = pager::init($recTotal, $recPerPage, $pageID);
|
||||
|
||||
/* Save session. */
|
||||
$this->session->set('testtaskList', $this->app->getURI(true));
|
||||
if($this->app->viewType != 'json') $this->session->set('testtaskList', $this->app->getURI(true));
|
||||
|
||||
$this->app->loadLang('testcase');
|
||||
|
||||
@@ -254,7 +260,7 @@ class my extends control
|
||||
public function testcase($type = 'assigntome', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Save session, load lang. */
|
||||
$this->session->set('caseList', $this->app->getURI(true));
|
||||
if($this->app->viewType != 'json') $this->session->set('caseList', $this->app->getURI(true));
|
||||
$this->app->loadLang('testcase');
|
||||
$this->app->loadLang('testtask');
|
||||
|
||||
|
||||
@@ -4,3 +4,21 @@ function changeDate(date)
|
||||
link = createLink('my', 'todo', 'type=' + date);
|
||||
location.href=link;
|
||||
}
|
||||
|
||||
|
||||
$(function()
|
||||
{
|
||||
// Support hash start with todo-1
|
||||
var hash = window.location.hash.toLowerCase();
|
||||
if(hash.indexOf('#todo-') === 0)
|
||||
{
|
||||
var todoId = hash.substr(6);
|
||||
var url = createLink('todo', 'view', 'id=1&from=my&onlybody=yes');
|
||||
var $a = $('<a/>');
|
||||
$a.attr({href: url}).modalTrigger(
|
||||
{
|
||||
'data-toggle': 'modal',
|
||||
type: 'iframe'
|
||||
}).trigger('click');
|
||||
}
|
||||
});
|
||||
|
||||
+10
-10
@@ -99,14 +99,14 @@ class product extends control
|
||||
|
||||
/**
|
||||
* Browse a product.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
*
|
||||
* @param int $productID
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -136,8 +136,8 @@ class product extends control
|
||||
if($browseType == 'bymodule') setcookie('storyModule', (int)$param, $this->config->cookieLife, $this->config->webRoot);
|
||||
if($browseType != 'bymodule') $this->session->set('storyBrowseType', $browseType);
|
||||
|
||||
$moduleID = ($browseType == 'bymodule') ? (int)$param : ($browseType == 'bysearch' ? 0 : ($this->cookie->storyModule ? $this->cookie->storyModule : 0));
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
$moduleID = ($browseType == 'bymodule') ? (int)$param : ($browseType == 'bysearch' ? 0 : ($this->cookie->storyModule ? $this->cookie->storyModule : 0));
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
|
||||
/* Set menu. */
|
||||
$this->product->setMenu($this->products, $productID, $branch);
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<td><?php echo $users[$build->builder]?></td>
|
||||
<td class='text-right'>
|
||||
<?php
|
||||
common::printIcon('testtask', 'create', "product=0&product=$product->id&build=$build->id", '', 'list', 'check');
|
||||
common::printIcon('testtask', 'create', "product=$product->id&project=0&build=$build->id", '', 'list', 'check');
|
||||
common::printIcon('build', 'edit', "buildID=$build->id", '', 'list');
|
||||
if(common::hasPriv('build', 'delete'))
|
||||
{
|
||||
|
||||
@@ -39,6 +39,7 @@ $lang->productplan->confirmUnlinkBug = "Do you want to unlink this Bug?";
|
||||
|
||||
$lang->productplan->id = 'ID';
|
||||
$lang->productplan->product = $lang->productCommon;
|
||||
$lang->productplan->branch = 'Platform/Branch';
|
||||
$lang->productplan->title = 'Title';
|
||||
$lang->productplan->desc = 'Description';
|
||||
$lang->productplan->begin = 'Begin';
|
||||
@@ -58,6 +59,6 @@ $lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.';
|
||||
$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.';
|
||||
$lang->productplan->beginGeEnd = 'ID %s begin time value should not be greater than t.';
|
||||
|
||||
$lang->productplan->featureBar['browse']['unexpired'] = 'On Time';
|
||||
$lang->productplan->featureBar['browse']['all'] = 'All';
|
||||
$lang->productplan->featureBar['browse']['unexpired'] = 'On Time';
|
||||
$lang->productplan->featureBar['browse']['overdue'] = 'Overdue';
|
||||
|
||||
@@ -39,6 +39,7 @@ $lang->productplan->confirmUnlinkBug = "您确认移除该Bug吗?";
|
||||
|
||||
$lang->productplan->id = '编号';
|
||||
$lang->productplan->product = $lang->productCommon;
|
||||
$lang->productplan->branch = '平台/分支';
|
||||
$lang->productplan->title = '名称';
|
||||
$lang->productplan->desc = '描述';
|
||||
$lang->productplan->begin = '开始日期';
|
||||
|
||||
@@ -39,6 +39,7 @@ $lang->productplan->confirmUnlinkBug = "您確認移除該Bug嗎?";
|
||||
|
||||
$lang->productplan->id = '編號';
|
||||
$lang->productplan->product = $lang->productCommon;
|
||||
$lang->productplan->branch = '平台/分支';
|
||||
$lang->productplan->title = '名稱';
|
||||
$lang->productplan->desc = '描述';
|
||||
$lang->productplan->begin = '開始日期';
|
||||
@@ -58,6 +59,6 @@ $lang->productplan->errorNoBegin = 'ID %s 開始時間不能為空';
|
||||
$lang->productplan->errorNoEnd = 'ID %s 結束時間不能為空';
|
||||
$lang->productplan->beginGeEnd = 'ID %s 開始時間不能大於結束時間';
|
||||
|
||||
$lang->productplan->featureBar['browse']['unexpired'] = '未過期';
|
||||
$lang->productplan->featureBar['browse']['all'] = '全部';
|
||||
$lang->productplan->featureBar['browse']['unexpired'] = '未過期';
|
||||
$lang->productplan->featureBar['browse']['overdue'] = '已過期';
|
||||
|
||||
@@ -140,7 +140,7 @@ class productplanModel extends model
|
||||
public function create()
|
||||
{
|
||||
$plan = fixer::input('post')->stripTags($this->config->productplan->editor->create['id'], $this->config->allowedTags)->remove('delta,uid')->get();
|
||||
$plan = $this->loadModel('file')->processImgURL($plan, $this->config->plan->editor->create['id'], $this->post->uid);
|
||||
$plan = $this->loadModel('file')->processImgURL($plan, $this->config->productplan->editor->create['id'], $this->post->uid);
|
||||
$this->dao->insert(TABLE_PRODUCTPLAN)
|
||||
->data($plan)
|
||||
->autoCheck()
|
||||
@@ -166,7 +166,7 @@ class productplanModel extends model
|
||||
{
|
||||
$oldPlan = $this->dao->findByID((int)$planID)->from(TABLE_PRODUCTPLAN)->fetch();
|
||||
$plan = fixer::input('post')->stripTags($this->config->productplan->editor->edit['id'], $this->config->allowedTags)->remove('delta,uid')->get();
|
||||
$plan = $this->loadModel('file')->processImgURL($plan, $this->config->plan->editor->edit['id'], $this->post->uid);
|
||||
$plan = $this->loadModel('file')->processImgURL($plan, $this->config->productplan->editor->edit['id'], $this->post->uid);
|
||||
$this->dao->update(TABLE_PRODUCTPLAN)
|
||||
->data($plan)
|
||||
->autoCheck()
|
||||
|
||||
@@ -18,7 +18,7 @@ table th.col-closed {width:15%}
|
||||
#kanbanWrapper tbody tr.dragging td.col-droppable.drop-to .board-task + .board-shadow {margin-top: 6px;}
|
||||
#kanbanWrapper tbody tr.dragging td.col-droppable.drop-to .board-shadow {height: 28px; background: #999; background: rgba(0,0,0,0.35); opacity: 1;}
|
||||
#kanbanWrapper tbody tr.dragging td.col-droppable.drop-to.drag-from .board-shadow {display: none}
|
||||
#kanbanWrapper .board.drag-from {opacity: 0.8}
|
||||
#kanbanWrapper .board.drag-from.dragging {opacity: 0.8;}
|
||||
|
||||
#kanban.dragging, .drag-shadow {cursor: move!important;}
|
||||
|
||||
@@ -34,10 +34,11 @@ table th.col-closed {width:15%}
|
||||
.board-actions .btn:active, .board-actions .btn:focus, .board-actions .btn:hover {background: #999; color: inherit; background: rgba(255,255,255,.2);}
|
||||
.ie-8 .board-actions .btn {min-width: 10px}
|
||||
.board-actions > .dropdown {display: inline-block; margin-left: -5px;}
|
||||
.dropdown .caret {border-top-color: #999}
|
||||
.dropdown-menu > a {display: block; padding: 3px 15px; color: #333; font-size: 12px}
|
||||
.dropdown-menu > a:hover {background: #f1f1f1; color: #1a53ff; text-decoration: none}
|
||||
.dropdown-menu > a.disabled, .dropdown-menu > a.disabled:hover, .dropdown-menu > a.active {color: #aaa; background: none}
|
||||
.board .dropdown-menu {min-width: 60px;}
|
||||
.board .dropdown .caret {border-top-color: #999}
|
||||
.board .dropdown-menu > a {display: block; padding: 3px 15px; color: #333; font-size: 12px}
|
||||
.board .dropdown-menu > a:hover {background: #f1f1f1; color: #1a53ff; text-decoration: none}
|
||||
.board .dropdown-menu > a.disabled, .board .dropdown-menu > a.disabled:hover, .board .dropdown-menu > a.active {color: #aaa; background: none}
|
||||
.board .board-footer {display: none; opacity: 0.9}
|
||||
.board.show-info .board-footer {display: block; margin: 0 -6px -3px -6px; padding: 5px; background: rgba(0,0,0,0.07);}
|
||||
.board-footer .board-id {display: inline-block; border: 1px solid #aaa; font-weight: normal; padding: 0px 4px; text-align: center; min-width: 20px; line-height: 16px; height: 17px; margin-right: 10px; font-size: 12px;}
|
||||
|
||||
@@ -51,6 +51,7 @@ $lang->project->mine = 'My Responsibility: ';
|
||||
$lang->project->other = 'Other:';
|
||||
$lang->project->deleted = 'Deleted';
|
||||
$lang->project->delayed = 'Delayed';
|
||||
$lang->project->product = $lang->project->products;
|
||||
|
||||
$lang->project->start = 'Start';
|
||||
$lang->project->activate = 'Activate';
|
||||
@@ -197,6 +198,7 @@ $lang->project->confirmDelete = "Do you want to delete {$lang->projectCo
|
||||
$lang->project->confirmUnlinkMember = "Do you want to unlink this User from {$lang->projectCommon}?";
|
||||
$lang->project->confirmUnlinkStory = "Do you want to unlink this Story from {$lang->projectCommon}?";
|
||||
$lang->project->errorNoLinkedProducts = "No linked {$lang->productCommon} found in {$lang->projectCommon}. You will be directed to {$lang->productCommon}linked page.";
|
||||
$lang->project->errorSameProducts = "{$lang->projectCommon} cannot be associated with multiple identical {$lang->productCommon}。";
|
||||
$lang->project->accessDenied = "Access to {$lang->projectCommon} denied!";
|
||||
$lang->project->tips = 'Note';
|
||||
$lang->project->afterInfo = "{$lang->projectCommon} is created. Next you can ";
|
||||
|
||||
@@ -51,6 +51,7 @@ $lang->project->mine = '我负责:';
|
||||
$lang->project->other = '其他:';
|
||||
$lang->project->deleted = '已删除';
|
||||
$lang->project->delayed = '已延期';
|
||||
$lang->project->product = $lang->project->products;
|
||||
|
||||
$lang->project->start = '开始';
|
||||
$lang->project->activate = '激活';
|
||||
|
||||
@@ -51,6 +51,7 @@ $lang->project->mine = '我負責:';
|
||||
$lang->project->other = '其他:';
|
||||
$lang->project->deleted = '已刪除';
|
||||
$lang->project->delayed = '已延期';
|
||||
$lang->project->product = $lang->project->products;
|
||||
|
||||
$lang->project->start = '開始';
|
||||
$lang->project->activate = '激活';
|
||||
@@ -197,6 +198,7 @@ $lang->project->confirmDelete = "您確定刪除{$lang->projectCommon}[%
|
||||
$lang->project->confirmUnlinkMember = "您確定從該{$lang->projectCommon}中移除該用戶嗎?";
|
||||
$lang->project->confirmUnlinkStory = "您確定從該{$lang->projectCommon}中移除該需求嗎?";
|
||||
$lang->project->errorNoLinkedProducts = "該{$lang->projectCommon}沒有關聯的{$lang->productCommon},系統將轉到{$lang->productCommon}關聯頁面";
|
||||
$lang->project->errorSameProducts = "{$lang->projectCommon}不能關聯多個相同的{$lang->productCommon}。";
|
||||
$lang->project->accessDenied = "您無權訪問該{$lang->projectCommon}!";
|
||||
$lang->project->tips = '提示';
|
||||
$lang->project->afterInfo = "{$lang->projectCommon}添加成功,您現在可以進行以下操作:";
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
<td class='text-left' title="<?php echo $task->name?>">
|
||||
<?php if(isset($branchGroups[$task->product][$task->branch])) echo "<span title='{$lang->product->branchName[$task->productType]}' class='label label-branch label-badge'>" . $branchGroups[$task->product][$task->branch] . '</span>';?>
|
||||
<?php if($modulePairs and $task->module) echo "<span title='{$lang->task->module}' class='label label-info label-badge'>" . $modulePairs[$task->module] . '</span>';?>
|
||||
<?php
|
||||
<?php
|
||||
if(!common::printLink('task', 'view', "task=$task->id", $task->name, null, "style='color: $task->color'")) echo $task->name;
|
||||
if($task->fromBug) echo html::a($this->createLink('bug', 'view', "id=$task->fromBug"), "[BUG#$task->fromBug]", '_blank', "class='bug'");
|
||||
?>
|
||||
|
||||
@@ -31,6 +31,7 @@ $lang->release->basicInfo = 'Basic Info';
|
||||
|
||||
$lang->release->id = 'ID';
|
||||
$lang->release->product = $lang->productCommon;
|
||||
$lang->release->branch = 'Platform/Branch';
|
||||
$lang->release->build = 'Build';
|
||||
$lang->release->name = 'Name';
|
||||
$lang->release->date = 'Date';
|
||||
@@ -41,6 +42,7 @@ $lang->release->unlinkStory = 'Unlink Story';
|
||||
$lang->release->unlinkBug = 'Unlink Bug';
|
||||
$lang->release->stories = 'Finished Story';
|
||||
$lang->release->bugs = 'Solved Bug';
|
||||
$lang->release->leftBugs = 'Remained Bug';
|
||||
$lang->release->generatedBugs = 'Remained Bug';
|
||||
$lang->release->finishStories = 'Finished %s Story';
|
||||
$lang->release->resolvedBugs = 'Solved %s Bug';
|
||||
|
||||
@@ -31,6 +31,7 @@ $lang->release->basicInfo = '基本信息';
|
||||
|
||||
$lang->release->id = 'ID';
|
||||
$lang->release->product = $lang->productCommon;
|
||||
$lang->release->branch = '平台/分支';
|
||||
$lang->release->build = '版本';
|
||||
$lang->release->name = '发布名称';
|
||||
$lang->release->date = '发布日期';
|
||||
@@ -41,6 +42,7 @@ $lang->release->unlinkStory = '移除需求';
|
||||
$lang->release->unlinkBug = '移除Bug';
|
||||
$lang->release->stories = '完成的需求';
|
||||
$lang->release->bugs = '解决的Bug';
|
||||
$lang->release->leftBugs = '遗留的Bug';
|
||||
$lang->release->generatedBugs = '遗留的Bug';
|
||||
$lang->release->finishStories = '本次共完成 %s 个需求';
|
||||
$lang->release->resolvedBugs = '本次共解决 %s 个Bug';
|
||||
|
||||
@@ -31,6 +31,7 @@ $lang->release->basicInfo = '基本信息';
|
||||
|
||||
$lang->release->id = 'ID';
|
||||
$lang->release->product = $lang->productCommon;
|
||||
$lang->release->branch = '平台/分支';
|
||||
$lang->release->build = '版本';
|
||||
$lang->release->name = '發佈名稱';
|
||||
$lang->release->date = '發佈日期';
|
||||
@@ -41,6 +42,7 @@ $lang->release->unlinkStory = '移除需求';
|
||||
$lang->release->unlinkBug = '移除Bug';
|
||||
$lang->release->stories = '完成的需求';
|
||||
$lang->release->bugs = '解決的Bug';
|
||||
$lang->release->leftBugs = '遺留的Bug';
|
||||
$lang->release->generatedBugs = '遺留的Bug';
|
||||
$lang->release->finishStories = '本次共完成 %s 個需求';
|
||||
$lang->release->resolvedBugs = '本次共解決 %s 個Bug';
|
||||
|
||||
@@ -80,6 +80,7 @@ $lang->report->bugTitle = 'Bug標題';
|
||||
$lang->report->taskName = '任務名稱';
|
||||
$lang->report->todoName = '待辦名稱';
|
||||
$lang->report->testTaskName = '版本名稱';
|
||||
$lang->report->deadline = '截止日期';
|
||||
|
||||
$lang->report->mailTitle = new stdclass();
|
||||
$lang->report->mailTitle->begin = '提醒:您有';
|
||||
|
||||
@@ -25,6 +25,13 @@ $lang->search->me = 'Me';
|
||||
$lang->search->noQuery = 'No query saved!';
|
||||
$lang->search->onMenuBar = 'Show in Menu';
|
||||
|
||||
$lang->search->account = 'Account';
|
||||
$lang->search->module = 'Module';
|
||||
$lang->search->title = 'Title';
|
||||
$lang->search->form = 'Form Field';
|
||||
$lang->search->sql = 'SQL Condition';
|
||||
$lang->search->shortcut = $lang->search->onMenuBar;
|
||||
|
||||
$lang->search->operators['='] = '=';
|
||||
$lang->search->operators['!='] = '!=';
|
||||
$lang->search->operators['>'] = '>';
|
||||
|
||||
@@ -25,6 +25,13 @@ $lang->search->me = '自己';
|
||||
$lang->search->noQuery = '还没有保存查询!';
|
||||
$lang->search->onMenuBar = '显示在菜单栏';
|
||||
|
||||
$lang->search->account = '用户名';
|
||||
$lang->search->module = '模块';
|
||||
$lang->search->title = '名称';
|
||||
$lang->search->form = '表单字段';
|
||||
$lang->search->sql = 'SQL条件';
|
||||
$lang->search->shortcut = $lang->search->onMenuBar;
|
||||
|
||||
$lang->search->operators['='] = '=';
|
||||
$lang->search->operators['!='] = '!=';
|
||||
$lang->search->operators['>'] = '>';
|
||||
|
||||
@@ -25,6 +25,13 @@ $lang->search->me = '自己';
|
||||
$lang->search->noQuery = '還沒有保存查詢!';
|
||||
$lang->search->onMenuBar = '顯示在菜單欄';
|
||||
|
||||
$lang->search->account = '用戶名';
|
||||
$lang->search->module = '模組';
|
||||
$lang->search->title = '名稱';
|
||||
$lang->search->form = '表單欄位';
|
||||
$lang->search->sql = 'SQL條件';
|
||||
$lang->search->shortcut = $lang->search->onMenuBar;
|
||||
|
||||
$lang->search->operators['='] = '=';
|
||||
$lang->search->operators['!='] = '!=';
|
||||
$lang->search->operators['>'] = '>';
|
||||
|
||||
@@ -22,7 +22,6 @@ class sso extends control
|
||||
{
|
||||
$referer = empty($_GET['referer']) ? '' : $this->get->referer;
|
||||
$locate = empty($referer) ? getWebRoot() : base64_decode($referer);
|
||||
if($this->loadModel('user')->isLogon()) die($this->locate($locate));
|
||||
|
||||
$this->app->loadConfig('sso');
|
||||
if(!$this->config->sso->turnon) die($this->locate($locate));
|
||||
@@ -40,9 +39,9 @@ class sso extends control
|
||||
if(strpos($location, '&') !== false)
|
||||
{
|
||||
$location = rtrim($location, '&') . "&token=$token&auth=$auth&userIP=$userIP&callback=$callback&referer=$referer";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
$location = rtrim($location, '?') . "?token=$token&auth=$auth&userIP=$userIP&callback=$callback&referer=$referer";
|
||||
}
|
||||
$this->locate($location);
|
||||
@@ -63,6 +62,11 @@ class sso extends control
|
||||
$this->locate($this->createLink('sso', 'bind', "referer=" . helper::safe64Encode($locate)));
|
||||
}
|
||||
|
||||
if($this->loadModel('user')->isLogon())
|
||||
{
|
||||
if($this->session->user && $this->session->user->account == $user->account) die($this->locate($locate));
|
||||
}
|
||||
|
||||
$this->user->cleanLocked($user->account);
|
||||
/* Authorize him and save to session. */
|
||||
$user->rights = $this->user->authorize($user->account);
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
$lang->sso = new stdclass();
|
||||
$lang->sso->settings = '配置';
|
||||
$lang->sso->turnon = '是否打開';
|
||||
$lang->sso->redirect = '自動跳回然之';
|
||||
$lang->sso->redirect = '自動跳迥然之';
|
||||
$lang->sso->code = '代號';
|
||||
$lang->sso->key = '密鑰';
|
||||
$lang->sso->addr = '介面地址';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?php
|
||||
<?php
|
||||
/**
|
||||
* The model file of story module of ZenTaoPMS.
|
||||
*
|
||||
@@ -372,6 +372,11 @@ class storyModel extends model
|
||||
{
|
||||
$specChanged = false;
|
||||
$oldStory = $this->dao->findById((int)$storyID)->from(TABLE_STORY)->fetch();
|
||||
$oldSpec = $this->dao->select('title,spec,verify')->from(TABLE_STORYSPEC)->where('story')->eq((int)$storyID)->andWhere('version')->eq($oldStory->version)->fetch();
|
||||
$oldStory->title = isset($oldSpec->title) ? $oldSpec->title : '';
|
||||
$oldStory->spec = isset($oldSpec->spec) ? $oldSpec->spec : '';
|
||||
$oldStory->verify = isset($oldSpec->verify) ? $oldSpec->verify : '';
|
||||
|
||||
if(!empty($_POST['lastEditedDate']) and $oldStory->lastEditedDate != $this->post->lastEditedDate)
|
||||
{
|
||||
dao::$errors[] = $this->lang->error->editedByOther;
|
||||
@@ -1991,10 +1996,9 @@ class storyModel extends model
|
||||
foreach($datas as $key => $project)
|
||||
{
|
||||
if(!$project->branch) continue;
|
||||
$branchIDList[] = $project->branch;
|
||||
$branchIDList[$project->branch] = $project->branch;
|
||||
}
|
||||
|
||||
$branchIDList = array_unique($branchIDList);
|
||||
$branchs = $this->dao->select('id, name')->from(TABLE_BRANCH)->where('id')->in($branchIDList)->andWhere('deleted')->eq(0)->fetchALL('id');
|
||||
$modules = $this->loadModel('tree')->getModulesName(array_keys($datas));
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user