Merge branch 'master' of https://github.com/easysoft/zentaopms
This commit is contained in:
@@ -445,44 +445,114 @@ class baseControl
|
||||
*/
|
||||
public function getCSS($moduleName, $methodName)
|
||||
{
|
||||
$moduleName = strtolower(trim($moduleName));
|
||||
$methodName = strtolower(trim($methodName));
|
||||
$moduleName = strtolower(trim($moduleName));
|
||||
$methodName = strtolower(trim($methodName));
|
||||
|
||||
$modulePath = $this->app->getModulePath($this->appName, $moduleName);
|
||||
$cssExtPath = $this->app->getModuleExtPath($this->appName, $moduleName, 'css') ;
|
||||
$modulePath = $this->app->getModulePath($this->appName, $moduleName);
|
||||
$cssExtPath = $this->app->getModuleExtPath($this->appName, $moduleName, 'css') ;
|
||||
|
||||
$css = '';
|
||||
$mainCssFile = $modulePath . 'css' . DS . $this->devicePrefix . 'common.css';
|
||||
$methodCssFile = $modulePath . 'css' . DS . $this->devicePrefix . $methodName . '.css';
|
||||
if(file_exists($mainCssFile)) $css .= file_get_contents($mainCssFile);
|
||||
if(is_file($methodCssFile)) $css .= file_get_contents($methodCssFile);
|
||||
$clientLang = $this->app->getClientLang();
|
||||
$notCNLang = strpos('|zh-cn|zh-tw|', "|{$clientLang}|") === false;
|
||||
|
||||
$css = '';
|
||||
$devicePrefix = $this->devicePrefix;
|
||||
$mainCssPath = $modulePath . 'css' . DS;
|
||||
|
||||
/* Common css file. like module/story/css/common.css. */
|
||||
$mainCssFile = $mainCssPath . $devicePrefix . 'common.css';
|
||||
if(is_file($mainCssFile)) $css .= file_get_contents($mainCssFile);
|
||||
|
||||
/* Common css file with lang. like module/story/css/common.en.css. */
|
||||
$mainCssLangFile = $mainCssPath . $devicePrefix . "common.{$clientLang}.css";
|
||||
if(!file_exists($mainCssLangFile) and $notCNLang) $mainCssLangFile = $mainCssPath . $devicePrefix . "common.en.css";
|
||||
if(is_file($mainCssLangFile)) $css .= file_get_contents($mainCssLangFile);
|
||||
|
||||
/* Method css file. like module/story/css/create.css. */
|
||||
$methodCssFile = $mainCssPath . $devicePrefix . $methodName . '.css';
|
||||
if(is_file($methodCssFile)) $css .= file_get_contents($methodCssFile);
|
||||
|
||||
/* Method css file with lang. like module/story/css/create.en.css. */
|
||||
$methodCssLangFile = $mainCssPath . $devicePrefix . "{$methodName}.{$clientLang}.css";
|
||||
if(!file_exists($methodCssLangFile) and $notCNLang) $methodCssLangFile = $mainCssPath . $devicePrefix . "{$methodName}.en.css";
|
||||
if(is_file($methodCssLangFile)) $css .= file_get_contents($methodCssLangFile);
|
||||
|
||||
if(!empty($cssExtPath))
|
||||
{
|
||||
$cssMethodExt = $cssExtPath['common'] . $methodName . DS;
|
||||
$cssCommonExt = $cssExtPath['common'] . 'common' . DS;
|
||||
|
||||
$cssExtFiles = glob($cssCommonExt . $this->devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) foreach($cssExtFiles as $cssFile) $css .= file_get_contents($cssFile);
|
||||
$cssExtFiles = glob($cssCommonExt . $devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) $css .= $this->getExtCSS($cssExtFiles);
|
||||
|
||||
$cssExtFiles = glob($cssMethodExt . $this->devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) foreach($cssExtFiles as $cssFile) $css .= file_get_contents($cssFile);
|
||||
$cssExtFiles = glob($cssMethodExt . $devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) $css .= $this->getExtCSS($cssExtFiles);
|
||||
|
||||
if(!empty($cssExtPath['site']))
|
||||
{
|
||||
$cssMethodExt = $cssExtPath['site'] . $methodName . DS;
|
||||
$cssCommonExt = $cssExtPath['site'] . 'common' . DS;
|
||||
$cssExtFiles = glob($cssCommonExt . $this->devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) foreach($cssExtFiles as $cssFile) $css .= file_get_contents($cssFile);
|
||||
$cssExtFiles = glob($cssCommonExt . $devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) $css .= $this->getExtCSS($cssExtFiles);
|
||||
|
||||
$cssExtFiles = glob($cssMethodExt . $this->devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) foreach($cssExtFiles as $cssFile) $css .= file_get_contents($cssFile);
|
||||
$cssExtFiles = glob($cssMethodExt . $devicePrefix . '*.css');
|
||||
if(!empty($cssExtFiles) and is_array($cssExtFiles)) $css .= $this->getExtCSS($cssExtFiles);
|
||||
}
|
||||
}
|
||||
|
||||
return $css;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get extension css and extension css with lang.
|
||||
*
|
||||
* @param array $files
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getExtCSS($files)
|
||||
{
|
||||
$clientLang = $this->app->getClientLang();
|
||||
$notCNLang = strpos('|zh-cn|zh-tw|', "|{$clientLang}|") === false;
|
||||
|
||||
$filePairs = array();
|
||||
foreach($files as $cssFile)
|
||||
{
|
||||
$fileName = basename($cssFile);
|
||||
$filePairs[$fileName] = $cssFile;
|
||||
}
|
||||
|
||||
$css = '';
|
||||
$usedCodes = array();
|
||||
foreach($filePairs as $fileName => $cssFile)
|
||||
{
|
||||
if(preg_match('/^\w+\.css$/', $fileName))
|
||||
{
|
||||
/* Method extension css file. like module/story/ext/css/create/effort.css. */
|
||||
$css .= file_get_contents($cssFile);
|
||||
list($code) = explode('.', $fileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
list($code) = explode('.', $fileName);
|
||||
if(isset($usedCodes[$code])) continue;
|
||||
}
|
||||
|
||||
|
||||
/* Method extension css file. like module/story/ext/css/create/effort.zh-cn.css. */
|
||||
if(isset($filePairs["{$code}.{$clientLang}.css"]))
|
||||
{
|
||||
$css .= file_get_contents($filePairs["{$code}.{$clientLang}.css"]);
|
||||
}
|
||||
elseif($notCNLang and isset($filePairs["{$code}.en.css"]))
|
||||
{
|
||||
$css .= file_get_contents($filePairs["{$code}.en.css"]);
|
||||
}
|
||||
$usedCodes[$code] = $code;
|
||||
}
|
||||
|
||||
return $css;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取适用于当前方法的js:该模块公用的js + 当前方法的js + 扩展的js。
|
||||
* Get js codes applied to current method: module common js + method js + extension js.
|
||||
@@ -739,8 +809,11 @@ class baseControl
|
||||
* Load the control file.
|
||||
*/
|
||||
if(!is_file($file2Included)) $this->app->triggerError("The control file $file2Included not found", __FILE__, __LINE__, $exit = true);
|
||||
chdir(dirname($file2Included));
|
||||
if(!class_exists($moduleName)) helper::import($file2Included);
|
||||
if(!class_exists($moduleName))
|
||||
{
|
||||
chdir(dirname($file2Included));
|
||||
helper::import($file2Included);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置调用的类名。
|
||||
|
||||
+10
-55
@@ -21,10 +21,10 @@ include dirname(__FILE__) . '/base/control.class.php';
|
||||
class control extends baseControl
|
||||
{
|
||||
/**
|
||||
* 加载指定模块的model文件。
|
||||
* Load the model file of one module.
|
||||
*
|
||||
* Extension: set appName as empty.
|
||||
* 企业版部分功能是从然之合并过来的。然之代码中调用loadModel方法时传递了一个非空的appName,在禅道中会导致错误。
|
||||
* 调用父类的loadModel方法来避免这个错误。
|
||||
* Some codes merged from ranzhi called the function loadModel with a non-empty appName which causes an error in zentao.
|
||||
* Call the parent function with empty appName to avoid this error.
|
||||
*
|
||||
* @param string $moduleName 模块名,如果为空,使用当前模块。The module name, if empty, use current module's name.
|
||||
* @param string $appName The app name, if empty, use current app's name.
|
||||
@@ -33,52 +33,7 @@ class control extends baseControl
|
||||
*/
|
||||
public function loadModel($moduleName = '', $appName = '')
|
||||
{
|
||||
$appName = '';
|
||||
|
||||
if(empty($moduleName)) $moduleName = $this->moduleName;
|
||||
if(empty($appName)) $appName = $this->appName;
|
||||
|
||||
global $loadedModels;
|
||||
if(isset($loadedModels[$appName][$moduleName]))
|
||||
{
|
||||
$this->$moduleName = $loadedModels[$appName][$moduleName];
|
||||
$this->dao = $this->$moduleName->dao;
|
||||
return $this->$moduleName;
|
||||
}
|
||||
|
||||
$modelFile = $this->app->setModelFile($moduleName, $appName);
|
||||
|
||||
/**
|
||||
* 如果没有model文件,尝试加载config配置信息。
|
||||
* If no model file, try load config.
|
||||
*/
|
||||
if(!helper::import($modelFile))
|
||||
{
|
||||
$this->app->loadModuleConfig($moduleName, $appName);
|
||||
$this->app->loadLang($moduleName, $appName);
|
||||
$this->dao = new dao();
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果没有扩展文件,model类名是$moduleName + 'model',如果有扩展,还需要增加ext前缀。
|
||||
* If no extension file, model class name is $moduleName + 'model', else with 'ext' as the prefix.
|
||||
*/
|
||||
$modelClass = class_exists('ext' . $appName . $moduleName. 'model') ? 'ext' . $appName . $moduleName . 'model' : $appName . $moduleName . 'model';
|
||||
if(!class_exists($modelClass))
|
||||
{
|
||||
$modelClass = class_exists('ext' . $moduleName. 'model') ? 'ext' . $moduleName . 'model' : $moduleName . 'model';
|
||||
if(!class_exists($modelClass)) $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化model对象,在control对象中可以通过$this->$moduleName来引用。同时将dao对象赋为control对象的成员变量,方便引用。
|
||||
* Init the model object thus you can try $this->$moduleName to access it. Also assign the $dao object as a member of control object.
|
||||
*/
|
||||
$loadedModels[$appName][$moduleName] = new $modelClass($appName);
|
||||
$this->$moduleName = $loadedModels[$appName][$moduleName];
|
||||
$this->dao = $this->$moduleName->dao;
|
||||
return $this->$moduleName;
|
||||
return parent::loadModel($moduleName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -198,7 +153,7 @@ class control extends baseControl
|
||||
/**
|
||||
* Execute hooks of a method.
|
||||
*
|
||||
* @param int $objectID
|
||||
* @param int $objectID The id of an object. The object maybe a bug | build | feedback | product | productplan | project | release | story | task | testcase | testsuite | testtask.
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -214,7 +169,7 @@ class control extends baseControl
|
||||
/**
|
||||
* Build operate menu of a method.
|
||||
*
|
||||
* @param object $object product|project|productplan|release|build|story|task|bug|testtask|testcase|testsuite
|
||||
* @param object $object product|project|productplan|release|build|story|task|bug|testtask|testcase|testsuite
|
||||
* @param string $displayOn view|browse
|
||||
* @access public
|
||||
* @return void
|
||||
@@ -230,9 +185,9 @@ class control extends baseControl
|
||||
/**
|
||||
* Print extend fields.
|
||||
*
|
||||
* @param object $object
|
||||
* @param string $type
|
||||
* @param string $extras
|
||||
* @param object $object bug | build | feedback | product | productplan | project | release | story | task | testcase | testsuite | testtask
|
||||
* @param string $type table | div
|
||||
* @param string $extras columns=1,mode=value,position=right|right|all
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
|
||||
@@ -21,12 +21,10 @@ include dirname(__FILE__) . '/base/model.class.php';
|
||||
class model extends baseModel
|
||||
{
|
||||
/**
|
||||
* 加载一个模块的model。加载完成后,使用$this->$moduleName来访问这个model对象。
|
||||
* 比如:loadModel('user')引入user模块的model实例对象,可以通过$this->user来访问它。
|
||||
*
|
||||
* Load the model of one module. After loaded, can use $this->$moduleName to visit the model object.
|
||||
*
|
||||
* Extension: set appName as empty.
|
||||
* 企业版部分功能是从然之合并过来的。然之代码中调用loadModel方法时传递了一个非空的appName,在禅道中会导致错误。
|
||||
* 调用父类的loadModel方法来避免这个错误。
|
||||
* Some codes merged from ranzhi called the function loadModel with a non-empty appName which causes an error in zentao.
|
||||
* Call the parent function with empty appName to avoid this error.
|
||||
*
|
||||
* @param string $moduleName
|
||||
* @access public
|
||||
@@ -34,31 +32,7 @@ class model extends baseModel
|
||||
*/
|
||||
public function loadModel($moduleName, $appName = '')
|
||||
{
|
||||
$appName = '';
|
||||
|
||||
if(empty($moduleName)) return false;
|
||||
if(empty($appName)) $appName = $this->appName;
|
||||
|
||||
global $loadedModels;
|
||||
if(isset($loadedModels[$appName][$moduleName]))
|
||||
{
|
||||
$this->$moduleName = $loadedModels[$appName][$moduleName];
|
||||
return $this->$moduleName;
|
||||
}
|
||||
|
||||
$modelFile = $this->app->setModelFile($moduleName, $appName);
|
||||
|
||||
if(!helper::import($modelFile)) return false;
|
||||
$modelClass = class_exists('ext' . $appName . $moduleName. 'model') ? 'ext' . $appName . $moduleName . 'model' : $appName . $moduleName . 'model';
|
||||
if(!class_exists($modelClass))
|
||||
{
|
||||
$modelClass = class_exists('ext' . $moduleName. 'model') ? 'ext' . $moduleName . 'model' : $moduleName . 'model';
|
||||
if(!class_exists($modelClass)) $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true);
|
||||
}
|
||||
|
||||
$loadedModels[$appName][$moduleName] = new $modelClass($appName);
|
||||
$this->$moduleName = $loadedModels[$appName][$moduleName];
|
||||
return $this->$moduleName;
|
||||
return parent::loadModel($moduleName);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+35
-20
@@ -39,9 +39,18 @@ class router extends baseRouter
|
||||
public $rawMethod;
|
||||
|
||||
/**
|
||||
* Add custom langs when set client lang.
|
||||
* 标记是否是工作流
|
||||
* Whether the tag is a workflow
|
||||
*
|
||||
* @param string $lang zh-cn|zh-tw|zh-hk|en
|
||||
* @var bool
|
||||
* @access public
|
||||
*/
|
||||
public $isFlow = false;
|
||||
|
||||
/**
|
||||
* Merge system and translated langs.
|
||||
*
|
||||
* @param string $lang zh-cn|zh-tw|en
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -57,8 +66,10 @@ class router extends baseRouter
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载语言文件,返回全局$lang对象。
|
||||
* Load lang and return it as the global lang object.
|
||||
* 企业版部分功能是从然之合并过来的。然之代码中调用loadLang方法时传递了一个非空的appName,在禅道中会导致错误。
|
||||
* 把appName设置为空来避免这个错误。
|
||||
* Some codes merged from ranzhi called the function loadLang with a non-empty appName which causes an error in zentao.
|
||||
* Set the value of appName to empty to avoid this error.
|
||||
*
|
||||
* @param string $moduleName the module name
|
||||
* @param string $appName the app name
|
||||
@@ -112,8 +123,10 @@ class router extends baseRouter
|
||||
$productProject = $productProject->value;
|
||||
list($productCommon, $projectCommon) = explode('_', $productProject);
|
||||
}
|
||||
$lang->productCommon = isset($this->config->productCommonList[$this->clientLang][(int)$productCommon]) ? $this->config->productCommonList[$this->clientLang][(int)$productCommon] : $this->config->productCommonList['en'][0];
|
||||
$lang->projectCommon = isset($this->config->projectCommonList[$this->clientLang][(int)$projectCommon]) ? $this->config->projectCommonList[$this->clientLang][(int)$projectCommon] : $this->config->projectCommonList['en'][0];
|
||||
|
||||
/* Set productCommon and projectCommon. Default english lang. */
|
||||
$lang->productCommon = isset($this->config->productCommonList[$this->clientLang][(int)$productCommon]) ? $this->config->productCommonList[$this->clientLang][(int)$productCommon] : $this->config->productCommonList['en'][(int)$productCommon];
|
||||
$lang->projectCommon = isset($this->config->projectCommonList[$this->clientLang][(int)$projectCommon]) ? $this->config->projectCommonList[$this->clientLang][(int)$projectCommon] : $this->config->projectCommonList['en'][(int)$projectCommon];
|
||||
}
|
||||
|
||||
parent::loadLang($moduleName, $appName);
|
||||
@@ -165,13 +178,10 @@ class router extends baseRouter
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载模块的config文件,返回全局$config对象。
|
||||
* 如果该模块是common,加载$configRoot的配置文件,其他模块则加载其模块的配置文件。
|
||||
*
|
||||
* Load config and return it as the global config object.
|
||||
* If the module is common, search in $configRoot, else in $modulePath.
|
||||
*
|
||||
* Extension: set appName as empty.
|
||||
* 企业版部分功能是从然之合并过来的。然之代码中调用loadModuleConfig方法时传递了一个非空的appName,在禅道中会导致错误。
|
||||
* 把appName设置为空来避免这个错误。
|
||||
* Some codes merged from ranzhi called the function loadModuleConfig with a non-empty appName which causes an error in zentao.
|
||||
* Set the value of appName to empty to avoid this error.
|
||||
*
|
||||
* @param string $moduleName module name
|
||||
* @param string $appName app name
|
||||
@@ -222,8 +232,7 @@ class router extends baseRouter
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用父类方法时不传递$appName参数,保证父类方法中$appName值为空。
|
||||
* The $appName parameter is not passed when calling the parent class method, ensuring that the $appName value in the parent class method is null.
|
||||
* The alias for loadModuleConfig.
|
||||
*
|
||||
* @param string $moduleName
|
||||
* @param string $appName
|
||||
@@ -286,6 +295,10 @@ class router extends baseRouter
|
||||
*/
|
||||
public function setControlFile($exitIfNone = true)
|
||||
{
|
||||
/* Set raw module and method name for fetch control. */
|
||||
if(empty($this->rawModule)) $this->rawModule = $this->moduleName;
|
||||
if(empty($this->rawMethod)) $this->rawMethod = $this->methodName;
|
||||
|
||||
/* If is not a biz version or is in install mode or in in upgrade mode, call parent method. */
|
||||
if(!isset($this->config->bizVersion) or defined('IN_INSTALL') or defined('IN_UPGRADE')) return parent::setControlFile($exitIfNone);
|
||||
|
||||
@@ -305,6 +318,7 @@ class router extends baseRouter
|
||||
{
|
||||
$this->rawModule = $this->moduleName;
|
||||
$this->rawMethod = 'browse';
|
||||
$this->isFlow = true;
|
||||
|
||||
$moduleName = 'flow';
|
||||
$methodName = 'browse';
|
||||
@@ -318,6 +332,7 @@ class router extends baseRouter
|
||||
{
|
||||
$this->rawModule = $this->moduleName;
|
||||
$this->rawMethod = $this->methodName;
|
||||
$this->isFlow = true;
|
||||
|
||||
$this->loadModuleConfig('workflowaction');
|
||||
|
||||
@@ -434,8 +449,8 @@ class router extends baseRouter
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果$this->rawModule和$this->rawMethod的值不为空,说明这个请求需要工作流引擎来处理,则要根据工作流引擎的需要重新设置参数。
|
||||
* If the values of $this->rawModule and $this->rawMethod are not empty, indicating that the request needs to be processed
|
||||
* 如果$this->isFlow的值为true,说明这个请求需要工作流引擎来处理,则要根据工作流引擎的需要重新设置参数。
|
||||
* If the values of $this->isFlow is true, indicating that the request needs to be processed
|
||||
* by the workflow engine, the parameters are reset according to the needs of the workflow engine.
|
||||
*
|
||||
* @param array $defaultParams the default params defined by the method.
|
||||
@@ -445,14 +460,14 @@ class router extends baseRouter
|
||||
*/
|
||||
public function mergeParams($defaultParams, $passedParams)
|
||||
{
|
||||
/* If the rawModule and rawMethod is not empty, reset the passed params. */
|
||||
if($this->rawModule && $this->rawMethod)
|
||||
/* If the isFlow is true, reset the passed params. */
|
||||
if($this->isFlow)
|
||||
{
|
||||
$passedParams = array_reverse($passedParams);
|
||||
|
||||
/* 如果请求的方法名不是browse、create、edit、view、delete、export中的任何一个,则需要添加action参数来传递请求的方法名。 */
|
||||
/* If the requested method name is not any of browse, create, edit, view, delete, or export, you need to add an action parameter to pass the requested method name. */
|
||||
if(!in_array($this->rawMethod, $this->config->workflowaction->default->actions)) $passedParams['action'] = $this->rawMethod;
|
||||
if(isset($this->config->workflowaction->default->actions) and !in_array($this->rawMethod, $this->config->workflowaction->default->actions)) $passedParams['action'] = $this->rawMethod;
|
||||
/* 添加module参数来传递请求的模块名。 */
|
||||
/* Add the module parameter to pass the requested module name. */
|
||||
$passedParams['module'] = $this->rawModule;
|
||||
|
||||
@@ -1075,6 +1075,7 @@ EOT;
|
||||
$jsLang = new stdclass();
|
||||
$jsLang->submitting = isset($lang->loading) ? $lang->loading : '';
|
||||
$jsLang->save = $jsConfig->save;
|
||||
$jsLang->expand = isset($lang->expand) ? $lang->expand : '';
|
||||
$jsLang->timeout = isset($lang->timeout) ? $lang->timeout : '';
|
||||
|
||||
$js = self::start(false);
|
||||
|
||||
@@ -34,6 +34,7 @@ class fixer extends baseFixer
|
||||
{
|
||||
$fields = str_replace(' ', '', trim($fields));
|
||||
|
||||
/* Get extend field by flow. */
|
||||
global $config;
|
||||
$flowFields = array();
|
||||
if(isset($config->bizVersion))
|
||||
@@ -45,14 +46,27 @@ class fixer extends baseFixer
|
||||
}
|
||||
foreach($this->data as $field => $value)
|
||||
{
|
||||
if(isset($flowFields[$field]) and is_array($value)) $this->data->$field = implode(',', $value);
|
||||
/* Implode array when form has array. */
|
||||
if(isset($flowFields[$field]) and is_array($value))
|
||||
{
|
||||
$canImplode = true;
|
||||
foreach($value as $k => $v)
|
||||
{
|
||||
if(is_object($v) or is_array($v))
|
||||
{
|
||||
$canImplode = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if($canImplode) $this->data->$field = implode(',', $value);
|
||||
}
|
||||
$this->specialChars($field);
|
||||
}
|
||||
|
||||
|
||||
if(empty($fields)) return $this->data;
|
||||
if(strpos($fields, ',') === false) return $this->data->$fields;
|
||||
|
||||
/* Process fields for check by key. */
|
||||
$fields = array_flip(explode(',', $fields));
|
||||
foreach($this->data as $field => $value)
|
||||
{
|
||||
|
||||
@@ -126,11 +126,12 @@ class SMTP {
|
||||
}
|
||||
|
||||
// connect to the smtp server
|
||||
$this->smtp_conn = fsockopen($host, // the host of the server
|
||||
$port, // the port to use
|
||||
$errno, // error number if any
|
||||
$errstr, // error message if any
|
||||
$tval); // give up after ? secs
|
||||
// Replace fsockopen for don't validate remote hosts
|
||||
$contextOptions['ssl']['verify_host'] = false;
|
||||
$contextOptions['ssl']['verify_peer'] = false;
|
||||
$contextOptions['ssl']['verify_peer_name'] = false;
|
||||
$context = stream_context_create($contextOptions);
|
||||
$this->smtp_conn = stream_socket_client($host . ':' . $port, $errno, $errstr, $tval, STREAM_CLIENT_CONNECT, $context);
|
||||
// verify we connected properly
|
||||
if(empty($this->smtp_conn)) {
|
||||
$this->error = array("error" => "Failed to connect to server",
|
||||
@@ -616,7 +617,7 @@ class SMTP {
|
||||
|
||||
protected function parseHelloFields($type)
|
||||
{
|
||||
$this->server_caps = [];
|
||||
$this->server_caps = array();
|
||||
$lines = explode("\n", $this->helo_rply);
|
||||
|
||||
foreach ($lines as $n => $s) {
|
||||
@@ -638,7 +639,7 @@ class SMTP {
|
||||
break;
|
||||
case 'AUTH':
|
||||
if (!is_array($fields)) {
|
||||
$fields = [];
|
||||
$fields = array();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -19,6 +19,7 @@ $lang->action->actor = 'User';
|
||||
$lang->action->action = 'Action';
|
||||
$lang->action->actionID = 'Action ID';
|
||||
$lang->action->date = 'Date';
|
||||
$lang->action->extra = 'Extra';
|
||||
|
||||
$lang->action->trash = 'Recycle';
|
||||
$lang->action->undelete = 'Restore';
|
||||
@@ -87,7 +88,7 @@ $lang->action->objectTypes['testreport'] = 'Report';
|
||||
$lang->action->objectTypes['entry'] = 'Entry';
|
||||
$lang->action->objectTypes['webhook'] = 'Webhook';
|
||||
|
||||
/* 用来描述操作历史记录。*/
|
||||
/* Used to describe operation history. */
|
||||
$lang->action->desc = new stdclass();
|
||||
$lang->action->desc->common = '$date, <strong>$action</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
@@ -129,7 +130,7 @@ $lang->action->desc->diff2 = '<strong><i>%s</i></strong> is changed. Th
|
||||
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
|
||||
$lang->action->desc->linked2bug = '$date, linked to <strong>$extra</strong> by <strong>$actor</strong>';
|
||||
|
||||
/* 子任务修改父任务的历史操作记录 */
|
||||
/* Used to describe the history of operations related to parent-child tasks. */
|
||||
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkchildtask = '$date, <strong>$actor</strong> linked a child task <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkchildtask = '$date, <strong>$actor</strong> linked a child task <strong>$extra</strong>。' . "\n";
|
||||
@@ -137,11 +138,11 @@ $lang->action->desc->unlinkchildrentask = '$date, <strong>$actor</strong> unlink
|
||||
$lang->action->desc->linkparenttask = '$date, <strong>$actor</strong> linked to a parent task <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkparenttask = '$date, <strong>$actor</strong> unlinked a parent task <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 关联用例和移除用例时的历史操作记录。*/
|
||||
/* Historical record of actions when associating and removing cases. */
|
||||
$lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> linked a case <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> unlinked a case <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* 用来显示动态信息。*/
|
||||
/* Used to display dynamic information. */
|
||||
$lang->action->label = new stdclass();
|
||||
$lang->action->label->created = 'created ';
|
||||
$lang->action->label->opened = 'opened ';
|
||||
@@ -209,7 +210,7 @@ $lang->action->label->batchcreate = "batch created tasks";
|
||||
$lang->action->label->createchildren = "create child tasks";
|
||||
$lang->action->label->managed = "managed";
|
||||
|
||||
/* 动态信息按照对象分组 */
|
||||
/* Dynamic information is grouped by object. */
|
||||
$lang->action->dynamicAction = new stdclass;
|
||||
$lang->action->dynamicAction->todo['opened'] = 'Create Todo';
|
||||
$lang->action->dynamicAction->todo['edited'] = 'Edit Todo';
|
||||
@@ -357,7 +358,7 @@ $lang->action->dynamicAction->user['loginxuanxuan'] = 'Login Desktop';
|
||||
$lang->action->dynamicAction->entry['created'] = 'Add Application';
|
||||
$lang->action->dynamicAction->entry['edited'] = 'Edit Application';
|
||||
|
||||
/* 用来生成相应对象的链接。*/
|
||||
/* Generate the corresponding object link. */
|
||||
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
|
||||
$lang->action->label->productplan = 'Plan|productplan|view|productID=%s';
|
||||
$lang->action->label->release = 'Release|release|view|productID=%s';
|
||||
@@ -402,7 +403,7 @@ $lang->action->search->objectTypeList['testsuite'] = 'Suite';
|
||||
$lang->action->search->objectTypeList['caselib'] = 'Library';
|
||||
$lang->action->search->objectTypeList['testreport'] = 'Report';
|
||||
|
||||
/* 用来在动态显示中显示动作 */
|
||||
/* Used to display actions in dynamic method. */
|
||||
$lang->action->search->label[''] = '';
|
||||
$lang->action->search->label['created'] = $lang->action->label->created;
|
||||
$lang->action->search->label['opened'] = $lang->action->label->opened;
|
||||
|
||||
@@ -19,6 +19,7 @@ $lang->action->actor = '操作者';
|
||||
$lang->action->action = '动作';
|
||||
$lang->action->actionID = '记录ID';
|
||||
$lang->action->date = '日期';
|
||||
$lang->action->extra = '附加值';
|
||||
|
||||
$lang->action->trash = '回收站';
|
||||
$lang->action->undelete = '还原';
|
||||
@@ -129,7 +130,7 @@ $lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,
|
||||
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
|
||||
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>';
|
||||
|
||||
/* 子任务修改父任务的历史操作记录 */
|
||||
/* 用来描述和父子任务相关的操作历史记录。*/
|
||||
$lang->action->desc->createchildren = '$date, 由 <strong>$actor</strong> 创建子任务 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 关联子任务 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 关联子任务 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
@@ -19,6 +19,7 @@ $lang->action->actor = '操作者';
|
||||
$lang->action->action = '動作';
|
||||
$lang->action->actionID = '記錄ID';
|
||||
$lang->action->date = '日期';
|
||||
$lang->action->extra = '附加值';
|
||||
|
||||
$lang->action->trash = '資源回收筒';
|
||||
$lang->action->undelete = '還原';
|
||||
@@ -129,7 +130,7 @@ $lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,
|
||||
$lang->action->desc->diff3 = '將檔案名 %s 改為 %s 。' . "\n";
|
||||
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 關聯到版本 <strong>$extra</strong>';
|
||||
|
||||
/* 子任務修改父任務的歷史操作記錄 */
|
||||
/* 用來描述和父子任務相關的操作歷史記錄。*/
|
||||
$lang->action->desc->createchildren = '$date, 由 <strong>$actor</strong> 創建子任務 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 關聯子任務 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 關聯子任務 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
+10
-2
@@ -45,9 +45,11 @@ class actionModel extends model
|
||||
$action->actor = $actor;
|
||||
$action->action = $actionType;
|
||||
$action->date = helper::now();
|
||||
$action->comment = trim(strip_tags($comment, $this->config->allowedTags));
|
||||
$action->extra = $extra;
|
||||
|
||||
$_POST['comment'] = $comment;
|
||||
$action->comment = fixer::input('post')->stripTags('comment')->get('comment');
|
||||
|
||||
/* Process action. */
|
||||
$action = $this->loadModel('file')->processImgURL($action, 'comment', $this->post->uid);
|
||||
if($autoDelete) $this->file->autoDelete($this->post->uid);
|
||||
@@ -978,6 +980,12 @@ class actionModel extends model
|
||||
{
|
||||
$this->dao->update(TABLE_DOCLIB)->set('deleted')->eq(0)->where($action->objectType)->eq($action->objectID)->exec();
|
||||
}
|
||||
/* Revert productplan project status */
|
||||
if($action->objectType == 'productplan')
|
||||
{
|
||||
$plan = $this->loadModel('productplan')->getById($action->objectID);
|
||||
$this->loadModel('productplan')->updatePlanParentStatus($plan->parent);
|
||||
}
|
||||
|
||||
/* Update action record in action table. */
|
||||
$this->dao->update(TABLE_ACTION)->set('extra')->eq(ACTIONMODEL::BE_UNDELETED)->where('id')->eq($actionID)->exec();
|
||||
@@ -1059,7 +1067,7 @@ class actionModel extends model
|
||||
|
||||
if($dateGroup)
|
||||
{
|
||||
$lastDateActions = $this->dao->select('*')->from(TABLE_ACTION)->where($this->session->actionQueryCondition)->andWhere('`date`')->like(substr($action->originalDate, 0, 10) . '%')->orderBy($this->session->actionOrderBy)->fetchAll('id');
|
||||
$lastDateActions = $this->dao->select('*')->from(TABLE_ACTION)->where($this->session->actionQueryCondition)->andWhere("(LEFT(`date`, 10) = '" . substr($action->originalDate, 0, 10) . "')")->orderBy($this->session->actionOrderBy)->fetchAll('id');
|
||||
if(count($dateGroup[$date]) < count($lastDateActions))
|
||||
{
|
||||
unset($dateGroup[$date]);
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
$flow = $config->action->customFlows[$action->objectType];
|
||||
$module = $flow->module;
|
||||
}
|
||||
if(strpos(',doclib,module,webhook,workflowdatasource,workflowfield,workflowlabel,workflowlayout,workflowrule,', ",{$module},") !== false)
|
||||
if(strpos(',doclib,module,webhook,', ",{$module},") !== false)
|
||||
{
|
||||
echo $action->objectName;
|
||||
}
|
||||
@@ -63,7 +63,7 @@
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo $users[$action->actor];?></td>
|
||||
<td><?php echo zget($users, $action->actor);?></td>
|
||||
<td><?php echo $action->date;?></td>
|
||||
<td>
|
||||
<?php
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
.thWidth{width:300px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:130px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:300px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:130px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:130px !important;}
|
||||
@@ -1,2 +0,0 @@
|
||||
.actionWidth{width:140px !important;}
|
||||
html[lang^='zh-'] .actionWidth{width:110px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.actionWidth{width:140px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.actionWidth{width:110px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.actionWidth{width:110px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.checkbox-primary label{height:auto;}
|
||||
@@ -53,7 +53,7 @@ $lang->block->params->value = '参数值';
|
||||
$lang->block->createBlock = '添加区块';
|
||||
$lang->block->editBlock = '编辑区块';
|
||||
$lang->block->ordersSaved = '排序已保存';
|
||||
$lang->block->confirmRemoveBlock = '确定移除区块吗?';
|
||||
$lang->block->confirmRemoveBlock = '确定隐藏区块吗?';
|
||||
$lang->block->noticeNewBlock = '10.0版本以后各个视图主页提供了全新的视图,您要启用新的视图布局吗?';
|
||||
$lang->block->confirmReset = '是否恢复默认布局?';
|
||||
$lang->block->closeForever = '永久关闭';
|
||||
|
||||
@@ -53,7 +53,7 @@ $lang->block->params->value = '參數值';
|
||||
$lang->block->createBlock = '添加區塊';
|
||||
$lang->block->editBlock = '編輯區塊';
|
||||
$lang->block->ordersSaved = '排序已保存';
|
||||
$lang->block->confirmRemoveBlock = '確定移除區塊嗎?';
|
||||
$lang->block->confirmRemoveBlock = '確定隱藏區塊嗎?';
|
||||
$lang->block->noticeNewBlock = '10.0版本以後各個視圖主頁提供了全新的視圖,您要啟用新的視圖佈局嗎?';
|
||||
$lang->block->confirmReset = '是否恢復預設佈局?';
|
||||
$lang->block->closeForever = '永久關閉';
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
$i = 0;
|
||||
foreach($actions as $action)
|
||||
{
|
||||
$user = isset($users[$action->actor]) ? $users[$action->actor] : $action->actor;
|
||||
$user = zget($users, $action->actor);
|
||||
if($action->action == 'login' or $action->action == 'logout' or empty($action->objectLink)) $action->objectName = $action->objectLabel = '';
|
||||
$class = $action->major ? "class='active'" : '';
|
||||
echo "<li $class><div>";
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
.product-info .type-info {color: #A6AAB8; text-align: center; position: absolute; right: 0; top: 6px; width: 100px;}
|
||||
html[lang="en"] .product-info .type-info {color: #A6AAB8; text-align: center; position: absolute; right: 0; top: 6px; width: 90px;}
|
||||
.product-info .type-value,
|
||||
.product-info .type-label {font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
.product-info .type-label {font-size: 12px; overflow: visible; text-overflow: ellipsis; white-space: nowrap;}
|
||||
.product-info .type-value {font-size: 14px;}
|
||||
.product-info .type-value > strong {font-size: 20px; color: #3C4353;}
|
||||
.product-info .actions {position: absolute; left: 10px; top: 14px;}
|
||||
|
||||
@@ -19,7 +19,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
|
||||
.block-todoes .todoes-input .form-control:-ms-input-placeholder {font-size: 12px; line-height: 20px;color: #a4a8b6;}
|
||||
.block-todoes .todoes-input .form-control::placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
|
||||
.block-todoes .todoes {padding: 0 10px 10px 10px; margin: 0 -20px; max-height: 350px; overflow: auto; overflow-x:hidden}
|
||||
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden;}
|
||||
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden; max-width: 820px;}
|
||||
.block-todoes .todoes > li:hover {background-color: #e9f2fb;}
|
||||
.block-todoes .todo-title {padding: 5px 15px 5px 5px;}
|
||||
.block-todoes .todo-pri {margin: 0 5px;}
|
||||
|
||||
@@ -12,6 +12,7 @@ $lang->branch->id = 'ID';
|
||||
$lang->branch->product = 'Product';
|
||||
$lang->branch->name = 'Name';
|
||||
$lang->branch->order = 'Order';
|
||||
$lang->branch->deleted = 'Delete';
|
||||
|
||||
$lang->branch->confirmDelete = 'Do you want to delete this @branch@?';
|
||||
$lang->branch->canNotDelete = 'There is data in @branch@. It cannot be deleted.';
|
||||
|
||||
@@ -12,6 +12,7 @@ $lang->branch->id = '编号';
|
||||
$lang->branch->product = '所属产品';
|
||||
$lang->branch->name = '名称';
|
||||
$lang->branch->order = '排序';
|
||||
$lang->branch->deleted = '已删除';
|
||||
|
||||
$lang->branch->confirmDelete = '是否删除该@branch@?';
|
||||
$lang->branch->canNotDelete = '该@branch@下已经有数据,不能删除!';
|
||||
|
||||
@@ -12,6 +12,7 @@ $lang->branch->id = '編號';
|
||||
$lang->branch->product = '所屬產品';
|
||||
$lang->branch->name = '名稱';
|
||||
$lang->branch->order = '排序';
|
||||
$lang->branch->deleted = '已刪除';
|
||||
|
||||
$lang->branch->confirmDelete = '是否刪除該@branch@?';
|
||||
$lang->branch->canNotDelete = '該@branch@下已經有數據,不能刪除!';
|
||||
|
||||
@@ -1591,6 +1591,7 @@ class bug extends control
|
||||
}
|
||||
|
||||
if(!(in_array('platform', $productsType) or in_array('branch', $productsType))) unset($fields['branch']);// If products's type are normal, unset branch field.
|
||||
if(isset($this->config->bizVersion)) list($fields, $bugs) = $this->loadModel('workflowfield')->appendDataFromFlow($fields, $bugs);
|
||||
|
||||
$this->post->set('fields', $fields);
|
||||
$this->post->set('rows', $bugs);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
.closed, .closed a{color:gray; text-decoration:line-through;}
|
||||
.resolved, .resolved a{color:#8EC21F; text-decoration:none;}
|
||||
.tree .closed, .tree .closed a{color:#003366; text-decoration:none;}
|
||||
.confirm0 {color:gray; font-size:9px}
|
||||
.confirm1 {color:green; font-size:9px}
|
||||
.confirm0 {color:gray;}
|
||||
.confirm1 {color:green;}
|
||||
td.delayed{color:#fff; background: #e84e0f!important;}
|
||||
|
||||
.datatable-wrapper .table-datatable .datatable-row td {height:37px;}
|
||||
|
||||
@@ -38,6 +38,7 @@ html[lang='en'] #deadlineTd .input-group-addon{padding: 5px 18px}
|
||||
.title-group #severity + .chosen-container > .chosen-single {border-radius: 0!important;}
|
||||
.title-group #pri + .chosen-container > .chosen-single {border-top-left-radius: 0!important; border-bottom-left-radius: 0!important;}
|
||||
.title-group .has-icon-right{min-width:700px}
|
||||
#mainContent .center-block{padding-bottom:40px;}
|
||||
|
||||
#typeBox {width:180px;}
|
||||
#osBox {width:190px;}
|
||||
|
||||
@@ -4,6 +4,3 @@
|
||||
.col-side .chosen-container[id^="resolvedBuild"] {width: 172px!important}
|
||||
.chosen-choices li.search-choice{word-break: break-all;}
|
||||
#linkBugBox > li {margin-left:-56px}
|
||||
|
||||
.thWidth{width:100px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:80px !important;}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:100px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -1,4 +1 @@
|
||||
.chosen-container[id^="buildProject"] {max-width: 160px; border-radius: 0}
|
||||
|
||||
.thWidth{width:130px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:100px !important;}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:130px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:100px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:100px !important;}
|
||||
@@ -3,8 +3,3 @@
|
||||
.table-data tr > td{word-break: break-all; word-wrap: break-word;}
|
||||
.side-col .cell{padding:0px;}
|
||||
.tab-pane table {border: 1px solid #ddd; border-top: none;}
|
||||
|
||||
#legendBasicInfo .thWidth{width:110px !important;}
|
||||
#legendLife .thWidth{width:100px !important;}
|
||||
html[lang^='zh-'] #legendBasicInfo .thWidth{width:70px !important;}
|
||||
html[lang^='zh-'] #legendLife .thWidth{width:90px !important;}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
#legendBasicInfo .thWidth{width:110px !important;}
|
||||
#legendLife .thWidth{width:100px !important;}
|
||||
@@ -0,0 +1,2 @@
|
||||
#legendBasicInfo .thWidth{width:70px !important;}
|
||||
#legendLife .thWidth{width:90px !important;}
|
||||
@@ -0,0 +1,2 @@
|
||||
#legendBasicInfo .thWidth{width:70px !important;}
|
||||
#legendLife .thWidth{width:90px !important;}
|
||||
+14
-10
@@ -19,6 +19,8 @@ $lang->bug->module = 'Module';
|
||||
$lang->bug->moduleAB = 'Module';
|
||||
$lang->bug->project = $lang->projectCommon;
|
||||
$lang->bug->story = 'Story';
|
||||
$lang->bug->storyVersion = 'Story Version';
|
||||
$lang->bug->color = 'Color';
|
||||
$lang->bug->task = 'Task';
|
||||
$lang->bug->title = 'Title';
|
||||
$lang->bug->severity = 'Severity';
|
||||
@@ -65,6 +67,8 @@ $lang->bug->linkBug = 'Linked Bugs';
|
||||
$lang->bug->linkBugs = 'Link Bug';
|
||||
$lang->bug->unlinkBug = 'Unlink';
|
||||
$lang->bug->case = 'Cases';
|
||||
$lang->bug->caseVersion = 'Case Version';
|
||||
$lang->bug->testtask = 'Request';
|
||||
$lang->bug->files = 'Files';
|
||||
$lang->bug->keywords = 'Tags';
|
||||
$lang->bug->lastEditedByAB = 'EditedBy';
|
||||
@@ -74,7 +78,7 @@ $lang->bug->fromCase = 'From Case';
|
||||
$lang->bug->toCase = 'To Case';
|
||||
$lang->bug->colorTag = 'Color';
|
||||
|
||||
/* 方法列表。*/
|
||||
/* Method list. */
|
||||
$lang->bug->index = 'Bug Home';
|
||||
$lang->bug->create = 'Report Bug';
|
||||
$lang->bug->batchCreate = 'Batch Report';
|
||||
@@ -110,7 +114,7 @@ $lang->bug->confirmStoryChange = 'Confirm Story Change';
|
||||
$lang->bug->copy = 'Copy';
|
||||
$lang->bug->search = 'Search';
|
||||
|
||||
/* 查询条件列表。*/
|
||||
/* Query condition list. */
|
||||
$lang->bug->assignToMe = 'AssignedToMe';
|
||||
$lang->bug->openedByMe = 'ReportedByMe';
|
||||
$lang->bug->resolvedByMe = 'ResolvedByMe';
|
||||
@@ -143,7 +147,7 @@ $lang->bug->noBug = 'No bugs yet.';
|
||||
$lang->bug->noModule = '<div>You have no modules.</div><div>Manage now</div>';
|
||||
$lang->bug->delayWarning = " <strong class='text-danger'> Delay %s days </strong>";
|
||||
|
||||
/* 页面标签。*/
|
||||
/* Page tags. */
|
||||
$lang->bug->lblAssignedTo = 'AssignTo';
|
||||
$lang->bug->lblMailto = 'Mailto';
|
||||
$lang->bug->lblLastEdited = 'EditedBy';
|
||||
@@ -152,7 +156,7 @@ $lang->bug->allUsers = 'Load All Users';
|
||||
$lang->bug->allBuilds = 'All Builds';
|
||||
$lang->bug->createBuild = 'New';
|
||||
|
||||
/* legend列表。*/
|
||||
/* Legend list。*/
|
||||
$lang->bug->legendBasicInfo = 'Basic Info';
|
||||
$lang->bug->legendAttatch = 'Files';
|
||||
$lang->bug->legendPrjStoryTask = $lang->projectCommon . '/Story/Task';
|
||||
@@ -164,22 +168,22 @@ $lang->bug->legendLife = 'Bug Life';
|
||||
$lang->bug->legendMisc = 'Misc.';
|
||||
$lang->bug->legendRelated = 'Related Info';
|
||||
|
||||
/* 功能按钮。*/
|
||||
/* Button. */
|
||||
$lang->bug->buttonConfirm = 'Confirm';
|
||||
|
||||
/* 交互提示。*/
|
||||
/* Interactive prompt. */
|
||||
$lang->bug->summary = "Total <strong>%s</strong> bugs on this page, and <strong>%s</strong> Active.";
|
||||
$lang->bug->confirmChangeProduct = "Any change to {$lang->productCommon} will cause linked {$lang->projectCommon}s, stories and tasks change. Do you want to do this?";
|
||||
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
|
||||
$lang->bug->remindTask = 'This bug has been converted to a task. Do you want to update the status of Task(ID %s)?';
|
||||
$lang->bug->skipClose = 'Bug %s is active. You cannot close it.';
|
||||
|
||||
/* 模板。*/
|
||||
/* Template. */
|
||||
$lang->bug->tplStep = "<p>[Steps]</p><br/>";
|
||||
$lang->bug->tplResult = "<p>[Results]</p><br/>";
|
||||
$lang->bug->tplExpect = "<p>[Expectations]</p><br/>";
|
||||
|
||||
/* 各个字段取值列表。*/
|
||||
/* Value list for each field. */
|
||||
$lang->bug->severityList[1] = '1';
|
||||
$lang->bug->severityList[2] = '2';
|
||||
$lang->bug->severityList[3] = '3';
|
||||
@@ -269,7 +273,7 @@ $lang->bug->resolutionList['postponed'] = 'Postponed';
|
||||
$lang->bug->resolutionList['willnotfix'] = "Won't Fix";
|
||||
$lang->bug->resolutionList['tostory'] = 'Convert to Story';
|
||||
|
||||
/* 统计报表。*/
|
||||
/* Statistical statement. */
|
||||
$lang->bug->report = new stdclass();
|
||||
$lang->bug->report->common = 'Report';
|
||||
$lang->bug->report->select = 'Select Report Type';
|
||||
@@ -365,7 +369,7 @@ $lang->bug->report->bugsPerAssignedTo->graph->xAxisName = 'AssignTo';
|
||||
$lang->bug->report->bugLiveDays->graph->xAxisName = 'Handling Time';
|
||||
$lang->bug->report->bugHistories->graph->xAxisName = 'Handling Steps';
|
||||
|
||||
/* 操作记录。*/
|
||||
/* Operating record. */
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, resolved by <strong>$actor</strong> and the resolution is <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, converted by <strong>$actor</strong> to <strong>Story</strong> with ID <strong>$extra</strong>.');
|
||||
|
||||
@@ -19,6 +19,8 @@ $lang->bug->module = '所属模块';
|
||||
$lang->bug->moduleAB = '模块';
|
||||
$lang->bug->project = '所属' . $lang->projectCommon;
|
||||
$lang->bug->story = '相关需求';
|
||||
$lang->bug->storyVersion = '需求版本';
|
||||
$lang->bug->color = '标题颜色';
|
||||
$lang->bug->task = '相关任务';
|
||||
$lang->bug->title = 'Bug标题';
|
||||
$lang->bug->severity = '严重程度';
|
||||
@@ -30,7 +32,7 @@ $lang->bug->browser = '浏览器';
|
||||
$lang->bug->steps = '重现步骤';
|
||||
$lang->bug->status = 'Bug状态';
|
||||
$lang->bug->statusAB = '状态';
|
||||
$lang->bug->subStatus = 'Bug子状态';
|
||||
$lang->bug->subStatus = '子状态';
|
||||
$lang->bug->activatedCount = '激活次数';
|
||||
$lang->bug->activatedCountAB = '激活次数';
|
||||
$lang->bug->activatedDate = '激活日期';
|
||||
@@ -65,6 +67,8 @@ $lang->bug->linkBug = '相关Bug';
|
||||
$lang->bug->linkBugs = '关联相关Bug';
|
||||
$lang->bug->unlinkBug = '移除相关Bug';
|
||||
$lang->bug->case = '相关用例';
|
||||
$lang->bug->caseVersion = '用例版本';
|
||||
$lang->bug->testtask = '测试单';
|
||||
$lang->bug->files = '附件';
|
||||
$lang->bug->keywords = '关键词';
|
||||
$lang->bug->lastEditedByAB = '修改者';
|
||||
|
||||
@@ -19,6 +19,8 @@ $lang->bug->module = '所屬模組';
|
||||
$lang->bug->moduleAB = '模組';
|
||||
$lang->bug->project = '所屬' . $lang->projectCommon;
|
||||
$lang->bug->story = '相關需求';
|
||||
$lang->bug->storyVersion = '需求版本';
|
||||
$lang->bug->color = '標題顏色';
|
||||
$lang->bug->task = '相關任務';
|
||||
$lang->bug->title = 'Bug標題';
|
||||
$lang->bug->severity = '嚴重程度';
|
||||
@@ -30,6 +32,7 @@ $lang->bug->browser = '瀏覽器';
|
||||
$lang->bug->steps = '重現步驟';
|
||||
$lang->bug->status = 'Bug狀態';
|
||||
$lang->bug->statusAB = '狀態';
|
||||
$lang->bug->subStatus = '子狀態';
|
||||
$lang->bug->activatedCount = '激活次數';
|
||||
$lang->bug->activatedCountAB = '激活次數';
|
||||
$lang->bug->activatedDate = '激活日期';
|
||||
@@ -64,6 +67,8 @@ $lang->bug->linkBug = '相關Bug';
|
||||
$lang->bug->linkBugs = '關聯相關Bug';
|
||||
$lang->bug->unlinkBug = '移除相關Bug';
|
||||
$lang->bug->case = '相關用例';
|
||||
$lang->bug->caseVersion = '用例版本';
|
||||
$lang->bug->testtask = '測試單';
|
||||
$lang->bug->files = '附件';
|
||||
$lang->bug->keywords = '關鍵詞';
|
||||
$lang->bug->lastEditedByAB = '修改者';
|
||||
|
||||
@@ -27,14 +27,18 @@
|
||||
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-70px'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<th class='w-80px'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<td class='w-p25-f'><?php echo html::select('assignedTo', $users, $bug->resolvedBy, "class='form-control chosen'");?></td><td></td>
|
||||
</tr>
|
||||
<tr class='hide'>
|
||||
<th><?php echo $lang->bug->status;?></th>
|
||||
<td><?php echo html::hidden('status', 'active');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=1');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->openedBuild;?></th>
|
||||
<td colspan='2'><?php echo html::select('openedBuild[]', $builds, $bug->openedBuild, 'size=4 multiple=multiple class="form-control chosen"');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=2');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->comment;?></th>
|
||||
<td colspan='2'><?php echo html::textarea('comment', '', "rows='6' class='form-control'");?></td>
|
||||
|
||||
@@ -34,11 +34,15 @@ js::set('page', 'assignedto');
|
||||
<th class='w-80px'><?php echo $lang->bug->assignBug;?></th>
|
||||
<td class='w-p25-f'><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='form-control chosen'");?></td><td></td>
|
||||
</tr>
|
||||
<tr class='hide'>
|
||||
<th><?php echo $lang->bug->status;?></th>
|
||||
<td><?php echo html::hidden('status', $bug->status);?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=1');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->mailto;?></th>
|
||||
<td colspan='2'><?php echo html::select('mailto[]', $users, str_replace(' ', '', $bug->mailto), 'class="form-control chosen" multiple');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=2');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->comment;?></th>
|
||||
<td colspan='2'><?php echo html::textarea('comment', '', "rows='6' class='form-control'");?></td>
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
</div>
|
||||
<form method='post' target='hiddenwin'>
|
||||
<table class='table table-form'>
|
||||
<tr class='hide'>
|
||||
<th class='w-60px'><?php echo $lang->bug->status;?></th>
|
||||
<td><?php echo html::hidden('status', 'closed');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=1');?>
|
||||
<tr>
|
||||
<th class='w-60px'><?php echo $lang->comment;?></th>
|
||||
|
||||
@@ -45,11 +45,16 @@ js::set('page', 'confirmbug');
|
||||
<td><?php echo html::select('pri', $lang->bug->priList, $bug->pri, "class='form-control chosen'");?></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class='hide'>
|
||||
<th><?php echo $lang->bug->status;?></th>
|
||||
<td><?php echo html::hidden('status', $bug->status);?></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=1');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->mailto;?></th>
|
||||
<td colspan='2'><?php echo html::select('mailto[]', $users, str_replace(' ' , '', $bug->mailto), 'class="form-control chosen" multiple');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=2');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->comment;?></th>
|
||||
<td colspan='2'><?php echo html::textarea('comment', '', "rows='6' class='w-p94'");?></td>
|
||||
|
||||
@@ -288,7 +288,11 @@ js::set('flow', $config->global->flow);
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php $this->printExtendFields('', 'table', 'columns=2');?>
|
||||
<tr class='hide'>
|
||||
<th><?php echo $lang->bug->status;?></th>
|
||||
<td><?php echo html::hidden('status');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields('', 'table', 'columns=1');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->files;?></th>
|
||||
<td colspan='2'><?php echo $this->fetch('file', 'buildform', 'fileCount=1&percent=0.85');?></td>
|
||||
|
||||
@@ -213,7 +213,7 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild);
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class='thWidth'><?php echo $lang->bug->openedBy;?></th>
|
||||
<td><?php echo $users[$bug->openedBy];?></td>
|
||||
<td><?php echo zget($users, $bug->openedBy);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->openedBuild;?></th>
|
||||
|
||||
@@ -73,6 +73,10 @@ js::set('productID' , $bug->product);
|
||||
<th><?php echo $lang->bug->assignedTo;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, $assignedTo, "class='form-control chosen'");?></td>
|
||||
</tr>
|
||||
<tr class='hide'>
|
||||
<th><?php echo $lang->bug->status;?></th>
|
||||
<td><?php echo html::hidden('status', 'resolved');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields($bug, 'table', 'columns=1');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->files;?></th>
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->lblAssignedTo;?></th>
|
||||
<td><?php if($bug->assignedTo) echo $users[$bug->assignedTo] . $lang->at . $bug->assignedDate;?></td>
|
||||
<td><?php if($bug->assignedTo) echo zget($users, $bug->assignedTo) . $lang->at . $bug->assignedDate;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->deadline;?></th>
|
||||
@@ -224,7 +224,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->mailto;?></th>
|
||||
<td><?php $mailto = explode(',', str_replace(' ', '', $bug->mailto)); foreach($mailto as $account) echo ' ' . $users[$account]; ?></td>
|
||||
<td><?php $mailto = explode(',', str_replace(' ', '', $bug->mailto)); foreach($mailto as $account) echo ' ' . zget($users, $account); ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -376,7 +376,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php $this->printExtendFields($bug, 'div', "position=right&divCell=true");?>
|
||||
<?php $this->printExtendFields($bug, 'div', "position=right&mode=value");?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -45,8 +45,8 @@
|
||||
</td>
|
||||
<td><span class='label-pri label-pri-<?php echo $bug->pri;?>' title='<?php echo zget($lang->bug->priList, $bug->pri, $bug->pri);?>'><?php echo zget($lang->bug->priList, $bug->pri, $bug->pri)?></span></td>
|
||||
<td class='text-left nobr' title='<?php echo $bug->title?>'><?php echo html::a($this->createLink('bug', 'view', "bugID=$bug->id", '', true), $bug->title, '', "data-toggle='modal' data-type='iframe' data-width='90%'");?></td>
|
||||
<td><?php echo $users[$bug->openedBy];?></td>
|
||||
<td style='overflow:visible;padding-top:1px;padding-bottom:1px;'><?php echo ($bug->status == 'resolved' or $bug->status == 'closed') ? $users[$bug->resolvedBy] : html::select("resolvedBy[{$bug->id}]", $users, $this->app->user->account, "class='form-control chosen'");?></td>
|
||||
<td><?php echo zget($users, $bug->openedBy);?></td>
|
||||
<td style='overflow:visible;padding-top:1px;padding-bottom:1px;'><?php echo ($bug->status == 'resolved' or $bug->status == 'closed') ? zget($users, $bug->resolvedBy) : html::select("resolvedBy[{$bug->id}]", $users, $this->app->user->account, "class='form-control chosen'");?></td>
|
||||
<td>
|
||||
<span class='status-bug status-<?php echo $bug->status?>'>
|
||||
<?php echo $this->processStatus('bug', $bug);?>
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
</td>
|
||||
<td><span class='label-pri label-pri-<?php echo $story->pri;?>' title='<?php echo zget($lang->story->priList, $story->pri, $story->pri);?>'><?php echo zget($lang->story->priList, $story->pri, $story->pri)?></span></td>
|
||||
<td class='text-left nobr' title='<?php echo $story->title?>'><?php echo html::a($this->createLink('story', 'view', "storyID=$story->id", '', true), $story->title, '', "data-toggle='modal' data-type='iframe' data-width='90%'");?></td>
|
||||
<td><?php echo $users[$story->openedBy];?></td>
|
||||
<td><?php echo $users[$story->assignedTo];?></td>
|
||||
<td><?php echo zget($users, $story->openedBy);?></td>
|
||||
<td><?php echo zget($users, $story->assignedTo);?></td>
|
||||
<td><?php echo $story->estimate;?></td>
|
||||
<td>
|
||||
<span class='status-story status-<?php echo $story->status?>'>
|
||||
|
||||
@@ -131,7 +131,7 @@ tbody tr td:first-child input{display:none;}
|
||||
</td>
|
||||
<td><span class='label-pri label-pri-<?php echo $story->pri;?>' title='<?php echo zget($lang->story->priList, $story->pri, $story->pri);?>'><?php echo zget($lang->story->priList, $story->pri, $story->pri);?></span></td>
|
||||
<td class='text-left nobr' title='<?php echo $story->title?>'><?php echo html::a($storyLink,$story->title, '', "class='iframe' data-width='1000'");?></td>
|
||||
<td><?php echo $users[$story->openedBy];?></td>
|
||||
<td><?php echo zget($users, $story->openedBy);?></td>
|
||||
<td><?php echo $story->estimate;?></td>
|
||||
<td>
|
||||
<span class='status-story status-<?php echo $story->status;?>'>
|
||||
@@ -209,9 +209,9 @@ tbody tr td:first-child input{display:none;}
|
||||
<?php echo $this->processStatus('bug', $bug);?>
|
||||
</span>
|
||||
</td>
|
||||
<td><?php echo $users[$bug->openedBy];?></td>
|
||||
<td><?php echo zget($users, $bug->openedBy);?></td>
|
||||
<td><?php echo substr($bug->openedDate, 5, 11)?></td>
|
||||
<td><?php echo $users[$bug->resolvedBy];?></td>
|
||||
<td><?php echo zget($users, $bug->resolvedBy);?></td>
|
||||
<td><?php echo substr($bug->resolvedDate, 5, 11)?></td>
|
||||
<td class='c-actions'>
|
||||
<?php
|
||||
@@ -284,9 +284,9 @@ tbody tr td:first-child input{display:none;}
|
||||
<?php echo $this->processStatus('bug', $bug);?>
|
||||
</span>
|
||||
</td>
|
||||
<td><?php echo $users[$bug->openedBy];?></td>
|
||||
<td><?php echo zget($users, $bug->openedBy);?></td>
|
||||
<td><?php echo substr($bug->openedDate, 5, 11)?></td>
|
||||
<td><?php echo $users[$bug->resolvedBy];?></td>
|
||||
<td><?php echo zget($users, $bug->resolvedBy);?></td>
|
||||
<td><?php echo substr($bug->resolvedDate, 5, 11)?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
@@ -321,7 +321,7 @@ tbody tr td:first-child input{display:none;}
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->build->builder;?></th>
|
||||
<td><?php echo $users[$build->builder];?></td>
|
||||
<td><?php echo zget($users, $build->builder);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->build->date;?></th>
|
||||
|
||||
@@ -21,6 +21,7 @@ $lang->percent = '%';
|
||||
$lang->dash = '-';
|
||||
|
||||
$lang->zentaoPMS = 'ZenTao';
|
||||
$lang->logoImg = 'zt-logo-en.png';
|
||||
$lang->welcome = "%s PMS";
|
||||
$lang->logout = 'Abmelden';
|
||||
$lang->login = 'Anmelden';
|
||||
@@ -477,7 +478,7 @@ $lang->error = new stdclass();
|
||||
$lang->error->companyNotFound = "The domain %s cannot be found!";
|
||||
$lang->error->length = array("『%s』Length Error. It should be『%s』", "『%s』length should be <=『%s』and >『%s』.");
|
||||
$lang->error->reg = "『%s』Format Error. It should be『%s』.";
|
||||
$lang->error->unique = "『%s』『%s』existed. Please go to Admin->Recycle to restore it, if you are sure it is deleted.";
|
||||
$lang->error->unique = "『%s』『%s』existed. Please go to Admin->Data->Recycle to restore it, if you are sure it is deleted.";
|
||||
$lang->error->gt = "『%s』should be >『%s』.";
|
||||
$lang->error->ge = "『%s』should be >=『%s』.";
|
||||
$lang->error->notempty = "『%s』should not be blank.";
|
||||
|
||||
@@ -21,6 +21,7 @@ $lang->percent = '%';
|
||||
$lang->dash = '-';
|
||||
|
||||
$lang->zentaoPMS = 'ZenTao';
|
||||
$lang->logoImg = 'zt-logo-en.png';
|
||||
$lang->welcome = "%s ALM";
|
||||
$lang->logout = 'Logout';
|
||||
$lang->login = 'Login';
|
||||
@@ -178,7 +179,7 @@ $lang->index->menu = new stdclass();
|
||||
$lang->index->menu->product = "{$lang->productCommon}|product|browse";
|
||||
$lang->index->menu->project = "{$lang->projectCommon}|project|browse";
|
||||
|
||||
/* my dashboard menu settings. */
|
||||
/* My dashboard menu settings. */
|
||||
$lang->my = new stdclass();
|
||||
$lang->my->menu = new stdclass();
|
||||
|
||||
@@ -477,7 +478,7 @@ $lang->error = new stdclass();
|
||||
$lang->error->companyNotFound = "The domain %s cannot be found!";
|
||||
$lang->error->length = array("『%s』length error. It should be『%s』", "『%s』length should be <=『%s』and >『%s』.");
|
||||
$lang->error->reg = "『%s』format error. It should be『%s』.";
|
||||
$lang->error->unique = "『%s』『%s』exists. Go to Admin->Recycle Bin to restore it, if you are sure it is deleted.";
|
||||
$lang->error->unique = "『%s』『%s』exists. Go to Admin->Data->Recycle Bin to restore it, if you are sure it is deleted.";
|
||||
$lang->error->gt = "『%s』should be >『%s』.";
|
||||
$lang->error->ge = "『%s』should be >=『%s』.";
|
||||
$lang->error->notempty = "『%s』should not be blank.";
|
||||
|
||||
@@ -21,6 +21,7 @@ $lang->percent = '%';
|
||||
$lang->dash = '-';
|
||||
|
||||
$lang->zentaoPMS = '禅道';
|
||||
$lang->logoImg = 'zt-logo.png';
|
||||
$lang->welcome = "%s项目管理系统";
|
||||
$lang->logout = '退出';
|
||||
$lang->login = '登录';
|
||||
@@ -477,7 +478,7 @@ $lang->error = new stdclass();
|
||||
$lang->error->companyNotFound = "您访问的域名 %s 没有对应的公司。";
|
||||
$lang->error->length = array("『%s』长度错误,应当为『%s』", "『%s』长度应当不超过『%s』,且大于『%s』。");
|
||||
$lang->error->reg = "『%s』不符合格式,应当为:『%s』。";
|
||||
$lang->error->unique = "『%s』已经有『%s』这条记录了。如果您确定该记录已删除,请到后台管理-回收站还原。";
|
||||
$lang->error->unique = "『%s』已经有『%s』这条记录了。如果您确定该记录已删除,请到后台-数据-回收站还原。";
|
||||
$lang->error->gt = "『%s』应当大于『%s』。";
|
||||
$lang->error->ge = "『%s』应当不小于『%s』。";
|
||||
$lang->error->notempty = "『%s』不能为空。";
|
||||
|
||||
@@ -21,6 +21,7 @@ $lang->percent = '%';
|
||||
$lang->dash = '-';
|
||||
|
||||
$lang->zentaoPMS = '禪道';
|
||||
$lang->logoImg = 'zt-logo.png';
|
||||
$lang->welcome = "%s項目管理系統";
|
||||
$lang->logout = '退出';
|
||||
$lang->login = '登錄';
|
||||
@@ -477,7 +478,7 @@ $lang->error = new stdclass();
|
||||
$lang->error->companyNotFound = "您訪問的域名 %s 沒有對應的公司。";
|
||||
$lang->error->length = array("『%s』長度錯誤,應當為『%s』", "『%s』長度應當不超過『%s』,且大於『%s』。");
|
||||
$lang->error->reg = "『%s』不符合格式,應當為:『%s』。";
|
||||
$lang->error->unique = "『%s』已經有『%s』這條記錄了。如果您確定該記錄已刪除,請到後台管理-資源回收筒還原。";
|
||||
$lang->error->unique = "『%s』已經有『%s』這條記錄了。如果您確定該記錄已刪除,請到後台-數據-資源回收筒還原。";
|
||||
$lang->error->gt = "『%s』應當大於『%s』。";
|
||||
$lang->error->ge = "『%s』應當不小於『%s』。";
|
||||
$lang->error->notempty = "『%s』不能為空。";
|
||||
|
||||
+22
-6
@@ -553,6 +553,13 @@ class commonModel extends model
|
||||
$menu = customModel::getModuleMenu($moduleName);
|
||||
$isMobile = $app->viewType === 'mhtml';
|
||||
|
||||
/* If this is not workflow then use rawModule and rawMethod to judge highlight. */
|
||||
if(!$app->isFlow)
|
||||
{
|
||||
$currentModule = $app->rawModule;
|
||||
$currentMethod = $app->rawMethod;
|
||||
}
|
||||
|
||||
/* The beginning of the menu. */
|
||||
echo $isMobile ? '' : "<ul class='nav nav-default'>\n";
|
||||
|
||||
@@ -1078,23 +1085,32 @@ EOD;
|
||||
global $app, $config;
|
||||
|
||||
/**
|
||||
* 当主状态改变并且未设置子状态的值时把子状态的值置空并记录日志。
|
||||
* 当主状态改变并且未设置子状态的值时把子状态的值设置为默认值并记录日志。
|
||||
* Change sub status when status is changed and sub status is not set, and record the changes.
|
||||
*/
|
||||
if(isset($config->bizVersion))
|
||||
{
|
||||
$oldID = zget($old, 'id', '');
|
||||
$oldStatus = zget($old, 'status', '');
|
||||
$oldSubStatus = zget($old, 'subStatus', '');
|
||||
$newStatus = zget($new, 'status', '');
|
||||
$newSubStatus = zget($new, 'subStatus', '');
|
||||
|
||||
if($oldID && $oldStatus && $oldSubStatus && $newStatus && !$newSubStatus && $oldStatus != $newStatus)
|
||||
if($oldID && $oldStatus && $newStatus && !$newSubStatus && $oldStatus != $newStatus)
|
||||
{
|
||||
$table = zget($config->objectTables, $app->getModuleName());
|
||||
$app->dbh->exec("UPDATE $table SET `subStatus` = '' WHERE `id` = $oldID");
|
||||
$moduleName = $app->getModuleName();
|
||||
|
||||
$new->subStatus = '';
|
||||
$field = $app->dbh->query('SELECT options FROM ' . TABLE_WORKFLOWFIELD . " WHERE `module` = '$moduleName' AND `field` = 'subStatus'")->fetch();
|
||||
if(!empty($field->options)) $field->options = json_decode($field->options, true);
|
||||
|
||||
if(!empty($field->options[$newStatus]['default']))
|
||||
{
|
||||
$flow = $app->dbh->query('SELECT `table` FROM ' . TABLE_WORKFLOW . " WHERE `module`='$moduleName'")->fetch();
|
||||
$default = $field->options[$newStatus]['default'];
|
||||
|
||||
$app->dbh->exec("UPDATE `$flow->table` SET `subStatus` = '$default' WHERE `id` = '$oldID'");
|
||||
|
||||
$new->subStatus = $default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
<?php $canEditComment = (end($actions) == $action and $action->comment and $this->methodName == 'view' and $action->actor == $this->app->user->account and common::hasPriv('action', 'editComment'));?>
|
||||
<li value='<?php echo $i ++;?>'>
|
||||
<?php
|
||||
if(isset($users[$action->actor])) $action->actor = $users[$action->actor];
|
||||
if($action->action == 'assigned' and isset($users[$action->extra]) ) $action->extra = $users[$action->extra];
|
||||
$action->actor = zget($users, $action->actor);
|
||||
if($action->action == 'assigned') $action->extra = zget($users, $action->extra);
|
||||
if(strpos($action->actor, ':') !== false) $action->actor = substr($action->actor, strpos($action->actor, ':') + 1);
|
||||
?>
|
||||
<?php $this->action->printAction($action);?>
|
||||
|
||||
@@ -19,8 +19,8 @@ if(file_exists($extViewFile))
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<td style='padding: 10px; background-color: #FFF0D5'>
|
||||
<?php if(isset($users[$action->actor])) $action->actor = $users[$action->actor];?>
|
||||
<?php if(isset($users[$action->extra])) $action->extra = $users[$action->extra];?>
|
||||
<?php $action->actor = zget($users, $action->actor);?>
|
||||
<?php $action->extra = zget($users, $action->extra);?>
|
||||
<span style='font-size: 16px; color: #F1A325'>●</span> <span><?php $this->action->printAction($action);?></span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
.thWidth{width:120px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:80px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:120px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -1,2 +0,0 @@
|
||||
.thWidth{width:250px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:120px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:250px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:120px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:120px !important;}
|
||||
@@ -1,2 +0,0 @@
|
||||
.thWidth{width:140px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:80px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:140px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -1,2 +0,0 @@
|
||||
.thWidth{width:130px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:80px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:130px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:80px !important;}
|
||||
@@ -20,6 +20,8 @@ $lang->dept->browse = "Manage Department";
|
||||
$lang->dept->manage = "Manage Department";
|
||||
$lang->dept->updateOrder = "Rank Department";
|
||||
$lang->dept->add = "Add Department";
|
||||
$lang->dept->grade = "Department Grade";
|
||||
$lang->dept->order = "Department Order";
|
||||
$lang->dept->dragAndSort = "Drag to order";
|
||||
|
||||
$lang->dept->confirmDelete = " Do you want to delete this department?";
|
||||
|
||||
@@ -20,6 +20,8 @@ $lang->dept->browse = "部门维护";
|
||||
$lang->dept->manage = "维护部门";
|
||||
$lang->dept->updateOrder = "更新排序";
|
||||
$lang->dept->add = "添加部门";
|
||||
$lang->dept->grade = "部门级别";
|
||||
$lang->dept->order = "排序";
|
||||
$lang->dept->dragAndSort = "拖动排序";
|
||||
|
||||
$lang->dept->confirmDelete = " 您确定删除该部门吗?";
|
||||
|
||||
@@ -20,6 +20,8 @@ $lang->dept->browse = "部門維護";
|
||||
$lang->dept->manage = "維護部門";
|
||||
$lang->dept->updateOrder = "更新排序";
|
||||
$lang->dept->add = "添加部門";
|
||||
$lang->dept->grade = "部門級別";
|
||||
$lang->dept->order = "排序";
|
||||
$lang->dept->dragAndSort = "拖動排序";
|
||||
|
||||
$lang->dept->confirmDelete = " 您確定刪除該部門嗎?";
|
||||
|
||||
@@ -45,6 +45,7 @@ class doc extends control
|
||||
|
||||
$this->lang->modulePageActions = $this->doc->setFastMenu($this->lang->doc->fast);
|
||||
$this->lang->modulePageActions .= common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), "<i class='icon icon-plus'></i> " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='70%'") : '';
|
||||
$this->lang->modulePageActions .= common::hasPriv('doc', 'create') ? $this->doc->setCreateDocMenu() : '';
|
||||
|
||||
$actionURL = $this->createLink('doc', 'browse', "lib=0&browseType=bySearch&queryID=myQueryID");
|
||||
$this->doc->buildSearchForm(0, array(), 0, $actionURL, 'index');
|
||||
|
||||
@@ -52,7 +52,6 @@ $(document).ready(function()
|
||||
$('#module').trigger('chosen:close');
|
||||
});
|
||||
|
||||
$('#pageActions ul.dropdown-menu').css('left', '67px');
|
||||
$('.libs-group.sort').sortable(
|
||||
{
|
||||
trigger: '.lib',
|
||||
|
||||
@@ -63,7 +63,7 @@ $lang->doc->pastEdited = 'Total Updated';
|
||||
$lang->doc->myDoc = 'My Documents';
|
||||
$lang->doc->myCollection = 'My Favorites';
|
||||
|
||||
/* 方法列表。*/
|
||||
/* Methods list */
|
||||
$lang->doc->index = 'Document Home';
|
||||
$lang->doc->create = 'Create Document';
|
||||
$lang->doc->edit = 'Edit Document';
|
||||
@@ -96,7 +96,7 @@ $lang->doc->fixedMenu = 'Fix to Menu';
|
||||
$lang->doc->removeMenu = 'Remove from Menu';
|
||||
$lang->doc->search = 'Search';
|
||||
|
||||
/* 查询条件列表 */
|
||||
/* Query condition list. */
|
||||
$lang->doc->allProduct = 'All' . $lang->productCommon . 's';
|
||||
$lang->doc->allProject = 'All' . $lang->projectCommon . 's';
|
||||
|
||||
|
||||
+38
-3
@@ -147,7 +147,13 @@ class docModel extends model
|
||||
}
|
||||
elseif($type == 'all')
|
||||
{
|
||||
$stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->orderBy('`order`, id desc')->query();
|
||||
/* Associated display Settings -> shows only unclosed projects.*/
|
||||
$stmt = $this->dao->select('distinct t1.*')->from(TABLE_DOCLIB)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on("t1.project = '' || t1.project = t2.id")
|
||||
->where('t1.deleted')->eq(0)
|
||||
->beginIF(strpos($this->config->doc->custom->showLibs,'unclosed') !== false)->andWhere('t2.status')->notin('done,closed')->fi()
|
||||
->orderBy('t1.order,t1.id desc')
|
||||
->query();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -174,7 +180,7 @@ class docModel extends model
|
||||
if($lib->project != 0) $lib->name = zget($projects, $lib->project, '') . '/' . $lib->name;
|
||||
}
|
||||
|
||||
$libPairs[$lib->id] = $lib->name;
|
||||
$libPairs[$lib->id] = '/' . $lib->name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +189,7 @@ class docModel extends model
|
||||
$stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where('id')->in($appendLibs)->orderBy('`order`, id desc')->query();
|
||||
while($lib = $stmt->fetch())
|
||||
{
|
||||
if(!isset($libPairs[$lib->id]) and $this->checkPrivLib($lib, $extra)) $libPairs[$lib->id] = $lib->name;
|
||||
if(!isset($libPairs[$lib->id]) and $this->checkPrivLib($lib, $extra)) $libPairs[$lib->id] = '/' . $lib->name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -653,6 +659,8 @@ class docModel extends model
|
||||
$now = helper::now();
|
||||
$doc = fixer::input('post')->setDefault('module', 0)
|
||||
->stripTags($this->config->doc->editor->edit['id'], $this->config->allowedTags)
|
||||
->setIF(!$this->post->users, 'users', '')
|
||||
->setIF(!$this->post->groups, 'groups', '')
|
||||
->add('editedBy', $this->app->user->account)
|
||||
->add('editedDate', $now)
|
||||
->cleanInt('module')
|
||||
@@ -1601,6 +1609,33 @@ class docModel extends model
|
||||
return $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set document module index page create document button.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setCreateDocMenu()
|
||||
{
|
||||
$libID = $this->dao->select('id')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->orderBy('id desc')->limit('1')->fetch('id');
|
||||
$actions = "";
|
||||
if($libID)
|
||||
{
|
||||
$actions .= "<div class='dropdown' id='createDropdown'>";
|
||||
$actions .= "<button class='btn btn-primary' type='button' data-toggle='dropdown'><i class='icon icon-plus'></i>" . $this->lang->doc->create . "<span class='caret'></span></button>";
|
||||
$actions .= "<ul class='dropdown-menu' style='left:0px'>";
|
||||
foreach($this->lang->doc->typeList as $typeKey => $typeName)
|
||||
{
|
||||
$class = strpos($this->config->doc->officeTypes, $typeKey) !== false ? 'iframe' : '';
|
||||
$actions .= "<li>";
|
||||
$actions .= html::a(helper::createLink('doc', 'create', "libID=$libID&moduleID=0&type=$typeKey"), $typeName, '', "class='$class'");
|
||||
$actions .= "</li>";
|
||||
}
|
||||
$actions .="</ul></div>";
|
||||
}
|
||||
return $actions;
|
||||
}
|
||||
|
||||
public function setFastMenu($fastLib)
|
||||
{
|
||||
$actions = '';
|
||||
|
||||
@@ -29,10 +29,11 @@ $lang->extension->eraseAction = 'Erase Extension';
|
||||
$lang->extension->upgrade = 'Erweiterung Upgraden';
|
||||
$lang->extension->agreeLicense = 'Lizenz';
|
||||
|
||||
$lang->extension->structure = 'Struktur';
|
||||
$lang->extension->installed = 'Installiert';
|
||||
$lang->extension->deactivated = 'Deaktiviert';
|
||||
$lang->extension->available = 'Heruntergeladen';
|
||||
$lang->extension->structure = 'Struktur';
|
||||
$lang->extension->extstructure = 'Struktur';
|
||||
$lang->extension->installed = 'Installiert';
|
||||
$lang->extension->deactivated = 'Deaktiviert';
|
||||
$lang->extension->available = 'Heruntergeladen';
|
||||
|
||||
$lang->extension->name = 'Erweiterungsname';
|
||||
$lang->extension->code = 'Code';
|
||||
|
||||
@@ -29,10 +29,11 @@ $lang->extension->eraseAction = 'Erase Extension';
|
||||
$lang->extension->upgrade = 'Upgrade Extension';
|
||||
$lang->extension->agreeLicense = 'I agree to the license.';
|
||||
|
||||
$lang->extension->structure = 'Extension Structure';
|
||||
$lang->extension->installed = 'Installed';
|
||||
$lang->extension->deactivated = 'Deactivated';
|
||||
$lang->extension->available = 'Downloaded';
|
||||
$lang->extension->structure = 'Structure';
|
||||
$lang->extension->extstructure = 'Extension Structure';
|
||||
$lang->extension->installed = 'Installed';
|
||||
$lang->extension->deactivated = 'Deactivated';
|
||||
$lang->extension->available = 'Downloaded';
|
||||
|
||||
$lang->extension->name = 'Extension Name';
|
||||
$lang->extension->code = 'Code';
|
||||
|
||||
@@ -29,10 +29,11 @@ $lang->extension->eraseAction = '清除插件';
|
||||
$lang->extension->upgrade = '升级插件';
|
||||
$lang->extension->agreeLicense = '我同意该授权';
|
||||
|
||||
$lang->extension->structure = '目录结构';
|
||||
$lang->extension->installed = '已安装';
|
||||
$lang->extension->deactivated = '被禁用';
|
||||
$lang->extension->available = '已下载';
|
||||
$lang->extension->structure = '目录结构';
|
||||
$lang->extension->extstructure = '目录结构';
|
||||
$lang->extension->installed = '已安装';
|
||||
$lang->extension->deactivated = '被禁用';
|
||||
$lang->extension->available = '已下载';
|
||||
|
||||
$lang->extension->name = '插件名称';
|
||||
$lang->extension->code = '代号';
|
||||
|
||||
@@ -29,10 +29,11 @@ $lang->extension->eraseAction = '清除插件';
|
||||
$lang->extension->upgrade = '升級插件';
|
||||
$lang->extension->agreeLicense = '我同意該授權';
|
||||
|
||||
$lang->extension->structure = '目錄結構';
|
||||
$lang->extension->installed = '已安裝';
|
||||
$lang->extension->deactivated = '被禁用';
|
||||
$lang->extension->available = '已下載';
|
||||
$lang->extension->structure = '目錄結構';
|
||||
$lang->extension->extstructure = '目錄結構';
|
||||
$lang->extension->installed = '已安裝';
|
||||
$lang->extension->deactivated = '被禁用';
|
||||
$lang->extension->available = '已下載';
|
||||
|
||||
$lang->extension->name = '插件名稱';
|
||||
$lang->extension->code = '代號';
|
||||
|
||||
@@ -626,7 +626,7 @@ class extensionModel extends model
|
||||
rsort($dirs); // remove from the lower level directory.
|
||||
foreach($dirs as $dir)
|
||||
{
|
||||
if(!@rmdir($appRoot . $dir)) $removeCommands[] = "rmdir $appRoot$dir";
|
||||
if(!is_writable($appRoot . $dir) or !rmdir($appRoot . $dir)) $removeCommands[] = "rmdir $appRoot$dir";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -502,10 +502,10 @@ class file extends control
|
||||
$mime = in_array($file->extension, $this->config->file->imageExtensions) ? "image/{$file->extension}" : $this->config->file->mimes['default'];
|
||||
header("Content-type: $mime");
|
||||
|
||||
$cacheMaxAge = $this->config->cookieLife - time();
|
||||
$cacheMaxAge = 10 * 365 * 24 * 3600;
|
||||
header("Cache-Control: private");
|
||||
header("Pragma: cache");
|
||||
header("Expires:" . gmdate("D, d M Y H:i:s", $this->config->cookieLife) . " GMT");
|
||||
header("Expires:" . gmdate("D, d M Y H:i:s", time() + $cacheMaxAge) . " GMT");
|
||||
header("Cache-Control: max-age=$cacheMaxAge");
|
||||
|
||||
$handle = fopen($file->realPath, "r");
|
||||
|
||||
@@ -6,6 +6,3 @@
|
||||
|
||||
#mainMenu #groupName{line-height:33px; float: left}
|
||||
.checkbox-right{padding-left:0px !important;}
|
||||
|
||||
.thWidth{width:180px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:150px !important;}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:180px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:150px !important;}
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:150px !important;}
|
||||
@@ -4,6 +4,3 @@
|
||||
.checkbox-primary>label{padding-left:20px;}
|
||||
.pl-0px {padding-left:0px !important;}
|
||||
.pt-0px {padding-top:0px !important;}
|
||||
|
||||
.thWidth{width:130px !important;}
|
||||
html[lang^='zh-'] .thWidth{width:100px !important;}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.thWidth{width:130px !important;}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user