diff --git a/db/update16.5.sql b/db/update16.5.sql
index 1414880be7..13f6161936 100644
--- a/db/update16.5.sql
+++ b/db/update16.5.sql
@@ -78,3 +78,9 @@ ALTER TABLE `zt_action` MODIFY COLUMN `product` text NOT NULL;
ALTER TABLE `zt_effort` MODIFY COLUMN `product` text NOT NULL;
ALTER TABLE `zt_stakeholder` ADD INDEX objectID(`objectID`);
UPDATE `zt_api` SET response = REPLACE(response, 'assgnedDate', 'assignedDate');
+
+REPLACE INTO `zt_zoutput` (`id`, `activity`, `name`, `content`, `optional`, `status`, `createdBy`, `createdDate`, `editedBy`, `order`, `deleted`) VALUES
+(71,47,'禅道缺陷记录','','','','admin','2020-01-09 14:22:52','',355,'0'),
+(78,52,'禅道缺陷记录','','','','admin','2020-01-09 14:22:52','',390,'0'),
+(89,58,'禅道缺陷跟踪系统记录项','','yes','','admin','2020-01-09 14:25:16','',445,'0'),
+(99,64,'禅道缺陷记录项','','yes','','admin','2020-01-09 14:26:52','',495,'0');
diff --git a/db/zentao.sql b/db/zentao.sql
index 6690d04830..892cb37ec5 100644
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -13058,14 +13058,14 @@ REPLACE INTO `zt_zoutput` (`id`, `activity`, `name`, `content`, `optional`, `sta
(68,44,'模块代码','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',340,'0'),
(69,45,'《代码质量检查记录单》','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',345,'0'),
(70,46,'《单元测试缺陷统计分析报告》','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',350,'0'),
-(71,47,'bugzilla缺陷记录','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',355,'0'),
+(71,47,'禅道缺陷记录','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',355,'0'),
(72,48,'《系统集成说明书》','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',360,'0'),
(73,49,'《集成测试用例》','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',365,'0'),
(74,50,'《评审通知》 ','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',370,'0'),
(75,50,'《同行评审准备表》 ','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',375,'0'),
(76,50,'《同行评审报告》','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',380,'0'),
(77,51,'《集成测试报告》','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',385,'0'),
-(78,52,'bugzilla缺陷记录','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',390,'0'),
+(78,52,'禅道缺陷记录','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',390,'0'),
(79,52,'《用户操作手册》 ','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',395,'0'),
(80,52,'《安装手册》','','','','admin','2020-01-09 14:22:52','','0000-00-00 00:00:00',400,'0'),
(81,54,'《系统测试计划》','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',405,'0'),
@@ -13076,7 +13076,7 @@ REPLACE INTO `zt_zoutput` (`id`, `activity`, `name`, `content`, `optional`, `sta
(86,57,'《评审通知》','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',430,'0'),
(87,57,'《同行评审准备表》','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',435,'0'),
(88,57,'《同行评审报告》','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',440,'0'),
-(89,58,'bugzilla缺陷跟踪系统记录项','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',445,'0'),
+(89,58,'禅道缺陷跟踪系统记录项','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',445,'0'),
(90,58,'《系统测试分析报告》','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',450,'0'),
(91,58,'《缺陷统计分析报告》','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',455,'0'),
(92,59,'《产品打包清单》','','yes','','admin','2020-01-09 14:25:16','','0000-00-00 00:00:00',460,'0'),
@@ -13086,7 +13086,7 @@ REPLACE INTO `zt_zoutput` (`id`, `activity`, `name`, `content`, `optional`, `sta
(96,62,'《工作记录单》','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',480,'0'),
(97,62,'《交接签收单》','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',485,'0'),
(98,62,'《安装调试信息》','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',490,'0'),
-(99,64,'bugzilla缺陷记录项','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',495,'0'),
+(99,64,'禅道缺陷记录项','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',495,'0'),
(100,64,'会议纪要等文档','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',500,'0'),
(101,65,'《交接验收单》','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',505,'0'),
(102,65,'《客户验收报告》','','yes','','admin','2020-01-09 14:26:52','','0000-00-00 00:00:00',510,'0'),
diff --git a/extension/lite/common/ext/lang/en/lite.php b/extension/lite/common/ext/lang/en/lite.php
index f8f60da3e7..c0b729fa71 100644
--- a/extension/lite/common/ext/lang/en/lite.php
+++ b/extension/lite/common/ext/lang/en/lite.php
@@ -202,6 +202,8 @@ $lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->sec
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
+
+if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "License|admin|license'", 'alias' => 'license');
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
if($config->edition != 'open')
diff --git a/extension/lite/common/ext/lang/zh-cn/lite.php b/extension/lite/common/ext/lang/zh-cn/lite.php
index c49dd6958c..4771e9f0d1 100644
--- a/extension/lite/common/ext/lang/zh-cn/lite.php
+++ b/extension/lite/common/ext/lang/zh-cn/lite.php
@@ -202,6 +202,8 @@ $lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->sec
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
+
+if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "授权信息|admin|license'", 'alias' => 'license');
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
if($config->edition != 'open')
diff --git a/lib/filter/filter.class.php b/lib/filter/filter.class.php
index ebedf6292b..623386462c 100644
--- a/lib/filter/filter.class.php
+++ b/lib/filter/filter.class.php
@@ -20,6 +20,19 @@ helper::import(dirname(dirname(__FILE__)) . '/base/filter/filter.class.php');
*/
class validater extends baseValidater
{
+ /**
+ * 检查文件名。
+ * Check file name.
+ *
+ * @param string $var
+ * @static
+ * @access public
+ * @return bool
+ */
+ public static function checkFileName($var)
+ {
+ return !preg_match('/>+|<+/', $var);
+ }
}
/**
diff --git a/module/branch/model.php b/module/branch/model.php
index ff54cb859b..6e87a07734 100644
--- a/module/branch/model.php
+++ b/module/branch/model.php
@@ -753,7 +753,9 @@ class branchModel extends model
->andWhere('product')->eq($productID)
->fetchGroup('project');
- $this->dao->delete()->from(TABLE_PROJECTPRODUCT)->where('branch')->in($mergedBranches . ",$targetBranch")->exec();
+ $this->dao->delete()->from(TABLE_PROJECTPRODUCT)->where('branch')->in($mergedBranches . ",$targetBranch")
+ ->andWhere('product')->eq($productID)
+ ->exec();
foreach($linkedProject as $projectID => $projectProducts)
{
$plan = 0;
diff --git a/module/bug/view/batchcreate.html.php b/module/bug/view/batchcreate.html.php
old mode 100644
new mode 100755
index f83e38018b..f0f4267291
--- a/module/bug/view/batchcreate.html.php
+++ b/module/bug/view/batchcreate.html.php
@@ -69,7 +69,11 @@
'>bug->keywords;?> |
bug->getFlowExtendFields();
- foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ foreach($extendFields as $extendField)
+ {
+ $required = strpos(",$extendField->rules,", ',1,') !== false ? 'required' : '';
+ echo "{$extendField->name} | ";
+ }
?>
@@ -125,11 +129,13 @@
' style='overflow:visible'> bug->osList, $os, "class='form-control chosen'");?> |
' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> |
'> |
- loadModel('flow');
+ foreach($extendFields as $extendField)
{
$object = new stdclass();
$object->{$extendField->field} = $extendField->default;
- echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $object, $extendField->field . "[$i]") . " | ";
+ echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, $object, $extendField->field . "[$i]") . " | ";
}
?>
@@ -179,11 +185,12 @@
' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> |
'> |
loadModel('flow');
foreach($extendFields as $extendField)
{
$object = new stdclass();
$object->{$extendField->field} = $extendField->default;
- echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[$i]") . " | ";
+ echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, $object, $extendField->field . "[$i]") . " | ";
}
?>
@@ -232,11 +239,12 @@
' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> |
'> |
loadModel('flow');
foreach($extendFields as $extendField)
{
$object = new stdclass();
$object->{$extendField->field} = $extendField->default;
- echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[%s]") . " | ";
+ echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, $object, $extendField->field . "[%s]") . " | ";
}
?>
diff --git a/module/common/model.php b/module/common/model.php
index 7ca52cefe4..5aaa48b24c 100644
--- a/module/common/model.php
+++ b/module/common/model.php
@@ -123,9 +123,15 @@ class commonModel extends model
$projectID = $execution->project;
$project = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch();
+ $today = helper::today();
if($project->status == 'wait')
{
- $this->dao->update(TABLE_PROJECT)->set('status')->eq('doing')->where('id')->eq($projectID)->exec();
+ $this->dao->update(TABLE_PROJECT)
+ ->set('status')->eq('doing')
+ ->beginIf(helper::isZeroDate($project->realBegan))->set('realBegan')->eq($today)->fi()
+ ->where('id')->eq($projectID)
+ ->exec();
+
$this->loadModel('action')->create('project', $projectID, 'syncproject');
}
return $project;
@@ -2245,9 +2251,17 @@ EOD;
}
else
{
- if(helper::isAjaxRequest()) die(json_encode(array('result' => false, 'message' => $this->lang->error->loginTimeout))); // Fix bug #14478.
+ $uri = $this->app->getURI(true);
+ if($module == 'message' and $method == 'ajaxgetmessage')
+ {
+ $uri = helper::createLink('my');
+ }
+ elseif(helper::isAjaxRequest())
+ {
+ die(json_encode(array('result' => false, 'message' => $this->lang->error->loginTimeout))); // Fix bug #14478.
+ }
- $referer = helper::safe64Encode($this->app->getURI(true));
+ $referer = helper::safe64Encode($uri);
print(js::locate(helper::createLink('user', 'login', "referer=$referer")));
helper::end();
}
diff --git a/module/company/lang/en.php b/module/company/lang/en.php
index 7839b64d2a..54be6c1852 100644
--- a/module/company/lang/en.php
+++ b/module/company/lang/en.php
@@ -32,7 +32,7 @@ $lang->company->deleted = 'Deleted';
$lang->company->product = $lang->productCommon;
$lang->company->project = 'Project';
-$lang->company->execution = 'Execution';
+$lang->company->execution = $lang->executionCommon;
$lang->company->user = 'User';
$lang->company->empty = 'No Dynamic';
diff --git a/module/company/lang/zh-cn.php b/module/company/lang/zh-cn.php
index 8e45b8144c..23b1c0e37a 100644
--- a/module/company/lang/zh-cn.php
+++ b/module/company/lang/zh-cn.php
@@ -32,7 +32,7 @@ $lang->company->deleted = '已删除';
$lang->company->product = $lang->productCommon;
$lang->company->project = '项目';
-$lang->company->execution = '执行';
+$lang->company->execution = $lang->executionCommon;
$lang->company->user = '用户';
$lang->company->empty = '暂时没有动态';
diff --git a/module/doc/css/view.css b/module/doc/css/view.css
index 30c81239a0..10db9ec13d 100644
--- a/module/doc/css/view.css
+++ b/module/doc/css/view.css
@@ -20,3 +20,4 @@
.doc-fullscreen .fullscreen-btn > .icon-fullscreen:before {content: '\e972';}
.right-icon a {color: #1183fb;}
.cell th,td {word-break: break-word;}
+.main-actions {width: 100% !important;}
diff --git a/module/doc/js/objectlibs.js b/module/doc/js/objectlibs.js
index 080e036379..a661bf9b5d 100644
--- a/module/doc/js/objectlibs.js
+++ b/module/doc/js/objectlibs.js
@@ -87,6 +87,8 @@ function fullScreen()
whenFailEnterFullscreen(error);
}
}
+
+ $('.main-col iframe').css('min-height', $(window).height() + 'px');
}
/**
@@ -102,6 +104,7 @@ function exitFullScreen()
$('#content .actions').removeClass('hidden');
$('#content .file-image .right-icon').removeClass('hidden');
$('#content .detail').eq(1).removeClass('hidden');
+ $('.main-col iframe').css('min-height', '380px');
$.cookie('isFullScreen', 0);
}
diff --git a/module/job/model.php b/module/job/model.php
index c1387806d6..00d56de7d3 100644
--- a/module/job/model.php
+++ b/module/job/model.php
@@ -457,12 +457,12 @@ class jobModel extends model
if($job->triggerType == 'tag')
{
- $lastTag = $this->getLastTagByRepo($repo, $job);
- if($lastTag)
+ $job->lastTag = $this->getLastTagByRepo($repo, $job);
+
+ if($job->lastTag)
{
- $build->tag = $lastTag;
- $job->lastTag = $lastTag;
- $this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($job->id)->exec();
+ $build->tag = $job->lastTag;
+ $this->dao->update(TABLE_JOB)->set('lastTag')->eq($job->lastTag)->where('id')->eq($job->id)->exec();
}
}
diff --git a/module/mr/control.php b/module/mr/control.php
index a24ac9d82e..497ba80482 100644
--- a/module/mr/control.php
+++ b/module/mr/control.php
@@ -422,11 +422,13 @@ class mr extends control
}
}
- $this->view->repo = $this->loadModel('repo')->getRepoByID($MR->repoID);
- $this->view->repoID = $MR->repoID;
- $this->view->diffs = $diffs;
- $this->view->encoding = $encoding;
- $this->view->arrange = $arrange;
+ $this->view->repo = $this->loadModel('repo')->getRepoByID($MR->repoID);
+ $this->view->repoID = $MR->repoID;
+ $this->view->diffs = $diffs;
+ $this->view->encoding = $encoding;
+ $this->view->arrange = $arrange;
+ $this->view->sourceBranch = $MR->sourceBranch;
+ $this->view->targetBranch = $MR->targetBranch;
$this->display();
}
diff --git a/module/mr/model.php b/module/mr/model.php
index 07d84f3532..712740bb74 100644
--- a/module/mr/model.php
+++ b/module/mr/model.php
@@ -1177,7 +1177,6 @@ class mrModel extends model
$bugInfo['content'] = $data->steps;
$bugInfo['title'] = $data->title;
$bugInfo['objectType'] = 'bug';
- $bugInfo['entry'] = $data->entry;
return $bugInfo;
}
diff --git a/module/mr/view/header.review.html.php b/module/mr/view/header.review.html.php
index 1b6201d186..d6e2032306 100644
--- a/module/mr/view/header.review.html.php
+++ b/module/mr/view/header.review.html.php
@@ -38,7 +38,8 @@ if($repoExecution)
}
$reviews = $this->mr->getReview($repoID, $MR->id);
-$v1 = isset($oldRevision) ? $oldRevision : 0;
+$v1 = str_replace('-', '*', $sourceBranch);
+$v2 = str_replace('-', '*', $targetBranch);
$this->loadModel('repo');
@@ -46,7 +47,7 @@ $taskModuleSelect = html::select('taskModule', $taskModules, $taskRepoModule,
$taskUserSelect = html::select('taskAssignedTo', $taskMembers, '', 'class="form-control chosen"');
$taskExecutionSelect = html::select('taskExecution', $taskExecutions, $repoExecution, 'class="form-control chosen" onchange="changeExecution(this)"');
-$reviewUrl = $this->createLink('mr', 'addReview', "repoID=$repoID&mr={$MR->id}&v1=$v1&v2=");
+$reviewUrl = $this->createLink('mr', 'addReview', "repoID=$repoID&mr={$MR->id}&v1=$v1&v2=$v2");
$productSelect = html::select('product', $products, $repoProduct, 'class="product form-control chosen" onchange="changeProduct(this)"');
$branches = $this->loadModel('branch')->getPairs($repoProduct);
$moduleSelect = html::select('module', $modules, $bugRepoModule, 'class="form-control chosen"');
@@ -153,7 +154,6 @@ js::set('revision', '');
repo->submit, '', 'btn btn-wide btn-primary reviewSubmit');?>
cancel, "onclick='hiddenForm()'", 'btn btn-wide');?>
-
|
diff --git a/module/my/control.php b/module/my/control.php
index ea6d26055d..96593fcdb5 100644
--- a/module/my/control.php
+++ b/module/my/control.php
@@ -857,7 +857,7 @@ EOF;
$this->view->browseType = $browseType;
$this->view->ncs = $ncList;
$this->view->users = $this->loadModel('user')->getPairs('noclosed|noletter');
- $this->view->projects = $this->loadModel('project')->getPairsByProgram(0);
+ $this->view->projects = $this->loadModel('project')->getPairsByProgram();
$this->view->pager = $pager;
$this->view->orderBy = $orderBy;
$this->view->mode = 'nc';
diff --git a/module/product/css/view.css b/module/product/css/view.css
index 71d10b732b..f8860cc652 100644
--- a/module/product/css/view.css
+++ b/module/product/css/view.css
@@ -9,3 +9,4 @@ td.acl {white-space: nowrap;}
.c-openedBy ,.c-acl ,.c-prs ,.c-common {width:110px !important;}
.c-bugs ,.c-type {width:120px !important;}
.c-release {padding-right: 20px !important;}
+.c-feedback {padding-right: 20px !important;}
diff --git a/module/product/view/view.html.php b/module/product/view/view.html.php
index 21cf06752c..e05d64fdba 100644
--- a/module/product/view/view.html.php
+++ b/module/product/view/view.html.php
@@ -37,7 +37,7 @@
-
+
product->manager;?>
diff --git a/module/programplan/model.php b/module/programplan/model.php
index 89fe560112..dcfe5571ea 100644
--- a/module/programplan/model.php
+++ b/module/programplan/model.php
@@ -200,8 +200,8 @@ class programplanModel extends model
if($data->start_date) $data->start_date = date('d-m-Y', strtotime($data->start_date));
if($data->start_date == '' or $data->endDate == '') $data->duration = 0;
- $datas['data'][] = $data;
- $stageIndex[] = array('planID' => $plan->id, 'progress' => array('totalConsumed' => 0, 'totalReal' => 0));
+ $datas['data'][] = $data;
+ $stageIndex[$plan->id] = array('planID' => $plan->id, 'parent' => $plan->parent, 'progress' => array('totalConsumed' => 0, 'totalReal' => 0));
}
$taskSign = "[ T ] ";
@@ -272,9 +272,15 @@ class programplanModel extends model
{
$stageIndex[$index]['progress']['totalConsumed'] += $task->consumed;
$stageIndex[$index]['progress']['totalReal'] += ($task->left + $task->consumed);
+
+ $stageIndex[$stage['parent']]['progress']['totalConsumed'] += $task->consumed;
+ $stageIndex[$stage['parent']]['progress']['totalReal'] += ($task->left + $task->consumed);
}
}
}
+
+ /* Ceturns all the values from the stageIndex and indexes the array numerically. */
+ $stageIndex = array_values($stageIndex);
/* Calculate the progress of the phase. */
foreach($stageIndex as $index => $stage)
diff --git a/module/project/model.php b/module/project/model.php
index 0ae9c93ae7..ca49af809e 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -556,6 +556,7 @@ class projectModel extends model
->andWhere('deleted')->eq(0)
->beginIF($projectIdList)->andWhere('id')->in($projectIdList)->fi()
->beginIF(!$this->app->user->admin and $mode != 'all')->andWhere('id')->in($this->app->user->view->projects)->fi()
+ ->beginIF($mode != 'all' and !empty($mode))->andWhere('model')->in($mode)->fi()
->fetchPairs('id', 'name');
}
@@ -1946,7 +1947,6 @@ class projectModel extends model
public function getTeamMemberPairs($projectID)
{
$project = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch();
-
if(empty($project)) return array();
$type = 'project';
diff --git a/module/project/view/create.html.php b/module/project/view/create.html.php
old mode 100644
new mode 100755
index 430b55fc30..67d56df7b2
--- a/module/project/view/create.html.php
+++ b/module/project/view/create.html.php
@@ -92,7 +92,6 @@
| project->endList , '', "onclick='computeEndDate(this.value)'");?> |
-
| execution->days;?> |
@@ -102,7 +101,6 @@
| | |
-
| project->manageProducts;?> |
diff --git a/module/project/view/edit.html.php b/module/project/view/edit.html.php
old mode 100644
new mode 100755
index fe4faa64e4..c221585ef0
--- a/module/project/view/edit.html.php
+++ b/module/project/view/edit.html.php
@@ -103,7 +103,6 @@
end == LONG_TIME ? 999 : (strtotime($project->end) - strtotime($project->begin)) / 3600 / 24 + 1;?>
| project->endList , $deltaValue, "onclick='computeEndDate(this.value)'");?> |
- model == 'scrum'):?>
end == LONG_TIME) echo "class='hidden'";?>>
| project->days;?> |
@@ -115,7 +114,6 @@
| |
|
-
| project->manageProducts;?> |
diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php
index e0303c441a..e93141a2b5 100644
--- a/module/story/lang/zh-cn.php
+++ b/module/story/lang/zh-cn.php
@@ -137,8 +137,8 @@ $lang->story->comment = '备注';
$lang->story->children = "子需求";
$lang->story->childrenAB = "子";
$lang->story->linkStories = "相关{$lang->SRCommon}";
-$lang->story->childStories = "细分{$lang->SRCommon}";
-$lang->story->duplicateStory = "重复{$lang->SRCommon}ID";
+$lang->story->childStories = "细分需求";
+$lang->story->duplicateStory = "重复需求ID";
$lang->story->reviewResult = '评审意见';
$lang->story->preVersion = '之前版本';
$lang->story->keywords = '关键词';
diff --git a/module/story/lang/zh-tw.php b/module/story/lang/zh-tw.php
index 723d3bbf03..ce380f2a41 100644
--- a/module/story/lang/zh-tw.php
+++ b/module/story/lang/zh-tw.php
@@ -136,8 +136,8 @@ $lang->story->comment = '備註';
$lang->story->children = "子需求";
$lang->story->childrenAB = "子";
$lang->story->linkStories = "相關{$lang->SRCommon}";
-$lang->story->childStories = "細分{$lang->SRCommon}";
-$lang->story->duplicateStory = "重複{$lang->SRCommon}ID";
+$lang->story->childStories = "細分需求";
+$lang->story->duplicateStory = "重複需求ID";
$lang->story->reviewResult = '評審意見';
$lang->story->preVersion = '之前版本';
$lang->story->keywords = '關鍵詞';
diff --git a/module/story/view/batchcreate.html.php b/module/story/view/batchcreate.html.php
old mode 100644
new mode 100755
index 67321db43c..19525945f6
--- a/module/story/view/batchcreate.html.php
+++ b/module/story/view/batchcreate.html.php
@@ -68,7 +68,11 @@
| '>story->keywords;?> |
story->getFlowExtendFields();
- foreach($extendFields as $extendField) echo "{$extendField->name} | ";
+ foreach($extendFields as $extendField)
+ {
+ $required = strpos(",$extendField->rules,", ',1,') !== false ? 'required' : '';
+ echo "{$extendField->name} | ";
+ }
?>
@@ -115,11 +119,12 @@
'> |
loadModel('flow');
foreach($extendFields as $extendField)
{
$object = new stdclass();
$object->{$extendField->field} = $extendField->default;
- echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $object, $extendField->field . '[$id]') . " | ";
+ echo "control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, $object, $extendField->field . '[$id]') . " | ";
}
?>
@@ -153,7 +158,7 @@ $(function()
var $select = $(this);
if($select.hasClass('picker-select')) $select.parent().find('.picker').remove();
if(index == 1) $select.find("option[value='ditto']").remove();
- if(index > 1) $select.val('ditto');
+ if(index > 1 && $select.find('option[value="ditto"]').length > 0) $select.val('ditto');
if($select.attr('id').indexOf('branch') >= 0) $select.val('')
$select.chosen();
setTimeout(function()
diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php
index 63fe2c1d49..401800657f 100644
--- a/module/story/view/edit.html.php
+++ b/module/story/view/edit.html.php
@@ -244,7 +244,7 @@
diff --git a/module/testtask/model.php b/module/testtask/model.php
index c56e78032c..0c44197e46 100644
--- a/module/testtask/model.php
+++ b/module/testtask/model.php
@@ -1704,7 +1704,8 @@ class testtaskModel extends model
elseif(!isset($existCases[$case->title]))
{
$this->dao->insert(TABLE_CASE)->data($case, 'steps')->exec();
- $caseID = $this->dao->lastInsertID();
+ $caseID = $this->dao->lastInsertID();
+ $case->steps = isset($case->steps) ? $case->steps : array();
foreach($case->steps as $caseStep)
{
$caseStep->case = $caseID;
diff --git a/module/todo/js/common.js b/module/todo/js/common.js
index d0dd53402a..e6f4a994ce 100644
--- a/module/todo/js/common.js
+++ b/module/todo/js/common.js
@@ -48,7 +48,7 @@ function loadList(type, id, defaultType, idvalue)
if(data.length != 0)
{
$(divClass).html(data).find('select').chosen();
- if(config.currentMethod == 'edit') $(divClass).html(data).find('select').val(idvalue).trigger('chosen:updated');
+ if(config.currentMethod == 'edit' || type == 'feedback') $(divClass).html(data).find('select').val(idvalue).trigger('chosen:updated');
}
else
{
diff --git a/module/todo/js/create.js b/module/todo/js/create.js
index 46315fd964..bd5ffd5a0e 100644
--- a/module/todo/js/create.js
+++ b/module/todo/js/create.js
@@ -31,7 +31,7 @@ $(function()
});
$('#pri').on('change', function()
- {
+ {
var $select = $(this);
var $selector = $select.closest('.pri-selector');
var value = $select.val();
diff --git a/module/todo/model.php b/module/todo/model.php
index 512756c9d5..d3a569fac3 100644
--- a/module/todo/model.php
+++ b/module/todo/model.php
@@ -553,7 +553,7 @@ class todoModel extends model
if($todo->type == 'risk' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_RISK)->fetch('name');
if($todo->type == 'opportunity' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_OPPORTUNITY)->fetch('name');
if($todo->type == 'review' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_REVIEW)->fetch('title');
- if($todo->type == 'feedback' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_FEEDBACK)->fetch('title');
+ if($todo->type == 'feedback' and $this->config->edition != 'open') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_FEEDBACK)->fetch('title');
$todo->begin = date::formatTime($todo->begin);
$todo->end = date::formatTime($todo->end);
diff --git a/module/todo/view/create.html.php b/module/todo/view/create.html.php
index 26e62d13aa..b565b6bdb1 100644
--- a/module/todo/view/create.html.php
+++ b/module/todo/view/create.html.php
@@ -171,7 +171,7 @@
|
- createLink('my', 'todo', 'type=all'), $lang->goback, '', "class='btn btn-back btn-wide'");?>
+ session->todoList, $lang->goback, '', "class='btn btn-back btn-wide'");?>
|
diff --git a/module/tree/lang/en.php b/module/tree/lang/en.php
index 04f5afe740..9fb6632a2e 100644
--- a/module/tree/lang/en.php
+++ b/module/tree/lang/en.php
@@ -18,7 +18,7 @@ $lang->tree->browseTask = 'Manage Task Module';
$lang->tree->manage = 'Manage Module';
$lang->tree->fix = 'Fix Module';
$lang->tree->manageProduct = "Manage {$lang->productCommon} Modules";
-$lang->tree->manageExecution = "Manage {$lang->executionCommon} Modules";
+$lang->tree->manageExecution = "Manage {$lang->execution->common} Modules";
$lang->tree->manageLine = "Manage {$lang->productCommon} Line";
$lang->tree->manageBug = 'Manage Bug';
$lang->tree->manageCase = 'Manage Case';
@@ -32,7 +32,7 @@ $lang->tree->manageLineChild = "Manage {$lang->productCommon} Line";
$lang->tree->manageBugChild = 'Manage Child Modules of Bugs';
$lang->tree->manageCaseChild = 'Manage Child Cases';
$lang->tree->manageCaselibChild = 'Manage Child Libraries';
-$lang->tree->manageTaskChild = "Manage Child {$lang->executionCommon} Modules";
+$lang->tree->manageTaskChild = "Manage Child {$lang->execution->common} Modules";
$lang->tree->syncFromProduct = "Copy from Other {$lang->productCommon}s";
$lang->tree->dragAndSort = "Drag to order";
$lang->tree->sort = "Order";
diff --git a/module/tree/lang/zh-cn.php b/module/tree/lang/zh-cn.php
index c2b90998d9..5d6c89c0f1 100644
--- a/module/tree/lang/zh-cn.php
+++ b/module/tree/lang/zh-cn.php
@@ -18,7 +18,7 @@ $lang->tree->browseTask = '任务模块维护';
$lang->tree->manage = '维护模块';
$lang->tree->fix = '修正数据';
$lang->tree->manageProduct = "维护{$lang->productCommon}视图模块";
-$lang->tree->manageExecution = "维护{$lang->executionCommon}视图模块";
+$lang->tree->manageExecution = "维护{$lang->execution->common}视图模块";
$lang->tree->manageLine = "维护{$lang->productCommon}线";
$lang->tree->manageBug = '维护测试视图模块';
$lang->tree->manageCase = '维护用例视图模块';
@@ -32,7 +32,7 @@ $lang->tree->manageLineChild = "维护{$lang->productCommon}线";
$lang->tree->manageBugChild = '维护Bug子模块';
$lang->tree->manageCaseChild = '维护用例子模块';
$lang->tree->manageCaselibChild = '维护用例库子模块';
-$lang->tree->manageTaskChild = "维护{$lang->executionCommon}子模块";
+$lang->tree->manageTaskChild = "维护{$lang->execution->common}子模块";
$lang->tree->syncFromProduct = '复制模块';
$lang->tree->dragAndSort = "拖放排序";
$lang->tree->sort = "排序";
diff --git a/module/upgrade/model.php b/module/upgrade/model.php
index bbfee0a1ef..68ffad56fe 100644
--- a/module/upgrade/model.php
+++ b/module/upgrade/model.php
@@ -495,7 +495,8 @@ class upgradeModel extends model
$this->updateGroup4Lite();
break;
- case '16.5':
+ case '16_5':
+ $this->updateProjectStatus();
$this->updateStoryReviewer();
break;
}
@@ -6181,4 +6182,35 @@ class upgradeModel extends model
$this->dao->insert(TABLE_STORYREVIEW)->data($data)->exec();
}
}
+
+ /**
+ * Update the project status.
+ *
+ * @access public
+ * @return void
+ */
+ public function updateProjectStatus()
+ {
+ $projects = $this->dao->select('*')->from(TABLE_PROJECT)
+ ->where('deleted')->eq('0')
+ ->andWhere('status')->eq('doing')
+ ->andWhere('type')->eq('project')
+ ->andWhere('realBegan')->eq('0000-00-00')
+ ->fetchAll('id');
+
+ if(empty($projects)) return;
+
+ $projectIDList = array_keys($projects);
+
+ $executions = $this->dao->select('id,project,min(realBegan) as minBegan')->from(TABLE_EXECUTION)
+ ->where('status')->eq('doing')
+ ->andWhere('deleted')->eq('0')
+ ->andWhere('project')->in($projectIDList)
+ ->groupBy('project')
+ ->fetchAll();
+
+ if(empty($executions)) return;
+
+ foreach ($executions as $execution) $this->dao->update(TABLE_PROJECT)->set('realBegan')->eq($execution->minBegan)->where('id')->eq($execution->project)->exec();
+ }
}
diff --git a/test/class/personnel.class.php b/test/class/personnel.class.php
index 3115b4c9fb..c9aa98481d 100644
--- a/test/class/personnel.class.php
+++ b/test/class/personnel.class.php
@@ -276,7 +276,7 @@ class personnelTest
*
* @param string $objectType
* @param int $objectID
- * @param string mixed $user
+ * @param array mixed $user
* @access public
* @return void
*/
@@ -292,8 +292,20 @@ class personnelTest
return $objects;
}
+ /**
+ * Delete product whitelist Test
+ *
+ * @param int mixed $productID
+ * @param string $account
+ * @access public
+ * @return void
+ */
public function deleteProductWhitelistTest($productID, $account = '')
{
+ global $tester;
+ $this->addWhitelistTest('product', $productID, array('admin'));
+ $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($productID)->andWhere('objectType')->eq('product')->exec();
+
$objects = $this->objectModel->deleteProductWhitelist($productID, $account);
if(dao::isError()) return dao::getError();
@@ -301,8 +313,19 @@ class personnelTest
return $objects;
}
- public function deleteProgramWhitelistTest($programID = 0, $account = '')
+ /**
+ * Delete program whitelist Test
+ *
+ * @param int $programID
+ * @param string $account
+ * @access public
+ * @return void
+ */
+ public function deleteProgramWhitelistTest($programID, $account)
{
+ global $tester;
+ $this->addWhitelistTest('program', $programID, array($account));
+ $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($programID)->andWhere('objectType')->eq('program')->exec();
$objects = $this->objectModel->deleteProgramWhitelist($programID, $account);
if(dao::isError()) return dao::getError();
@@ -310,8 +333,19 @@ class personnelTest
return $objects;
}
- public function deleteProjectWhitelistTest($objectID = 0, $account = '')
+ /**
+ * Delete project whitelist Test
+ *
+ * @param int mixed $objectID
+ * @param string mixed $account
+ * @access public
+ * @return void
+ */
+ public function deleteProjectWhitelistTest($objectID, $account)
{
+ global $tester;
+ $this->addWhitelistTest('project', $objectID, array($account));
+ $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($objectID)->andWhere('objectType')->eq('project')->exec();
$objects = $this->objectModel->deleteProjectWhitelist($objectID, $account);
if(dao::isError()) return dao::getError();
@@ -319,8 +353,19 @@ class personnelTest
return $objects;
}
+ /**
+ * Delete execution whitelist Test
+ *
+ * @param int mixed $executionID
+ * @param string $account
+ * @access public
+ * @return void
+ */
public function deleteExecutionWhitelistTest($executionID, $account = '')
{
+ global $tester;
+ $this->addWhitelistTest('sprint', $executionID, array($account));
+ $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($executionID)->andWhere('objectType')->eq('sprint')->exec();
$objects = $this->objectModel->deleteExecutionWhitelist($executionID, $account);
if(dao::isError()) return dao::getError();
@@ -328,8 +373,21 @@ class personnelTest
return $objects;
}
+ /**
+ * Delete whitelist Test
+ *
+ * @param array $users
+ * @param string $objectType
+ * @param int $objectID
+ * @param int $groupID
+ * @access public
+ * @return void
+ */
public function deleteWhitelistTest($users = array(), $objectType = 'program', $objectID = 0, $groupID = 0)
{
+ global $tester;
+ $this->addWhitelistTest($objectType, $objectID, $users);
+ $tester->dao->update(TABLE_ACL)->set('source')->eq('sync')->where('objectID')->eq($objectID)->andWhere('objectType')->eq($objectType)->exec();
$objects = $this->objectModel->deleteWhitelist($users, $objectType, $objectID, $groupID);
if(dao::isError()) return dao::getError();
diff --git a/test/model/personnel/addwhitelist.php b/test/model/personnel/addwhitelist.php
old mode 100644
new mode 100755
index ee45a7b2eb..a9bdcb041f
--- a/test/model/personnel/addwhitelist.php
+++ b/test/model/personnel/addwhitelist.php
@@ -2,7 +2,6 @@
addWhitelist();
cid=1
pid=1
+测试正常添加白名单 >> 0
+测试不传用户名的情况,这里不传用户名会导致删除符合条件的数据 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->addWhitelistTest()) && p() && e();
\ No newline at end of file
+$user = array();
+$user[0] = array('admin');
+$user[1] = array();
+
+$objectID = array();
+$objectID[0] = 11;
+$objectID[1] = 21;
+
+$objectType = array();
+$objectType[0] = 'project';
+$objectType[1] = 'program';
+$objectType[2] = 'product';
+$objectType[3] = 'sprint';
+
+$result1 = $personnel->addWhitelistTest($objectType[0], $objectID[0], $user[0]);
+$result2 = $personnel->addWhitelistTest($objectType[0], $objectID[0], $user[1]);
+
+r($result1) && p() && e('0'); //测试正常添加白名单
+r($result2) && p() && e('0'); //测试不传用户名的情况,这里不传用户名会导致删除符合条件的数据
\ No newline at end of file
diff --git a/test/model/personnel/buildsearchform.php b/test/model/personnel/buildsearchform.php
old mode 100644
new mode 100755
index edcd239213..b506babce5
--- a/test/model/personnel/buildsearchform.php
+++ b/test/model/personnel/buildsearchform.php
@@ -2,7 +2,6 @@
buildSearchForm();
cid=1
pid=1
+
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->buildSearchFormTest()) && p() && e();
\ No newline at end of file
+//r($personnel->buildSearchFormTest()) && p() && e();
\ No newline at end of file
diff --git a/test/model/personnel/canviewprogram.php b/test/model/personnel/canviewprogram.php
index 5cae45f2e1..0acdfcbbf2 100755
--- a/test/model/personnel/canviewprogram.php
+++ b/test/model/personnel/canviewprogram.php
@@ -10,6 +10,9 @@ title=测试 personnelModel->canViewProgram();
cid=1
pid=1
+看是否具有访问权限有的情况 >> 1
+看是否具有访问权限no的情况 >> 1
+
*/
$personnel = new personnelTest('admin');
@@ -21,4 +24,4 @@ $account = array();
$account[0] = 'test2';
r($personnel->canViewProgramTest(1, 'test2')) && p() && e('1'); //看是否具有访问权限有的情况
-r($personnel->canViewProgramTest(10000, 'test2')) && p() && e('1'); //看是否具有访问权限no的情况
+r($personnel->canViewProgramTest(10000, 'test2')) && p() && e('1'); //看是否具有访问权限no的情况
\ No newline at end of file
diff --git a/test/model/personnel/creatememberlink.php b/test/model/personnel/creatememberlink.php
old mode 100644
new mode 100755
index c991ed8e18..854972754b
--- a/test/model/personnel/creatememberlink.php
+++ b/test/model/personnel/creatememberlink.php
@@ -2,7 +2,6 @@
createMemberLink();
cid=1
pid=1
+
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->createMemberLinkTest()) && p() && e();
\ No newline at end of file
+//r($personnel->createMemberLinkTest()) && p() && e();
\ No newline at end of file
diff --git a/test/model/personnel/deleteexecutionwhitelist.php b/test/model/personnel/deleteexecutionwhitelist.php
old mode 100644
new mode 100755
index 3d9cdc899a..fbce5664f2
--- a/test/model/personnel/deleteexecutionwhitelist.php
+++ b/test/model/personnel/deleteexecutionwhitelist.php
@@ -2,7 +2,6 @@
deleteExecutionWhitelist();
cid=1
pid=1
+调用add方法创建spring类型的白名单,并修改source为sync,然后再通过条件删除 >> 0
+不传参数的情况,删除id为0的匹配数据,为空则跳过 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->deleteExecutionWhitelistTest()) && p() && e();
\ No newline at end of file
+$executionID = array();
+$executionID[0] = 16;
+$executionID[1] = '';
+
+$account = array();
+$account[0] = 'admin';
+$account[1] = '';
+
+$result1 = $personnel->deleteExecutionWhitelistTest($executionID[0], $account[0]);
+$result2 = $personnel->deleteExecutionWhitelistTest($executionID[1], $account[1]);
+
+r($result1) && p() && e('0'); //调用add方法创建spring类型的白名单,并修改source为sync,然后再通过条件删除
+r($result2) && p() && e('0'); //不传参数的情况,删除id为0的匹配数据,为空则跳过
\ No newline at end of file
diff --git a/test/model/personnel/deleteproductwhitelist.php b/test/model/personnel/deleteproductwhitelist.php
old mode 100644
new mode 100755
index 999f5735d8..53c32813b4
--- a/test/model/personnel/deleteproductwhitelist.php
+++ b/test/model/personnel/deleteproductwhitelist.php
@@ -2,7 +2,6 @@
deleteProductWhitelist();
cid=1
pid=1
+删除了产品10的白名单,这里有个条件,source必须为sync,同步过来的才能删 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->deleteProductWhitelistTest()) && p() && e();
\ No newline at end of file
+$productID = array();
+$productID[0] = 10;
+$peoductID[1] = 11111;
+
+$account = array();
+$account[0] = 'admin';
+$account[1] = 'test111';
+
+$result1 = $personnel->deleteProductWhitelistTest($productID[0], $account[0]);
+
+r($result1) && p() && e('0'); //删除了产品10的白名单,这里有个条件,source必须为sync,同步过来的才能删
\ No newline at end of file
diff --git a/test/model/personnel/deleteprogramwhitelist.php b/test/model/personnel/deleteprogramwhitelist.php
old mode 100644
new mode 100755
index 62b756d600..1203c49240
--- a/test/model/personnel/deleteprogramwhitelist.php
+++ b/test/model/personnel/deleteprogramwhitelist.php
@@ -2,7 +2,6 @@
deleteProgramWhitelist();
cid=1
pid=1
+我这里通过add方法创建了一个id为10的项目集白名单,并修改source为同步,然后删除创建的这条信息 >> 0
+传入空时这里我删除了一个objectID为0的,program白名单信息,如果没这条数据跳过 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->deleteProgramWhitelistTest()) && p() && e();
\ No newline at end of file
+$programID = array();
+$programID[0] = 10;
+$programID[1] = '';
+
+$account = array();
+$account[0] = 'dev10';
+$account[1] = '';
+
+$result1 = $personnel->deleteProgramWhitelistTest($programID[0], $account[0]);
+$result2 = $personnel->deleteProgramWhitelistTest($programID[1], $account[1]);
+
+r($result1) && p() && e('0'); //我这里通过add方法创建了一个id为10的项目集白名单,并修改source为同步,然后删除创建的这条信息
+r($result2) && p() && e('0'); //传入空时这里我删除了一个objectID为0的,program白名单信息,如果没这条数据跳过
\ No newline at end of file
diff --git a/test/model/personnel/deleteprojectwhitelist.php b/test/model/personnel/deleteprojectwhitelist.php
old mode 100644
new mode 100755
index 9ef63d7cf4..34d93aa1aa
--- a/test/model/personnel/deleteprojectwhitelist.php
+++ b/test/model/personnel/deleteprojectwhitelist.php
@@ -2,7 +2,6 @@
deleteProjectWhitelist();
cid=1
pid=1
+通过add方法创建一个白名单,这里判断了objectType为sprint的情况,正常传入无法删除 >> 0
+传入空的情况时,删除为objectID为0的数据,如果空,则跳过 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->deleteProjectWhitelistTest()) && p() && e();
\ No newline at end of file
+$projectID = array();
+$projectID[0] = 15;
+$projectID[1] = '';
+
+$account = array();
+$account[0] = 'dev15';
+$account[1] = '';
+
+$result1 = $personnel->deleteProjectWhitelistTest($projectID[0], $account[0]);
+$result2 = $personnel->deleteProjectWhitelistTest($projectID[1], $account[1]);
+
+r($result1) && p() && e('0'); //通过add方法创建一个白名单,这里判断了objectType为sprint的情况,正常传入无法删除
+r($result2) && p() && e('0'); //传入空的情况时,删除为objectID为0的数据,如果空,则跳过
\ No newline at end of file
diff --git a/test/model/personnel/deletewhitelist.php b/test/model/personnel/deletewhitelist.php
old mode 100644
new mode 100755
index f3e767a268..b20f0ee32c
--- a/test/model/personnel/deletewhitelist.php
+++ b/test/model/personnel/deletewhitelist.php
@@ -2,7 +2,6 @@
deleteWhitelist();
cid=1
pid=1
+创建删除objectID为2的项目白名单 >> 0
+创建删除objectID为2的产品白名单 >> 0
+创建删除objectID为10的项目集白名单 >> 0
+创建删除objectID为11的执行白名单 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->deleteWhitelistTest()) && p() && e();
\ No newline at end of file
+$users = array();
+$users[0] = 'dev17';
+
+$objectType = array();
+$objectType[0] = 'project';
+$objectType[1] = 'product';
+$objectType[2] = 'program';
+$objectType[3] = 'sprint';
+
+$objectID = array();
+$objectID[0] = '2';
+$objectID[1] = '10';
+$objectID[2] = '11';
+
+$groupID = array();
+$groupID[0] = '1';
+$groupID[1] = '2';
+
+$result1 = $personnel->deleteWhitelistTest($users, $objectType[0], $objectID[0]);
+$result2 = $personnel->deleteWhitelistTest($users, $objectType[1], $objectID[0]);
+$result3 = $personnel->deleteWhitelistTest($users, $objectType[2], $objectID[1]);
+$result4 = $personnel->deleteWhitelistTest($users, $objectType[3], $objectID[2]);
+
+r($result1) && p() && e('0'); //创建删除objectID为2的项目白名单
+r($result2) && p() && e('0'); //创建删除objectID为2的产品白名单
+r($result3) && p() && e('0'); //创建删除objectID为10的项目集白名单
+r($result4) && p() && e('0'); //创建删除objectID为11的执行白名单
\ No newline at end of file
diff --git a/test/model/personnel/getaccessiblepersonnel.php b/test/model/personnel/getaccessiblepersonnel.php
index 43024dcef0..1c0059f6b1 100755
--- a/test/model/personnel/getaccessiblepersonnel.php
+++ b/test/model/personnel/getaccessiblepersonnel.php
@@ -10,6 +10,11 @@ title=测试 personnelModel->getAccessiblePersonnel();
cid=1
pid=1
+测试取出结果集中的一个对象里的名字programID=1 >> 测试1
+测试取出匹配的数量 >> 10
+测试取出结果集中的一个对象里的名字programID=2 >> 开发11
+测试取出匹配的数量 >> 10
+
*/
$personnel = new personnelTest('admin');
@@ -38,4 +43,4 @@ $getnumber2 = count($personnel->getAccessiblePersonnelTest($programID[1], $dep
r($getrealname1) && p('realname') && e('测试1'); //测试取出结果集中的一个对象里的名字programID=1
r($getnumber1) && p() && e('10'); //测试取出匹配的数量
r($getrealname2) && p('realname') && e('开发11'); //测试取出结果集中的一个对象里的名字programID=2
-r($getnumber2) && p() && e('10'); //测试取出匹配的数量
+r($getnumber2) && p() && e('10'); //测试取出匹配的数量
\ No newline at end of file
diff --git a/test/model/personnel/getbugandstoryinvest.php b/test/model/personnel/getbugandstoryinvest.php
old mode 100644
new mode 100755
index f31002d347..7e58149b51
--- a/test/model/personnel/getbugandstoryinvest.php
+++ b/test/model/personnel/getbugandstoryinvest.php
@@ -2,7 +2,6 @@
getBugAndStoryInvest();
cid=1
pid=1
+
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getBugAndStoryInvestTest()) && p() && e();
\ No newline at end of file
+//r($personnel->getBugAndStoryInvestTest()) && p() && e();
\ No newline at end of file
diff --git a/test/model/personnel/getcopiedobjects.php b/test/model/personnel/getcopiedobjects.php
old mode 100644
new mode 100755
index 698551d7cb..8785e24dde
--- a/test/model/personnel/getcopiedobjects.php
+++ b/test/model/personnel/getcopiedobjects.php
@@ -2,7 +2,6 @@
getCopiedObjects();
cid=1
pid=1
+取出匹配的项目数量 >> 20
+取出其中一个匹配的项目 >> 独立项目20
+取出匹配的产品数量 >> 119
+取出其中一个匹配的产品 >> 多平台产品100
+取出匹配的项目集数量 >> 9
+取出其中一个匹配的项目集 >> 项目集10
+取出匹配的执行数量 >> 10
+取出其中一个匹配的执行 >> 独立项目20
+传入不存在的objectID匹配的执行数量 >> 0
+传入空值时取出匹配的执行数量 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getCopiedObjectsTest()) && p() && e();
\ No newline at end of file
+$objectID = array();
+$objectID[0] = 1;
+$objectID[1] = 2;
+$objectID[2] = 11111;
+$objectID[3] = '';
+
+$objectType = array();
+$objectType[0] = 'project';
+$objectType[1] = 'product';
+$objectType[2] = 'program';
+$objectType[3] = 'sprint';
+
+$result1 = $personnel->getCopiedObjectsTest($objectID[0], $objectType[0]);
+$result2 = $personnel->getCopiedObjectsTest($objectID[0], $objectType[1]);
+$result3 = $personnel->getCopiedObjectsTest($objectID[1], $objectType[2]);
+$result4 = $personnel->getCopiedObjectsTest($objectID[1], $objectType[3]);
+$result5 = $personnel->getCopiedObjectsTest($objectID[2], $objectType[3]);
+$result6 = $personnel->getCopiedObjectsTest($objectID[2], $objectType[3]);
+
+//a($result);die;
+r(count($result1)) && p() && e('20'); //取出匹配的项目数量
+r($result1) && p('750') && e('独立项目20'); //取出其中一个匹配的项目
+r(count($result2)) && p() && e('119'); //取出匹配的产品数量
+r($result2) && p('100') && e('多平台产品100'); //取出其中一个匹配的产品
+r(count($result3)) && p() && e('9'); //取出匹配的项目集数量
+r($result3) && p('10') && e('项目集10'); //取出其中一个匹配的项目集
+r(count($result4)) && p() && e('10'); //取出匹配的执行数量
+r($result4) && p('750') && e(' 独立项目20'); //取出其中一个匹配的执行
+r(count($result5)) && p() && e('0'); //传入不存在的objectID匹配的执行数量
+r(count($result6)) && p() && e('0'); //传入空值时取出匹配的执行数量
\ No newline at end of file
diff --git a/test/model/personnel/getinvest.php b/test/model/personnel/getinvest.php
index 4ab1075f40..7278652501 100755
--- a/test/model/personnel/getinvest.php
+++ b/test/model/personnel/getinvest.php
@@ -10,6 +10,8 @@ title=测试 personnelModel->getInvest();
cid=1
pid=1
+
+
*/
$personnel = new personnelTest('admin');
@@ -22,4 +24,4 @@ $invest1 = count($personnel->getInvestTest($programID[0]));
$invest2 = count($personnel->getInvestTest($programID[1]));
r($invest1) && p($invest1) && e(''); //获得项目id=1的授权用户数量
-r($invest2) && p($invest2) && e(''); //获得项目id=2的授权用户数量
+r($invest2) && p($invest2) && e(''); //获得项目id=2的授权用户数量
\ No newline at end of file
diff --git a/test/model/personnel/getinvolvedexecutions.php b/test/model/personnel/getinvolvedexecutions.php
index 1f7f6ec81d..73f04ea8cf 100755
--- a/test/model/personnel/getinvolvedexecutions.php
+++ b/test/model/personnel/getinvolvedexecutions.php
@@ -2,7 +2,6 @@
getInvolvedExecutions();
cid=1
pid=1
+涉及到执行的人员计数 >> 8
+取出其中一个 >> 1
+传入不存在的id >> 0
+
*/
$personnel = new personnelTest('admin');
$project = array();
-$project[0] = 101;
-$project[1] = 102;
+$project[0] = array(11, 12);
+$project[1] = 12222;
-r($personnel->getInvolvedExecutionsTest($project)) && p() && e(''); //
+$result1 = count($personnel->getInvolvedExecutionsTest($project[0]));
+$result2 = $personnel->getInvolvedExecutionsTest($project[0]);
+$result3 = $personnel->getInvolvedExecutionsTest($project[1]);
+
+r($result1) && p() && e('8'); //涉及到执行的人员计数
+r($result2) && p('pm72') && e('1'); //取出其中一个
+r($result3) && p() && e('0'); //传入不存在的id
\ No newline at end of file
diff --git a/test/model/personnel/getinvolvedprojects.php b/test/model/personnel/getinvolvedprojects.php
old mode 100644
new mode 100755
index d1b7d1357e..ed856f1ca4
--- a/test/model/personnel/getinvolvedprojects.php
+++ b/test/model/personnel/getinvolvedprojects.php
@@ -2,7 +2,6 @@
getInvolvedProjects();
cid=1
pid=1
+计数project11,12的团队人员个数 >> 4
+取出其中一个角色 >> 1
+传入不存在的ID >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getInvolvedProjectsTest()) && p() && e();
\ No newline at end of file
+$projectID = array();
+$projectID[0] = array(11, 12);
+$projectID[1] = array(1111);
+
+$result1 = count($personnel->getInvolvedProjectsTest($projectID[0]));
+$result2 = $personnel->getInvolvedProjectsTest($projectID[0]);
+$result3 = count($personnel->getInvolvedProjectsTest($projectID[1]));
+
+r($result1) && p() && e('4'); //计数project11,12的团队人员个数
+r($result2) && p('admin') && e('1'); //取出其中一个角色
+r($result3) && p() && e('0'); //传入不存在的ID
\ No newline at end of file
diff --git a/test/model/personnel/getissueinvest.php b/test/model/personnel/getissueinvest.php
old mode 100644
new mode 100755
index 2cda93661f..70df9a3cc4
--- a/test/model/personnel/getissueinvest.php
+++ b/test/model/personnel/getissueinvest.php
@@ -2,7 +2,6 @@
getIssueInvest();
cid=1
pid=1
+
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
r($personnel->getIssueInvestTest()) && p() && e();
\ No newline at end of file
diff --git a/test/model/personnel/getprojecttaskinvest.php b/test/model/personnel/getprojecttaskinvest.php
old mode 100644
new mode 100755
index 691c956177..a8a3dd73ed
--- a/test/model/personnel/getprojecttaskinvest.php
+++ b/test/model/personnel/getprojecttaskinvest.php
@@ -2,7 +2,6 @@
getProjectTaskInvest();
cid=1
pid=1
+次方法为页面上的项目信息,人员,创建人物 >> 0
+次方法为页面上的项目信息,人员,已完成任务 >> 0
+次方法为页面上的项目信息,人员,待处理 >> 0
+次方法为页面上的项目信息,人员,任务消耗 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getProjectTaskInvestTest()) && p() && e();
\ No newline at end of file
+$projectID = array();
+$projectID[0] = 11;
+$projectID[1] = 12;
+
+$account = array();
+$account[0] = 'admin';
+$account[1] = 'user3';
+
+$result1 = $personnel->getProjectTaskInvestTest($projectID, $account);
+
+r($result1) && p('0:createdTask') && e('0'); //次方法为页面上的项目信息,人员,创建人物
+r($result1) && p('0:finishedTask') && e('0'); //次方法为页面上的项目信息,人员,已完成任务
+r($result1) && p('0:pendingTask') && e('0'); //次方法为页面上的项目信息,人员,待处理
+r($result1) && p('0:consumedTask') && e('0'); //次方法为页面上的项目信息,人员,任务消耗
\ No newline at end of file
diff --git a/test/model/personnel/getriskinvest.php b/test/model/personnel/getriskinvest.php
index 8abe2503b6..e9242ce909 100755
--- a/test/model/personnel/getriskinvest.php
+++ b/test/model/personnel/getriskinvest.php
@@ -10,10 +10,12 @@ title=测试 personnelModel->getRiskInvest();
cid=1
pid=1
+
+
*/
$personnel = new personnelTest('admin');
var_dump($personnel->getRiskInvestTest(array('test2', 'test3'), array(1, 2, 3)));die;
-r($personnel->getRiskInvestTest()) && p() && e();
+r($personnel->getRiskInvestTest()) && p() && e();
\ No newline at end of file
diff --git a/test/model/personnel/getsprintandstage.php b/test/model/personnel/getsprintandstage.php
old mode 100644
new mode 100755
index ad77fac728..1a2d4afc3f
--- a/test/model/personnel/getsprintandstage.php
+++ b/test/model/personnel/getsprintandstage.php
@@ -2,7 +2,6 @@
getSprintAndStage();
cid=1
pid=1
+
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getSprintAndStageTest()) && p() && e();
\ No newline at end of file
+//r($personnel->getSprintAndStageTest()) && p() && e();
\ No newline at end of file
diff --git a/test/model/personnel/getuserefforthours.php b/test/model/personnel/getuserefforthours.php
old mode 100644
new mode 100755
index ebac34ab07..7a189e417c
--- a/test/model/personnel/getuserefforthours.php
+++ b/test/model/personnel/getuserefforthours.php
@@ -10,8 +10,19 @@ title=测试 personnelModel->getUserEffortHours();
cid=1
pid=1
+正常传入的情况 >> 0
+传入不存在的情况 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getUserEffortHoursTest()) && p() && e();
\ No newline at end of file
+$projectID = array();
+$projectID[0] = 11;
+$projectID[1] = 11111;
+
+$result1 = $personnel->getUserEffortHoursTest($projectID[0]);
+$result2 = $personnel->getUserEffortHoursTest($projectID[1]);
+
+r($result1) && p() && e('0'); //正常传入的情况
+r($result2) && p() && e('0'); //传入不存在的情况
\ No newline at end of file
diff --git a/test/model/personnel/getuserhours.php b/test/model/personnel/getuserhours.php
old mode 100644
new mode 100755
index a134a1fd95..dbc3ae0b6d
--- a/test/model/personnel/getuserhours.php
+++ b/test/model/personnel/getuserhours.php
@@ -10,8 +10,39 @@ title=测试 personnelModel->getUserHours();
cid=1
pid=1
+取出admin工时 >> 4
+取出po82的工时 >> 3
+取出匹配的人员数量 >> 2
+当传入一个存在的角色一个不存在的角色时,打印其中存在的角色工时 >> 4
+其中一个为空时,取出匹配的人员数量 >> 1
+当传入task不存在时 >> 0
+当task不存在时,取出匹配个数 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getUserHoursTest()) && p() && e();
\ No newline at end of file
+$userTask = array();
+$userTask['po82'] = array(1);
+$userTask['admin'] = array(2);
+
+$userTask1 = array();
+$userTask1['test111'] = array(1);
+$userTask1['admin'] = array(2);
+
+$userTask2 = array();
+$userTask2['admin'] = array(1111);
+$userTask2['po82'] = array(1112);
+
+$result1 = $personnel->getUserHoursTest($userTask);
+$result2 = count($personnel->getUserHoursTest($userTask));
+$result3 = $personnel->getUserHoursTest($userTask1);
+$result4 = $personnel->getUserHoursTest($userTask2);
+
+r($result1) && p('admin:consumed') && e('4'); //取出admin工时
+r($result1) && p('po82:consumed') && e('3'); //取出po82的工时
+r($result2) && p() && e('2'); //取出匹配的人员数量
+r($result3) && p('admin:consumed') && e('4'); //当传入一个存在的角色一个不存在的角色时,打印其中存在的角色工时
+r(count($result3)) && p() && e('1'); //其中一个为空时,取出匹配的人员数量
+r($result4) && p('admin:consumed') && e('0'); //当传入task不存在时
+r(count($result4)) && p() && e('0'); //当task不存在时,取出匹配个数
\ No newline at end of file
diff --git a/test/model/personnel/getwhitelist.php b/test/model/personnel/getwhitelist.php
old mode 100644
new mode 100755
index 5d2f1e51ca..37799e3803
--- a/test/model/personnel/getwhitelist.php
+++ b/test/model/personnel/getwhitelist.php
@@ -2,7 +2,6 @@
getWhitelist();
cid=1
pid=1
+取出对应object1的项目人员数量 >> 2
+取出其中一个人员项目经理10 >> 项目经理10
+取出另一个人员admin >> admin
+取出对应object2的执行人员数量 >> 0
+当传入不存在的objectID时,取出匹配执行人员数量 >> 0
+当传入空时,查看匹配执行的人员数量 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getWhitelistTest()) && p() && e();
\ No newline at end of file
+$objectID = array();
+$objectID[0] = 1;
+$objectID[1] = 2;
+$objectID[2] = 11111;
+$objectID[3] = '';
+
+$objectType = array();
+$objectType[0] = 'project';
+$objectType[1] = 'program';
+$objectType[2] = 'product';
+$objectType[3] = 'sprint';
+
+$result1 = $personnel->getWhitelistTest($objectID[0], $objectType[1]);
+$result2 = $personnel->getWhitelistTest($objectID[1], $objectType[3]);
+$result3 = $personnel->getWhitelistTest($objectID[2], $objectType[3]);
+$result4 = $personnel->getWhitelistTest($objectID[3], $objectType[1]);
+
+r(count($result1)) && p() && e('2'); //取出对应object1的项目人员数量
+r($result1) && p('0:realname') && e('项目经理10'); //取出其中一个人员项目经理10
+r($result1) && p('1:realname') && e('admin'); //取出另一个人员admin
+r(count($result2)) && p() && e('0'); //取出对应object2的执行人员数量
+r(count($result3)) && p() && e('0'); //当传入不存在的objectID时,取出匹配执行人员数量
+r(count($result4)) && p() && e('0'); //当传入空时,查看匹配执行的人员数量
\ No newline at end of file
diff --git a/test/model/personnel/getwhitelistaccount.php b/test/model/personnel/getwhitelistaccount.php
old mode 100644
new mode 100755
index d1d2eed402..69b7bfef0a
--- a/test/model/personnel/getwhitelistaccount.php
+++ b/test/model/personnel/getwhitelistaccount.php
@@ -2,7 +2,6 @@
getWhitelistAccount();
cid=1
pid=1
+这是一个正常测试,统计关联白名单人员数量 >> 2
+取出其中一个数据admin >> admin
+取出另一个数据dev10 >> dev10
+取出objectid2的白名单数量 >> 0
+当objectID不存在时,统计匹配数量 >> 0
+当传入参数为空时,统计匹配人员数量 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->getWhitelistAccountTest()) && p() && e();
\ No newline at end of file
+$objectID = array();
+$objectID[0] = 1;
+$objectID[1] = 2;
+$objectID[2] = 1111;
+$objectID[3] = '';
+
+$objectType = array();
+$objectType[0] = 'project';
+$objectType[1] = 'program';
+$objectType[2] = 'product';
+$objectType[3] = 'sprint';
+
+$result1 = $personnel->getWhitelistAccountTest($objectID[0], $objectType[1]);
+$result2 = $personnel->getWhitelistAccountTest($objectID[1], $objectType[2]);
+$result3 = $personnel->getWhitelistAccountTest($objectID[2], $objectType[3]);
+$result4 = $personnel->getWhitelistAccountTest($objectID[3], $objectType[0]);
+
+r(count($result1)) && p() && e('2'); //这是一个正常测试,统计关联白名单人员数量
+r($result1) && p('admin') && e('admin'); //取出其中一个数据admin
+r($result1) && p('dev10') && e('dev10'); //取出另一个数据dev10
+r(count($result2)) && p() && e('0'); //取出objectid2的白名单数量
+r(count($result3)) && p() && e('0'); //当objectID不存在时,统计匹配数量
+r(count($result4)) && p() && e('0'); //当传入参数为空时,统计匹配人员数量
\ No newline at end of file
diff --git a/test/model/personnel/updatewhitelist.php b/test/model/personnel/updatewhitelist.php
old mode 100644
new mode 100755
index b513f5c90a..3d05269ae5
--- a/test/model/personnel/updatewhitelist.php
+++ b/test/model/personnel/updatewhitelist.php
@@ -2,7 +2,6 @@
updateWhitelist();
cid=1
pid=1
+传入已有参数时,数据变更类型source为add >> 0
+传入已有参数时,数据变更type为blacklist >> 0
+传入没有的参数时,新建一条source为sync的数据 >> 0
+
*/
-$personnel = new personnelTest();
+$personnel = new personnelTest('admin');
-r($personnel->updateWhitelistTest()) && p() && e();
\ No newline at end of file
+$user = array();
+$user[0] = array('admin', 'dev10');
+$user[1] = array('test1', 'test2');
+
+$objectType = array();
+$objectType[0] = 'project';
+$objectType[1] = 'program';
+$objectType[2] = 'product';
+$objectType[3] = 'sprint';
+
+$objectID = array();
+$objectID[0] = 1;
+$objectID[1] = 2;
+
+$type = array();
+$type[0] = 'whitelist';
+$type[1] = 'blacklist';
+
+$source = array();
+$source[0] = 'update';
+$source[1] = 'add';
+$source[2] = 'sync';
+
+$updateType = array();
+$updateType[0] = 'increase';
+$updateType[1] = 'replace';
+
+$result1 = $personnel->updateWhitelistTest($user[0], $objectType[0], $objectID[1], $type[0], $source[1], $updateType[0]);
+$result2 = $personnel->updateWhitelistTest($user[0], $objectType[1], $objectID[0], $type[1], $source[0], $updateType[1]);
+$result3 = $personnel->updateWhitelistTest($user[1], $objectType[0], $objectID[0], $type[0], $source[2], $updateType[0]);
+
+r($result1) && p() && e('0'); //传入已有参数时,数据变更类型source为add
+r($result2) && p() && e('0'); //传入已有参数时,数据变更type为blacklist
+r($result3) && p() && e('0'); //传入没有的参数时,新建一条source为sync的数据
\ No newline at end of file
diff --git a/test/ztest b/test/ztest
index ee415cc8a5..358a930ca6 100755
--- a/test/ztest
+++ b/test/ztest
@@ -96,7 +96,13 @@ switch($argv[1])
break;
case 'productsonplan':
ztfRun('model/productsonplan');
- break;;
+ break;
+ case 'personnel':
+ ztfRun('model/personnel');
+ break;
+ case 'projectstory':
+ ztfRun('model/projectstory');
+ break;
case 'admin':
ztfRun('model/admin');
break;
diff --git a/www/js/zui/kanban/min.js b/www/js/zui/kanban/min.js
index 9607dc32a0..6552dc91c3 100644
--- a/www/js/zui/kanban/min.js
+++ b/www/js/zui/kanban/min.js
@@ -1,7 +1,7 @@
/*!
- * ZUI: ZUI Kanban View - v1.10.0 - 2022-03-24
+ * ZUI: ZUI Kanban View - v1.10.0 - 2022-04-21
* http://openzui.com
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2022 cnezsoft.com; Licensed MIT
*/
-!function(){"use strict";function a(a,e){return n&&!e?requestAnimationFrame(a):setTimeout(a,e||0)}function e(a){return n?cancelAnimationFrame(a):void clearTimeout(a)}var n="function"==typeof window.requestAnimationFrame;$.zui({asap:a,clearAsap:e})}(),function(a){"use strict";function e(e,n){"string"==typeof e&&(e=a(e)),e instanceof a&&(e=e[0]);var t=e.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,d=window.innerWidth||document.documentElement.clientWidth;if(n)return t.left>=0&&t.top>=0&&t.left+t.width<=d&&t.top+t.height<=r;var i=t.top<=r&&t.top+t.height>=0,o=t.left<=d&&t.left+t.width>=0;return i&&o}var n="zui.virtualRender",t=function(e,r){"function"==typeof r&&(r={render:r});var d=this;d.name=n,d.$=a(e),d.options=r=a.extend({},t.DEFAULTS,this.$.data(),r),d.rendered=!1;var i=r.container;"function"==typeof i&&(i=i(d));var o=a(i?i:window);d.tryRender()||(d.$container=o,d.scrollListener=d.tryRender.bind(d),r.pendingClass&&d.$.addClass(r.pendingClass),o.on("scroll",d.scrollListener))};t.prototype.tryRender=function(){var n=this;return!(n.rendered||!e(n.$))&&(n.renderTaskID&&a.zui.clearAsap(n.renderTaskID),n.renderTaskID=a.zui.asap(function(){n.renderTaskID=null;var a=n.options.render(n.$);a!==!1&&(n.rendered=!0,n.destroy())},n.options.delay),!0)},t.prototype.destroy=function(){var e=this;e.renderTaskID&&a.zui.clearAsap(e.renderTaskID),e.scrollListener&&(e.$container.off("scroll",e.scrollListener),e.scrollListener=null);var t=e.options.pendingClass;t&&e.$.removeClass(t),e.$.removeData(n)},t.DEFAULTS={pendingClass:"virtual-pending"},a.fn.virtualRender=function(e){return this.each(function(){var r=a(this),d=r.data(n);if(d){if("string"==typeof e)return d[e]();d.destroy()}r.data(n,d=new t(this,e))})},a.zui.isElementInViewport=e}(jQuery),function(a){"use strict";var e="zui.kanban",n="object"==typeof CSS&&CSS.supports("display","flex"),t=function(n,r){var d=this;if(d.name=e,d.$=a(n).addClass("kanban"),r=d.setOptions(a.extend({},t.DEFAULTS,this.$.data(),r)),r.onAction){var i=function(e){var n=a(this);r.onAction(n.data("action"),n,e,d)};d.$.on("click",".action",i).on("dblclick",".action-dbc",i)}var o=r.droppable;if("auto"===o&&(o=!r.readonly),o){var s=r.sortable;"function"==typeof s?s={finish:s}:s&&"object"!=typeof s&&(s={});var l=0;"function"==typeof o?o={drop:o}:"object"!=typeof o&&(o={});var c=a.extend({dropOnMouseleave:!0,selector:".kanban-item",target:".kanban-lane-col:not(.kanban-col-sorting)",mouseButton:"left"},o,{before:function(e){if(o.before){var n=o.before(e);if(n===!1)return n}if(s){var t=e.element.closest(".kanban-lane-items");t.closest(".kanban-col").addClass("kanban-col-sorting"),d._sortResult=null,d._$sortItems=t;var r=t.data("zui.sortable");r||t.sortable(a.extend({},s,{selector:".kanban-item",trigger:".kanban-card",dragCssClass:"kanban-item-sorting",noShadow:!0,finish:function(a){a.list.length>1&&(d._sortResult=a)}})).triggerHandler(e.event)}},drop:function(a){o.drop&&o.drop(a),r.onAction&&r.onAction("dropItem",a.element,a,d)},start:function(e){d.$.addClass("kanban-dragging"),l&&clearTimeout(l),l=setTimeout(function(){a(e.shadowElement).addClass("in"),l=0},50),o.start&&o.start(e)},always:function(a){d.$.removeClass("kanban-dragging"),l&&(clearTimeout(l),l=0),s&&(d._$sortItems.sortable("destroy").closest(".kanban-col").removeClass("kanban-col-sorting"),!a.isIn&&d._sortResult&&s.finish&&s.finish(d._sortResult)),o.always&&o.always(a)}});d.$.droppable(c)}r.onCreate&&r.onCreate(d)};t.prototype.setOptions=function(e){var t=this,r=a.extend({},t.options,{data:t.data},e);t.options=r,r.useFlex&&!n&&(r.useFlex=!1),t.$.toggleClass("no-flex",!r.useFlex).toggleClass("use-flex",!!r.useFlex);var d=!!a.fn.virtualRender&&r.virtualize;return d&&("object"!=typeof d&&(d={lane:!0}),t.virtualize=a.extend({},d)),t.data=r.data||[],t.render(t.data),r},t.prototype.render=function(a){var e=this;a&&(e.data=a),e.data&&!Array.isArray(e.data)&&(e.data=[e.data]);var n=e.options,t=e.data||[];n.beforeRender&&n.beforeRender(e,t),e.$.toggleClass("kanban-readonly",!!n.readonly).toggleClass("kanban-no-lane-name",!!n.noLaneName),e.$.children(".kanban-board").addClass("kanban-expired"),e.maxKanbanBoardWidth=0;for(var r=0;r
1&&e.$.children(".kanban-board").css("min-width",e.maxKanbanBoardWidth),n.onRender&&n.onRender(e)},t.prototype.layoutKanban=function(a,e){for(var n=this,t=n.options,r=t.noLaneName?0:t.laneNameWidth,d=0,i={},o=!1,s=[],l=0;l0&&t.subLaneSpace&&(k.$height+=t.subLaneSpace)}}else for(var y=k.items||k.cards||{},C=0;C-1){var r=n.data[t];e=a.extend(r,e),n.data[t]=e}else n.data.push(e)}e.id||(e.id=a.zui.uuid());var d=e.id,i=n.options,o=n.$,s=o.children('.kanban-board[data-id="'+d+'"]');s.length?s.removeClass("kanban-expired"):s=a('').appendTo(o),n.layoutKanban(e,s),n.renderKanbanHeader(e,s),s.children(".kanban-lane").addClass("kanban-expired");for(var l=e.lanes||[],c=0;c ').prependTo(n),r.useFlex||i.addClass("clearfix")),i.css("height",(d?2:1)*r.headerHeight).toggleClass("kanban-header-has-parent",!!d);var o=i.children(".kanban-cols");o.css("left",e.$layout.laneNameWidth).children(".kanban-col").addClass("kanban-expired");for(var s=e.columns,l=e.$layout.columnsMap||{},c=null,u=null,h=0;h
.kanban-col").addClass("kanban-expired"):o=a(['"].join("")),s&&s.length?s.after(o):n.prepend(o),o.data("col",e).attr("data-type",e.type);var l=r.$layout.columnWidth;i.useFlex?o.css("flex",e.subs.length+" "+e.subs.length+" "+l*e.subs.length+"%"):o.css({width:l*e.subs.length+"%",left:e.$index*l+"%"});var c=o.children(".kanban-header-col");c.find(".title>.icon").attr("class","icon icon-"+(e.icon||""));var u=c.find(".title>.text").text(e.name).attr("title",e.name);if(e.color&&u.css("color",e.color),i.showCount){var h=void 0!==e.count?e.count:e.$cardsCount;i.showZeroCount||h||(h="");var p=c.find(".title>.count").text(h);i.onRenderCount&&i.onRenderCount(p,h,e,d)}i.onRenderHeaderCol&&i.onRenderHeaderCol(o,e,n,r)},t.prototype.renderHeaderCol=function(e,n,t,r,d){var i=this,o=i.options;if(e.parentType&&t){var s=n.children('.kanban-header-parent-col[data-id="'+t.id+'"]');n=s.children(".kanban-header-sub-cols")}var l=n.children('.kanban-header-col[data-id="'+e.id+'"]'),c=r?n.children('.kanban-header-col[data-id="'+r.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):l=a(['"].join("")),c&&c.length?c.after(l):n.prepend(l),l.data("col",e).attr("data-type",e.type);var u=t?100/t.subs.length:d.$layout.columnWidth;o.useFlex?l.css("flex","1 1 "+u+"%"):l.css({left:(t?e.$subIndex:e.$index)*u+"%",width:u+"%"}),l.find(".title>.icon").attr("class","icon icon-"+(e.icon||""));var h=l.find(".title>.text").text(e.name).attr("title",e.name);if(e.color&&h.css("color",e.color),o.showCount){var p=void 0!==e.count?e.count:e.$cardsCount;o.showZeroCount||p||(p="");var b=l.find(".title>.count").text(p);o.onRenderCount&&o.onRenderCount(b,p,e,i)}o.onRenderHeaderCol&&o.onRenderHeaderCol(l,e,n,d)},t.prototype.renderLane=function(e,t,r,d){var i=this,o=i.options;r=r||i.$.children('.kanban-board[data-id="'+e.kanban+'"]');var s=r.children('.kanban-lane[data-id="'+e.id+'"]');s.length?s.removeClass("kanban-expired"):(s=a('').appendTo(r),n||s.addClass("clearfix"));var l=e.subLanes?e.subLanes.length:0;s.attr("data-index",e.$index).data("lane",e).toggleClass("has-sub-lane",l>0).css({height:e.$height||"auto"}),i.virtualizeRender(d,"lane",s,function(){if(!o.noLaneName){var n=s.children('.kanban-lane-name[data-id="'+e.id+'"]');n.length||(n=a('').prependTo(s)),n.empty().css("width",o.laneNameWidth).attr("title",e.name).append(a('').text(e.name)),e.color&&n.css("background-color",e.color),o.onRenderLaneName&&o.onRenderLaneName(n,e,r,t,d)}s.children(".kanban-cols,.kanban-sub-lanes").addClass("kanban-expired");var l;l=e.subLanes?i.renderSubLanes(e,t,s,d):i.renderLaneCols(t,e.items||e.cards||{},s,e,d),o.useFlex||l.css("left",d.$layout.laneNameWidth),s.children(".kanban-expired").remove()},{lane:e,columns:t,kanban:d})},t.prototype.virtualizeRender=function(e,n,t,r,d){var i=this,o=i.virtualize,s=o?o[n]:null;return s?("function"==typeof s&&(s=s(d,t)),"number"==typeof s&&t.height(s),void t.virtualRender(a.extend({render:r},i.options.virtualRenderOptions))):r()},t.prototype.renderSubLanes=function(e,n,t,r){var d=this,i=t.children(".kanban-sub-lanes");i.length?i.removeClass("kanban-expired"):i=a('').appendTo(t),i.children(".kanban-sub-lane").addClass("kanban-expired");for(var o=0;o ').appendTo(r),n||o.addClass("clearfix")),o.attr("data-index",i).data("lane",e).css({height:e.$height||"auto"}),o.children(".kanban-col").addClass("kanban-expired");var s=e.items||e.cards;s&&this.renderLaneCols(t,s,o,e,d),o.children(".kanban-expired").remove()},t.prototype.renderLaneCols=function(e,n,t,r,d){var i=this,o=t.children(".kanban-cols");o.length?o.removeClass("kanban-expired"):o=a('
').appendTo(t),o.children(".kanban-col").addClass("kanban-expired");for(var s=null,l=0;l
0?e[i-1]:null;o.$index=i,o.$col=a,o.$lane=t,this.renderCard(o,d,s,a,t,r)}var l=a.cardsPerRow||t.cardsPerRow||r.cardsPerRow||this.options.cardsPerRow;d.css("padding",this.options.cardSpace/2).toggleClass("kanban-items-grid",l>1).attr("data-cards-per-row",l),d.children(".kanban-expired").remove()},t.prototype.renderLaneCol=function(e,n,t){var r=this,d=r.options,i=n.children('.kanban-lane-col[data-id="'+e.id+'"]'),o=t?n.children('.kanban-lane-col[data-id="'+t.id+'"]:not(.kanban-expired)'):null;i.length?i.removeClass("kanban-expired"):(i=a(['"].join("")),r.options.readonly||i.append(['','","
"].join("")),d.laneItemsClass&&i.find(".kanban-lane-items").addClass(d.laneItemsClass),d.laneColClass&&i.addClass(d.laneColClass)),o&&o.length?o.after(i):n.prepend(i),i.attr({"data-parent":e.parentType?e.parentType:null,"data-type":e.type}).data("col",e);var s=e.$kanbanData.$layout.columnWidth;return d.useFlex?i.css("flex","1 1 "+s+"%"):i.css({left:e.$index*s+"%",width:s+"%"}),i},t.prototype.renderCard=function(e,n,t,r,d,i){var o=this.options,s=n.children('.kanban-item[data-id="'+e.id+'"]'),l=t?n.children('.kanban-item[data-id="'+t.id+'"]:not(.kanban-expired)'):null;s.length?s.removeClass("kanban-expired"):(s=a(''),o.wrapCard&&s.append('')),l&&l.length?l.after(s):n.prepend(s);var c=r.cardsPerRow||d.cardsPerRow||i.cardsPerRow||o.cardsPerRow;s.data("item",e).css({padding:o.cardSpace/2,width:c>1?100/c+"%":""});var u=o.wrapCard?s.children(".kanban-card"):s;u.css("height",o.cardHeight);var h=o.cardRender||o.itemRender;if(h)h(e,u,r,d,i);else{var p=u.find(".title");p.length||(p=a('').appendTo(u)),p.text(e.name||e.title)}return u},t.DEFAULTS={minColWidth:100,maxColHeight:400,minColHeight:90,minSubColHeight:40,subLaneSpace:2,laneNameWidth:20,headerHeight:32,cardHeight:40,cardSpace:10,cardsPerRow:1,wrapCard:!0,fluidBoardWidth:!0,addItemText:"添加条目",useFlex:!0,droppable:"auto",laneColClass:"",showCount:!0},a.fn.kanban=function(n){return this.each(function(){var r=a(this),d=r.data(e),i="object"==typeof n&&n;d||r.data(e,d=new t(this,i)),"string"==typeof n&&d[n]()})},t.NAME=e,a.fn.kanban.Constructor=t}(jQuery);
\ No newline at end of file
+!function(){"use strict";function a(a,e){return n&&!e?requestAnimationFrame(a):setTimeout(a,e||0)}function e(a){return n?cancelAnimationFrame(a):void clearTimeout(a)}var n="function"==typeof window.requestAnimationFrame;$.zui({asap:a,clearAsap:e})}(),function(a){"use strict";function e(e,n){"string"==typeof e&&(e=a(e)),e instanceof a&&(e=e[0]);var t=e.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,d=window.innerWidth||document.documentElement.clientWidth;if(n)return t.left>=0&&t.top>=0&&t.left+t.width<=d&&t.top+t.height<=r;var i=t.top<=r&&t.top+t.height>=0,o=t.left<=d&&t.left+t.width>=0;return i&&o}var n="zui.virtualRender",t=function(e,r){"function"==typeof r&&(r={render:r});var d=this;d.name=n,d.$=a(e),d.options=r=a.extend({},t.DEFAULTS,this.$.data(),r),d.rendered=!1;var i=r.container;"function"==typeof i&&(i=i(d));var o=a(i?i:window);d.tryRender()||(d.$container=o,d.scrollListener=d.tryRender.bind(d),r.pendingClass&&d.$.addClass(r.pendingClass),o.on("scroll",d.scrollListener))};t.prototype.tryRender=function(){var n=this;return!(n.rendered||!e(n.$))&&(n.renderTaskID&&a.zui.clearAsap(n.renderTaskID),n.renderTaskID=a.zui.asap(function(){n.renderTaskID=null;var a=n.options.render(n.$);a!==!1&&(n.rendered=!0,n.destroy())},n.options.delay),!0)},t.prototype.destroy=function(){var e=this;e.renderTaskID&&a.zui.clearAsap(e.renderTaskID),e.scrollListener&&(e.$container.off("scroll",e.scrollListener),e.scrollListener=null);var t=e.options.pendingClass;t&&e.$.removeClass(t),e.$.removeData(n)},t.DEFAULTS={pendingClass:"virtual-pending"},a.fn.virtualRender=function(e){return this.each(function(){var r=a(this),d=r.data(n);if(d){if("string"==typeof e)return d[e]();d.destroy()}r.data(n,d=new t(this,e))})},a.zui.isElementInViewport=e}(jQuery),function(a){"use strict";var e="zui.kanban",n="object"==typeof CSS&&CSS.supports("display","flex"),t=function(n,r){var d=this;if(d.name=e,d.$=a(n).addClass("kanban"),r=d.setOptions(a.extend({},t.DEFAULTS,this.$.data(),r)),r.onAction){var i=function(e){var n=a(this);r.onAction(n.data("action"),n,e,d)};d.$.on("click",".action",i).on("dblclick",".action-dbc",i)}var o=r.droppable;if("auto"===o&&(o=!r.readonly),o){var s=r.sortable;"function"==typeof s?s={finish:s}:s&&"object"!=typeof s&&(s={});var l=0;"function"==typeof o?o={drop:o}:"object"!=typeof o&&(o={});var c=a.extend({dropOnMouseleave:!0,selector:".kanban-item",target:".kanban-lane-col:not(.kanban-col-sorting)",mouseButton:"left"},o,{before:function(e){if(o.before){var n=o.before(e);if(n===!1)return n}if(s){var t=e.element.closest(".kanban-lane-items");t.closest(".kanban-col").addClass("kanban-col-sorting"),d._sortResult=null,d._$sortItems=t;var r=t.data("zui.sortable");r||t.sortable(a.extend({},s,{selector:".kanban-item",trigger:".kanban-card",dragCssClass:"kanban-item-sorting",noShadow:!0,finish:function(a){a.changed&&a.list.length>1&&(d._sortResult=a)}})).triggerHandler(e.event)}},drop:function(a){o.drop&&o.drop(a),r.onAction&&r.onAction("dropItem",a.element,a,d)},start:function(e){d.$.addClass("kanban-dragging"),l&&clearTimeout(l),l=setTimeout(function(){a(e.shadowElement).addClass("in"),l=0},50),o.start&&o.start(e)},always:function(a){d.$.removeClass("kanban-dragging"),l&&(clearTimeout(l),l=0),s&&(d._$sortItems.sortable("destroy").closest(".kanban-col").removeClass("kanban-col-sorting"),a.target[0]===a.element.closest(".kanban-lane-col")[0]&&d._sortResult&&s.finish&&s.finish(d._sortResult)),o.always&&o.always(a)}});d.$.droppable(c)}r.onCreate&&r.onCreate(d)};t.prototype.setOptions=function(e){var t=this,r=a.extend({},t.options,{data:t.data},e);t.options=r,r.useFlex&&!n&&(r.useFlex=!1),t.$.toggleClass("no-flex",!r.useFlex).toggleClass("use-flex",!!r.useFlex);var d=!!a.fn.virtualRender&&r.virtualize;return d&&("object"!=typeof d&&(d={lane:!0}),t.virtualize=a.extend({},d)),t.data=r.data||[],t.render(t.data),r},t.prototype.render=function(a){var e=this;a&&(e.data=a),e.data&&!Array.isArray(e.data)&&(e.data=[e.data]);var n=e.options,t=e.data||[];n.beforeRender&&n.beforeRender(e,t),e.$.toggleClass("kanban-readonly",!!n.readonly).toggleClass("kanban-no-lane-name",!!n.noLaneName),e.$.children(".kanban-board").addClass("kanban-expired"),e.maxKanbanBoardWidth=0;for(var r=0;r1&&e.$.children(".kanban-board").css("min-width",e.maxKanbanBoardWidth),n.onRender&&n.onRender(e)},t.prototype.layoutKanban=function(a,e){for(var n=this,t=n.options,r=t.noLaneName?0:t.laneNameWidth,d=0,i={},o=!1,s=[],l=0;l0&&t.subLaneSpace&&(k.$height+=t.subLaneSpace)}}else for(var y=k.items||k.cards||{},C=0;C-1){var r=n.data[t];e=a.extend(r,e),n.data[t]=e}else n.data.push(e)}e.id||(e.id=a.zui.uuid());var d=e.id,i=n.options,o=n.$,s=o.children('.kanban-board[data-id="'+d+'"]');s.length?s.removeClass("kanban-expired"):s=a('').appendTo(o),n.layoutKanban(e,s),n.renderKanbanHeader(e,s),s.children(".kanban-lane").addClass("kanban-expired");for(var l=e.lanes||[],c=0;c ').prependTo(n),r.useFlex||i.addClass("clearfix")),i.css("height",(d?2:1)*r.headerHeight).toggleClass("kanban-header-has-parent",!!d);var o=i.children(".kanban-cols");o.css("left",e.$layout.laneNameWidth).children(".kanban-col").addClass("kanban-expired");for(var s=e.columns,l=e.$layout.columnsMap||{},c=null,u=null,h=0;h.kanban-col").addClass("kanban-expired"):o=a(['"].join("")),s&&s.length?s.after(o):n.prepend(o),o.data("col",e).attr("data-type",e.type);var l=r.$layout.columnWidth;i.useFlex?o.css("flex",e.subs.length+" "+e.subs.length+" "+l*e.subs.length+"%"):o.css({width:l*e.subs.length+"%",left:e.$index*l+"%"});var c=o.children(".kanban-header-col");c.find(".title>.icon").attr("class","icon icon-"+(e.icon||""));var u=c.find(".title>.text").text(e.name).attr("title",e.name);if(e.color&&u.css("color",e.color),i.showCount){var h=void 0!==e.count?e.count:e.$cardsCount;i.showZeroCount||h||(h="");var p=c.find(".title>.count").text(h);i.onRenderCount&&i.onRenderCount(p,h,e,d)}i.onRenderHeaderCol&&i.onRenderHeaderCol(o,e,n,r)},t.prototype.renderHeaderCol=function(e,n,t,r,d){var i=this,o=i.options;if(e.parentType&&t){var s=n.children('.kanban-header-parent-col[data-id="'+t.id+'"]');n=s.children(".kanban-header-sub-cols")}var l=n.children('.kanban-header-col[data-id="'+e.id+'"]'),c=r?n.children('.kanban-header-col[data-id="'+r.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):l=a(['"].join("")),c&&c.length?c.after(l):n.prepend(l),l.data("col",e).attr("data-type",e.type);var u=t?100/t.subs.length:d.$layout.columnWidth;o.useFlex?l.css("flex","1 1 "+u+"%"):l.css({left:(t?e.$subIndex:e.$index)*u+"%",width:u+"%"}),l.find(".title>.icon").attr("class","icon icon-"+(e.icon||""));var h=l.find(".title>.text").text(e.name).attr("title",e.name);if(e.color&&h.css("color",e.color),o.showCount){var p=void 0!==e.count?e.count:e.$cardsCount;o.showZeroCount||p||(p="");var b=l.find(".title>.count").text(p);o.onRenderCount&&o.onRenderCount(b,p,e,i)}o.onRenderHeaderCol&&o.onRenderHeaderCol(l,e,n,d)},t.prototype.renderLane=function(e,t,r,d){var i=this,o=i.options;r=r||i.$.children('.kanban-board[data-id="'+e.kanban+'"]');var s=r.children('.kanban-lane[data-id="'+e.id+'"]');s.length?s.removeClass("kanban-expired"):(s=a('').appendTo(r),n||s.addClass("clearfix"));var l=e.subLanes?e.subLanes.length:0;s.attr("data-index",e.$index).data("lane",e).toggleClass("has-sub-lane",l>0).css({height:e.$height||"auto"}),i.virtualizeRender(d,"lane",s,function(){if(!o.noLaneName){var n=s.children('.kanban-lane-name[data-id="'+e.id+'"]');n.length||(n=a('').prependTo(s)),n.empty().css("width",o.laneNameWidth).attr("title",e.name).append(a('').text(e.name)),e.color&&n.css("background-color",e.color),o.onRenderLaneName&&o.onRenderLaneName(n,e,r,t,d)}s.children(".kanban-cols,.kanban-sub-lanes").addClass("kanban-expired");var l;l=e.subLanes?i.renderSubLanes(e,t,s,d):i.renderLaneCols(t,e.items||e.cards||{},s,e,d),o.useFlex||l.css("left",d.$layout.laneNameWidth),s.children(".kanban-expired").remove()},{lane:e,columns:t,kanban:d})},t.prototype.virtualizeRender=function(e,n,t,r,d){var i=this,o=i.virtualize,s=o?o[n]:null;return s?("function"==typeof s&&(s=s(d,t)),"number"==typeof s&&t.height(s),void t.virtualRender(a.extend({render:r},i.options.virtualRenderOptions))):r()},t.prototype.renderSubLanes=function(e,n,t,r){var d=this,i=t.children(".kanban-sub-lanes");i.length?i.removeClass("kanban-expired"):i=a('').appendTo(t),i.children(".kanban-sub-lane").addClass("kanban-expired");for(var o=0;o').appendTo(r),n||o.addClass("clearfix")),o.attr("data-index",i).data("lane",e).css({height:e.$height||"auto"}),o.children(".kanban-col").addClass("kanban-expired");var s=e.items||e.cards;s&&this.renderLaneCols(t,s,o,e,d),o.children(".kanban-expired").remove()},t.prototype.renderLaneCols=function(e,n,t,r,d){var i=this,o=t.children(".kanban-cols");o.length?o.removeClass("kanban-expired"):o=a('').appendTo(t),o.children(".kanban-col").addClass("kanban-expired");for(var s=null,l=0;l0?e[i-1]:null;o.$index=i,o.$col=a,o.$lane=t,this.renderCard(o,d,s,a,t,r)}var l=a.cardsPerRow||t.cardsPerRow||r.cardsPerRow||this.options.cardsPerRow;d.css("padding",this.options.cardSpace/2).toggleClass("kanban-items-grid",l>1).attr("data-cards-per-row",l),d.children(".kanban-expired").remove()},t.prototype.renderLaneCol=function(e,n,t){var r=this,d=r.options,i=n.children('.kanban-lane-col[data-id="'+e.id+'"]'),o=t?n.children('.kanban-lane-col[data-id="'+t.id+'"]:not(.kanban-expired)'):null;i.length?i.removeClass("kanban-expired"):(i=a(['"].join("")),r.options.readonly||i.append(['','","
"].join("")),d.laneItemsClass&&i.find(".kanban-lane-items").addClass(d.laneItemsClass),d.laneColClass&&i.addClass(d.laneColClass)),o&&o.length?o.after(i):n.prepend(i),i.attr({"data-parent":e.parentType?e.parentType:null,"data-type":e.type}).data("col",e);var s=e.$kanbanData.$layout.columnWidth;return d.useFlex?i.css("flex","1 1 "+s+"%"):i.css({left:e.$index*s+"%",width:s+"%"}),i},t.prototype.renderCard=function(e,n,t,r,d,i){var o=this.options,s=n.children('.kanban-item[data-id="'+e.id+'"]'),l=t?n.children('.kanban-item[data-id="'+t.id+'"]:not(.kanban-expired)'):null;s.length?s.removeClass("kanban-expired"):(s=a(''),o.wrapCard&&s.append('')),l&&l.length?l.after(s):n.prepend(s);var c=r.cardsPerRow||d.cardsPerRow||i.cardsPerRow||o.cardsPerRow;s.data("item",e).css({padding:o.cardSpace/2,width:c>1?100/c+"%":""});var u=o.wrapCard?s.children(".kanban-card"):s;u.css("height",o.cardHeight);var h=o.cardRender||o.itemRender;if(h)h(e,u,r,d,i);else{var p=u.find(".title");p.length||(p=a('').appendTo(u)),p.text(e.name||e.title)}return u},t.DEFAULTS={minColWidth:100,maxColHeight:400,minColHeight:90,minSubColHeight:40,subLaneSpace:2,laneNameWidth:20,headerHeight:32,cardHeight:40,cardSpace:10,cardsPerRow:1,wrapCard:!0,fluidBoardWidth:!0,addItemText:"添加条目",useFlex:!0,droppable:"auto",laneColClass:"",showCount:!0},a.fn.kanban=function(n){return this.each(function(){var r=a(this),d=r.data(e),i="object"==typeof n&&n;d||r.data(e,d=new t(this,i)),"string"==typeof n&&d[n]()})},t.NAME=e,a.fn.kanban.Constructor=t}(jQuery);
\ No newline at end of file
diff --git a/xuanxuan/extension/xuan/index/ext/js/index/xuanxuan.js b/xuanxuan/extension/xuan/index/ext/js/index/xuanxuan.js
index 298d6b5bb9..6ba536deac 100644
--- a/xuanxuan/extension/xuan/index/ext/js/index/xuanxuan.js
+++ b/xuanxuan/extension/xuan/index/ext/js/index/xuanxuan.js
@@ -5,7 +5,7 @@ if(window.navigator.userAgent.indexOf('xuanxuan') > 0)
/** Update zentao client app menu */
function updateAppMenu()
{
- const menuItems = appsMenuItems.map(function(item)
+ var menuItems = appsMenuItems.map(function(item)
{
if (item === 'divider') return '-';
var $title = $('' + item.title + '
');
diff --git a/xuanxuan/extension/xuan/index/ext/view/index.xuanxuan.html.hook.php b/xuanxuan/extension/xuan/index/ext/view/index.xuanxuan.html.hook.php
index 9fdc05f312..e056e5cd95 100644
--- a/xuanxuan/extension/xuan/index/ext/view/index.xuanxuan.html.hook.php
+++ b/xuanxuan/extension/xuan/index/ext/view/index.xuanxuan.html.hook.php
@@ -10,7 +10,7 @@ $('html').addClass('xxc-embed');
/** Update zentao client app menu */
function updateAppMenu()
{
- const menuItems = appsMenuItems.map(function(item)
+ var menuItems = appsMenuItems.map(function(item)
{
if (item === 'divider') return '-';
var $title = $('' + item.title + '
');