Merge branch 'master' into 'sprint212_leiyong_task_59528'
# Conflicts: # module/execution/css/create.css
This commit is contained in:
@@ -7,8 +7,8 @@ XVERSION = $(shell head -n 1 xuanxuan/XVERSION)
|
||||
#RELEASE_PATH := $(if $(ZENTAO_RELEASE_PATH),$(ZENTAO_RELEASE_PATH),$(shell pwd))
|
||||
XUANPATH := /home/gitlab-runner/ci/gitlab/xuan/
|
||||
XUAN_WEB_PATH := /home/gitlab-runner/ci/packages/web
|
||||
BUILD_PATH := /home/z/ci/build/
|
||||
RELEASE_PATH := /home/z/ci/release/
|
||||
BUILD_PATH := /home/z/ci/pip_build/
|
||||
RELEASE_PATH := /home/z/ci/pip_release/
|
||||
|
||||
all:
|
||||
make clean
|
||||
|
||||
@@ -221,6 +221,7 @@ $config->openMethods[] = 'kanban.finishcard';
|
||||
$config->openMethods[] = 'kanban.deleteobjectcard';
|
||||
$config->openMethods[] = 'admin.ignore';
|
||||
$config->openMethods[] = 'personnel.unbindwhitelist';
|
||||
$config->openMethods[] = 'tree.viewhistory';
|
||||
|
||||
/* Define the tables. */
|
||||
define('TABLE_COMPANY', '`' . $config->db->prefix . 'company`');
|
||||
@@ -378,6 +379,8 @@ $config->objectTables['apistruct'] = TABLE_APISTRUCT;
|
||||
|
||||
$config->newFeatures = array('introduction', 'tutorial', 'youngBlueTheme', 'visions');
|
||||
|
||||
$config->pipelineTypeList = array('gitlab', 'sonarqube', 'jenkins');
|
||||
|
||||
/* Program privs.*/
|
||||
$config->programPriv = new stdclass();
|
||||
$config->programPriv->scrum = array('story', 'projectstory', 'projectrelease', 'project', 'execution', 'build', 'bug', 'testcase', 'testreport', 'doc', 'repo', 'meeting', 'stakeholder', 'testtask');
|
||||
|
||||
@@ -7,3 +7,5 @@ CREATE TABLE `zt_cfd` (
|
||||
`date` date NOT NULL,
|
||||
UNIQUE KEY `execution_type_name_date` (`execution`,`type`,`name`,`date`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computecfd', '更新累积流图', 'zentao', 1, 'normal', '0000-00-00 00:00:00');
|
||||
|
||||
+2
-1
@@ -1842,7 +1842,8 @@ CREATE TABLE IF NOT EXISTS `zt_webhook` (
|
||||
|
||||
INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES
|
||||
('*', '*', '*', '*', '*', '', '监控定时任务', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
|
||||
('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computeburn', '更新燃尽图', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
|
||||
('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computeburn', '更新燃尽图', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
|
||||
('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computecfd', '更新累积流图', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
|
||||
('0', '8', '*', '*', '*', 'moduleName=report&methodName=remind', '每日任务提醒', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
|
||||
('*/5', '*', '*', '*', '*', 'moduleName=svn&methodName=run', '同步SVN', 'zentao', 1, 'stop', '0000-00-00 00:00:00'),
|
||||
('*/5', '*', '*', '*', '*', 'moduleName=git&methodName=run', '同步GIT', 'zentao', 1, 'stop', '0000-00-00 00:00:00'),
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->execution->noExecution;?></span>
|
||||
<?php if(common::hasPriv('execution', 'create')):?>
|
||||
<?php if(common::hasPriv('execution', 'create') and $status == "all"):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-plus'></i> " . $lang->project->createKanban, '', "class='btn btn-info' data-app='project'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
|
||||
@@ -312,6 +312,26 @@ class control extends baseControl
|
||||
chdir($currentPWD);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取一个方法的输出内容,这样我们可以在一个方法里获取其他模块方法的内容。
|
||||
* 如果模块名为空,则调用该模块、该方法;如果设置了模块名,调用指定模块指定方法。
|
||||
*
|
||||
* Get the output of one module's one method as a string, thus in one module's method, can fetch other module's content.
|
||||
* If the module name is empty, then use the current module and method. If set, use the user defined module and method.
|
||||
*
|
||||
* @param string $moduleName module name.
|
||||
* @param string $methodName method name.
|
||||
* @param array $params params.
|
||||
* @access public
|
||||
* @return string the parsed html.
|
||||
*/
|
||||
public function fetch($moduleName = '', $methodName = '', $params = array(), $appName = '')
|
||||
{
|
||||
if($moduleName != $this->moduleName) $this->app->fetchModule = $moduleName;
|
||||
|
||||
return parent::fetch($moduleName, $methodName, $params, $appName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build operate menu of a method.
|
||||
*
|
||||
|
||||
@@ -46,6 +46,15 @@ class router extends baseRouter
|
||||
*/
|
||||
public $isFlow = false;
|
||||
|
||||
/**
|
||||
* Fetch的模块名。
|
||||
* The fetched module name.
|
||||
*
|
||||
* @var string
|
||||
* @access public
|
||||
*/
|
||||
public $fetchModule;
|
||||
|
||||
/**
|
||||
* Get the $moduleRoot var.
|
||||
*
|
||||
|
||||
@@ -48,7 +48,7 @@ class dao extends baseDAO
|
||||
/* Check current module is buildin workflow. */
|
||||
if(isset($config->workflow->buildin->modules))
|
||||
{
|
||||
$currentModule = $app->rawModule;
|
||||
$currentModule = $app->fetchModule ? $app->fetchModule : $app->rawModule;
|
||||
foreach($config->workflow->buildin->modules as $appModules)
|
||||
{
|
||||
if(!empty($appModules->$currentModule))
|
||||
|
||||
@@ -51,7 +51,7 @@ class fixer extends baseFixer
|
||||
{
|
||||
global $app, $dbh;
|
||||
$flowFields = array();
|
||||
$moduleName = $app->rawModule;
|
||||
$moduleName = $app->fetchModule ? $app->fetchModule : $app->rawModule;
|
||||
$stmt = $dbh->query("SELECT * FROM " . TABLE_WORKFLOWFIELD . " WHERE `module` = '{$moduleName}' and `buildin` = '0'");
|
||||
while($flowField = $stmt->fetch()) $flowFields[$flowField->field] = $flowField;
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ $config->action->majorList['project'] = array('opened', 'edited');
|
||||
$config->action->majorList['execution'] = array('opened', 'edited');
|
||||
|
||||
$config->action->needGetProjectType = 'build,task,bug,case,testcase,caselib,testtask,testsuite,testreport,doc,issue,release,risk,design,opportunity,trainplan,gapanalysis,researchplan,researchreport,';
|
||||
$config->action->needGetRelateField = ',story,productplan,release,task,build,bug,testcase,case,testtask,testreport,doc,doclib,issue,risk,opportunity,trainplan,gapanalysis,team,whitelist,researchplan,researchreport,meeting,kanbanlane,kanbancolumn,';
|
||||
$config->action->needGetRelateField = ',story,productplan,release,task,build,bug,testcase,case,testtask,testreport,doc,doclib,issue,risk,opportunity,trainplan,gapanalysis,team,whitelist,researchplan,researchreport,meeting,kanbanlane,kanbancolumn,module,';
|
||||
$config->action->noLinkModules = ',doclib,module,webhook,gitlab,sonarqube,pipeline,jenkins,kanban,kanbanspace,kanbancolumn,kanbanlane,kanbanregion,kanbancard,execution,project,traincategory,apistruct,program,product,user,entry,';
|
||||
|
||||
$config->action->preferredTypeNum = 10;
|
||||
|
||||
@@ -680,6 +680,7 @@ $lang->action->label->kanbancard = 'Kanban Card|kanban|view|kanbanID=%s';
|
||||
$lang->action->label->mr = 'Merge Request|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab Server|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = 'Stage|stage|browse|';
|
||||
$lang->action->label->module = 'Module|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
@@ -680,6 +680,7 @@ $lang->action->label->kanbancard = 'Kanban Card|kanban|view|kanbanID=%s';
|
||||
$lang->action->label->mr = 'Merge Request|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab Server|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = 'Stage|stage|browse|';
|
||||
$lang->action->label->module = 'Module|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
@@ -680,6 +680,7 @@ $lang->action->label->kanbancard = 'Kanban Card|kanban|view|kanbanID=%s';
|
||||
$lang->action->label->mr = 'Merge Request|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab Server|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = 'Stage|stage|browse|';
|
||||
$lang->action->label->module = 'Module|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
@@ -680,6 +680,7 @@ $lang->action->label->kanbancard = '看板卡片|kanban|view|kanbanID=%s';
|
||||
$lang->action->label->mr = '合并请求|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab服务器|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = '瀑布模型的阶段|stage|browse|';
|
||||
$lang->action->label->module = '模块|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
+41
-1
@@ -282,6 +282,11 @@ class actionModel extends model
|
||||
if($extra == 'project') $record['project'] = $objectID;
|
||||
if($extra == 'sprint' or $extra == 'stage') $record['execution'] = $objectID;
|
||||
break;
|
||||
case 'module':
|
||||
if(strpos(',deleted,', ",$actionType,") === false) $module = $this->dao->select('*')->from(TABLE_MODULE)->where('id')->in($extra)->fetch();
|
||||
if(strpos(',deleted,', ",$actionType,") !== false) $module = $this->dao->select('*')->from(TABLE_MODULE)->where('id')->eq($objectID)->fetch();
|
||||
if(!empty($module) and $module->type == 'story') $record['product'] = $module->root;
|
||||
break;
|
||||
default:
|
||||
$result = $this->dao->select('*')->from($this->config->objectTables[$objectType])->where('id')->eq($objectID)->fetch();
|
||||
$record['product'] = zget($result, 'product', '0');
|
||||
@@ -318,13 +323,19 @@ class actionModel extends model
|
||||
*/
|
||||
public function getList($objectType, $objectID)
|
||||
{
|
||||
$modules = $objectType == 'module' ? $this->dao->select('id')->from(TABLE_MODULE)->where('root')->eq($objectID)->fetchPairs('id') : array();
|
||||
$commiters = $this->loadModel('user')->getCommiters();
|
||||
$actions = $this->dao->select('*')->from(TABLE_ACTION)
|
||||
->beginIF($objectType == 'project')
|
||||
->where("objectType IN('project', 'testtask', 'build')")
|
||||
->andWhere('project')->eq((int)$objectID)
|
||||
->fi()
|
||||
->beginIF($objectType != 'project')
|
||||
->beginIF($objectType == 'module')
|
||||
->where('objectType')->eq($objectType)
|
||||
->andWhere('((action')->ne('deleted')->andWhere('objectID')->eq((int)$objectID)->markRight(1)
|
||||
->orWhere('(action')->eq('deleted')->andWhere('objectID')->in($modules)->markRight(1)->markRight(1)
|
||||
->fi()
|
||||
->beginIF($objectType != 'project' and $objectType != 'module')
|
||||
->where('objectType')->eq($objectType)
|
||||
->andWhere('objectID')->eq((int)$objectID)
|
||||
->fi()
|
||||
@@ -836,6 +847,10 @@ class actionModel extends model
|
||||
{
|
||||
$desc = $this->lang->$objectType->action->changebychild;
|
||||
}
|
||||
elseif($action->objectType == 'module' and in_array($action->action, array('created', 'moved', 'deleted')))
|
||||
{
|
||||
$desc = $this->lang->$objectType->action->{$action->action};
|
||||
}
|
||||
elseif($action->action == 'createmr' and strpos($action->extra, '::') !== false)
|
||||
{
|
||||
list($mrCreatedDate, $mrActor, $mrLink) = explode('::', $action->extra);
|
||||
@@ -920,6 +935,21 @@ class actionModel extends model
|
||||
$actionDesc = str_replace('$extra', $desc['extra'][$extra], $desc['main']);
|
||||
}
|
||||
}
|
||||
|
||||
if($action->objectType == 'module' and strpos(',created,moved,', $action->action) !== false)
|
||||
{
|
||||
$moduleNames = $this->loadModel('tree')->getOptionMenu($action->objectID, 'story', 0, 'all', '');
|
||||
$modules = explode(',', $action->extra);
|
||||
$moduleNames = array_intersect_key($moduleNames, array_combine($modules, $modules));
|
||||
$moduleNames = implode(', ', $moduleNames);
|
||||
$actionDesc = str_replace('$extra', $moduleNames, $desc['main']);
|
||||
}
|
||||
elseif($action->objectType == 'module' and $action->action == 'deleted')
|
||||
{
|
||||
$module = $this->dao->select('*')->from(TABLE_MODULE)->where('id')->eq($action->objectID)->fetch();
|
||||
$moduleNames = $this->loadModel('tree')->getOptionMenu($module->root, 'story', 0, 'all', '');
|
||||
$actionDesc = str_replace('$extra', zget($moduleNames, $action->objectID), $desc['main']);
|
||||
}
|
||||
echo $actionDesc;
|
||||
}
|
||||
else
|
||||
@@ -1204,6 +1234,11 @@ class actionModel extends model
|
||||
$objectName = $objectType == 'productplan' ? 'title' : 'name';
|
||||
$action->objectName = $this->dao->select($objectName)->from($objectTable)->where('id')->eq($action->extra)->fetch($objectName);
|
||||
}
|
||||
elseif($action->objectType == 'module' and !empty($action->extra) and $action->action != 'deleted')
|
||||
{
|
||||
$modules = $this->dao->select('id,name')->from(TABLE_MODULE)->where('id')->in(explode(',', $action->extra))->fetchPairs('id');
|
||||
$action->objectName = implode(',', $modules);
|
||||
}
|
||||
|
||||
$projectID = isset($relatedProjects[$action->objectType][$action->objectID]) ? $relatedProjects[$action->objectType][$action->objectID] : 0;
|
||||
|
||||
@@ -1466,6 +1501,10 @@ class actionModel extends model
|
||||
{
|
||||
$params = sprintf($vars, $action->extra);
|
||||
}
|
||||
elseif($action->objectType == 'module' and $action->action == 'deleted')
|
||||
{
|
||||
$params = sprintf($vars, trim($action->product, ','));
|
||||
}
|
||||
else
|
||||
{
|
||||
$params = sprintf($vars, $action->objectID);
|
||||
@@ -1611,6 +1650,7 @@ class actionModel extends model
|
||||
{
|
||||
$fieldName = $history->field;
|
||||
$history->fieldLabel = (isset($this->lang->$objectType) && isset($this->lang->$objectType->$fieldName)) ? $this->lang->$objectType->$fieldName : $fieldName;
|
||||
if($objectType == 'module') $history->fieldLabel = $this->lang->tree->$fieldName;
|
||||
if(($length = strlen($history->fieldLabel)) > $maxLength) $maxLength = $length;
|
||||
$history->diff ? $historiesWithDiff[] = $history : $historiesWithoutDiff[] = $history;
|
||||
}
|
||||
|
||||
+11
-6
@@ -208,12 +208,17 @@ class blockModel extends model
|
||||
->fetch('count');
|
||||
|
||||
$today = date('Y-m-d');
|
||||
$data['delayTask'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_TASK)
|
||||
->where('assignedTo')->eq($this->app->user->account)
|
||||
->andWhere('status')->in('wait,doing')
|
||||
->andWhere('deadline')->ne('0000-00-00')
|
||||
->andWhere('deadline')->lt($today)
|
||||
->andWhere('deleted')->eq(0)
|
||||
$data['delayTask'] = (int)$this->dao->select('count(t1.id) AS count')->from(TABLE_TASK)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on("t1.project = t2.id")
|
||||
->leftJoin(TABLE_EXECUTION)->alias('t3')->on("t1.execution = t3.id")
|
||||
->where('t1.assignedTo')->eq($this->app->user->account)
|
||||
->andWhere('(t2.status')->ne('suspended')
|
||||
->orWhere('t3.status')->ne('suspended')
|
||||
->markRight(1)
|
||||
->andWhere('t1.status')->in('wait,doing')
|
||||
->andWhere('t1.deadline')->ne('0000-00-00')
|
||||
->andWhere('t1.deadline')->lt($today)
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->fetch('count');
|
||||
$data['delayBug'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG)
|
||||
->where('assignedTo')->eq($this->app->user->account)
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
.product-info .progress-info {position: absolute; left: 8px; top: 10px; width: 180px; font-size: 12px;}
|
||||
.product-info .type-info {color: #A6AAB8; text-align: center; position: absolute; right: 0; top: 6px; width: 100px;}
|
||||
.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: hidden; text-overflow: ellipsis; white-space: nowrap; color: #838A9D;}
|
||||
.progress-pie .progress-info>small {color: #838A9D;}
|
||||
.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;}
|
||||
|
||||
@@ -18,7 +18,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
|
||||
.block-todoes .todoes-input .form-control::-moz-placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
|
||||
.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 {padding: 0 10px 10px 10px; margin: 0 -10px; 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:hover {background-color: #e9f2fb;}
|
||||
.block-todoes .todo-title {padding: 0px;}
|
||||
|
||||
@@ -395,6 +395,12 @@ class bug extends control
|
||||
{
|
||||
$this->dao->update(TABLE_TODO)->set('status')->eq('done')->where('id')->eq($output['todoID'])->exec();
|
||||
$this->action->create('todo', $output['todoID'], 'finished', '', "BUG:$bugID");
|
||||
|
||||
if($this->config->edition == 'biz' || $this->config->edition == 'max')
|
||||
{
|
||||
$todo = $this->dao->select('type, idvalue')->from(TABLE_TODO)->where('id')->eq($output['todoID'])->fetch();
|
||||
if($todo->type == 'feedback' && $todo->idvalue) $this->loadModel('feedback')->updateStatus('todo', $todo->idvalue, 'done');
|
||||
}
|
||||
}
|
||||
|
||||
$message = $this->executeHooks($bugID);
|
||||
|
||||
@@ -6,5 +6,6 @@
|
||||
.c-build, .c-browser, .c-keywords {width: 100px;}
|
||||
.c-steps {width: 150px;}
|
||||
.c-pri, .c-severity {width: 80px;}
|
||||
[lang^=de] .c-build {width: 110px}
|
||||
[lang^=fr] .c-build {width: 110px}
|
||||
.c-actions {width: 60px;}
|
||||
[lang^=de] .c-build, [lang^=fr] .c-build {width: 115px}
|
||||
@media screen and (max-width: 1366px) {[lang^=de] .c-build, [lang^=fr] .c-build {width: 110px}}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
html[lang='en'] #moduleIdBox .input-group-addon {padding: 5px 23px;}
|
||||
html[lang='en'] #deadlineTd .input-group-addon {padding: 5px 18px;}
|
||||
html[lang='zh-cn'] #keywordsAddonLabel, .task {width: 77px;}
|
||||
html[lang='zh-tw'] #keywordsAddonLabel, .task {width: 77px;}
|
||||
html[lang='fr'] #keywordsAddonLabel, .task {width: 61px;}
|
||||
html[lang='de'] #keywordsAddonLabel, .task {width: 73px;}
|
||||
|
||||
.ke-toolbar .ke-outline[data-name='savetemplate'] {display: block;}
|
||||
.ke-outline .ke-icon-savetemplate {background-image: url(theme/default/images/kindeditor/save.gif); background-position: center; width: 56px; height: 20px;}
|
||||
|
||||
@@ -22,6 +22,7 @@ $(function()
|
||||
var link = createLink('custom', 'ajaxSaveCustomFields', 'module=bug§ion=custom&key=batchCreateFields');
|
||||
$.post(link, {'fields' : fields}, function()
|
||||
{
|
||||
showFields = fields;
|
||||
showCheckedFields(fields);
|
||||
$('#formSetting').parent().removeClass('open');
|
||||
|
||||
@@ -55,8 +56,6 @@ $(function()
|
||||
*/
|
||||
function showCheckedFields(fields)
|
||||
{
|
||||
showFields = fields;
|
||||
|
||||
var fieldList = ',' + fields + ',';
|
||||
$('#formSettingForm > .checkboxes > .checkbox-primary > input').each(function()
|
||||
{
|
||||
@@ -77,22 +76,6 @@ function showCheckedFields(fields)
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Hidden require field.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function hiddenRequireFields()
|
||||
{
|
||||
$('#formSettingForm > .checkboxes > .checkbox-primary > input').each(function()
|
||||
{
|
||||
var field = ',' + $(this).val() + ',';
|
||||
var required = ',' + requiredFields + ',';
|
||||
if(required.indexOf(field) >= 0) $(this).closest('div').addClass('hidden');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set opened builds.
|
||||
*
|
||||
@@ -236,3 +219,35 @@ $(document).keydown(function(event)
|
||||
inputFocusJump('down');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Add item.
|
||||
*
|
||||
* @param object $obj
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function addItem(obj)
|
||||
{
|
||||
var item = $('#addItem').html().replace(/%i%/g, itemIndex + 1);
|
||||
$('<tr class="addedItem">' + item + '</tr>').insertAfter($(obj).closest('tr'));
|
||||
|
||||
$(obj).closest('tr').next().find(".form-date").datepicker();
|
||||
$(obj).closest('tr').next().find('div[id$=_chosen]').remove();
|
||||
$(obj).closest('tr').next().find('.chosen').next('.picker').remove();
|
||||
$(obj).closest('tr').next().find('.chosen').chosen();
|
||||
|
||||
itemIndex ++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete item.
|
||||
*
|
||||
* @param object $obj
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function deleteItem(obj)
|
||||
{
|
||||
$(obj).closest('tr').remove();
|
||||
}
|
||||
|
||||
@@ -72,4 +72,9 @@ $(document).on('change', 'select', function()
|
||||
$(function()
|
||||
{
|
||||
$('#subNavbar li[data-id="bug"]').addClass('active');
|
||||
|
||||
$('#customField').click(function()
|
||||
{
|
||||
hiddenRequireFields();
|
||||
});
|
||||
});
|
||||
|
||||
+12
-14
@@ -887,20 +887,18 @@ function setBranchRelated(branchID, productID, num)
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function()
|
||||
/**
|
||||
* Hidden require field.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function hiddenRequireFields()
|
||||
{
|
||||
$('#customField').click(function()
|
||||
$('#formSettingForm > .checkboxes > .checkbox-primary > input').each(function()
|
||||
{
|
||||
$('#formSettingForm > .checkboxes > .checkbox-primary > input').each(function()
|
||||
{
|
||||
var field = ',' + $(this).val() + ',';
|
||||
var required = ',' + requiredFields + ',';
|
||||
if(required.indexOf(field) >= 0) $(this).attr('disabled', 'disabled');
|
||||
});
|
||||
var field = ',' + $(this).val() + ',';
|
||||
var required = ',' + requiredFields + ',';
|
||||
if(required.indexOf(field) >= 0) $(this).closest('div').addClass('hidden');
|
||||
});
|
||||
|
||||
$('#formSettingForm .btn-primary').click(function()
|
||||
{
|
||||
$('#formSettingForm > .checkboxes > .checkbox-primary > input').removeAttr('disabled');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -745,6 +745,8 @@ class bugModel extends model
|
||||
|
||||
if($bug->execution and $bug->status != $oldBug->status) $this->loadModel('kanban')->updateLane($bug->execution, 'bug');
|
||||
|
||||
if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
|
||||
|
||||
return common::createChanges($oldBug, $bug);
|
||||
}
|
||||
}
|
||||
@@ -845,6 +847,9 @@ class bugModel extends model
|
||||
unset($bug);
|
||||
}
|
||||
|
||||
$isBiz = $this->config->edition == 'biz';
|
||||
$isMax = $this->config->edition == 'max';
|
||||
|
||||
/* Update bugs. */
|
||||
foreach($bugs as $bugID => $bug)
|
||||
{
|
||||
@@ -866,6 +871,12 @@ class bugModel extends model
|
||||
$this->executeHooks($bugID);
|
||||
|
||||
$allChanges[$bugID] = common::createChanges($oldBug, $bug);
|
||||
|
||||
if(($isBiz || $isMax) && $oldBug->feedback && !isset($feedbacks[$oldBug->feedback]))
|
||||
{
|
||||
$feedbacks[$oldBug->feedback] = $oldBug->feedback;
|
||||
$this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1138,6 +1149,8 @@ class bugModel extends model
|
||||
/* Link bug to build and release. */
|
||||
$this->linkBugToBuild($bugID, $bug->resolvedBuild);
|
||||
|
||||
if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
|
||||
|
||||
return common::createChanges($oldBug, $bug);
|
||||
}
|
||||
|
||||
@@ -1252,6 +1265,9 @@ class bugModel extends model
|
||||
$modules = array();
|
||||
while($module = $stmt->fetch()) $modules[$module->id] = $module;
|
||||
|
||||
$isBiz = $this->config->edition == 'biz';
|
||||
$isMax = $this->config->edition == 'max';
|
||||
|
||||
$changes = array();
|
||||
foreach($bugIDList as $i => $bugID)
|
||||
{
|
||||
@@ -1297,6 +1313,12 @@ class bugModel extends model
|
||||
|
||||
if($oldBug->execution) $this->loadModel('kanban')->updateLane($oldBug->execution, 'bug');
|
||||
$changes[$bugID] = common::createChanges($oldBug, $bug);
|
||||
|
||||
if(($isBiz || $isMax) && $oldBug->feedback && !isset($feedbacks[$oldBug->feedback]))
|
||||
{
|
||||
$feedbacks[$oldBug->feedback] = $oldBug->feedback;
|
||||
$this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
|
||||
}
|
||||
}
|
||||
|
||||
/* Link bug to build and release. */
|
||||
@@ -1408,6 +1430,8 @@ class bugModel extends model
|
||||
if(isset($output['toColID'])) $this->kanban->moveCard($bugID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']);
|
||||
}
|
||||
|
||||
if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
|
||||
|
||||
return common::createChanges($oldBug, $bug);
|
||||
}
|
||||
|
||||
|
||||
@@ -82,6 +82,7 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
|
||||
echo "<th class='c-extend $required'>{$extendField->name}</th>";
|
||||
}
|
||||
?>
|
||||
<th class='c-actions'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -107,7 +108,7 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
|
||||
$browser = $i == 1 ? '' : 'ditto';
|
||||
?>
|
||||
<tr>
|
||||
<td class='text-center'><?php echo $i;?></td>
|
||||
<td class='text-left'><?php echo $i;?></td>
|
||||
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox' style='overflow:visible'><?php echo html::select("branches[$i]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, $i)'");?></td>
|
||||
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
|
||||
<?php if($config->systemMode == 'new'):?>
|
||||
@@ -145,6 +146,12 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
|
||||
$this->loadModel('flow');
|
||||
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[$i]") . "</td>";
|
||||
?>
|
||||
<td class='c-actions text-left'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<?php if($i != 1):?>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php $i++;?>
|
||||
<?php endforeach;?>
|
||||
@@ -199,6 +206,12 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
|
||||
$this->loadModel('flow');
|
||||
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[$i]") . "</td>";
|
||||
?>
|
||||
<td class='c-actions text-left'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<?php if($i != 1):?>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor;?>
|
||||
</tbody>
|
||||
@@ -214,12 +227,13 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?php js::set('itemIndex', -- $i);?>
|
||||
<table class='template' id='trTemp'>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>%s</td>
|
||||
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?> productBox' style='overflow:visible'><?php echo html::select("branches[%s]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, \"%s\")'");?></td>
|
||||
<td><?php echo html::select("modules[%s]", $moduleOptionMenu, $moduleID, "class='form-control'");?></td>
|
||||
<td><?php echo html::select("modules[%s]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
|
||||
<?php if($config->systemMode == 'new'):?>
|
||||
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[%s]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, \"%s\")'");?></td>
|
||||
<?php endif;?>
|
||||
@@ -242,7 +256,7 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
|
||||
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox'><?php echo html::input("deadlines[%s]", '', "class='form-control form-date'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?> stepsBox'><?php echo html::textarea("stepses[%s]", '', "rows='1' class='form-control autosize'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?> typeBox' style='overflow:visible'> <?php echo html::select("types[%s]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox' style='overflow:visible'> <?php echo html::select("pris[%s]", $lang->bug->priList, '', "class='form-control'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox' style='overflow:visible'> <?php echo html::select("pris[%s]", $lang->bug->priList, $pri, "class='form-control'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?> severityBox' style='overflow:visible'><?php echo html::select("severities[%s]", $lang->bug->severityList, '3', "class='form-control'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?> osBox' style='overflow:visible'> <?php echo html::select("oses[%s]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?> browserBox' style='overflow:visible'> <?php echo html::select("browsers[%s]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
|
||||
@@ -251,9 +265,62 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
|
||||
$this->loadModel('flow');
|
||||
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[%s]") . "</td>";
|
||||
?>
|
||||
<td class='c-actions text-left'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div>
|
||||
<?php $i = '%i%';?>
|
||||
<table class='hidden'>
|
||||
<tr id='addItem' class='hidden'>
|
||||
<td><?php echo $i;?></td>
|
||||
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox' style='overflow:visible'><?php echo html::select("branches[$i]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, $i)'");?></td>
|
||||
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
|
||||
<?php if($config->systemMode == 'new'):?>
|
||||
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
|
||||
<?php endif;?>
|
||||
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
|
||||
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='form-control chosen' multiple");?></td>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<div class="input-control has-icon-right">
|
||||
<?php echo html::input("title[$i]", '', "class='form-control title-import'");?>
|
||||
<div class="colorpicker">
|
||||
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
|
||||
<ul class="dropdown-menu clearfix">
|
||||
<li class="heading"><?php echo $lang->bug->colorTag;?><i class="icon icon-close"></i></li>
|
||||
</ul>
|
||||
<?php echo html::hidden("color[$i]", '', "data-provide='colorpicker' data-icon='color' data-wrapper='input-control-icon-right' data-update-color='#title\\[$i\\]'");?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<?php if(isset($executionType) and $executionType == 'kanban'):?>
|
||||
<td><?php echo html::select("regions[$i]", $regionPairs, $regionID, "class='form-control chosen' onchange='setLane(this.value, $i)'");?></td>
|
||||
<td><?php echo html::select("lanes[$i]", $lanePairs, $laneID, "class='form-control chosen'");?></td>
|
||||
<?php endif;?>
|
||||
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox'><?php echo html::input("deadlines[$i]", '', "class='form-control form-date'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?> stepsBox'><?php echo html::textarea("stepses[$i]", '', "rows='1' class='form-control autosize'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?> typeBox' style='overflow:visible'> <?php echo html::select("types[$i]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox' style='overflow:visible'> <?php echo html::select("pris[$i]", $lang->bug->priList, $pri, "class='form-control'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?> severityBox' style='overflow:visible'><?php echo html::select("severities[$i]", $lang->bug->severityList, '3', "class='form-control'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?> osBox' style='overflow:visible'> <?php echo html::select("oses[$i]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?> browserBox' style='overflow:visible'> <?php echo html::select("browsers[$i]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?> keywordsBox'><?php echo html::input("keywords[$i]", '', "class='form-control'");?></td>
|
||||
<?php
|
||||
$this->loadModel('flow');
|
||||
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[$i]") . "</td>";
|
||||
?>
|
||||
<td class='c-actions text-left'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<?php js::set('branch', $branch)?>
|
||||
<?php if(isonlybody()):?>
|
||||
<style>
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php js::set('dittoNotice', $this->lang->bug->dittoNotice);?>
|
||||
<?php js::set('showFields', $showFields);?>
|
||||
<?php js::set('requiredFields', $config->bug->edit->requiredFields);?>
|
||||
<div id='mainContent' class='main-content fade'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->bug->common . $lang->colon . $lang->bug->batchEdit;?></h2>
|
||||
|
||||
@@ -18,7 +18,7 @@ js::set('holders', $lang->bug->placeholder);
|
||||
js::set('page', 'create');
|
||||
js::set('createRelease', $lang->release->create);
|
||||
js::set('createBuild', $lang->build->create);
|
||||
js::set('refresh', $lang->refresh);
|
||||
js::set('refresh', $lang->refreshIcon);
|
||||
js::set('flow', $config->global->flow);
|
||||
js::set('stepsRequired', $stepsRequired);
|
||||
js::set('stepsNotEmpty', $lang->bug->stepsNotEmpty);
|
||||
@@ -28,6 +28,7 @@ js::set('blockID', $blockID);
|
||||
js::set('moduleID', $moduleID);
|
||||
js::set('tab', $this->app->tab);
|
||||
js::set('requiredFields', $config->bug->create->requiredFields);
|
||||
js::set('showFields', $showFields);
|
||||
if($this->app->tab == 'execution') js::set('objectID', $executionID);
|
||||
if($this->app->tab == 'project') js::set('objectID', $projectID);
|
||||
?>
|
||||
@@ -69,7 +70,7 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
|
||||
echo "<span class='input-group-addon'>";
|
||||
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=bug¤tModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
|
||||
echo ' ';
|
||||
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'");
|
||||
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='$lang->refresh' onclick='loadProductModules($productID)'");
|
||||
echo '</span>';
|
||||
}
|
||||
?>
|
||||
@@ -312,7 +313,7 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php if($showStory):?>
|
||||
<span class='input-group-addon'><?php echo $lang->bug->task?></span>
|
||||
<span class='input-group-addon task'><?php echo $lang->bug->task?></span>
|
||||
<?php endif;?>
|
||||
<?php echo html::select('task', '', $taskID, "class='form-control chosen'") . html::hidden('oldTaskID', $taskID);?>
|
||||
</div>
|
||||
|
||||
@@ -111,7 +111,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
|
||||
echo "<span class='input-group-addon'>";
|
||||
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=bug¤tModuleID=0&branch=$bug->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
|
||||
echo ' ';
|
||||
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'");
|
||||
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='$lang->refresh' onclick='loadProductModules($productID)'");
|
||||
echo '</span>';
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -25,6 +25,8 @@ class ciModel extends model
|
||||
session_write_close();
|
||||
}
|
||||
common::setMenuVars('devops', $this->session->repoID);
|
||||
|
||||
$this->lang->switcherMenu = $this->loadModel('repo')->getSwitcher($this->session->repoID);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -80,6 +80,7 @@ $lang->misc = new stdclass();
|
||||
$lang->acl = new stdclass();
|
||||
$lang->curd = new stdclass();
|
||||
$lang->sonarqube = new stdclass();
|
||||
$lang->app = new stdclass();
|
||||
|
||||
$lang->projectbuild = new stdclass();
|
||||
$lang->projectrelease = new stdclass();
|
||||
@@ -174,6 +175,8 @@ $lang->createIcons['program'] = 'program';
|
||||
$lang->createIcons['kanbanspace'] = 'cube';
|
||||
$lang->createIcons['kanban'] = 'kanban';
|
||||
|
||||
$lang->refreshIcon = "<i class='icon icon-refresh'></i>";
|
||||
|
||||
$lang->noMenuModule = array('report', 'my', 'todo', 'effort', 'program', 'product', 'execution', 'task', 'build', 'productplan', 'project', 'projectrelease', 'projectstory', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage', 'entry', 'jenkins', 'gitlab');
|
||||
|
||||
if(isset($_SESSION['tutorialMode']) and $_SESSION['tutorialMode'] and !defined('TUTORIAL')) define('TUTORIAL', true);
|
||||
|
||||
@@ -84,7 +84,6 @@ $lang->waterfallModel = 'Waterfall';
|
||||
$lang->scrumModel = 'Scrum';
|
||||
$lang->all = 'All';
|
||||
$lang->viewDetails = 'View Details';
|
||||
$lang->app = 'APP';
|
||||
|
||||
$lang->actions = 'Aktionen';
|
||||
$lang->restore = 'Wiederherstellen';
|
||||
@@ -197,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->kanban->common = 'Kanban';
|
||||
$lang->backup->common = 'Backup';
|
||||
$lang->action->trash = 'Recycle';
|
||||
$lang->app->common = 'APP';
|
||||
$lang->app->serverLink = 'Server Link';
|
||||
|
||||
$lang->personnel->common = 'Member';
|
||||
$lang->personnel->invest = 'Investment';
|
||||
|
||||
@@ -84,7 +84,6 @@ $lang->waterfallModel = 'Waterfall';
|
||||
$lang->scrumModel = 'Scrum';
|
||||
$lang->all = 'All';
|
||||
$lang->viewDetails = 'View Details';
|
||||
$lang->app = 'APP';
|
||||
|
||||
$lang->actions = 'Action';
|
||||
$lang->restore = 'Reset';
|
||||
@@ -197,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->kanban->common = 'Kanban';
|
||||
$lang->backup->common = 'Backup';
|
||||
$lang->action->trash = 'Recycle';
|
||||
$lang->app->common = 'APP';
|
||||
$lang->app->serverLink = 'Server Link';
|
||||
|
||||
$lang->personnel->common = 'Member';
|
||||
$lang->personnel->invest = 'Investment';
|
||||
|
||||
@@ -84,7 +84,6 @@ $lang->waterfallModel = 'Waterfall';
|
||||
$lang->scrumModel = 'Scrum';
|
||||
$lang->all = 'All';
|
||||
$lang->viewDetails = 'View Details';
|
||||
$lang->app = 'APP';
|
||||
|
||||
$lang->actions = 'Action';
|
||||
$lang->restore = 'Réinitialiser';
|
||||
@@ -197,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->kanban->common = 'Kanban';
|
||||
$lang->backup->common = 'Backup';
|
||||
$lang->action->trash = 'Recycle';
|
||||
$lang->app->common = 'APP';
|
||||
$lang->app->serverLink = 'Server Link';
|
||||
|
||||
$lang->personnel->common = 'Member';
|
||||
$lang->personnel->invest = 'Investment';
|
||||
|
||||
@@ -394,12 +394,12 @@ $lang->qa->menuOrder[45] = 'automation';
|
||||
$lang->qa->dividerMenu = ',bug,testtask,caselib,';
|
||||
|
||||
/* DevOps menu. */
|
||||
$lang->devops->menu = new stdclass();
|
||||
$lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit');
|
||||
$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse|repoID=%s");
|
||||
$lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse", 'subModule' => 'compile,job');
|
||||
$lang->devops->menu->app = array('link' => "{$lang->app}|devops|app|%s");
|
||||
$lang->devops->menu->set = array('link' => "{$lang->devops->set}|repo|maintain", 'subModule' => 'gitlab,jenkins,sonarqube', 'alias' => 'setrules,create,edit');
|
||||
$lang->devops->menu = new stdclass();
|
||||
$lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit');
|
||||
$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse|repoID=%s");
|
||||
$lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse|repoID=%s", 'subModule' => 'compile,job');
|
||||
$lang->devops->menu->app = array('link' => "{$lang->app->common}|app|serverlink|%s");
|
||||
$lang->devops->menu->set = array('link' => "{$lang->devops->set}|repo|maintain", 'subModule' => 'gitlab,jenkins,sonarqube', 'alias' => 'setrules,create,edit');
|
||||
|
||||
$lang->devops->menuOrder[5] = 'code';
|
||||
$lang->devops->menuOrder[10] = 'mr';
|
||||
@@ -651,6 +651,7 @@ $lang->navGroup->compile = 'devops';
|
||||
$lang->navGroup->ci = 'devops';
|
||||
$lang->navGroup->svn = 'devops';
|
||||
$lang->navGroup->git = 'devops';
|
||||
$lang->navGroup->app = 'devops';
|
||||
|
||||
$lang->navGroup->company = 'system';
|
||||
|
||||
|
||||
@@ -65,7 +65,6 @@ $lang->noData = 'Không có dữ liệu.';
|
||||
$lang->fullscreen = 'Fullscreen';
|
||||
$lang->retrack = 'Retrack';
|
||||
$lang->whitelist = 'Lista bianca';
|
||||
$lang->app = 'APP';
|
||||
|
||||
$lang->actions = 'Hành động';
|
||||
$lang->restore = 'Thiết lập lại';
|
||||
@@ -125,8 +124,10 @@ $lang->typeAB = 'Loại';
|
||||
$lang->nameAB = 'Name';
|
||||
|
||||
$lang->common = new stdclass();
|
||||
$lang->common->common = 'Module chung';
|
||||
$lang->devops->common = 'DevOps';
|
||||
$lang->common->common = 'Module chung';
|
||||
$lang->devops->common = 'DevOps';
|
||||
$lang->app->common = 'APP';
|
||||
$lang->app->serverLink = 'Server Link';
|
||||
|
||||
global $config;
|
||||
list($programModule, $programMethod) = explode('-', $config->programLink);
|
||||
|
||||
@@ -84,7 +84,6 @@ $lang->waterfallModel = '瀑布模型';
|
||||
$lang->scrumModel = '敏捷模型';
|
||||
$lang->all = '所有';
|
||||
$lang->viewDetails = '查看详情';
|
||||
$lang->app = '应用';
|
||||
|
||||
$lang->actions = '操作';
|
||||
$lang->restore = '恢复默认';
|
||||
@@ -197,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon}列表";
|
||||
$lang->kanban->common = '看板';
|
||||
$lang->backup->common = '备份';
|
||||
$lang->action->trash = '回收站';
|
||||
$lang->app->common = '应用';
|
||||
$lang->app->serverLink = '服务器链接';
|
||||
|
||||
$lang->personnel->common = '人员';
|
||||
$lang->personnel->invest = '投入人员';
|
||||
|
||||
@@ -78,7 +78,6 @@ $lang->globalSetting = '全局設置';
|
||||
$lang->waterfallModel = '瀑布模型';
|
||||
$lang->all = '所有';
|
||||
$lang->viewDetails = '查看詳情';
|
||||
$lang->app = '應用';
|
||||
|
||||
$lang->actions = '操作';
|
||||
$lang->restore = '恢復預設';
|
||||
@@ -182,6 +181,8 @@ $lang->stage->common = '階段';
|
||||
$lang->stage->list = '階段列表';
|
||||
$lang->execution->list = "{$lang->executionCommon}列表";
|
||||
$lang->kanban->common = '看板';
|
||||
$lang->app->common = '應用';
|
||||
$lang->app->serverLink = '服務器鏈接';
|
||||
|
||||
$lang->personnel->common = '人員';
|
||||
$lang->personnel->invest = '投入人員';
|
||||
|
||||
@@ -1104,6 +1104,10 @@ class commonModel extends model
|
||||
$executionID = $menuItem->link['vars'];
|
||||
commonModel::buildMoreButton($executionID);
|
||||
}
|
||||
elseif($menuItem->link['module'] == 'app' and $menuItem->link['method'] == 'serverlink')
|
||||
{
|
||||
commonModel::buildAppButton();
|
||||
}
|
||||
else
|
||||
{
|
||||
if($menuItem->link)
|
||||
@@ -1746,6 +1750,45 @@ EOD;
|
||||
echo $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build devops app button.
|
||||
*
|
||||
* @static
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public static function buildAppButton()
|
||||
{
|
||||
if(defined('TUTORIAL')) return;
|
||||
global $app, $config, $lang;
|
||||
|
||||
$pipelinePairs = array();
|
||||
$condition = '';
|
||||
if(!$app->user->admin)
|
||||
{
|
||||
$types = '';
|
||||
foreach($config->pipelineTypeList as $pipelineType)
|
||||
{
|
||||
if(commonModel::hasPriv($pipelineType, 'browse')) $types .= "'$pipelineType',";
|
||||
}
|
||||
if(empty($types)) return;
|
||||
$condition .= ' AND `type` in (' . trim($types, ',') . ')';
|
||||
}
|
||||
$pipelineList = $app->dbh->query("SELECT type,name,url FROM " . TABLE_PIPELINE . " WHERE `deleted` = '0' $condition order by type")->fetchAll();
|
||||
if(empty($pipelineList)) return;
|
||||
|
||||
$html = "<li class='dropdown dropdown-hover'><a href='javascript:;' data-toggle='dropdown'>{$lang->app->common}<span class='caret'></span></a>";
|
||||
$html .= "<ul class='dropdown-menu'>";
|
||||
|
||||
foreach($pipelineList as $pipeline)
|
||||
{
|
||||
$html .= "<li style='max-width: 300px;'>" . html::a($pipeline->url, "[{$pipeline->type}] {$pipeline->name}", '', "title='{$pipeline->name}' class='text-ellipsis' style='padding: 2px 10px' target='_blank'") . '</li>';
|
||||
}
|
||||
$html .= "</ul></li>\n";
|
||||
|
||||
echo $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print link icon.
|
||||
*
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
var $formSetting = $('#formSetting');
|
||||
$formSetting.on('click', '.close-dropdown', function()
|
||||
{
|
||||
if(showFields != undefined)
|
||||
if(typeof showFields != 'undefined')
|
||||
{
|
||||
var fieldList = ',' + showFields + ',';
|
||||
$('#formSettingForm > .checkboxes > .checkbox-primary > input:visible').each(function()
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
<?php if($action->action != 'login' and $action->action != 'logout'):?>
|
||||
<span class="text"><?php echo $action->objectLabel;?></span>
|
||||
<?php if($action->objectID):?>
|
||||
<span class="label label-id"><?php echo $action->objectID;?></span>
|
||||
<span class="label label-id"><?php echo ($action->objectType == 'module' and strpos(',created,edited,moved,', "$action->action") !== false) ? trim($action->extra, ',') : $action->objectID;?></span>
|
||||
<?php endif;?>
|
||||
<?php $tab = '';?>
|
||||
<?php if($action->objectType == 'meeting') $tab = $action->project ? "data-app='project'" : "data-app='my'";?>
|
||||
|
||||
@@ -22,12 +22,13 @@ class compile extends control
|
||||
public function __construct($moduleName = '', $methodName = '')
|
||||
{
|
||||
parent::__construct($moduleName, $methodName);
|
||||
$this->loadModel('ci')->setMenu();
|
||||
if($methodName != 'browse') $this->loadModel('ci')->setMenu();
|
||||
}
|
||||
|
||||
/**
|
||||
* Browse jenkins build.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param int $jobID
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
@@ -36,8 +37,17 @@ class compile extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function browse($jobID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
public function browse($repoID = 0, $jobID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
if($jobID)
|
||||
{
|
||||
$job = $this->loadModel('job')->getById($jobID);
|
||||
$repoID = $job->repo;
|
||||
|
||||
$this->view->job = $job;
|
||||
}
|
||||
$this->loadModel('ci')->setMenu($repoID);
|
||||
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
@@ -45,10 +55,9 @@ class compile extends control
|
||||
$this->view->position[] = html::a($this->createLink('job', 'browse'), $this->lang->ci->job);
|
||||
$this->view->position[] = $this->lang->compile->browse;
|
||||
|
||||
$this->loadModel('job');
|
||||
if($jobID) $this->view->job = $this->job->getById($jobID);
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->jobID = $jobID;
|
||||
$this->view->buildList = $this->compile->getList($jobID, $orderBy, $pager);
|
||||
$this->view->buildList = $this->compile->getList($repoID, $jobID, $orderBy, $pager);
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->pager = $pager;
|
||||
$this->display();
|
||||
|
||||
@@ -38,13 +38,14 @@ class compileModel extends model
|
||||
/**
|
||||
* Get build list.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param int $jobID
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getList($jobID, $orderBy = 'id_desc', $pager = null)
|
||||
public function getList($repoID, $jobID, $orderBy = 'id_desc', $pager = null)
|
||||
{
|
||||
return $this->dao->select('t1.id, t1.name, t1.job, t1.status, t1.createdDate, t1.testtask, t2.pipeline, t2.triggerType, t2.comment, t2.atDay, t2.atTime, t2.engine, t3.name as repoName, t4.name as jenkinsName')->from(TABLE_COMPILE)->alias('t1')
|
||||
->leftJoin(TABLE_JOB)->alias('t2')->on('t1.job=t2.id')
|
||||
@@ -52,6 +53,7 @@ class compileModel extends model
|
||||
->leftJoin(TABLE_PIPELINE)->alias('t4')->on('t2.server=t4.id')
|
||||
->where('t1.deleted')->eq('0')
|
||||
->andWhere('t1.job')->ne('0')
|
||||
->beginIF(!empty($repoID))->andWhere('t3.id')->eq($repoID)->fi()
|
||||
->beginIF(!empty($jobID))->andWhere('t1.job')->eq($jobID)->fi()
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
echo html::a($this->createLink('job', 'browse'), "<span class='text'>{$lang->ci->task}</span>", '', "class='btn btn-link'");
|
||||
echo html::a($this->createLink('compile', 'browse'), "<span class='text'>" . ($jobID ? $job->name : '') . " {$lang->ci->history}</span>", '', "class='btn btn-link btn-active-text'");
|
||||
echo html::a($this->createLink('job', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->task}</span>", '', "class='btn btn-link'");
|
||||
echo html::a($this->createLink('compile', 'browse', "repoID=$repoID&jobID=$jobID"), "<span class='text'>" . ($jobID ? $job->name : '') . " {$lang->ci->history}</span>", '', "class='btn btn-link btn-active-text'");
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
<?php if($job->engine == 'gitlab') echo html::a(helper::createLink('ci', "checkCompileStatus", "compileID={$build->id}"), "<i class='icon icon-eye icon-sm'></i> ". $lang->compile->refresh, '', "class='btn btn-secondary' id='refreshBtn'");?>
|
||||
<?php echo html::a(helper::createLink('compile', "browse", "jobID=$build->job"), "<i class='icon icon-back icon-sm'></i> ". $lang->goback, '', "class='btn btn-secondary'");?>
|
||||
<?php echo html::a(helper::createLink('compile', "browse", "repoID={$job->repo}&jobID={$build->job}"), "<i class='icon icon-back icon-sm'></i> ". $lang->goback, '', "class='btn btn-secondary'");?>
|
||||
</div>
|
||||
</div>
|
||||
<div id='mainContent'>
|
||||
|
||||
@@ -234,6 +234,7 @@ EOT;
|
||||
</tr>
|
||||
</table>
|
||||
<?php else:?>
|
||||
<?php if(!empty($fieldList) && is_array($fieldList)):?>
|
||||
<table class='table table-form active-disabled table-condensed mw-600px'>
|
||||
<tr class='text-center'>
|
||||
<td class='w-120px'><strong><?php echo $lang->custom->key;?></strong></td>
|
||||
@@ -270,6 +271,7 @@ EOT;
|
||||
<div class='alert alert-warning alert-block'><?php echo $lang->custom->notice->canNotAdd;?></div>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+18
-17
@@ -9,23 +9,24 @@
|
||||
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->dept->common = 'Abteilung';
|
||||
$lang->dept->id = 'ID';
|
||||
$lang->dept->path = 'Path';
|
||||
$lang->dept->position = 'Position';
|
||||
$lang->dept->manageChild = "Abteilung";
|
||||
$lang->dept->edit = "Bearbeiten";
|
||||
$lang->dept->delete = "Löschen";
|
||||
$lang->dept->parent = "Übergeordnet";
|
||||
$lang->dept->manager = "Manager";
|
||||
$lang->dept->name = "Name";
|
||||
$lang->dept->browse = "Verwalten";
|
||||
$lang->dept->manage = "Pflegen";
|
||||
$lang->dept->updateOrder = "Sortieren";
|
||||
$lang->dept->add = "Hinzufügen";
|
||||
$lang->dept->grade = "Grade";
|
||||
$lang->dept->order = "Rank";
|
||||
$lang->dept->dragAndSort = "Verschieben und sortieren";
|
||||
$lang->dept->common = 'Abteilung';
|
||||
$lang->dept->id = 'ID';
|
||||
$lang->dept->path = 'Path';
|
||||
$lang->dept->position = 'Position';
|
||||
$lang->dept->manageChild = "Abteilung";
|
||||
$lang->dept->edit = "Bearbeiten";
|
||||
$lang->dept->delete = "Löschen";
|
||||
$lang->dept->parent = "Übergeordnet";
|
||||
$lang->dept->manager = "Manager";
|
||||
$lang->dept->name = "Name";
|
||||
$lang->dept->browse = "Verwalten";
|
||||
$lang->dept->manage = "Pflegen";
|
||||
$lang->dept->updateOrder = "Sortieren";
|
||||
$lang->dept->add = "Hinzufügen";
|
||||
$lang->dept->grade = "Grade";
|
||||
$lang->dept->order = "Rank";
|
||||
$lang->dept->dragAndSort = "Verschieben und sortieren";
|
||||
$lang->dept->noDepartment = "No Department";
|
||||
|
||||
$lang->dept->confirmDelete = " Möchten Sie diese Abteilung löschen?";
|
||||
$lang->dept->successSave = " Gespeichert!";
|
||||
|
||||
+18
-17
@@ -9,23 +9,24 @@
|
||||
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->dept->common = 'Department';
|
||||
$lang->dept->id = 'ID';
|
||||
$lang->dept->path = 'Path';
|
||||
$lang->dept->position = 'Position';
|
||||
$lang->dept->manageChild = "Department";
|
||||
$lang->dept->edit = "Edit Department";
|
||||
$lang->dept->delete = "Delete Department";
|
||||
$lang->dept->parent = "Parent Dept";
|
||||
$lang->dept->manager = "Manager";
|
||||
$lang->dept->name = "Department Name";
|
||||
$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->common = 'Department';
|
||||
$lang->dept->id = 'ID';
|
||||
$lang->dept->path = 'Path';
|
||||
$lang->dept->position = 'Position';
|
||||
$lang->dept->manageChild = "Department";
|
||||
$lang->dept->edit = "Edit Department";
|
||||
$lang->dept->delete = "Delete Department";
|
||||
$lang->dept->parent = "Parent Dept";
|
||||
$lang->dept->manager = "Manager";
|
||||
$lang->dept->name = "Department Name";
|
||||
$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->noDepartment = "No Department";
|
||||
|
||||
$lang->dept->confirmDelete = " Do you want to delete this department?";
|
||||
$lang->dept->successSave = " Saved!";
|
||||
|
||||
+18
-17
@@ -9,23 +9,24 @@
|
||||
* @version $Id: en.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->dept->common = 'Compartiments';
|
||||
$lang->dept->id = 'ID';
|
||||
$lang->dept->path = 'Path';
|
||||
$lang->dept->position = 'Position';
|
||||
$lang->dept->manageChild = "Entreprise > Compartiments > Domaines";
|
||||
$lang->dept->edit = "Editer Compartiment";
|
||||
$lang->dept->delete = "Supprimer Compartiment";
|
||||
$lang->dept->parent = "Comp. Parent";
|
||||
$lang->dept->manager = "Responsable";
|
||||
$lang->dept->name = "Nom du Compartiment";
|
||||
$lang->dept->browse = "Consulter Compartiment";
|
||||
$lang->dept->manage = "Gérer Compartiment";
|
||||
$lang->dept->updateOrder = "Rang Compartiment";
|
||||
$lang->dept->add = "Ajout Compartiment";
|
||||
$lang->dept->grade = "Grade du Compartiment";
|
||||
$lang->dept->order = "Ordre du Compartiment";
|
||||
$lang->dept->dragAndSort = "Déplacez pour classer";
|
||||
$lang->dept->common = 'Compartiments';
|
||||
$lang->dept->id = 'ID';
|
||||
$lang->dept->path = 'Path';
|
||||
$lang->dept->position = 'Position';
|
||||
$lang->dept->manageChild = "Entreprise > Compartiments > Domaines";
|
||||
$lang->dept->edit = "Editer Compartiment";
|
||||
$lang->dept->delete = "Supprimer Compartiment";
|
||||
$lang->dept->parent = "Comp. Parent";
|
||||
$lang->dept->manager = "Responsable";
|
||||
$lang->dept->name = "Nom du Compartiment";
|
||||
$lang->dept->browse = "Consulter Compartiment";
|
||||
$lang->dept->manage = "Gérer Compartiment";
|
||||
$lang->dept->updateOrder = "Rang Compartiment";
|
||||
$lang->dept->add = "Ajout Compartiment";
|
||||
$lang->dept->grade = "Grade du Compartiment";
|
||||
$lang->dept->order = "Ordre du Compartiment";
|
||||
$lang->dept->dragAndSort = "Déplacez pour classer";
|
||||
$lang->dept->noDepartment = "No Department";
|
||||
|
||||
$lang->dept->confirmDelete = " Confirmez que vous voulez bien supprimer ce Compartiment ?";
|
||||
$lang->dept->successSave = " Sauvé !";
|
||||
|
||||
+18
-17
@@ -9,23 +9,24 @@
|
||||
* @version $Id: zh-cn.php 4129 2013-01-18 01:58:14Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
$lang->dept->common = '部门结构';
|
||||
$lang->dept->id = '编号';
|
||||
$lang->dept->path = '路径';
|
||||
$lang->dept->position = '职位';
|
||||
$lang->dept->manageChild = "下级部门";
|
||||
$lang->dept->edit = "编辑部门";
|
||||
$lang->dept->delete = "删除部门";
|
||||
$lang->dept->parent = "上级部门";
|
||||
$lang->dept->manager = "负责人";
|
||||
$lang->dept->name = "部门名称";
|
||||
$lang->dept->browse = "部门维护";
|
||||
$lang->dept->manage = "维护部门";
|
||||
$lang->dept->updateOrder = "更新排序";
|
||||
$lang->dept->add = "添加部门";
|
||||
$lang->dept->grade = "部门级别";
|
||||
$lang->dept->order = "排序";
|
||||
$lang->dept->dragAndSort = "拖动排序";
|
||||
$lang->dept->common = '部门结构';
|
||||
$lang->dept->id = '编号';
|
||||
$lang->dept->path = '路径';
|
||||
$lang->dept->position = '职位';
|
||||
$lang->dept->manageChild = "下级部门";
|
||||
$lang->dept->edit = "编辑部门";
|
||||
$lang->dept->delete = "删除部门";
|
||||
$lang->dept->parent = "上级部门";
|
||||
$lang->dept->manager = "负责人";
|
||||
$lang->dept->name = "部门名称";
|
||||
$lang->dept->browse = "部门维护";
|
||||
$lang->dept->manage = "维护部门";
|
||||
$lang->dept->updateOrder = "更新排序";
|
||||
$lang->dept->add = "添加部门";
|
||||
$lang->dept->grade = "部门级别";
|
||||
$lang->dept->order = "排序";
|
||||
$lang->dept->dragAndSort = "拖动排序";
|
||||
$lang->dept->noDepartment = "无部门";
|
||||
|
||||
$lang->dept->confirmDelete = " 您确定删除该部门吗?";
|
||||
$lang->dept->successSave = " 修改成功。";
|
||||
|
||||
@@ -113,7 +113,7 @@ class deptModel extends model
|
||||
krsort($deptMenu);
|
||||
$topMenu = array_pop($deptMenu);
|
||||
$topMenu = explode("\n", trim((string)$topMenu));
|
||||
$lastMenu[] = '/';
|
||||
$lastMenu[] = '/' . $this->lang->dept->noDepartment;
|
||||
foreach($topMenu as $menu)
|
||||
{
|
||||
if(!strpos($menu, '|')) continue;
|
||||
@@ -409,6 +409,7 @@ class deptModel extends model
|
||||
->where('deleted')->eq(0)
|
||||
->beginIF(strpos($params, 'all') === false)->andWhere('type')->eq($type)->fi()
|
||||
->beginIF($childDepts)->andWhere('dept')->in($childDepts)->fi()
|
||||
->beginIF($deptID === '0')->andWhere('dept')->eq($deptID)->fi()
|
||||
->beginIF($this->config->vision)->andWhere("CONCAT(',', visions, ',')")->like("%,{$this->config->vision},%")->fi()
|
||||
->orderBy('account')
|
||||
->fetchPairs();
|
||||
|
||||
@@ -1321,31 +1321,19 @@ class execution extends control
|
||||
$this->loadModel('kanban');
|
||||
$this->app->loadClass('date');
|
||||
|
||||
$end = helper::today() > $execution->end ? $execution->end : helper::today();
|
||||
if(helper::today() > $execution->end)
|
||||
{
|
||||
if(date($execution->end, strtotime('-14 days')) > $execution->begin)
|
||||
{
|
||||
$begin = date($execution->end, strtotime('-14 days'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$begin = $execution->begin;
|
||||
}
|
||||
}
|
||||
elseif(($execution->begin < helper::today()) and (helper::today() < $execution->end))
|
||||
{
|
||||
$begin = (date('Y-m-d', strtotime('-14 days')) < $execution->begin) ? $execution->begin : date('Y-m-d', strtotime('-14 days'));
|
||||
}
|
||||
|
||||
list($begin, $end) = $this->execution->getBeginEnd4CFD($execution);
|
||||
$dateList = date::getDateList($begin, $end, 'Y-m-d', '');
|
||||
|
||||
list($cycleTimeAvg, $throughput) = $this->execution->getCFDStatistics($executionID, $dateList, $type);
|
||||
|
||||
$this->view->title = $this->lang->execution->CFD;
|
||||
$this->view->type = $type;
|
||||
$this->view->execution = $execution;
|
||||
$this->view->executionName = $execution->name;
|
||||
$this->view->executionID = $executionID;
|
||||
$this->view->chartData = $this->execution->buildCFDData($executionID, $dateList, $type);
|
||||
$this->view->cycleTimeAvg = $cycleTimeAvg;
|
||||
$this->view->throughput = $throughput;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1357,9 +1345,10 @@ class execution extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function computeCFD($reload = 'no', $executionID = 0)
|
||||
public function computeCFD($reload = 'no', $executionID = 0, $date = '')
|
||||
{
|
||||
$this->execution->computeCFD($executionID);
|
||||
$date = date('Y-m-d', strtotime($date));
|
||||
$this->execution->computeCFD($executionID, $date);
|
||||
if($reload == 'yes') return print(js::reload('parent'));
|
||||
}
|
||||
|
||||
@@ -1605,7 +1594,9 @@ class execution extends control
|
||||
if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink;
|
||||
|
||||
$this->loadModel('product');
|
||||
$allProducts = $this->config->systemMode == 'classic' ? $this->product->getPairs('noclosed') : $this->product->getProductPairsByProject($projectID, 'noclosed');
|
||||
$allProducts = $this->config->systemMode == 'classic' ? $this->product->getPairs('noclosed') : $this->product->getProductPairsByProject($projectID, 'noclosed');
|
||||
$copyProjects = $this->loadModel('project')->getPairsByProgram(isset($project->parent) ? $project->parent : '', 'noclosed', '', 'order_asc', '', isset($project->model) ? $project->model : '');
|
||||
$copyProjectID = ($projectID == 0) ? key($copyProjects) : $projectID;
|
||||
|
||||
$this->view->title = (($this->app->tab == 'execution') and ($this->config->systemMode == 'new')) ? $this->lang->execution->createExec : $this->lang->execution->create;
|
||||
$this->view->position[] = $this->view->title;
|
||||
@@ -1620,6 +1611,8 @@ class execution extends control
|
||||
$this->view->team = $team;
|
||||
$this->view->teams = array(0 => '') + $this->execution->getCanCopyObjects((int)$projectID);
|
||||
$this->view->allProjects = array(0 => '') + $this->project->getPairsByModel('all', 0, 'noclosed');
|
||||
$this->view->copyProjects = $copyProjects;
|
||||
$this->view->copyExecutions = array('' => '') + $this->execution->getList($copyProjectID);
|
||||
$this->view->executionID = $executionID;
|
||||
$this->view->productID = $productID;
|
||||
$this->view->projectID = $projectID;
|
||||
@@ -4053,4 +4046,18 @@ class execution extends control
|
||||
echo json_encode($date);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax get copy project executions.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetCopyProjectExecutions($projectID = 0)
|
||||
{
|
||||
$executions = $this->execution->getList($projectID);
|
||||
echo json_encode($executions);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,11 +1,34 @@
|
||||
.main-content > h2 {font-size: 16px;}
|
||||
#cfdWrapper {max-width: 1400px; margin: 0 auto; padding: 25px 100px 10px; position: relative;}
|
||||
#cfdYUnit {position: absolute; color: #CBD0DB; top: 0; left: 90px;}
|
||||
#cfdXUnit {position: absolute; color: #CBD0DB; bottom: 20px; right: 60px;}
|
||||
#cfdLegend {position: absolute; right: 0; width: 80px; height: 60px; top: 50%; margin-top: -30px; line-height: 30px; color: #838A9D; font-size: 12px;}
|
||||
#cfdLegend > div {position: relative; padding-left: 30px;}
|
||||
#cfdLegend > div > .barline {position: absolute; width: 20px; left: 0; top: 13px; height: 3px; background: #EEEEEE;}
|
||||
#cfdLegend .line-real .bg-primary {background: #1183fb;}
|
||||
#cfdLegend .line-real .bg-delay {background: red;}
|
||||
|
||||
.pull-left .input-control {margin-right: 10px;}
|
||||
|
||||
#cfdWrapper {max-width: 1450px; padding: 25px 0px 10px; position: relative}
|
||||
#cfdYUnit {position: absolute; color: #CBD0DB; top: 40px; left: 30px}
|
||||
#cfdXUnit {position: absolute; color: #CBD0DB; bottom: 20px; left: 1200px}
|
||||
@media screen and (max-width: 1920px)
|
||||
{
|
||||
#cfdChart {width:1400px !important; height:600px !important}
|
||||
#mainContent {min-width: 1550px !important;}
|
||||
#burnStatistics {left: 1400px !important;}
|
||||
#cfdXUnit {left: 1400px;}
|
||||
}
|
||||
@media screen and (max-width: 1680px)
|
||||
{
|
||||
#cfdChart {width:1150px !important; height:500px !important}
|
||||
#mainContent {min-width: 1350px !important;}
|
||||
#burnStatistics {left: 1150px !important;}
|
||||
#cfdXUnit {left: 1150px;}
|
||||
}
|
||||
@media screen and (max-width: 1366px)
|
||||
{
|
||||
#cfdChart {width:1000px !important; height:400px !important}
|
||||
#mainContent {min-width: 1200px !important;}
|
||||
#burnStatistics {left: 1000px !important;}
|
||||
#cfdXUnit {left: 1000px;}
|
||||
}
|
||||
|
||||
#mainContent {min-width: 1400px;}
|
||||
#burnStatistics {position: absolute; width: 180px; left: 1200px; height: 200px; top: 20%; margin-top: -30px; line-height: 30px; color: #838A9D; font-size: 12px; border: 1px solid #dcdcdc; background-color: #F8F8F8; padding: 15px 20px; color: #3c4353; border-radius: 8px;}
|
||||
#burnStatistics .bg-primary {margin-right: 5px;}
|
||||
#burnStatistics .icon-help {color: black;}
|
||||
#burnStatistics h3 {margin-top: 10px; text-indent: 10px; margin-bottom: 30px;}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#burnStatistics {width : 160px;}
|
||||
@@ -32,3 +32,6 @@
|
||||
#dateRangeOption {vertical-align: top; padding-top: 13px;}
|
||||
#beginLabel {white-space: nowrap;}
|
||||
#endLabel {white-space: nowrap;}
|
||||
#copyProjectModal .projectSelect {display: inline-block; margin-left: 10px; width: 20%;}
|
||||
#copyProjectModal .titleBox{position: relative; bottom: 3px; display: inline-block;}
|
||||
a.chosen-single > div > b {top: -4px !important;}
|
||||
@@ -0,0 +1,95 @@
|
||||
$(function()
|
||||
{
|
||||
$('[data-toggle=tooltip]').tooltip();
|
||||
|
||||
if(chartData)
|
||||
{
|
||||
var i = 0;
|
||||
var series = [];
|
||||
var colors = ['#33B4DB', '#7ECF69', '#FFC73A', '#FF5A61', '#50C8D0', '#AF5AFF', '#4EA3FF', '#FF8C5A', '#6C73FF'];
|
||||
//var background = ['#E1F4FA', '#ECF8E9', '#FFF7E2', '#FFE7E8', '#E5F7F8', '#F3E7FF', '#E5F1FF', '#FFEEE7', '#E9EAFF'];
|
||||
|
||||
$.each(chartData['line'], function(label, set)
|
||||
{
|
||||
series.push({
|
||||
name: label,
|
||||
type: 'line',
|
||||
stack: 'Total',
|
||||
color: colors[i],
|
||||
areaStyle: {
|
||||
color: colors[i],
|
||||
opacity: 0.2
|
||||
},
|
||||
emphasis: {
|
||||
focus: 'series'
|
||||
},
|
||||
data: eval(set)
|
||||
})
|
||||
i ++;
|
||||
})
|
||||
|
||||
var chartDom = document.getElementById('cfdChart');
|
||||
var CFD = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
option = {
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
axisPointer: {
|
||||
type: 'cross',
|
||||
label: {
|
||||
backgroundColor: '#6a7985'
|
||||
}
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
data: Object.keys(chartData['line'])
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: chartData['labels'],
|
||||
axisLine:
|
||||
{
|
||||
show: true,
|
||||
lineStyle:
|
||||
{
|
||||
color: '#999',
|
||||
width:1
|
||||
}
|
||||
}
|
||||
}],
|
||||
yAxis: [
|
||||
{
|
||||
type: 'value',
|
||||
minInterval: 1,
|
||||
axisLine:
|
||||
{
|
||||
show: true,
|
||||
lineStyle:
|
||||
{
|
||||
color: ['#999'],
|
||||
width: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
series: series,
|
||||
};
|
||||
|
||||
option && CFD.setOption(option);
|
||||
window.addEventListener('resize', CFD.resize);
|
||||
}
|
||||
|
||||
$('#type').change(function()
|
||||
{
|
||||
location.href = createLink('execution', 'cfd', 'executionID=' + executionID + '&type=' + $(this).val());
|
||||
});
|
||||
});
|
||||
@@ -8,7 +8,11 @@ $(function()
|
||||
var heightType = $("[name='heightType']:checked").val();
|
||||
setCardCount(heightType);
|
||||
|
||||
$('#copyProjects a').click(function(){setCopyProject($(this).data('id')); $('#copyProjectModal').modal('hide')});
|
||||
$(document).on('click', '#copyProjects a', function()
|
||||
{
|
||||
setCopyProject($(this).data('id')); $('#copyProjectModal').modal('hide');
|
||||
});
|
||||
|
||||
$('#begin').on('change', function()
|
||||
{
|
||||
$("#end").val('');
|
||||
@@ -168,3 +172,43 @@ function subString(title, stringLength)
|
||||
|
||||
return title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load project executions.
|
||||
*
|
||||
* @param int $projectID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadProjectExecutions(projectID)
|
||||
{
|
||||
$.get(createLink('execution', 'ajaxGetCopyProjectExecutions', 'projectID=' + projectID + '&$copyExecutionID' + copyExecutionID), function(data)
|
||||
{
|
||||
if(data != '[]')
|
||||
{
|
||||
$('.alert').replaceWith("<div id='copyProjects' class='row'>");
|
||||
$("#copyProjects > div[data-id != '']").remove();
|
||||
$(".model-body").remove();
|
||||
var data = JSON.parse(data);
|
||||
if(copyExecutionID != 0 )
|
||||
{
|
||||
$('#copyProjects').append("<div class='col-md-4 col-sm-6'><a href='javascript:;' data-id='' class='cancel'><i class='icon-ban-circle'></i>" + cancelCopy + "</a></div>");
|
||||
}
|
||||
$.each(data, function(id, execution)
|
||||
{
|
||||
var type = execution.type == 'stage' ? 'waterfall' : execution.type;
|
||||
var active = copyExecutionID == id ? ' active' : '';
|
||||
$('#copyProjects').append("<div class='col-md-4 col-sm-6'><a href='javascript:;' data-id='" + id + "' class='nobr " + active + "'><i class='icon-" + type + " text-muted'></i>" + execution.name + "</a></div>");
|
||||
});
|
||||
}
|
||||
else if(data == '[]' && copyExecutionID == 0)
|
||||
{
|
||||
$('#copyProjects').replaceWith("<div class='alert with-icon'><i class='icon-exclamation-sign'></i><div class='content'>" + copyNoExecution + "</div>");
|
||||
}
|
||||
else if(data == '[]' && copyExecutionID != 0)
|
||||
{
|
||||
$("#copyProjects > div[data-id != '']").remove();
|
||||
$('#copyProjects').append("<div class='col-md-4 col-sm-6'><a href='javascript:;' data-id='' class='cancel'><i class='icon-ban-circle'></i>" + cancelCopy + "</a></div>");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -412,6 +412,7 @@ $lang->execution->ge = "『%s』should be >= actual beg
|
||||
$lang->execution->storyDragError = "The {$lang->SRCommon} is still a draft or has been changed, please drag it after the review";
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -429,6 +430,12 @@ $lang->execution->charts->burn->graph->reference = 'Referenz';
|
||||
$lang->execution->charts->burn->graph->actuality = 'Aktualität';
|
||||
$lang->execution->charts->burn->graph->delay = 'Delay';
|
||||
|
||||
$lang->execution->charts->cfd = new stdclass();
|
||||
$lang->execution->charts->cfd->cycleTime = 'Average cycle time';
|
||||
$lang->execution->charts->cfd->cycleTimeTip = 'Average cycle time of each card from development start to completion';
|
||||
$lang->execution->charts->cfd->throughput = 'Throughput Rate';
|
||||
$lang->execution->charts->cfd->throughputTip = 'Throughput Rate = WIP / Average cycle time';
|
||||
|
||||
$lang->execution->placeholder = new stdclass();
|
||||
$lang->execution->placeholder->code = 'Abkurzung des Projektnamens';
|
||||
$lang->execution->placeholder->totalLeft = 'Schätzungen zu Beginn des Projekts.';
|
||||
|
||||
@@ -412,6 +412,7 @@ $lang->execution->ge = "『%s』should be >= actual beg
|
||||
$lang->execution->storyDragError = "The {$lang->SRCommon} is still a draft or has been changed, please drag it after the review";
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -429,6 +430,12 @@ $lang->execution->charts->burn->graph->reference = 'Ideal';
|
||||
$lang->execution->charts->burn->graph->actuality = 'Actual';
|
||||
$lang->execution->charts->burn->graph->delay = 'Delay';
|
||||
|
||||
$lang->execution->charts->cfd = new stdclass();
|
||||
$lang->execution->charts->cfd->cycleTime = 'Average cycle time';
|
||||
$lang->execution->charts->cfd->cycleTimeTip = 'Average cycle time of each card from development start to completion';
|
||||
$lang->execution->charts->cfd->throughput = 'Throughput Rate';
|
||||
$lang->execution->charts->cfd->throughputTip = 'Throughput Rate = WIP / Average cycle time';
|
||||
|
||||
$lang->execution->placeholder = new stdclass();
|
||||
$lang->execution->placeholder->code = "Abbreviation of {$lang->executionCommon} name";
|
||||
$lang->execution->placeholder->totalLeft = "Hours estimated on the first day of the {$lang->executionCommon}.";
|
||||
|
||||
@@ -415,6 +415,7 @@ $lang->execution->ge = "『%s』should be >= actual beg
|
||||
$lang->execution->storyDragError = "The {$lang->SRCommon} is still a draft or has been changed, please drag it after the review";
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -432,6 +433,12 @@ $lang->execution->charts->burn->graph->reference = 'Idéal';
|
||||
$lang->execution->charts->burn->graph->actuality = 'Actuel';
|
||||
$lang->execution->charts->burn->graph->delay = 'Delay';
|
||||
|
||||
$lang->execution->charts->cfd = new stdclass();
|
||||
$lang->execution->charts->cfd->cycleTime = 'Average cycle time';
|
||||
$lang->execution->charts->cfd->cycleTimeTip = 'Average cycle time of each card from development start to completion';
|
||||
$lang->execution->charts->cfd->throughput = 'Throughput Rate';
|
||||
$lang->execution->charts->cfd->throughputTip = 'Throughput Rate = WIP / Average cycle time';
|
||||
|
||||
$lang->execution->placeholder = new stdclass();
|
||||
$lang->execution->placeholder->code = "Abréviation du nom du {$lang->executionCommon}";
|
||||
$lang->execution->placeholder->totalLeft = "Heures estimées le premier jour du {$lang->executionCommon}.";
|
||||
|
||||
@@ -412,6 +412,7 @@ $lang->execution->ge = "『%s』应当不小于实际
|
||||
$lang->execution->storyDragError = "该{$lang->SRCommon}还是草稿或已变更状态,请评审通过后再拖动";
|
||||
$lang->execution->countTip = '(%s人)';
|
||||
$lang->execution->pleaseInput = "请输入";
|
||||
$lang->execution->week = '周';
|
||||
|
||||
/* 统计。*/
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -429,6 +430,12 @@ $lang->execution->charts->burn->graph->reference = '参考';
|
||||
$lang->execution->charts->burn->graph->actuality = '实际';
|
||||
$lang->execution->charts->burn->graph->delay = '延期';
|
||||
|
||||
$lang->execution->charts->cfd = new stdclass();
|
||||
$lang->execution->charts->cfd->cycleTime = '平均周期时间';
|
||||
$lang->execution->charts->cfd->cycleTimeTip = '平均每个卡片从开发启动到完成的周期时间';
|
||||
$lang->execution->charts->cfd->throughput = '吞吐率';
|
||||
$lang->execution->charts->cfd->throughputTip = '吞吐率 = 在制品 / 平均周期时间';
|
||||
|
||||
$lang->execution->placeholder = new stdclass();
|
||||
$lang->execution->placeholder->code = '团队内部的简称';
|
||||
$lang->execution->placeholder->totalLeft = "{$lang->executionCommon}开始时的总预计工时";
|
||||
|
||||
@@ -3005,9 +3005,9 @@ class executionModel extends model
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function computeCFD($executionID = 0)
|
||||
public function computeCFD($executionID = 0, $date = '')
|
||||
{
|
||||
$today = helper::today();
|
||||
$today = $date ? $date : helper::today();
|
||||
$executions = $this->dao->select('id, code')->from(TABLE_EXECUTION)
|
||||
->where('type')->eq('kanban')
|
||||
->andWhere('status')->notin('done,closed,suspended')
|
||||
@@ -3025,7 +3025,7 @@ class executionModel extends model
|
||||
->orderBy('t2.id asc')
|
||||
->fetchAll('id');
|
||||
|
||||
/* Group by type/name/execution/colID. */
|
||||
/* Group by execution/type/name/lane/column. */
|
||||
$columnGroup = array();
|
||||
$parentNames = array();
|
||||
foreach($cells as $id => $column)
|
||||
@@ -3092,6 +3092,36 @@ class executionModel extends model
|
||||
$this->dao->replace(TABLE_BURN)->data($data)->exec();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get begin and end for CFD.
|
||||
*
|
||||
* @param object $execution
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getBeginEnd4CFD($execution)
|
||||
{
|
||||
$begin = $execution->begin;
|
||||
$end = $execution->end;
|
||||
if(helper::today() < $execution->begin)
|
||||
{
|
||||
$begin = helper::today();
|
||||
$end = helper::today();
|
||||
}
|
||||
elseif((helper::today() >= $execution->begin) and (helper::today() <= $execution->end))
|
||||
{
|
||||
$begin = (date('Y-m-d', strtotime('-13 days')) < $execution->begin) ? $execution->begin : date('Y-m-d', strtotime('-13 days'));
|
||||
$end = helper::today();
|
||||
}
|
||||
elseif((helper::today() > $execution->end))
|
||||
{
|
||||
$begin = date($execution->end, strtotime('-13 days')) > $execution->begin ? date($execution->end, strtotime('-13 days')) : $execution->begin;
|
||||
$end = $execution->end;
|
||||
}
|
||||
|
||||
return array($begin, $end);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get burn data for flot
|
||||
*
|
||||
@@ -3206,7 +3236,7 @@ class executionModel extends model
|
||||
|
||||
/**
|
||||
* Build CFD data.
|
||||
*
|
||||
*
|
||||
* @param int $executionID
|
||||
* @param string $type
|
||||
* @param array $dateList
|
||||
@@ -3264,6 +3294,44 @@ class executionModel extends model
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get CFD statistics.
|
||||
*
|
||||
* @param int $executionID
|
||||
* @param array $dateList
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getCFDStatistics($executionID, $dateList, $type)
|
||||
{
|
||||
$kanbanData = $this->loadModel('kanban')->getRDKanban($executionID, $type);
|
||||
$kanbanData = array_shift($kanbanData);
|
||||
|
||||
$cycleTime = array();
|
||||
foreach($kanbanData->groups as $group)
|
||||
{
|
||||
foreach($group->lanes as $lane)
|
||||
{
|
||||
if(!isset($lane->items['closed'])) continue;
|
||||
|
||||
foreach($lane->items['closed'] as $item)
|
||||
{
|
||||
$diffTime = $type == 'story' ? strtotime($item['lastEditedDate']) - strtotime($item['openedDate']) : strtotime($item['closedDate']) - strtotime($item['openedDate']);
|
||||
$day = floor($diffTime / (3600 * 24));
|
||||
if($day > 0) $cycleTime[$item['id']] = $day;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$itemCount = count($cycleTime);
|
||||
if(!$itemCount) return array('', '');
|
||||
$cycleTimeAvg = round(array_sum($cycleTime) / $itemCount);
|
||||
$throughput = round(($itemCount * 7) / $cycleTimeAvg, 1) . "{$this->lang->execution->kanbanCardsUnit}/" . $this->lang->execution->week;
|
||||
|
||||
return array($cycleTimeAvg, $throughput);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get taskes by search.
|
||||
*
|
||||
|
||||
@@ -73,12 +73,14 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $from == 'execution' ? $lang->execution->noExecutions : $lang->execution->noExecution;?></span>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-info'");?>
|
||||
<?php else: ?>
|
||||
<?php if(common::hasPriv('execution', 'create')):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-plus'></i> " . (($from == 'execution' and $config->systemMode == 'new') ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-info' data-app='execution'");?>
|
||||
<?php endif;?>
|
||||
<?php if($status == "all"):?>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-info'");?>
|
||||
<?php else: ?>
|
||||
<?php if(common::hasPriv('execution', 'create')):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-plus'></i> " . (($from == 'execution' and $config->systemMode == 'new') ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-info' data-app='execution'");?>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -11,13 +11,10 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/chart.html.php';?>
|
||||
<?php js::set('executionID', $executionID);?>
|
||||
<?php js::set('executionName', $execution->name);?>
|
||||
<?php js::set('watermark', $lang->execution->watermark);?>
|
||||
<?php js::set('cfdXUnit', $lang->execution->burnXUnit);?>
|
||||
<?php js::set('cfdYUnit', $lang->execution->burnYUnit);?>
|
||||
<?php js::set('type', $type);?>
|
||||
<?php js::import($jsRoot . 'echarts/echarts.common.min.js'); ?>
|
||||
<?php js::import($jsRoot . 'html2canvas/min.js'); ?>
|
||||
<?php js::set('executionID', $executionID); ?>
|
||||
<?php js::set('chartData', $chartData); ?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
@@ -35,62 +32,15 @@
|
||||
<div id='mainContent' class='main-content'>
|
||||
<h2 class='text-center'><?php echo $executionName . ' - ' . zget($lang->execution->cfdTypeList, $type) . $lang->execution->CFD;?></h2>
|
||||
<div id="cfdWrapper">
|
||||
<div id="cfdChart">
|
||||
<canvas id="cfdCanvas"></canvas>
|
||||
</div>
|
||||
<div id="cfdChart" style="width: 1200px; height: 600px"></div>
|
||||
<div id="cfdYUnit"><?php echo $lang->execution->count;?></div>
|
||||
<div id="cfdXUnit"><?php echo $lang->execution->burnXUnit;?></div>
|
||||
<div id="burnStatistics">
|
||||
<div class="stat-title"><span class="bg-primary"> </span> <?php echo $lang->execution->charts->cfd->cycleTime;?> <i class="icon icon-help" data-toggle="tooltip" data-tip-class="tooltip-help" data-placement="bottom" title="<?php echo $lang->execution->charts->cfd->cycleTimeTip;?>"></i></div>
|
||||
<h3><?php echo $cycleTimeAvg ? ($cycleTimeAvg . $lang->day) : $lang->noData;?></h3>
|
||||
<div class="stat-title"><span class="bg-primary"> </span> <?php echo $lang->execution->charts->cfd->throughput;?> <i class="icon icon-help" data-toggle="tooltip" data-tip-class="tooltip-help" data-placement="bottom" title="<?php echo $lang->execution->charts->cfd->throughputTip;?>"></i></div>
|
||||
<h3><?php echo $throughput ? $throughput : $lang->noData;?></h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var sets = [];
|
||||
var colors = ['#33B4DB', '#7ECF69', '#FFC73A', '#FF5A61', '#50C8D0', '#AF5AFF', '#4EA3FF', '#6C73FF', '#FF8C5A'];
|
||||
var i = 0;
|
||||
<?php foreach($chartData['line'] as $label => $set):?>
|
||||
sets.push({
|
||||
label: '<?php echo $label;?>',
|
||||
color: colors[i],
|
||||
pointStrokeColor: colors[i],
|
||||
pointHighlightStroke: colors[i],
|
||||
pointColor: colors[i],
|
||||
fillColor: colors[i] + '12',
|
||||
pointHighlightFill: colors[i],
|
||||
data: <?php echo $set;?>
|
||||
})
|
||||
i ++;
|
||||
<?php endforeach;?>
|
||||
|
||||
$('#type').change(function()
|
||||
{
|
||||
location.href = createLink('execution', 'cfd', 'executionID=' + executionID + '&type=' + $(this).val());
|
||||
});
|
||||
|
||||
$(function(){ initBurnChar();})
|
||||
|
||||
function initBurnChar()
|
||||
{
|
||||
var data =
|
||||
{
|
||||
labels: <?php echo json_encode($chartData['labels'])?>,
|
||||
datasets: sets
|
||||
};
|
||||
|
||||
var cfdChart = $("#cfdCanvas").lineChart(data,
|
||||
{
|
||||
pointDotStrokeWidth: 2,
|
||||
pointDotRadius: 3,
|
||||
datasetStrokeWidth: 3,
|
||||
datasetFill: true,
|
||||
datasetStroke: true,
|
||||
scaleShowBeyondLine: false,
|
||||
responsive: true,
|
||||
bezierCurve: false,
|
||||
scaleFontColor: '#838A9D',
|
||||
tooltipXPadding: 10,
|
||||
tooltipYPadding: 10,
|
||||
multiTooltipTitleTemplate: '<%= label %> <?php echo $lang->execution->count;?>',
|
||||
multiTooltipTemplate: "<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= value %>",
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -45,6 +45,9 @@
|
||||
<?php js::set('multiBranchProducts', $multiBranchProducts);?>
|
||||
<?php js::set('systemMode', $config->systemMode);?>
|
||||
<?php js::set('projectID', $projectID);?>
|
||||
<?php js::set('copyExecutionID', $copyExecutionID);?>
|
||||
<?php js::set('cancelCopy', $lang->execution->cancelCopy);?>
|
||||
<?php js::set('copyNoExecution', $lang->execution->copyNoExecution);?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='center-block'>
|
||||
<div class='main-header'>
|
||||
@@ -265,7 +268,10 @@
|
||||
<div class='modal-dialog mw-900px'>
|
||||
<div class='modal-header'>
|
||||
<button type='button' class='close' data-dismiss='modal'><i class="icon icon-close"></i></button>
|
||||
<h4 class='modal-title' id='myModalLabel'><?php echo $lang->execution->copyTitle;?></h4>
|
||||
<div class='titleBox'><h4 class='modal-title' id='myModalLabel'><?php echo $lang->execution->copyTitle;?></h4></div>
|
||||
<?php if($this->config->systemMode == 'new'):?>
|
||||
<div class='projectSelect'><?php echo html::select("project", $copyProjects, $projectID, "class='form-control chosen' required onchange='loadProjectExecutions(this.value)'");?></div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div class='modal-body'>
|
||||
<?php if(count($executions) == 1):?>
|
||||
@@ -275,6 +281,7 @@
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div id='copyProjects' class='row'>
|
||||
<?php if($config->systemMode == 'new' and $projectID == 0) $executions = $copyExecutions;?>
|
||||
<?php foreach ($executions as $id => $execution):?>
|
||||
<?php if(empty($id)):?>
|
||||
<?php if($copyExecutionID != 0):?>
|
||||
|
||||
@@ -198,7 +198,7 @@ body {margin-bottom: 25px;}
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->task->noTask;?></span>
|
||||
<?php if($canBeChanged and common::hasPriv('task', 'create')):?>
|
||||
<?php if($canBeChanged and common::hasPriv('task', 'create') and $status == "all"):?>
|
||||
<?php echo html::a($taskCreateLink, "<i class='icon icon-plus'></i> " . $lang->task->create, '', "class='btn btn-info'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
|
||||
@@ -634,12 +634,19 @@ class gitlab extends control
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browseUser', "gitlabID=$gitlabID")));
|
||||
}
|
||||
|
||||
$userPairs = $this->loadModel('user')->getPairs('noclosed|noletter');
|
||||
$user = $this->gitlab->apiGetSingleUser($gitlabID, $userID);
|
||||
$zentaoBindAccount = $this->dao->select('account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('openID')->eq($user->id)->fetch('account');
|
||||
$gitlabUser = $this->gitlab->apiGetSingleUser($gitlabID, $userID);
|
||||
$zentaoBindAccount = $this->dao->select('account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('openID')->eq($gitlabUser->id)->fetch('account');
|
||||
|
||||
$users = $this->loadModel('user')->getList();
|
||||
$bindedUsers = $this->gitlab->getUserAccountIdPairs($gitlabID);
|
||||
$userPairs = array('' => '');
|
||||
foreach($users as $user)
|
||||
{
|
||||
if(!isset($bindedUsers[$user->account]) or $u->account == $zentaoBindAccount) $userPairs[$user->account] = $user->realname;
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->user->edit;
|
||||
$this->view->user = $user;
|
||||
$this->view->user = $gitlabUser;
|
||||
$this->view->userPairs = $userPairs;
|
||||
$this->view->zentaoBindAccount = $zentaoBindAccount;
|
||||
$this->view->gitlabID = $gitlabID;
|
||||
@@ -714,7 +721,10 @@ class gitlab extends control
|
||||
$project->isMaintainer = $this->gitlab->checkUserAccess($gitlabID, $project->id, $project, $groupIDList, 'maintainer');
|
||||
}
|
||||
|
||||
$gitlab = $this->gitlab->getByID($gitlabID);
|
||||
$gitlab = $this->gitlab->getByID($gitlabID);
|
||||
$repos = $this->loadModel('repo')->getGitLabRepoList($gitlabID);
|
||||
$repoPairs = array();
|
||||
foreach($repos as $repo) $repoPairs[$repo->path] = $repo->id;
|
||||
|
||||
$this->view->gitlab = $gitlab;
|
||||
$this->view->keyword = urldecode(urldecode($keyword));
|
||||
@@ -723,6 +733,7 @@ class gitlab extends control
|
||||
$this->view->gitlabID = $gitlabID;
|
||||
$this->view->gitlabProjectList = $result['projects'];
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->repoPairs = $repoPairs;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ function addItem(obj)
|
||||
*/
|
||||
function deleteItem(obj)
|
||||
{
|
||||
if($(obj).hasClass('disabled')) return false;
|
||||
if($('#teamForm .table-form tbody').children().length < 2) return false;
|
||||
$(obj).closest('tr').remove();
|
||||
}
|
||||
|
||||
@@ -55,11 +55,10 @@
|
||||
<td class='text' title='<?php echo $gitlab->url;?>'><?php echo html::a($gitlab->url, $gitlab->url, '_target');?></td>
|
||||
<td class='c-actions text-left'>
|
||||
<?php
|
||||
$disabled = !empty($gitlab->isAdminToken) ? '' : 'disabled';
|
||||
$notBind = $gitlab->isBindUser ? '' : 'disabled';
|
||||
common::printLink('gitlab', 'edit', "gitlabID=$id", "<i class='icon icon-edit'></i> ", '',"title='{$lang->gitlab->edit}' class='btn btn-primary'");
|
||||
common::printLink('gitlab', 'bindUser', "id=$id", "<i class='icon icon-link'></i> ", '', "title='{$lang->gitlab->bindUser}' class='btn {$disabled} {$notBind}' ,'disabled'");
|
||||
if(common::hasPriv('gitlab', 'delete')) echo html::a($this->createLink('gitlab', 'delete', "gitlabID=$id"), '<i class="icon-trash"></i>', 'hiddenwin', "title='{$lang->gitlab->delete}' class='btn'");
|
||||
$disabled = (empty($gitlab->isAdminToken) or !$gitlab->isBindUser) ? false : true;
|
||||
common::printIcon('gitlab', 'edit', "gitlabID=$id", '', 'list', 'edit');
|
||||
echo common::buildIconButton('gitlab', 'bindUser', "gitlabID=$id", '', 'list', 'link', '', '', false, '', '', 0, $disabled);
|
||||
common::printIcon('gitlab', 'delete', "gitlabID=$id", '', 'list', 'trash', 'hiddenwin');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<?php echo $this->gitlab->getGitlabMenu($gitlabID, 'group');?>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<form id='gitlabForm' method='post'>
|
||||
<form id='gitlabForm' method='post' class="not-watch">
|
||||
<?php echo html::input('keyword', $keyword, "class='form-control' placeholder='{$lang->gitlab->placeholderSearch}' style='display: inline-block;width:auto;margin:0 10px'");?>
|
||||
<a id="gitlabSearch" class="btn btn-primary"><?php echo $lang->gitlab->search?></a>
|
||||
</form>
|
||||
@@ -59,10 +59,10 @@
|
||||
<td class='text' title='<?php echo substr($gitlabGroup->created_at, 0, 10);?>'><?php echo substr($gitlabGroup->created_at, 0, 10);?></td>
|
||||
<td class='c-actions text-left'>
|
||||
<?php
|
||||
$adminClass = ($app->user->admin or in_array($gitlabGroup->id, $adminGroupIDList)) ? '' : 'disabled';
|
||||
$isAdmin = ($app->user->admin or in_array($gitlabGroup->id, $adminGroupIDList)) ? true : false;
|
||||
common::printLink('gitlab', 'manageGroupMembers', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", "<i class='icon icon-team'></i> ", '',"title='{$lang->gitlab->group->manageMembers}' class='btn'");
|
||||
common::printLink('gitlab', 'editGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", "<i class='icon icon-edit'></i> ", '', "title='{$lang->gitlab->group->edit}' class='btn {$adminClass}'");
|
||||
if(common::hasPriv('gitlab', 'delete')) echo html::a($this->createLink('gitlab', 'deleteGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id"), '<i class="icon-trash"></i>', 'hiddenwin', "title='{$lang->gitlab->deleteGroup}' class='btn {$adminClass}'");
|
||||
echo common::buildIconButton('gitlab', 'editGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", '', 'list', 'edit', '', '', false, '', '', 0, $isAdmin);
|
||||
echo common::buildIconButton('gitlab', 'deleteGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", '', 'list', 'trash', 'hiddenwin', '', false, '', '', 0, $isAdmin);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<?php echo $this->gitlab->getGitlabMenu($gitlabID, 'project');?>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<form id='gitlabForm' method='post'>
|
||||
<form id='gitlabForm' method='post' class="not-watch">
|
||||
<?php echo html::input('keyword', $keyword, "class='form-control' placeholder='{$lang->gitlab->placeholderSearch}' style='display: inline-block;width:auto;margin:0 10px'");?>
|
||||
<a id="gitlabSearch" class="btn btn-primary"><?php echo $lang->gitlab->search?></a>
|
||||
</form>
|
||||
@@ -45,7 +45,7 @@
|
||||
<th class='c-name text-left'><?php common::printOrderLink('name', $orderBy, $vars, $lang->gitlab->project->name);?></th>
|
||||
<th class='text-left'></th>
|
||||
<th class='text-left'><?php echo $lang->gitlab->lastUpdate;?></th>
|
||||
<th class='c-actions-4'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-8'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -60,13 +60,13 @@
|
||||
<td class='text' title='<?php echo substr($gitlabProject->last_activity_at, 0, 10);?>'><?php echo substr($gitlabProject->last_activity_at, 0, 10);?></td>
|
||||
<td class='c-actions text-left'>
|
||||
<?php
|
||||
$maintainerClass = $gitlabProject->isMaintainer ? '' : 'disabled';
|
||||
$ownerClass = $gitlabProject->adminer ? '' : 'disabled';
|
||||
$emptyBranchClass = $gitlabProject->default_branch ? '' : 'disabled';
|
||||
common::printLink('gitlab', 'browseBranchPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", "<i class='icon icon-branch-lock'></i> ", '', "title='{$lang->gitlab->branch->accessLevel}' class='btn {$maintainerClass} {$emptyBranchClass}'");
|
||||
common::printLink('gitlab', 'browseTagPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", "<i class='icon icon-tag-lock'></i> ", '', "title='{$lang->gitlab->browseTagPriv}' class='btn {$maintainerClass} {$emptyBranchClass}'");
|
||||
common::printLink('gitlab', 'editProject', "gitlabID=$gitlabID&projectID=$gitlabProject->id", "<i class='icon icon-edit'></i> ", '', "title='{$lang->gitlab->project->edit}' class='btn {$ownerClass}'");
|
||||
if(common::hasPriv('gitlab', 'delete')) echo html::a($this->createLink('gitlab', 'deleteProject', "gitlabID=$gitlabID&projectID=$gitlabProject->id"), '<i class="icon-trash"></i>', 'hiddenwin', "title='{$lang->gitlab->deleteProject}' class='btn {$ownerClass}'");
|
||||
echo common::buildIconButton('gitlab', 'browseBranchPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'branch-lock', '', '', false, '', '', 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch));
|
||||
echo common::buildIconButton('gitlab', 'browseTagPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'tag-lock', '', '', false, '', '', 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch));
|
||||
echo common::buildIconButton('gitlab', 'manageProjectMembers', 'repoID=' . zget($repoPairs, $gitlabProject->id), '', 'list', 'team', '', '', false, '', '', 0, isset($repoPairs[$gitlabProject->id]));
|
||||
echo common::buildIconButton('gitlab', 'createWebhook', 'repoID=' . zget($repoPairs, $gitlabProject->id), '', 'list', 'change', 'hiddenwin', '', false, '', '', 0, isset($repoPairs[$gitlabProject->id]));
|
||||
echo common::buildIconButton('gitlab', 'importIssue', 'repoID=' . zget($repoPairs, $gitlabProject->id), '', 'list', 'link', '', '', false, '', '', 0, isset($repoPairs[$gitlabProject->id]));
|
||||
echo common::buildIconButton('gitlab', 'editProject', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'edit', '', '', false, '', '', 0, $gitlabProject->adminer);
|
||||
echo common::buildIconButton('gitlab', 'deleteProject', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'trash', 'hiddenwin', '', false, '', '', 0, $gitlabProject->adminer);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -14,20 +14,20 @@
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<?php echo $this->gitlab->getGitlabMenu($gitlabID, 'user');?>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<form id='gitlabForm' method='post'>
|
||||
<form id='gitlabForm' method='post' class="not-watch">
|
||||
<?php echo html::input('keyword', $keyword, "class='form-control' placeholder='{$lang->gitlab->placeholderSearch}' style='display: inline-block;width:auto;margin:0 10px'");?>
|
||||
<a id="gitlabSearch" class="btn btn-primary"><?php echo $lang->gitlab->search?></a>
|
||||
</form>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
<?php common::printLink('gitlab', 'createUser', "gitlabID=$gitlabID", "<i class='icon icon-plus'></i> " . $lang->gitlab->user->create, '', "class='btn btn-primary'");?>
|
||||
<?php if($isAdmin) common::printLink('gitlab', 'createUser', "gitlabID=$gitlabID", "<i class='icon icon-plus'></i> " . $lang->gitlab->user->create, '', "class='btn btn-primary'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(empty($gitlabUserList)):?>
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->noData;?></span>
|
||||
<?php echo html::a($this->createLink('gitlab', 'createProject', "gitlabID=$gitlabID"), "<i class='icon icon-plus'></i> " . $lang->gitlab->user->create, '', "class='btn btn-info'");?>
|
||||
<?php if($isAdmin) echo html::a($this->createLink('gitlab', 'createProject', "gitlabID=$gitlabID"), "<i class='icon icon-plus'></i> " . $lang->gitlab->user->create, '', "class='btn btn-info'");?>
|
||||
</p>
|
||||
</div>
|
||||
<?php else:?>
|
||||
@@ -58,8 +58,8 @@
|
||||
<td class='text' title='<?php echo substr($gitlabUser->lastActivityOn, 0, 10);?>'><?php echo substr($gitlabUser->lastActivityOn, 0, 10);?></td>
|
||||
<td class='c-actions text-left'>
|
||||
<?php
|
||||
common::printLink('gitlab', 'editUser', "gitlabID=$gitlabID&userID=$gitlabUser->id", "<i class='icon icon-edit'></i> ", '', "title='{$lang->gitlab->user->edit}' class='btn btn-primary'");
|
||||
if(common::hasPriv('gitlab', 'delete')) echo html::a($this->createLink('gitlab', 'deleteUser', "gitlabID=$gitlabID&userID=$gitlabUser->id"), '<i class="icon-trash"></i>', 'hiddenwin', "title='{$lang->gitlab->deleteUser}' class='btn'" . ($isAdmin ? '' : ' disabled'));
|
||||
echo common::buildIconButton('gitlab', 'editUser', "gitlabID=$gitlabID&userID=$gitlabUser->id", '', 'list', 'edit', '', '', false, '', '', 0, $isAdmin);
|
||||
echo common::buildIconButton('gitlab', 'deleteUser', "gitlabID=$gitlabID&userID=$gitlabUser->id", '', 'list', 'trash', 'hiddenwin', '', false, '', '', 0, $isAdmin);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -68,6 +68,7 @@ $lang->moduleOrder[210] = 'dev';
|
||||
$lang->moduleOrder[215] = 'message';
|
||||
$lang->moduleOrder[220] = 'gitlab';
|
||||
$lang->moduleOrder[225] = 'mr';
|
||||
$lang->moduleOrder[230] = 'app';
|
||||
|
||||
$lang->resource = new stdclass();
|
||||
|
||||
@@ -1145,6 +1146,7 @@ $lang->resource->repo->download = 'downloadAction';
|
||||
$lang->resource->repo->maintain = 'maintain';
|
||||
$lang->resource->repo->setRules = 'setRules';
|
||||
$lang->resource->repo->apiGetRepoByUrl = 'apiGetRepoByUrl';
|
||||
$lang->resource->repo->downloadCode = 'downloadCode';
|
||||
|
||||
$lang->repo->methodOrder[5] = 'create';
|
||||
$lang->repo->methodOrder[10] = 'edit';
|
||||
@@ -1160,6 +1162,7 @@ $lang->repo->methodOrder[55] = 'blame';
|
||||
$lang->repo->methodOrder[60] = 'download';
|
||||
$lang->repo->methodOrder[65] = 'setRules';
|
||||
$lang->repo->methodOrder[70] = 'apiGetRepoByUrl';
|
||||
$lang->repo->methodOrder[75] = 'downloadCode';
|
||||
|
||||
$lang->resource->ci = new stdclass();
|
||||
$lang->resource->ci->commitResult = 'commitResult';
|
||||
@@ -1441,6 +1444,12 @@ $lang->mr->methodOrder[85] = 'close';
|
||||
$lang->mr->methodOrder[90] = 'reopen';
|
||||
$lang->mr->methodOrder[95] = 'addReview';
|
||||
|
||||
/* App. */
|
||||
$lang->resource->app = new stdclass();
|
||||
$lang->resource->app->serverlink = 'serverLink';
|
||||
|
||||
$lang->app->methodOrder[10] = 'link';
|
||||
|
||||
/* Git. */
|
||||
$lang->resource->git = new stdclass();
|
||||
$lang->resource->git->diff = 'diff';
|
||||
|
||||
@@ -50,6 +50,7 @@ body.menu-hide {padding-left: 0;}
|
||||
.menu-hide #apps {left: 40px;}
|
||||
.app-container.loading:before {background-color: rgba(0,0,0,.1);}
|
||||
.app-container.loading:before, .app-container.loading::after {transition-delay: 3s;}
|
||||
.app-container.loading.open-from-hidden {transition: 0s;}
|
||||
|
||||
#appsBar {position: fixed; left: 96px; bottom: 0; right: 0; height: 40px; z-index: 1012; background: #fff; border-top: 1px solid #eff1f7;}
|
||||
.menu-hide #appsBar {left: 40px;}
|
||||
|
||||
@@ -264,7 +264,11 @@
|
||||
}
|
||||
|
||||
/* Show page app and update iframe source */
|
||||
if(url) reloadApp(appCode, url, true);
|
||||
if (url)
|
||||
{
|
||||
app.$app.toggleClass('open-from-hidden', app.$app.is(':hidden'))
|
||||
reloadApp(appCode, url, true);
|
||||
}
|
||||
app.zIndex = openedAppZIndex++;
|
||||
app.$app.show().css('z-index', app.zIndex);
|
||||
|
||||
@@ -457,6 +461,7 @@
|
||||
|
||||
if(!notTriggerEvent) app.$app.trigger('reloadapp', app);
|
||||
|
||||
if(url) $(iframe.contentWindow.document.body).hide(); // Code for task #59703.
|
||||
app.$app.addClass('loading');
|
||||
if(app._loadTimer) clearTimeout(app._loadTimer);
|
||||
app._loadTimer = setTimeout(function()
|
||||
|
||||
@@ -20,6 +20,7 @@ $lang->jenkins->lblCreate = 'Create Jenkins Server';
|
||||
$lang->jenkins->desc = 'Description';
|
||||
$lang->jenkins->tokenFirst = 'Use token if not empty.';
|
||||
$lang->jenkins->tips = 'Cancel "Prevent Cross Site Request Forgery exploits" when using password.';
|
||||
$lang->jenkins->serverList = 'Server List';
|
||||
|
||||
$lang->jenkins->error = new stdclass();
|
||||
$lang->jenkins->error->linkedJob = 'Failed. This jenkins has associated with the compile.';
|
||||
|
||||
@@ -20,6 +20,7 @@ $lang->jenkins->lblCreate = 'Create Jenkins Server';
|
||||
$lang->jenkins->desc = 'Description';
|
||||
$lang->jenkins->tokenFirst = 'Use token if not empty.';
|
||||
$lang->jenkins->tips = 'Cancel "Prevent Cross Site Request Forgery exploits" when using password.';
|
||||
$lang->jenkins->serverList = 'Server List';
|
||||
|
||||
$lang->jenkins->error = new stdclass();
|
||||
$lang->jenkins->error->linkedJob = 'Failed. This jenkins has associated with the compile.';
|
||||
|
||||
@@ -20,6 +20,7 @@ $lang->jenkins->lblCreate = 'Cr閑r Serveur Jenkins';
|
||||
$lang->jenkins->desc = 'Description';
|
||||
$lang->jenkins->tokenFirst = 'Utiliser un Token si non vide.';
|
||||
$lang->jenkins->tips = 'Cancel "Prevent Cross Site Request Forgery exploits" when using password.';
|
||||
$lang->jenkins->serverList = 'Server List';
|
||||
|
||||
$lang->jenkins->error = new stdclass();
|
||||
$lang->jenkins->error->linkedJob = 'Failed. This jenkins has associated with the compile.';
|
||||
|
||||
@@ -17,3 +17,4 @@ $lang->jenkins->lblCreate = 'Tạo Jenkins Server';
|
||||
$lang->jenkins->desc = 'Mô tả';
|
||||
$lang->jenkins->tokenFirst = 'Sử dụng token nếu không trống.';
|
||||
$lang->jenkins->tips = 'Hủy "Ngăn chặn khai thác yêu cầu trang web giả mạo" khi sử dụng mật khẩu.';
|
||||
$lang->jenkins->serverList = 'Server List';
|
||||
|
||||
@@ -20,6 +20,7 @@ $lang->jenkins->lblCreate = '添加Jenkins服务器';
|
||||
$lang->jenkins->desc = '描述';
|
||||
$lang->jenkins->tokenFirst = 'Token不为空时,优先使用Token。';
|
||||
$lang->jenkins->tips = '使用密码时,请在Jenkins全局安全设置中禁用"防止跨站点请求伪造"选项。';
|
||||
$lang->jenkins->serverList = '服务器列表';
|
||||
|
||||
$lang->jenkins->error = new stdclass();
|
||||
$lang->jenkins->error->linkedJob = '删除失败,该Jenkins跟构建有关联,请取消关联或删除构建。';
|
||||
|
||||
@@ -20,6 +20,7 @@ $lang->jenkins->lblCreate = '添加Jenkins伺服器';
|
||||
$lang->jenkins->desc = '描述';
|
||||
$lang->jenkins->tokenFirst = 'Token不為空時,優先使用Token。';
|
||||
$lang->jenkins->tips = '使用密碼時,請在Jenkins全局安全設置中禁用"防止跨站點請求偽造"選項。';
|
||||
$lang->jenkins->serverList = '伺服器列表';
|
||||
|
||||
$lang->jenkins->error = new stdclass();
|
||||
$lang->jenkins->error->linkedJob = '刪除失敗,該Jenkins跟構建有關聯,請取消關聯或刪除構建。';
|
||||
|
||||
@@ -12,9 +12,13 @@
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php'; ?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php echo html::a($this->createLink('jenkins', 'browse'), "<span class='text'>{$lang->jenkins->serverList}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
<?php if(common::hasPriv('jenkins', 'create')) common::printLink('jenkins', 'create', "", "<i class='icon icon-plus'></i> " . $lang->jenkins->create, '', "class='btn btn-primary'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(empty($jenkinsList)):?>
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
@@ -24,7 +28,6 @@
|
||||
<?php endif;?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div id='mainContent' class='main-row'>
|
||||
<form class='main-table' id='ajaxForm' method='post'>
|
||||
|
||||
@@ -22,7 +22,7 @@ class job extends control
|
||||
public function __construct($moduleName = '', $methodName = '')
|
||||
{
|
||||
parent::__construct($moduleName, $methodName);
|
||||
$this->loadModel('ci')->setMenu();
|
||||
if($methodName != 'browse') $this->loadModel('ci')->setMenu();
|
||||
$this->projectID = isset($_GET['project']) ? $_GET['project'] : 0;
|
||||
}
|
||||
|
||||
@@ -36,17 +36,21 @@ class job extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function browse($orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
public function browse($repoID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
/* Set session. */
|
||||
$this->loadModel('ci')->setMenu($repoID);
|
||||
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$this->app->loadLang('compile');
|
||||
$this->view->jobList = $this->job->getList($orderBy, $pager);
|
||||
$this->view->jobList = $this->job->getList($repoID, $orderBy, $pager);
|
||||
|
||||
$this->view->title = $this->lang->ci->job . $this->lang->colon . $this->lang->job->browse;
|
||||
$this->view->position[] = $this->lang->ci->job;
|
||||
$this->view->position[] = $this->lang->job->browse;
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->pager = $pager;
|
||||
|
||||
@@ -167,7 +171,7 @@ class job extends control
|
||||
}
|
||||
|
||||
$this->loadModel('action')->create('job', $id, 'edited');
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse')));
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse', "repoID={$job->repo}")));
|
||||
}
|
||||
|
||||
$repo = $this->loadModel('repo')->getRepoByID($job->repo);
|
||||
|
||||
@@ -36,17 +36,21 @@ class jobModel extends model
|
||||
/**
|
||||
* Get job list.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @param string $engine
|
||||
* @param string $pipeline
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getList($orderBy = 'id_desc', $pager = null, $engine = '', $pipeline = '')
|
||||
public function getList($repoID = 0, $orderBy = 'id_desc', $pager = null, $engine = '', $pipeline = '')
|
||||
{
|
||||
return $this->dao->select('t1.*, t2.name as repoName, t3.name as jenkinsName')->from(TABLE_JOB)->alias('t1')
|
||||
->leftJoin(TABLE_REPO)->alias('t2')->on('t1.repo=t2.id')
|
||||
->leftJoin(TABLE_PIPELINE)->alias('t3')->on('t1.server=t3.id')
|
||||
->where('t1.deleted')->eq('0')
|
||||
->beginIF($repoID)->andWhere('t1.repo')->eq($repoID)->fi()
|
||||
->beginIF($engine)->andWhere('t1.engine')->eq($engine)->fi()
|
||||
->beginIF($pipeline)->andWhere('t1.pipeline')->eq($pipeline)->fi()
|
||||
->orderBy($orderBy)
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php echo html::a($this->createLink('job', 'browse'), "<span class='text'>{$lang->ci->task}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
<?php echo html::a($this->createLink('compile', 'browse'), "<span class='text'>{$lang->ci->history}</span>", '', "class='btn btn-link'");?>
|
||||
<?php echo html::a($this->createLink('job', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->task}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
<?php echo html::a($this->createLink('compile', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->history}</span>", '', "class='btn btn-link'");?>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
<?php if(common::hasPriv('job', 'create')) common::printLink('job', 'create', "", "<i class='icon icon-plus'></i> " . $lang->job->create, '', "class='btn btn-primary'");?>
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
<th></th>
|
||||
<td colspan="2" class='text-center form-actions'>
|
||||
<?php echo html::submitButton();?>
|
||||
<?php if(!isonlybody()) echo html::a(inlink('browse', ""), $lang->goback, '', 'class="btn btn-wide"');?>
|
||||
<?php if(!isonlybody()) echo html::a(inlink('browse', "repoID={$job->repo}"), $lang->goback, '', 'class="btn btn-wide"');?>
|
||||
<?php echo html::hidden('repoType', zget($repoTypes, $job->repo, 'Git'));?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
+51
-10
@@ -543,6 +543,17 @@ class kanban extends control
|
||||
|
||||
$this->loadModel('action')->create('kanbanLane', $laneID, 'created');
|
||||
|
||||
if($from == 'execution')
|
||||
{
|
||||
if(dao::isError()) return $this->sendError(dao::getError());
|
||||
|
||||
$execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all';
|
||||
$execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default';
|
||||
$kanbanData = $this->loadModel('kanban')->getRDKanban($kanbanID, $execLaneType, 'id_desc', $regionID, $execGroupBy);
|
||||
$kanbanData = json_encode($kanbanData);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => "parent.updateKanban($kanbanData, $regionID)"));
|
||||
}
|
||||
|
||||
$kanbanGroup = $this->kanban->getKanbanData($kanbanID, $regionID);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => 1, 'callback' => array('target' => 'parent', 'name' => 'updateRegion', 'params' => array($regionID, $kanbanGroup))));
|
||||
}
|
||||
@@ -625,6 +636,17 @@ class kanban extends control
|
||||
{
|
||||
$this->kanban->delete(TABLE_KANBANLANE, $laneID);
|
||||
|
||||
if($this->app->tab == 'execution')
|
||||
{
|
||||
if(dao::isError()) return $this->sendError(dao::getError());
|
||||
|
||||
$execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all';
|
||||
$execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default';
|
||||
$kanbanData = $this->loadModel('kanban')->getRDKanban($kanbanID, $execLaneType, 'id_desc', $regionID, $execGroupBy);
|
||||
$kanbanData = json_encode($kanbanData);
|
||||
return print("<script>parent.updateKanban($kanbanData, $regionID)</script>");
|
||||
}
|
||||
|
||||
$kanbanGroup = $this->kanban->getKanbanData($kanbanID, $regionID);
|
||||
$kanbanGroup = json_encode($kanbanGroup);
|
||||
return print("<script>parent.updateRegion($regionID, $kanbanGroup)</script>");
|
||||
@@ -650,7 +672,10 @@ class kanban extends control
|
||||
if(dao::isError()) $this->send(array('message' => dao::getError(), 'result' => 'fail'));
|
||||
|
||||
$this->loadModel('action')->create('kanbanColumn', $columnID, 'Created');
|
||||
$this->send(array('message' => $this->lang->saveSuccess, 'result' => 'success', 'locate' => 'parent'));
|
||||
|
||||
$region = $this->kanban->getRegionByID($column->region);
|
||||
$kanbanGroup = $this->kanban->getKanbanData($region->kanban, $region->id);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => array('target' => 'parent', 'name' => 'updateRegion', 'params' => array($column->region, $kanbanGroup))));
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->kanban->createColumn;
|
||||
@@ -662,6 +687,7 @@ class kanban extends control
|
||||
/**
|
||||
* Split column.
|
||||
*
|
||||
* @param int $columnID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -671,7 +697,11 @@ class kanban extends control
|
||||
{
|
||||
$this->kanban->splitColumn($columnID);
|
||||
if(dao::isError()) $this->send(array('message' => dao::getError(), 'result' => 'fail'));
|
||||
$this->send(array('message' => $this->lang->saveSuccess, 'result' => 'success', 'locate' => 'parent'));
|
||||
|
||||
$column = $this->kanban->getColumnById($columnID);
|
||||
$region = $this->kanban->getRegionByID($column->region);
|
||||
$kanbanGroup = $this->kanban->getKanbanData($region->kanban, $region->id);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => array('target' => 'parent', 'name' => 'updateRegion', 'params' => array($column->region, $kanbanGroup))));
|
||||
}
|
||||
|
||||
$this->display();
|
||||
@@ -711,8 +741,10 @@ class kanban extends control
|
||||
|
||||
$this->loadModel('action')->create('kanbancolumn', $columnID, 'archived');
|
||||
|
||||
if(isonlybody()) return print(js::reload('parent.parent'));
|
||||
return print(js::reload('parent'));
|
||||
$region = $this->kanban->getRegionByID($column->region);
|
||||
$kanbanGroup = $this->kanban->getKanbanData($region->kanban, $region->id);
|
||||
$kanbanGroup = json_encode($kanbanGroup);
|
||||
return print("<script>parent.updateRegion({$column->region}, $kanbanGroup)</script>");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -795,7 +827,10 @@ class kanban extends control
|
||||
|
||||
$this->dao->delete()->from(TABLE_KANBANCOLUMN)->where('id')->eq($columnID)->exec();
|
||||
|
||||
return print(js::reload('parent'));
|
||||
$region = $this->kanban->getRegionByID($column->region);
|
||||
$kanbanGroup = $this->kanban->getKanbanData($region->kanban, $region->id);
|
||||
$kanbanGroup = json_encode($kanbanGroup);
|
||||
return print("<script>parent.updateRegion({$column->region}, $kanbanGroup)</script>");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1484,18 +1519,24 @@ class kanban extends control
|
||||
if($from == 'RDKanban')
|
||||
{
|
||||
if(dao::isError()) return $this->sendError(dao::getError());
|
||||
|
||||
$regionID = $column->region;
|
||||
$execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all';
|
||||
$execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default';
|
||||
$kanbanData = $this->loadModel('kanban')->getRDKanban($executionID, $execLaneType, 'id_desc', $regionID, $execGroupBy);
|
||||
$kanbanData = json_encode($kanbanData);
|
||||
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => "parent.updateKanban($kanbanData, $regionID)"));
|
||||
}
|
||||
|
||||
$region = $this->kanban->getRegionByID($column->region);
|
||||
$kanbanGroup = $this->kanban->getKanbanData($region->kanban, $region->id);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => array('target' => 'parent', 'name' => 'updateRegion', 'params' => array($column->region, $kanbanGroup))));
|
||||
elseif($from == 'kanban')
|
||||
{
|
||||
$region = $this->kanban->getRegionByID($column->region);
|
||||
$kanbanGroup = $this->kanban->getKanbanData($region->kanban, $region->id);
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => array('target' => 'parent', 'name' => 'updateRegion', 'params' => array($column->region, $kanbanGroup))));
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent'));
|
||||
}
|
||||
}
|
||||
|
||||
$this->app->loadLang('story');
|
||||
|
||||
+13
-10
@@ -1302,16 +1302,19 @@ class kanbanModel extends model
|
||||
|
||||
if(empty($object)) continue;
|
||||
|
||||
$cardData['id'] = $object->id;
|
||||
$cardData['order'] = $cardOrder++;
|
||||
$cardData['pri'] = $object->pri ? $object->pri : '';
|
||||
$cardData['estimate'] = $cell->type == 'bug' ? '' : $object->estimate;
|
||||
$cardData['assignedTo'] = $object->assignedTo;
|
||||
$cardData['deadline'] = $cell->type == 'story' ? '' : $object->deadline;
|
||||
$cardData['severity'] = $cell->type == 'bug' ? $object->severity : '';
|
||||
$cardData['acl'] = 'open';
|
||||
$cardData['lane'] = $laneID;
|
||||
$cardData['column'] = $cell->column;
|
||||
$cardData['id'] = $object->id;
|
||||
$cardData['order'] = $cardOrder++;
|
||||
$cardData['pri'] = $object->pri ? $object->pri : '';
|
||||
$cardData['estimate'] = $cell->type == 'bug' ? '' : $object->estimate;
|
||||
$cardData['assignedTo'] = $object->assignedTo;
|
||||
$cardData['deadline'] = $cell->type == 'story' ? '' : $object->deadline;
|
||||
$cardData['severity'] = $cell->type == 'bug' ? $object->severity : '';
|
||||
$cardData['acl'] = 'open';
|
||||
$cardData['lane'] = $laneID;
|
||||
$cardData['column'] = $cell->column;
|
||||
$cardData['openedDate'] = $object->openedDate;
|
||||
$cardData['closedDate'] = $object->closedDate;
|
||||
$cardData['lastEditedDate'] = $object->lastEditedDate;
|
||||
|
||||
if($cell->type == 'task')
|
||||
{
|
||||
|
||||
@@ -674,8 +674,7 @@ class mr extends control
|
||||
{
|
||||
$this->product->setMenu($productID, 0);
|
||||
$this->config->bug->search['fields']['branch'] = $this->lang->product->branch;
|
||||
$branches = array('' => '') + $this->loadModel('branch')->getPairs($productID, 'noempty');
|
||||
$this->config->bug->search['params']['branch']['values'] = $branches;
|
||||
$this->config->bug->search['params']['branch']['values'] = array('' => '') + $this->loadModel('branch')->getPairs($productID, 'noempty');
|
||||
}
|
||||
$this->loadModel('search')->setSearchParams($this->config->bug->search);
|
||||
|
||||
|
||||
@@ -10,14 +10,6 @@
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<div class='btn-group' id="swapper">
|
||||
<?php
|
||||
$link = inlink('browse', 'repoID=%s');
|
||||
echo $this->repo->getReposMenu($repo, $objectID, $link, 'Gitlab');
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-toolBar pull-left">
|
||||
<?php foreach($lang->mr->statusList as $key => $label):?>
|
||||
<?php $active = $param == $key ? 'btn-active-text' : '';?>
|
||||
|
||||
@@ -18,3 +18,6 @@ td.delayed {background: #e84e0f !important; color: white;}
|
||||
.c-status, .c-date, .c-user-short {width: 70px;}
|
||||
.c-project {width: 130px;}
|
||||
#taskTable .assigned-title{width: 110px; padding-left: 29px;}
|
||||
|
||||
html[lang="en"] .c-date {width: 80px;}
|
||||
html[lang="en"] .c-user-short {width: 88px;}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<div class="cell<?php if($browseType == 'bysearch') echo ' show';?>" id="queryBox" data-module='workFeedback'></div>
|
||||
<?php if(empty($feedbacks)):?>
|
||||
<div class="table-empty-tip">
|
||||
<p><span class="text-muted"><?php echo $lang->noData;?></span></p>
|
||||
<p><span class="text-muted"><?php echo $lang->feedback->noFeedback;?></span></p>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<?php
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
<td><?php echo zget($lang->testcase->typeList, $case->type);?></td>
|
||||
<td><?php echo zget($users, $case->openedBy);?></td>
|
||||
<td><?php echo zget($users, $case->lastRunner);?></td>
|
||||
<td><?php if(!helper::isZeroDate($case->lastRunDate)) echo date(DT_MONTHTIME1, strtotime($case->lastRunDate));?></td>
|
||||
<td><?php echo helper::isZeroDate($case->lastRunDate) ? '' : substr($case->lastRunDate, 5, 11);?></td>
|
||||
<td class='<?php echo $case->lastRunResult;?>'><?php if($case->lastRunResult) echo $lang->testcase->resultList[$case->lastRunResult];?></td>
|
||||
<td class='<?php if(isset($run)) echo $run->status;?>'><?php echo $this->processStatus('testcase', $case);?></td>
|
||||
<td class='c-actions'>
|
||||
|
||||
@@ -86,6 +86,7 @@ class pipelineModel extends model
|
||||
$this->dao->insert(TABLE_PIPELINE)->data($pipeline)
|
||||
->batchCheck($this->config->pipeline->create->requiredFields, 'notempty')
|
||||
->batchCheck("url", 'URL')
|
||||
->check('name', 'unique', "`type` = '$type'")
|
||||
->autoCheck()
|
||||
->exec();
|
||||
if(dao::isError()) return false;
|
||||
@@ -116,6 +117,7 @@ class pipelineModel extends model
|
||||
$this->dao->update(TABLE_PIPELINE)->data($pipeline)
|
||||
->batchCheck($this->config->pipeline->edit->requiredFields, 'notempty')
|
||||
->batchCheck("url", 'URL')
|
||||
->check('name', 'unique', "`type` = '$type' and id <> $id")
|
||||
->autoCheck()
|
||||
->where('id')->eq($id)
|
||||
->exec();
|
||||
|
||||
@@ -269,7 +269,7 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $storyType == 'story' ? $lang->story->noStory : $lang->story->noRequirement;?></span>
|
||||
<?php if(common::canModify('product', $product) and common::hasPriv('story', 'create')):?>
|
||||
<?php if(common::canModify('product', $product) and common::hasPriv('story', 'create') and $browseType == 'allstory'):?>
|
||||
<?php echo html::a($this->createLink('story', 'create', "productID={$productID}&branch={$branch}&moduleID={$moduleID}&storyID=0&projectID=$projectID&bugID=0&planID=0&todoID=0&extra=&type=$storyType"), "<i class='icon icon-plus'></i> " . $lang->story->create, '', "class='btn btn-info' data-app='$from'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
<?php echo zget($accountPairs, $action->actor);?>
|
||||
<span class='label-action'><?php echo $action->actionLabel;?></span>
|
||||
<span class="text"><?php echo $action->objectLabel;?></span>
|
||||
<span class="label label-id"><?php echo $action->objectID;?></span>
|
||||
<span class="label label-id"><?php echo ($action->objectType == 'module' and strpos(',created,edited,moved,', "$action->action") !== false) ? trim($action->extra, ',') : $action->objectID;?></span>
|
||||
<?php if($action->objectName) echo html::a($action->objectLink, $action->objectName);?>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->productplan->noPlan;?></span>
|
||||
<?php if(common::canModify('product', $product) and common::hasPriv('productplan', 'create')):?>
|
||||
<?php if(common::canModify('product', $product) and common::hasPriv('productplan', 'create') and $browseType == "all"):?>
|
||||
<?php echo html::a($this->createLink('productplan', 'create', "productID=$product->id&branch=$branch"), "<i class='icon icon-plus'></i> " . $lang->productplan->create, '', "class='btn btn-info'");?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
|
||||
@@ -35,7 +35,7 @@ js::set('browseType', $browseType);
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $lang->project->empty;?></span>
|
||||
<?php common::printLink('project', 'createGuide', "programID=$programID", '<i class="icon icon-plus"></i> ' . $lang->project->create, '', 'class="btn btn-info btn-wide " data-toggle="modal" data-target="#guideDialog"');?>
|
||||
<?php if($browseType == 'all') common::printLink('project', 'createGuide', "programID=$programID", '<i class="icon icon-plus"></i> ' . $lang->project->create, '', 'class="btn btn-info btn-wide " data-toggle="modal" data-target="#guideDialog"');?>
|
||||
</p>
|
||||
</div>
|
||||
<?php else:?>
|
||||
|
||||
@@ -11,10 +11,8 @@ function addItem(obj)
|
||||
$(obj).closest('tr').after('<tr class="addedItem">' + item + '</tr>');
|
||||
var newItem = $('#names' + itemIndex).closest('tr');
|
||||
newItem.find('.form-date').datepicker();
|
||||
$("#output" + itemIndex).chosen();
|
||||
$("#PM_i__chosen").remove();
|
||||
$("#PM" + itemIndex).chosen();
|
||||
$("#output_i__chosen").remove();
|
||||
$("#output" + itemIndex).picker();
|
||||
$("#PM" + itemIndex).picker();
|
||||
itemIndex ++;
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
<?php foreach($stages as $stage):?>
|
||||
<tr>
|
||||
<td><input type='text' name='names[<?php echo $i;?>]' id='names<?php echo $i;?>' value='<?php echo $stage->name;?>' class='form-control' /></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, '', "class='form-control chosen'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, '', "class='form-control picker-select'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'percent', ' hidden') . zget($requiredFields, 'percent', '', ' required');?>>
|
||||
<div class='input-group'>
|
||||
<input type='text' name='percents[<?php echo $i;?>]' id='percent<?php echo $i;?>' value='<?php echo $stage->percent;?>' class='form-control'/>
|
||||
@@ -89,15 +89,15 @@
|
||||
</td>
|
||||
<td class='<?php echo $hideAttribute?> <?php echo zget($visibleFields, 'attribute', ' hidden') . zget($requiredFields, 'attribute', '', ' required');?>'><?php echo html::select("attributes[$i]", $lang->stage->typeList, $stage->type, "class='form-control'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'acl', ' hidden') . zget($requiredFields, 'acl', '', ' required');?>'><?php echo html::select("acl[$i]", $lang->execution->aclList, 'open', "class='form-control' $class");?></td>
|
||||
<td <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, 0);?></td>
|
||||
<td class='text-center' <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, 0);?></td>
|
||||
<td><input type='text' name='begin[<?php echo $i;?>]' id='begin<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<td><input type='text' name='end[<?php echo $i;?>]' id='end<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realBegan', ' hidden') . zget($requiredFields, 'realBegan', '', ' required');?>><input type='text' name='realBegan[<?php echo $i;?>]' id='realBegan<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realEnd', ' hidden') . zget($requiredFields, 'realEnd', '', ' required');?>><input type='text' name='realEnd[<?php echo $i;?>]' id='realEnd<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<?php if($this->config->edition == 'max'):?>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, '', "class='form-control chosen' multiple");?></td>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, '', "class='form-control picker-select' data-drop-width='auto' multiple");?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-actions text-left'>
|
||||
<td class='c-actions text-center'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
|
||||
</td>
|
||||
@@ -111,7 +111,7 @@
|
||||
<?php echo html::hidden("planIDList[$i]", $plan->id);?>
|
||||
<tr>
|
||||
<td><input type='text' name="names[<?php echo $i;?>]" id='names<?php echo $i;?>' value='<?php echo $plan->name;?>' class='form-control' /></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, $plan->PM, "class='form-control chosen'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, $plan->PM, "class='form-control picker-select'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'percent', ' hidden') . zget($requiredFields, 'percent', '', ' required');?>>
|
||||
<div class='input-group'>
|
||||
<input type='text' name='percents[<?php echo $i;?>]' id='percent<?php echo $i;?>' value='<?php echo $plan->percent;?>' class='form-control' />
|
||||
@@ -120,17 +120,18 @@
|
||||
</td>
|
||||
<td class='<?php echo $hideAttribute?> <?php echo zget($visibleFields, 'attribute', ' hidden') . zget($requiredFields, 'attribute', '', ' required');?>'><?php echo html::select("attributes[$i]", $lang->stage->typeList, $plan->attribute, "class='form-control'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'acl', ' hidden') . zget($requiredFields, 'acl', '', ' required');?>><?php echo html::select("acl[$i]", $lang->execution->aclList, $plan->acl, "class='form-control' $class");?></td>
|
||||
<td <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, $plan->milestone, $disabled);?></td>
|
||||
<td class='text-center' <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, $plan->milestone, $disabled);?></td>
|
||||
<td><input type='text' name='begin[<?php echo $i;?>] ' id='begin<?php echo $i;?>' value='<?php echo $plan->begin;?>' class='form-control form-date' /></td>
|
||||
<td><input type='text' name='end[<?php echo $i;?>]' id='end<?php echo $i;?>' value='<?php echo $plan->end;?>' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realBegan', ' hidden') . zget($requiredFields, 'realBegan', '', ' required');?>><input type='text' name='realBegan[<?php echo $i;?>] ' id='realBegan<?php echo $i;?>' value='<?php echo $plan->realBegan;?>' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realEnd', ' hidden') . zget($requiredFields, 'realEnd', '', ' required');?>><input type='text' name='realEnd[<?php echo $i;?>]' id='realEnd<?php echo $i;?>' value='<?php echo $plan->realEnd;?>' class='form-control form-date' /></td>
|
||||
<?php if($this->config->edition == 'max'):?>
|
||||
<?php $option = empty($plan->output) ? 0 : explode(',', $plan->output);?>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, $option, "class='form-control chosen' multiple");?></td>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, $option, "class='form-control picker-select' data-drop-width='auto' multiple");?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-actions text-left'>
|
||||
<td class='c-actions text-center'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='invisible btn btn-link'><i class='icon icon-close'></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php $i ++;?>
|
||||
@@ -139,7 +140,7 @@
|
||||
<?php for($j = 0; $j < 5; $j ++):?>
|
||||
<tr class='addedItem'>
|
||||
<td><input type='text' name='names[<?php echo $i;?>]' id='names<?php echo $i;?>' value='' class='form-control' /></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, '', "class='form-control chosen'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, '', "class='form-control picker-select'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'percent', ' hidden') . zget($requiredFields, 'percent', '', ' required');?>>
|
||||
<div class='input-group'>
|
||||
<input type='text' name='percents[<?php echo $i;?>]' id='percent<?php echo $i;?>' value='' class='form-control' />
|
||||
@@ -148,15 +149,15 @@
|
||||
</td>
|
||||
<td class='<?php echo $hideAttribute?> <?php echo zget($visibleFields, 'attribute', ' hidden') . zget($requiredFields, 'attribute', '', ' required');?>'><?php echo html::select("attributes[$i]", $lang->stage->typeList, '', "class='form-control'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'acl', ' hidden') . zget($requiredFields, 'acl', '', ' required');?>><?php echo html::select("acl[$i]", $lang->execution->aclList, 'open', "class='form-control' $class");?></td>
|
||||
<td <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, 0);?></td>
|
||||
<td class='text-center' <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, 0);?></td>
|
||||
<td><input type='text' name='begin[<?php echo $i;?>] ' id='begin<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<td><input type='text' name='end[<?php echo $i;?>]' id='end<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realBegan', ' hidden') . zget($requiredFields, 'realBegan', '', ' required');?>><input type='text' name='realBegan[<?php echo $i;?>] ' id='realBegan<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realEnd', ' hidden') . zget($requiredFields, 'realEnd', '', ' required');?>><input type='text' name='realEnd[<?php echo $i;?>]' id='realEnd<?php echo $i;?>' value='' class='form-control form-date' /></td>
|
||||
<?php if($this->config->edition == 'max'):?>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, '', "class='form-control chosen' multiple");?></td>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, '', "class='form-control picker-select' data-drop-width='auto' multiple");?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-actions text-left'>
|
||||
<td class='c-actions text-center'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
|
||||
</td>
|
||||
@@ -180,7 +181,7 @@
|
||||
<table class='hidden'>
|
||||
<tr id='addItem' class='hidden'>
|
||||
<td><input type='text' name='<?php echo "names[$i]";?>' id='names<?php echo $i;?>' class='form-control' /></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, '', "class='form-control chosen' id='PM$i'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'PM', ' hidden') . zget($requiredFields, 'PM', '', ' required');?>><?php echo html::select("PM[$i]", $PMUsers, '', "class='form-control' id='PM$i'");?></td>
|
||||
<?php echo html::hidden("planIDList[$i]", 0);?>
|
||||
<td <?php echo zget($visibleFields, 'percent', ' hidden') . zget($requiredFields, 'percent', '', ' required');?>>
|
||||
<div class='input-group'>
|
||||
@@ -190,15 +191,15 @@
|
||||
</td>
|
||||
<td class='<?php echo $hideAttribute?> <?php echo zget($visibleFields, 'attribute', ' hidden') . zget($requiredFields, 'attribute', '', ' required');?>'><?php echo html::select("attributes[$i]", $lang->stage->typeList, '', "class='form-control'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'acl', ' hidden') . zget($requiredFields, 'acl', '', ' required');?>><?php echo html::select("acl[$i]", $lang->execution->aclList, 'open', "class='form-control' $class");?></td>
|
||||
<td <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, 0);?></td>
|
||||
<td class='text-center' <?php echo zget($visibleFields, 'milestone', ' hidden') . zget($requiredFields, 'milestone', '', ' required');?>><?php echo html::radio("milestone[$i]", $lang->programplan->milestoneList, 0);?></td>
|
||||
<td><input type='text' name='<?php echo "begin[$i]";?>' id='begin<?php echo $i;?>' class='form-control form-date' /></td>
|
||||
<td><input type='text' name='<?php echo "end[$i]";?>' id='end<?php echo $i;?>' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realBegan', ' hidden') . zget($requiredFields, 'realBegan', '', ' required');?>><input type='text' name='<?php echo "realBegan[$i]";?>' id='realBegan<?php echo $i;?>' class='form-control form-date' /></td>
|
||||
<td <?php echo zget($visibleFields, 'realEnd', ' hidden') . zget($requiredFields, 'realEnd', '', ' required');?>><input type='text' name='<?php echo "realEnd[$i]";?>' id='realEnd<?php echo $i;?>' class='form-control form-date' /></td>
|
||||
<?php if($this->config->edition == 'max'):?>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, '', "class='form-control chosen ' multiple");?></td>
|
||||
<td><?php echo html::select("output[$i][]", $documentList, '', "class='form-control' data-drop-width='auto' multiple");?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-actions'>
|
||||
<td class='c-actions text-center'>
|
||||
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
|
||||
</td>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user