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 @@ - - - model == 'scrum'):?> end == LONG_TIME) echo "class='hidden'";?>> - story->getFlowExtendFields(); - foreach($extendFields as $extendField) echo ""; + foreach($extendFields as $extendField) + { + $required = strpos(",$extendField->rules,", ',1,') !== false ? 'required' : ''; + echo ""; + } ?> @@ -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 @@
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)'");?>
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;?> {$extendField->name}{$extendField->name}
'>
status == 'closed'):?> - + diff --git a/module/task/view/batchcreate.html.php b/module/task/view/batchcreate.html.php old mode 100644 new mode 100755 index 8845a8bd13..fa922a4fd2 --- a/module/task/view/batchcreate.html.php +++ b/module/task/view/batchcreate.html.php @@ -81,7 +81,11 @@ task->getFlowExtendFields(); - foreach($extendFields as $extendField) echo ""; + foreach($extendFields as $extendField) + { + $required = strpos(",$extendField->rules,", ',1,') !== false ? 'required' : ''; + echo ""; + } ?> @@ -162,7 +166,15 @@ - control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[$i]") . "";?> + 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->flow->getFieldControl($extendField, $object, $extendField->field . "[$i]") . ""; + } + ?> @@ -228,7 +240,15 @@ - control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[%s]") . "";?> + 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->flow->getFieldControl($extendField, $object, $extendField->field . "[%s]") . ""; + } + ?>
story->duplicateStory;?>story->duplicateStory;?> duplicateStory == 0 ? '' : $story->duplicateStory, "class='form-control'");?>
'>task->pri;?> {$extendField->name}{$extendField->name}
> >task->priList, $pri, 'class=form-control');?>
> >task->priList, $pri, 'class=form-control');?>
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;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(['
','
','
','','',i.showCount?'':"","
","
",'
',"
","
"].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(['
','
','','',o.showCount?'':"","
",'
',"
"].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 +!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(['
','
','
','','',i.showCount?'':"","
","
",'
',"
","
"].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(['
','
','','',o.showCount?'':"","
",'
',"
"].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 + '
');