From 6eeaa44aa02f83fb1f1e06fa1a18fb76fe60c3d1 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 6 Dec 2021 08:58:58 +0800 Subject: [PATCH 01/30] * Fix bug #17077. --- module/branch/view/ajaxgetdropmenu.html.php | 4 ++-- module/product/model.php | 16 ++++++++++++++-- module/product/view/ajaxgetdropmenu.html.php | 2 +- module/testtask/control.php | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/module/branch/view/ajaxgetdropmenu.html.php b/module/branch/view/ajaxgetdropmenu.html.php index e31ed3807b..472398d74c 100644 --- a/module/branch/view/ajaxgetdropmenu.html.php +++ b/module/branch/view/ajaxgetdropmenu.html.php @@ -13,11 +13,11 @@ foreach($branches as $branchID => $branch) if($branchID == 'all' or empty($branchID) or $statusList[$branchID] == 'active') { - $activeBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}'"); + $activeBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}' data-app='{$this->app->tab}'"); } else { - $closedBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}'"); + $closedBranchesHtml .= html::a($linkHtml, $branch, '', "class='$selected' data-key='{$branchesPinyin[$branch]}' data-app='{$this->app->tab}'"); } } ?> diff --git a/module/product/model.php b/module/product/model.php index 3d268bed7c..8a39ab2c67 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -539,7 +539,7 @@ class productModel extends model if($currentModule == 'tree' and $currentMethod == 'browse') $isShowBranch = true; if($currentModule == 'product' and strpos($this->config->product->showBranchMethod, $currentMethod) !== false) $isShowBranch = true; if($this->app->tab == 'qa' and strpos(',testsuite,testreport,testtask,', ",$currentModule,") === false) $isShowBranch = true; - if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,', ",$currentMethod,") === false) $isShowBranch = true; + if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,browseunits,importunitresult,', ",$currentMethod,") === false) $isShowBranch = true; if($isShowBranch) { $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$currentProduct->type]); @@ -1978,7 +1978,19 @@ class productModel extends model elseif($module == 'testtask') { $extra = $method != 'browse' ? '' : "&extra=$extra"; - $link = helper::createLink($module, 'browse', "productID=%s" . ($branch ? "&branch=%s" : '&branch=0') . $extra); + if(strtolower($method) == 'browseunits') + { + $methodName = 'browseUnits'; + $param = '&browseType=newest&orderBy=id_desc&recTotal=0&recPerPage=0&pageID=1'; + $param .= $this->app->tab == 'project' ? "&projectID={$this->session->project}" : ''; + } + else + { + $methodName = 'browse'; + $param = ($branch ? "&branch=%s" : '&branch=0') . $extra; + } + + $link = helper::createLink($module, $methodName, "productID=%s" . $param); } elseif($module == 'bug' && $method == 'view') { diff --git a/module/product/view/ajaxgetdropmenu.html.php b/module/product/view/ajaxgetdropmenu.html.php index e5e4614385..7dacf4a174 100644 --- a/module/product/view/ajaxgetdropmenu.html.php +++ b/module/product/view/ajaxgetdropmenu.html.php @@ -82,7 +82,7 @@ foreach($products as $programID => $programProducts) if($product->status == 'normal' and $product->PO == $this->app->user->account) { - $myProductsHtml .= '
  • ' . html::a($linkHtml, $productName, '', "class='$selected productName' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' " . $locateTab) . '
  • '; + $myProductsHtml .= '
  • ' . html::a($linkHtml, $productName, '', "class='$selected productName' title='{$productName}' data-key='" . zget($productsPinYin, $product->name, '') . "' data-app='$app->tab'") . '
  • '; if($selected == 'selected') $tabActive = 'myProduct'; diff --git a/module/testtask/control.php b/module/testtask/control.php index f6f1581325..db6ffd75de 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -175,7 +175,7 @@ class testtask extends control } $this->loadModel('project')->setMenu($this->session->project); - $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID"); + $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', "projectID=$projectID", '', 0, '', false); } else { @@ -1394,7 +1394,7 @@ class testtask extends control $this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask'; $this->lang->scrum->menu->qa['subMenu']->testtask['subModule'] = ''; $this->loadModel('project')->setMenu($this->session->project); - $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits'); + $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', '', '', 0, '', false); /* Replace language. */ $project = $this->project->getByID($this->session->project); From 5c23642d3659a256b0663bebf6cbd5b3163c6e7a Mon Sep 17 00:00:00 2001 From: liyuchun Date: Mon, 6 Dec 2021 09:06:50 +0800 Subject: [PATCH 02/30] * Fix bug #16639. --- module/testtask/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/testtask/control.php b/module/testtask/control.php index f6f1581325..581976b8af 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -1365,7 +1365,7 @@ class testtask extends control ->andWhere('`case`')->in($this->post->caseIDList) ->exec(); $this->loadModel('action'); - foreach($this->post->caseIDList as $caseID) $this->action->create('case', $caseID, 'assigned', '', $taskID); + foreach($this->post->caseIDList as $caseID) $this->action->create('case', $caseID, 'assigned', '', $this->post->assignedTo); die(js::locate($this->session->caseList, 'parent')); } From e1b5dd464224f7b760b1b95bd76117df46066687 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 6 Dec 2021 09:12:46 +0800 Subject: [PATCH 03/30] * Add the unitcases method for remove the branch select. --- module/product/model.php | 2 +- module/testtask/control.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/product/model.php b/module/product/model.php index 8a39ab2c67..8bc8e7997d 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -539,7 +539,7 @@ class productModel extends model if($currentModule == 'tree' and $currentMethod == 'browse') $isShowBranch = true; if($currentModule == 'product' and strpos($this->config->product->showBranchMethod, $currentMethod) !== false) $isShowBranch = true; if($this->app->tab == 'qa' and strpos(',testsuite,testreport,testtask,', ",$currentModule,") === false) $isShowBranch = true; - if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,browseunits,importunitresult,', ",$currentMethod,") === false) $isShowBranch = true; + if($this->app->tab == 'qa' and $currentModule == 'testtask' and strpos(',create,edit,browseunits,importunitresult,unitcases,', ",$currentMethod,") === false) $isShowBranch = true; if($isShowBranch) { $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$currentProduct->type]); diff --git a/module/testtask/control.php b/module/testtask/control.php index db6ffd75de..867cfbf7aa 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -365,7 +365,7 @@ class testtask extends control $this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask'; $this->lang->scrum->menu->qa['subMenu']->testtask['subModule'] = ''; $this->loadModel('project')->setMenu($this->session->project); - $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits'); + $this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits', '', '', 0, '', false); } else { From 6507be61d815509783b8ea8f30c7e3f3a7eee9e1 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 6 Dec 2021 09:20:22 +0800 Subject: [PATCH 04/30] * Fix bug #17108. --- module/build/model.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/module/build/model.php b/module/build/model.php index b5176147c5..fe46c08ec1 100644 --- a/module/build/model.php +++ b/module/build/model.php @@ -78,15 +78,15 @@ class buildModel extends model /** * Get builds of a project in pairs. * - * @param int $projectID - * @param int $productID - * @param int $branch - * @param string $params noempty|notrunk, can be a set of them - * @param int $buildID + * @param int $projectID + * @param int $productID + * @param int|string $branch + * @param string $params noempty|notrunk|nodone|noterminate, can be a set of them + * @param int $buildID * @access public * @return array */ - public function getProjectBuildPairs($projectID, $productID, $branch = 0, $params = '', $buildID = 0) + public function getProjectBuildPairs($projectID, $productID, $branch = 'all', $params = '', $buildID = 0) { $sysBuilds = array(); $selectedBuilds = array(); @@ -100,7 +100,7 @@ class buildModel extends model ->leftJoin(TABLE_BRANCH)->alias('t4')->on('t1.branch = t4.id') ->where('t1.project')->eq((int)$projectID) ->beginIF($productID)->andWhere('t1.product')->eq((int)$productID)->fi() - ->beginIF($branch)->andWhere('t1.branch')->in("0,$branch")->fi() + ->beginIF($branch !== 'all')->andWhere('t1.branch')->eq($branch)->fi() ->andWhere('t1.deleted')->eq(0) ->orderBy('t1.date desc, t1.id desc')->fetchAll('id'); From 4de8fc462fdf8f776dc8dc7ac9ab4a463e6d6d60 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 6 Dec 2021 09:33:41 +0800 Subject: [PATCH 05/30] * Fix bug#17079. --- module/testtask/model.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/module/testtask/model.php b/module/testtask/model.php index 74ba37814e..51243d6618 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -72,12 +72,11 @@ class testtaskModel extends model { $products = $scopeAndStatus[0] == 'all' ? $this->app->user->view->products : array(); - return $this->dao->select("t1.*, t2.name AS productName, t3.name AS executionName, t4.name AS buildName, if(t4.name != '', t4.branch, t5.branch) AS branch") + return $this->dao->select("t1.*, t2.name AS productName, t3.name AS executionName, t4.name AS buildName, t4.branch AS branch") ->from(TABLE_TESTTASK)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_EXECUTION)->alias('t3')->on('t1.execution = t3.id') ->leftJoin(TABLE_BUILD)->alias('t4')->on('t1.build = t4.id') - ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t5')->on('t1.execution = t5.project and t1.product = t5.product') ->where('t1.deleted')->eq(0) ->andWhere('t1.auto')->ne('unit') @@ -86,7 +85,7 @@ class testtaskModel extends model ->beginIF($scopeAndStatus[0] == 'all')->andWhere('t1.product')->in($products)->fi() ->beginIF(strtolower($scopeAndStatus[1]) == 'totalstatus')->andWhere('t1.status')->in('blocked,doing,wait,done')->fi() ->beginIF(strtolower($scopeAndStatus[1]) != 'totalstatus')->andWhere('t1.status')->eq($scopeAndStatus[1])->fi() - ->beginIF($branch !== 'all')->andWhere("if(t4.branch, t4.branch, t5.branch) = '$branch'")->fi() + ->beginIF($branch !== 'all')->andWhere('t4.branch')->eq($branch)->fi() ->beginIF($beginTime)->andWhere('t1.begin')->ge($beginTime)->fi() ->beginIF($endTime)->andWhere('t1.end')->le($endTime)->fi() ->orderBy($orderBy) From 74ef8b9a1094d519cd04edf0eb803239fc6be957 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 6 Dec 2021 09:36:59 +0800 Subject: [PATCH 06/30] * refactor: comment. --- module/execution/js/kanban.js | 58 ++++++++++++++--------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index 11d735ea65..46d23d11e5 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -64,7 +64,7 @@ function renderDeadline(deadline) } /** - * Render story item 提供方法渲染看板中的需求卡片 + * Render story item * @param {Object} item Story item object * @param {JQuery} $item Kanban item element * @param {Object} col Column object @@ -125,7 +125,7 @@ function renderStoryItem(item, $item, col) } /** - * Render bug item 提供方法渲染看板中的 Bug 卡片 + * Render bug item * @param {Object} item Bug item object * @param {JQuery} $item Kanban item element * @param {Object} col Column object @@ -188,7 +188,7 @@ function renderBugItem(item, $item, col) } /** - * Render task item 提供方法渲染看板中的任务卡片 + * Render task item * @param {Object} item Task item object * @param {JQuery} $item Kanban item element * @param {Object} col Column object @@ -252,13 +252,13 @@ function renderTaskItem(item, $item, col) return $item; } -/* Add column renderer/ 添加特定列类型或列条目类型渲染方法 */ +/* Add column renderer */ addColumnRenderer('story', renderStoryItem); addColumnRenderer('bug', renderBugItem); addColumnRenderer('task', renderTaskItem); /** - * Render column count 渲染看板列头上的卡片数目 + * Render column count * @param {JQuery} $count Kanban count element * @param {number} count Column cards count * @param {number} col Column object @@ -271,7 +271,7 @@ function renderColumnCount($count, count, col) } /** - * Render header column 渲染看板列头部 + * Render header column * @param {JQuery} $col Header column element * @param {Object} col Header column object * @param {JQuery} $header Header element @@ -307,7 +307,7 @@ function renderHeaderCol($col, col, $header, kanban) } /** - * Render lane name 渲染看板泳道名称 + * Render lane name * @param {JQuery} $name Name element * @param {Object} lane Lane object * @param {JQuery} $kanban $kanban element @@ -331,9 +331,8 @@ function renderLaneName($name, lane, $kanban, columns, kanban) /** * Updata kanban data - * 更新看板上的数据 - * @param {string} kanbanID Kanban id 看板 ID - * @param {Object} data Kanban data 看板数据 + * @param {string} kanbanID Kanban id + * @param {Object} data Kanban data */ function updateKanban(kanbanID, data) { @@ -345,10 +344,9 @@ function updateKanban(kanbanID, data) /** * Create kanban in page - * 在界面上创建一个看板界面 - * @param {string} kanbanID Kanban id 看板 ID - * @param {Object} data Kanban data 看板数据 - * @param {Object} options Kanban options 组件初始化数据 看板名称 + * @param {string} kanbanID Kanban id + * @param {Object} data Kanban data + * @param {Object} options Kanban options */ function createKanban(kanbanID, data, options) { @@ -502,7 +500,6 @@ function findDropColumns($element, $root) /** * Change column type for a card - * 变更卡片类型 * @param {Object} card Card object * @param {String} fromColType The column type before change * @param {String} toColType The column type after change @@ -568,13 +565,6 @@ function changeCardColType(card, fromColType, toColType, kanbanID) var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '80%', url: link}); modalTrigger.show(); } - - /* - // TODO: The server must return a updated kanban data 服务器返回更新后的看板数据 - - // 调用 updateKanban 更新看板数据 - updateKanban(kanbanID, newKanbanData); - */ } /** @@ -588,7 +578,7 @@ function handleFinishDrop(event) var $dragCol = $card.closest('.kanban-lane-col'); var $dropCol = $(event.target); - /* Get d-n-d(drag and drop) infos 获取拖放操作相关信息 */ + /* Get d-n-d(drag and drop) infos */ var card = $card.data('item'); var fromColType = $dragCol.data('type'); var toColType = $dropCol.data('type'); @@ -599,9 +589,7 @@ function handleFinishDrop(event) $('#kanbans').find('.can-drop-here').removeClass('can-drop-here'); } -/** - * Handle sort cards in column 处理对列卡片进行排序 - */ +/** Handle sort cards in column */ function handleSortColCards() { /* TODO: handle sort cards from column contextmenu */ @@ -609,7 +597,7 @@ function handleSortColCards() } /** - * Create column menu 创建列操作菜单 + * Create column menu * @returns {Object[]} */ function createColumnMenu(options) @@ -626,7 +614,7 @@ function createColumnMenu(options) } /** - * Create column create button menu 创建列添加按钮操作菜单 + * Create column create button menu * @returns {Object[]} */ function createColumnCreateMenu(options) @@ -656,7 +644,7 @@ function createColumnCreateMenu(options) } /** - * Create lane menu 创建泳道操作菜单 + * Create lane menu * @returns {Object[]} */ function createLaneMenu(options) @@ -681,7 +669,7 @@ function createLaneMenu(options) } /** - * Create story menu 创建需求卡片操作菜单 + * Create story menu * @returns {Object[]} */ function createStoryMenu(options) @@ -703,7 +691,7 @@ function createStoryMenu(options) } /** - * Create bug menu 创建 Bug 卡片操作菜单 + * Create bug menu * @returns {Object[]} */ function createBugMenu(options) @@ -724,7 +712,7 @@ function createBugMenu(options) } /** - * Create task menu 创建任务卡片操作菜单 + * Create task menu * @returns {Object[]} */ function createTaskMenu(options) @@ -819,7 +807,7 @@ $(function() $('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null); $('#kanbanScaleControl .btn[data-type="-"]').attr('disabled', window.kanbanScaleSize <= 1 ? 'disabled' : null); - /* Common options 用于初始化看板的通用选项 */  + /* Common options */  var commonOptions = { maxColHeight: 'auto', @@ -843,7 +831,7 @@ $(function() onRenderCount: renderColumnCount }; - /* Create kanban 创建看板 */ + /* Create kanban */ if(groupBy == 'default') { var kanbanLane = ''; @@ -858,7 +846,7 @@ $(function() } else { - /* Create kanban by group. 分泳道创建看板. */ + /* Create kanban by group. */ createKanban(browseType, kanbanGroup[groupBy], commonOptions); } From 2f8bf5331fe14ac1633dc9e68cfd1d2ab3dbf689 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 6 Dec 2021 09:37:15 +0800 Subject: [PATCH 07/30] * update zui lib. --- www/js/zui/min.js | 6 +++--- www/theme/zui/css/min.css | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 351314ce8a..86083ba53c 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2021-12-03 + * ZUI: ZUI for Zentao - v1.10.0 - 2021-12-06 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2021 cnezsoft.com; Licensed MIT @@ -16,8 +16,8 @@ function(t,e,i){"$:nomunge";function n(){o=e[r](function(){a.each(function(){var * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ -function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(t){return r.raw?t:encodeURIComponent(t)}function i(t){return r.raw?t:decodeURIComponent(t)}function n(t){return e(r.json?JSON.stringify(t):String(t))}function o(t){0===t.indexOf('"')&&(t=t.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return t=decodeURIComponent(t.replace(s," ")),r.json?JSON.parse(t):t}catch(e){}}function a(t,e){var i=r.raw?t:o(t);return"function"==typeof e?e(i):i}var s=/\+/g,r=t.cookie=function(o,s,l){if(void 0!==s&&"function"!=typeof s){if(l=t.extend({},r.defaults,l),"number"==typeof l.expires){var h=l.expires,c=l.expires=new Date;c.setTime(+c+864e5*h)}return document.cookie=[e(o),"=",n(s),l.expires?"; expires="+l.expires.toUTCString():"",l.path?"; path="+l.path:"",l.domain?"; domain="+l.domain:"",l.secure?"; secure":""].join("")}for(var d=o?void 0:{},u=document.cookie?document.cookie.split("; "):[],f=0,p=u.length;f=0;t--)delete this.page[i[t]];this.set(a,this.page)}},s.prototype.pageRemove=function(t){"undefined"!=typeof this.page[t]&&(this.page[t]=null,this.pageSave())},s.prototype.pageClear=function(){this.page={},this.pageSave()},s.prototype.pageGet=function(t,e){var i=this.page[t];return void 0===e||null!==i&&void 0!==i?i:e},s.prototype.pageSet=function(t,i){e.isPlainObject(t)?e.extend(!0,this.page,t):this.page[this.serialize(t)]=i,this.pageSave()},s.prototype.check=function(){if(!this.enable&&!this.silence)throw new Error("Browser not support localStorage or enable status been set true.");return this.enable},s.prototype.length=function(){return this.check()?i.getLength?i.getLength():i.length:0},s.prototype.removeItem=function(t){return i.removeItem(t),this},s.prototype.remove=function(t){return this.removeItem(t)},s.prototype.getItem=function(t){return i.getItem(t)},s.prototype.get=function(t,e){var i=this.deserialize(this.getItem(t));return"undefined"!=typeof i&&null!==i||"undefined"==typeof e?i:e},s.prototype.key=function(t){return i.key(t)},s.prototype.setItem=function(t,e){return i.setItem(t,e),this},s.prototype.set=function(t,e){return void 0===e?this.remove(t):(this.setItem(t,this.serialize(e)),this)},s.prototype.clear=function(){return i.clear(),this},s.prototype.forEach=function(t){for(var e=this.length(),n=e-1;n>=0;n--){var o=i.key(n);t(o,this.get(o))}return this},s.prototype.getAll=function(){var t={};return this.forEach(function(e,i){t[e]=i}),t},s.prototype.serialize=function(t){return"string"==typeof t?t:JSON.stringify(t)},s.prototype.deserialize=function(t){if("string"==typeof t)try{return JSON.parse(t)}catch(e){return t||void 0}},e.zui({store:new s})}(window,jQuery),function(t){"use strict";var e="zui.searchBox",i=function(e,n){var o=this;o.name=name,o.$=t(e),o.options=n=t.extend({},i.DEFAULTS,o.$.data(),n);var a=o.$.is(n.inputSelector)?o.$:o.$.find(n.inputSelector);if(a.length){var s=function(){o.changeTimer&&(clearTimeout(o.changeTimer),o.changeTimer=null)},r=function(){s();var t=o.getSearch();if(t!==o.lastValue){var e=""===t;a.toggleClass("empty",e),o.$.callComEvent(o,"onSearchChange",[t,e]),o.lastValue=t}};o.$input=a=a.first(),a.on(n.listenEvent,function(t){o.changeTimer=setTimeout(function(){r()},n.changeDelay)}).on("focus",function(t){a.addClass("focus"),o.$.callComEvent(o,"onFocus",[t])}).on("blur",function(t){a.removeClass("focus"),o.$.callComEvent(o,"onBlur",[t])}).on("keydown",function(t){var e=0,i=t.which;27===i&&n.escToClear?(this.setSearch("",!0),r(),e=1):13===i&&n.onPressEnter&&(r(),o.$.callComEvent(o,"onPressEnter",[t]));var a=o.$.callComEvent(o,"onKeyDown",[t]);a===!1&&(e=1),e&&t.preventDefault()}),o.$.on("click",".search-clear-btn",function(t){o.setSearch("",!0),r(),o.focus(),t.preventDefault()}),r()}else console.error("ZUI: search box init error, cannot find search box input element.")};i.DEFAULTS={inputSelector:'input[type="search"],input[type="text"]',listenEvent:"change input paste",changeDelay:500},i.prototype.getSearch=function(){return this.$input&&t.trim(this.$input.val())},i.prototype.setSearch=function(t,e){var i=this.$input;i&&(i.val(t),e||i.trigger("change"))},i.prototype.focus=function(){this.$input&&this.$input.focus()},t.fn.searchBox=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[n]()})},i.NAME=e,t.fn.searchBox.Constructor=i}(jQuery),function(t,e){"use strict";var i="zui.draggable",n={container:"body",move:!0},o=0,a=function(e,i){var a=this;a.$=t(e),a.id=o++,a.options=t.extend({},n,a.$.data(),i),a.init()};a.DEFAULTS=n,a.NAME=i,a.prototype.init=function(){var n,o,a,s,r,l=this,h=l.$,c="before",d="drag",u="finish",f="."+i+"."+l.id,p="mousedown"+f,g="mouseup"+f,m="mousemove"+f,v=l.options,y=v.selector,b=v.handle,w=h,x="function"==typeof v.move,C=function(t){var e=t.pageX,i=t.pageY;r=!0;var o={left:e-a.x,top:i-a.y};w.removeClass("drag-ready").addClass("dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[d]&&v[d]({event:t,element:w,startOffset:a,pos:o,offset:{x:e-n.x,y:i-n.y},smallOffset:{x:e-s.x,y:i-s.y}}),s.x=e,s.y=i,v.stopPropagation&&t.stopPropagation()},_=function(i){if(t(e).off(f),!r)return void w.removeClass("drag-ready");var o={left:i.pageX-a.x,top:i.pageY-a.y};w.removeClass("drag-ready dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[u]&&v[u]({event:i,element:w,startOffset:a,pos:o,offset:{x:i.pageX-n.x,y:i.pageY-n.y},smallOffset:{x:i.pageX-s.x,y:i.pageY-s.y}}),i.preventDefault(),v.stopPropagation&&i.stopPropagation()},k=function(i){var l=t.zui.getMouseButtonCode(v.mouseButton);if(!(l>-1&&i.button!==l)){var h=t(this);if(y&&(w=b?h.closest(y):h),v[c]){var d=v[c]({event:i,element:w});if(d===!1)return}var u=t(v.container),f=w.offset();o=u.offset(),n={x:i.pageX,y:i.pageY},a={x:i.pageX-f.left+o.left,y:i.pageY-f.top+o.top},s=t.extend({},n),r=!1,w.addClass("drag-ready"),i.preventDefault(),v.stopPropagation&&i.stopPropagation(),t(e).on(m,C).on(g,_)}};b?h.on(p,b,k):y?h.on(p,y,k):h.on(p,k)},a.prototype.destroy=function(){var n="."+i+"."+this.id;this.$.off(n),t(e).off(n),this.$.data(i,null)},t.fn.draggable=function(e){return this.each(function(){var n=t(this),o=n.data(i),s="object"==typeof e&&e;o||n.data(i,o=new a(this,s)),"string"==typeof e&&o[e]()})},t.fn.draggable.Constructor=a}(jQuery,document),function(t,e,i){"use strict";var n="zui.droppable",o={target:".droppable-target",deviation:5,sensorOffsetX:0,sensorOffsetY:0,dropToClass:"drop-to",dropTargetClass:"drop-target"},a=0,s=function(e,i){var n=this;n.id=a++,n.$=t(e),n.options=t.extend({},o,n.$.data(),i),n.init()};s.DEFAULTS=o,s.NAME=n,s.prototype.trigger=function(e,i){return t.zui.callEvent(this.options[e],i,this)},s.prototype.init=function(){var o,a,s,r,l,h,c,d,u,f,p,g,m,v=this,y=v.$,b=v.options,w=b.deviation,x="."+n+"."+v.id,C="mousedown"+x,_="mouseup"+x,k="mousemove"+x,T=b.selector,S=b.handle,D=b.flex,M=b.container,P=b.canMoveHere,z=b.dropToClass,L=y,F=!1,I=M?t(b.container).first():T?y:t("body");b.dropOnMouseleave&&(_+=" mouseleave"+x);var $=function(e){if(F&&(p={left:e.pageX,top:e.pageY},!(i.abs(p.left-d.left)a&&p.top>s&&p.left-1&&i.button!==n)){var p=t(this);T&&(L=S?p.closest(T):p),L.hasClass("drag-shadow")||b.before&&b.before({event:i,element:L})===!1||(F=!0,o="function"==typeof b.target?b.target(L,y):I.find(b.target),a=null,s=null,r=!1,l=!0,h=null,c=L.offset(),u=I.offset(),u.top=u.top-I.scrollTop(),u.left=u.left-I.scrollLeft(),d={left:i.pageX,top:i.pageY},g=t.extend({},d),f={left:d.left-c.left,top:d.top-c.top},L.addClass("drag-from"),t(e).on(k,$).on(_,A),m=setTimeout(function(){t(e).on(C,A)},10),i.preventDefault(),b.stopPropagation&&i.stopPropagation())}};S?y.on(C,S,E):T?y.on(C,T,E):y.on(C,E)},s.prototype.destroy=function(){var i="."+n+"."+this.id;this.$.off(i),t(e).off(i),this.$.data(n,null)},s.prototype.reset=function(){this.destroy(),this.init()},t.fn.droppable=function(e){return this.each(function(){var i=t(this),o=i.data(n),a="object"==typeof e&&e;o||i.data(n,o=new s(this,a)),"string"==typeof e&&o[e]()})},t.fn.droppable.Constructor=s}(jQuery,document,Math),+function(t,e){"use strict";function i(e,i,a){return this.each(function(){var s=t(this),r=s.data(n),l=t.extend({},o.DEFAULTS,s.data(),"object"==typeof e&&e);r||s.data(n,r=new o(this,l)),"string"==typeof e?r[e](i,a):l.show&&r.show(i,a)})}var n="zui.modal",o=function(i,o){var a=this;a.options=o,a.$body=t(document.body),a.$element=t(i),a.$backdrop=a.isShown=null,a.scrollbarWidth=0,o.moveable===e&&(a.options.moveable=a.$element.hasClass("modal-moveable")),o.remote&&a.$element.find(".modal-content").load(o.remote,function(){a.$element.trigger("loaded."+n)}),o.scrollInside&&t(window).on("resize."+n,function(){a.isShown&&a.adjustPosition(e,100)})};o.VERSION="3.2.0",o.TRANSITION_DURATION=300,o.BACKDROP_TRANSITION_DURATION=150,o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0,position:"fit"};var a=function(e,i){var n=t(window);i.left=Math.max(0,Math.min(i.left,n.width()-e.outerWidth())),i.top=Math.max(0,Math.min(i.top,n.height()-e.outerHeight())),e.css(i)};o.prototype.toggle=function(t,e){return this.isShown?this.hide():this.show(t,e)},o.prototype.adjustPosition=function(i,o){var s=this;if(clearTimeout(s.reposTask),o)return void(s.reposTask=setTimeout(s.adjustPosition.bind(s,i,0),o));var r=s.options;if(i===e&&(i=r.position),i!==e&&null!==i){"function"==typeof i&&(i=i(s));var l=s.$element.find(".modal-dialog"),h=t(window).height(),c={maxHeight:"initial",overflow:"visible"},d=l.find(".modal-body").css(c);if(r.scrollInside&&d.length){var u=r.headerHeight,f=r.footerHeight,p=l.find(".modal-header"),g=l.find(".modal-footer");"number"!=typeof u&&(u=p.length?p.outerHeight():"function"==typeof u?u(p):0),"number"!=typeof f&&(f=g.length?g.outerHeight():"function"==typeof f?f(g):0),c.maxHeight=h-u-f,c.overflow=d[0].scrollHeight>c.maxHeight?"auto":"visible",d.css(c)}var m=Math.max(0,(h-l.outerHeight())/2);if("fit"===i?i={top:m>50?Math.floor(2*m/3):m}:"center"===i?i={top:m}:t.isPlainObject(i)||(i={top:i}),l.hasClass("modal-moveable")){var v=null,y=r.rememberPos;y&&(y===!0?v=s.$element.data("modal-pos"):t.zui.store&&(v=t.zui.store.pageGet(n+".rememberPos."+y))),i=t.extend(i,{left:Math.max(0,(t(window).width()-l.outerWidth())/2)},v),"inside"===r.moveable?a(l,i):l.css(i)}else l.css(i)}},o.prototype.setMoveable=function(){t.fn.draggable||console.error("Moveable modal requires draggable.js.");var e=this,i=e.options,o=e.$element.find(".modal-dialog").removeClass("modal-dragged");o.toggleClass("modal-moveable",!!i.moveable),e.$element.data("modal-moveable-setup")||o.draggable({container:e.$element,handle:".modal-header",before:function(){var t=o.css("margin-top");t&&"0px"!==t&&o.css("top",t).css("margin-top","").addClass("modal-dragged")},finish:function(o){var a=i.rememberPos;a&&(e.$element.data("modal-pos",o.pos),t.zui.store&&a!==!0&&t.zui.store.pageSet(n+".rememberPos."+a,o.pos))},move:"inside"!==i.moveable||function(t){a(o,t)}})},o.prototype.show=function(e,i){var a=this,s=t.Event("show."+n,{relatedTarget:e});a.$element.trigger(s),a.$element.toggleClass("modal-scroll-inside",!!a.options.scrollInside),a.isShown||s.isDefaultPrevented()||(a.isShown=!0,a.options.moveable&&a.setMoveable(),a.options.backdrop!==!1&&(a.setScrollbar(),a.$body.addClass("modal-open")),a.escape(),a.$element.on("click.dismiss."+n,'[data-dismiss="modal"]',function(t){a.hide(),t.stopPropagation()}),a.backdrop(function(){var s=t.support.transition&&a.$element.hasClass("fade");a.$element.parent().length||a.$element.appendTo(a.$body),a.$element.show().scrollTop(0),s&&a.$element[0].offsetWidth,a.$element.addClass("in").attr("aria-hidden",!1),a.adjustPosition(i),a.enforceFocus();var r=t.Event("shown."+n,{relatedTarget:e});s?a.$element.find(".modal-dialog").one("bsTransitionEnd",function(){a.$element.trigger("focus").trigger(r)}).emulateTransitionEnd(o.TRANSITION_DURATION):a.$element.trigger("focus").trigger(r)}))},o.prototype.hide=function(e){e&&e.preventDefault&&e.preventDefault();var i=this;e=t.Event("hide."+n),i.$element.trigger(e),i.isShown&&!e.isDefaultPrevented()&&(i.isShown=!1,i.options.backdrop!==!1&&(i.$body.removeClass("modal-open"),i.resetScrollbar()),i.escape(),t(document).off("focusin."+n),i.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss."+n),t.support.transition&&i.$element.hasClass("fade")?i.$element.one("bsTransitionEnd",i.hideModal.bind(i)).emulateTransitionEnd(o.TRANSITION_DURATION):i.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin."+n).on("focusin."+n,function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")}.bind(this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?t(document).on("keydown.dismiss."+n,function(i){if(27==i.which){var o=t.Event("escaping."+n),a=this.$element.triggerHandler(o,"esc");if(a!=e&&!a)return;this.hide()}}.bind(this)):this.isShown||t(document).off("keydown.dismiss."+n)},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden."+n)})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var i=this,a=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&a;if(this.$backdrop=t('').appendTo("body").data(n,i);var s=function(t,i,n){n=n||e[t],"function"==typeof n&&o.on(i+a,n)};s("onShow","show"),s("shown","shown"),s("onHide","hide",function(t){if("iframe"===e.type&&i.$iframeBody){var n=i.$iframeBody.triggerHandler("modalhide"+a,[i]);n===!1&&t.preventDefault()}var o=e.onHide;if(o)return o(t)}),s("hidden","hidden"),s("loaded","loaded"),o.on("shown"+a,function(){i.isShown=!0}).on("hidden"+a,function(){i.isShown=!1}),this.$modal=o,this.$dialog=o.find(".modal-dialog"),e.mergeOptions&&(this.options=e)},r.prototype.show=function(i){var a=this,l=t.extend({},r.DEFAULTS,a.options,{url:a.$trigger?a.$trigger.attr("href")||a.$trigger.attr("data-url")||a.$trigger.data("url"):a.options.url},i),h=a.isShown;l=a.initOptions(l),h||a.init(l);var c=a.$modal,d=c.find(".modal-dialog"),u=l.custom,f=d.find(".modal-body").css("padding","").toggleClass("load-indicator loading",!!h),p=d.find(".modal-header"),g=d.find(".modal-content");c.toggleClass("fade",l.fade).addClass(l.className).toggleClass("modal-loading",!h).toggleClass("modal-scroll-inside",!!l.scrollInside),d.toggleClass("modal-md","md"===l.size).toggleClass("modal-sm","sm"===l.size).toggleClass("modal-lg","lg"===l.size).toggleClass("modal-fullscreen","fullscreen"===l.size),p.toggle(l.showHeader),p.find(".modal-icon").attr("class","modal-icon icon-"+l.icon),p.find(".modal-title-name").text(l.title||""),l.size&&"fullscreen"===l.size&&(l.width="",l.height="");var m=function(){clearTimeout(this.resizeTask),this.resizeTask=setTimeout(function(){a.adjustPosition(l.position)},100)},v=function(t,e){return"undefined"==typeof t&&(t=l.delay),setTimeout(function(){d=c.find(".modal-dialog"),l.width&&"auto"!=l.width&&d.css("width",l.width),l.height&&"auto"!=l.height&&(d.css("height",l.height),"iframe"===l.type&&f.css("height",d.height()-p.outerHeight())),a.adjustPosition(l.position),c.removeClass("modal-loading").removeClass("modal-updating"),h&&f.removeClass("loading"),"iframe"!=l.type&&(f=d.off("resize."+n).find(".modal-body").off("resize."+n),l.scrollInside&&(f=f.children().off("resize."+n)),(f.length?f:d).on("resize."+n,m)),e&&e()},t)};if("custom"===l.type&&u)if("function"==typeof u){var y=u({modal:c,options:l,modalTrigger:a,ready:v});typeof y===s&&(f.html(y),v())}else u instanceof t?(f.html(t("
    ").append(u.clone()).html()),v()):(f.html(u),v());else if(l.url){var b=function(){var t=c.callComEvent(a,"broken");"string"==typeof t&&f.html(t),v()};if(c.attr("ref",l.url),"iframe"===l.type){c.addClass("modal-iframe"),this.firstLoad=!0;var w="iframe-"+l.name;p.detach(),f.detach(),g.empty().append(p).append(f),f.css("padding",0).html(''),l.waittime>0&&(a.waitTimeout=v(l.waittime,b));var x=document.getElementById(w);x.onload=x.onreadystatechange=function(i){var o=!!l.scrollInside;if(a.firstLoad&&c.addClass("modal-loading"),!this.readyState||"complete"==this.readyState){a.firstLoad=!1,l.waittime>0&&clearTimeout(a.waitTimeout);try{c.attr("ref",x.contentWindow.location.href);var s=e.frames[w];s.modalWidthReset&&(l.width=s.modalWidthReset);var r=s.$;if(r&&"auto"===l.height&&"fullscreen"!=l.size){var h=r("body").addClass("body-modal").toggleClass("body-modal-scroll-inside",o);a.$iframeBody=h,l.iframeBodyClass&&h.addClass(l.iframeBodyClass);var d=[],u=function(i){c.removeClass("fade");var n=h.outerHeight();if(i===!0&&l.onlyIncreaseHeight&&(n=Math.max(n,f.data("minModalHeight")||0),f.data("minModalHeight",n)),o){var a=l.headerHeight;"number"!=typeof a?a=p.outerHeight():"function"==typeof a&&(a=a(p));var s=t(e).height();n=Math.min(n,s-a)}for(d.length>1&&n===d[0]&&(n=Math.max(n,d[1])),d.push(n);d.length>2;)d.shift();f.css("height",n),l.fade&&c.addClass("fade"),v()};c.callComEvent(a,"loaded",{modalType:"iframe",jQuery:r}),setTimeout(u,100),h.off("resize."+n).on("resize."+n,u),o&&t(e).off("resize."+n).on("resize."+n,u)}else v();var g=l.handleLinkInIframe;g&&r("body").on("click","string"==typeof g?g:"a[href]",function(){t(this).is('[data-toggle="modal"]')||c.addClass("modal-updating")}),l.iframeStyle&&r("head").append("")}catch(i){v()}}}}else t.ajax(t.extend({url:l.url,success:function(i){try{var s=t(i);s.filter(".modal-dialog").length?d.parent().empty().append(s):s.filter(".modal-content").length?d.find(".modal-content").replaceWith(s):f.wrapInner(s)}catch(r){e.console&&e.console.warn&&console.warn("ZUI: Cannot recogernize remote content.",{error:r,data:i}),c.html(i)}c.callComEvent(a,"loaded",{modalType:o}),v(),l.scrollInside&&t(e).off("resize."+n).on("resize."+n,m)},error:b},l.ajaxOptions))}h||c.modal({show:"show",backdrop:l.backdrop,moveable:l.moveable,rememberPos:l.rememberPos,keyboard:l.keyboard,scrollInside:l.scrollInside})},r.prototype.close=function(t,i){var n=this;(t||i)&&n.$modal.on("hidden"+a,function(){"function"==typeof t&&t(),typeof i===s&&i.length&&!n.$modal.data("cancel-reload")&&("this"===i?e.location.reload():e.location=i)}),n.$modal.modal("hide")},r.prototype.toggle=function(t){this.isShown?this.close():this.show(t)},r.prototype.adjustPosition=function(t){t=t===i?this.options.position:t,"function"==typeof t&&(t=t(this)),this.$modal.modal("adjustPosition",t)},t.zui({ModalTrigger:r,modalTrigger:new r}),t.fn.modalTrigger=function(e,i){return t(this).each(function(){var o=t(this),a=o.data(n),l=t.extend({title:o.attr("title")||o.text(),url:o.attr("href"),type:o.hasClass("iframe")?"iframe":""},o.data(),t.isPlainObject(e)&&e);return a?void(typeof e==s?a[e](i):l.show&&a.show(i)):(o.data(n,a=new r(l,o)),void o.on((l.trigger||"click")+".toggle."+n,function(e){l=t.extend(l,{url:o.attr("href")||o.attr("data-url")||o.data("url")||l.url}),a.toggle(l),o.is("a")&&e.preventDefault()}))})};var l=t.fn.modal;t.fn.modal=function(e,i){return t(this).each(function(){var n=t(this);n.hasClass("modal")?l.call(n,e,i):n.modalTrigger(e,i)})},t.fn.modal.bs=l;var h=function(e){return e?e=t(e):(e=t(".modal.modal-trigger"),!e.length),e&&e instanceof t?e:null},c=function(i,o,a){var s=i;if("function"==typeof i){var r=a;a=o,o=i,i=r}i=h(i),i&&i.length?i.each(function(){t(this).data(n).close(o,a)}):t("body").hasClass("modal-open")||t(".modal.in").length||t("body").hasClass("body-modal")&&e.parent.$.zui.closeModal(s,o,a)},d=function(t,e){e=h(e),e&&e.length&&e.modal("adjustPosition",t)},u=function(e,i){"string"==typeof e&&(e={url:e});var o=h(i);o&&o.length&&o.each(function(){t(this).data(n).show(e)})};t.zui({reloadModal:u,closeModal:c,ajustModalPosition:d,adjustModalPosition:d}),t(document).on("click."+n+".data-api",'[data-toggle="modal"]',function(e){var i=t(this),o=i.attr("href"),a=null;try{a=t(i.attr("data-target")||o&&o.replace(/.*(?=#[^\s]+$)/,""))}catch(s){}a&&a.length||(i.data(n)?i.trigger(".toggle."+n):i.modalTrigger({show:!0})),i.is("a")&&e.preventDefault()}).on("click."+n+".data-api",'[data-dismiss="modal"]',function(){t.zui.closeModal()})}(window.jQuery,window,void 0),+function(t){"use strict";var e=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",t,e)};e.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.prototype.init=function(e,i,n){this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(n);for(var o=this.options.trigger.split(" "),a=o.length;a--;){var s=o[a];if("click"==s)this.$element.on("click."+this.type,this.options.selector,this.toggle.bind(this));else if("manual"!=s){var r="hover"==s?"mouseenter":"focus",l="hover"==s?"mouseleave":"blur";this.$element.on(r+"."+this.type,this.options.selector,this.enter.bind(this)),this.$element.on(l+"."+this.type,this.options.selector,this.leave.bind(this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},e.prototype.getDefaults=function(){return e.DEFAULTS},e.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},e.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,n){i[t]!=n&&(e[t]=n)}),e},e.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget)[this.type](this.getDelegateOptions()).data("zui."+this.type);return clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show()},e.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget)[this.type](this.getDelegateOptions()).data("zui."+this.type);return clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide()},e.prototype.show=function(e){var i=t.Event("show.zui."+this.type);if((e||this.hasContent())&&this.enabled){var n=this;if(n.$element.trigger(i),i.isDefaultPrevented())return;var o=n.tip();n.setContent(e),n.options.animation&&o.addClass("fade");var a="function"==typeof n.options.placement?n.options.placement.call(n,o[0],n.$element[0]):n.options.placement,s=/\s?auto?\s?/i,r=s.test(a);r&&(a=a.replace(s,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(a),n.options.container?o.appendTo(n.options.container):o.insertAfter(n.$element);var l=n.getPosition(),h=o[0].offsetWidth,c=o[0].offsetHeight;if(r){var d=n.$element.parent(),u=a,f=document.documentElement.scrollTop||document.body.scrollTop,p="body"==n.options.container?window.innerWidth:d.outerWidth(),g="body"==n.options.container?window.innerHeight:d.outerHeight(),m="body"==n.options.container?0:d.offset().left;a="bottom"==a&&l.top+l.height+c-f>g?"top":"top"==a&&l.top-f-c<0?"bottom":"right"==a&&l.right+h>p?"left":"left"==a&&l.left-h

    '}),e.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),e.prototype.constructor=e,e.prototype.getDefaults=function(){return e.DEFAULTS},e.prototype.setContent=function(){var t=this.tip(),e=this.getTarget();if(e)return e.find(".arrow").length<1&&t.addClass("no-arrow"),void t.html(e.html());var i=this.getTitle(),n=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](i),t.find(".popover-content")[this.options.html?"html":"text"](n),t.removeClass("fade top bottom left right in"),this.options.tipId&&t.attr("id",this.options.tipId),this.options.tipClass&&t.addClass(this.options.tipClass),t.find(".popover-title").html()||t.find(".popover-title").hide()},e.prototype.hasContent=function(){return this.getTarget()||this.getTitle()||this.getContent()},e.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},e.prototype.getTarget=function(){var e=this.$element,i=this.options,n=e.attr("data-target")||("function"==typeof i.target?i.target.call(e[0]):i.target);return!!n&&("$next"==n?e.next(".popover"):t(n))},e.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},e.prototype.tip=function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip};var i=t.fn.popover;t.fn.popover=function(i){return this.each(function(){var n=t(this),o=n.data("zui.popover"),a="object"==typeof i&&i;o||n.data("zui.popover",o=new e(this,a)),"string"==typeof i&&o[i]()})},t.fn.popover.Constructor=e,t.fn.popover.noConflict=function(){return t.fn.popover=i,this}}(window.jQuery),+function(t){"use strict";function e(e){t(o).remove(),t(a).each(function(e){var o=i(t(this));o.hasClass("open")&&(o.trigger(e=t.Event("hide."+n)),e.isDefaultPrevented()||o.removeClass("open").trigger("hidden."+n))})}function i(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var n;try{n=i&&t(i)}catch(o){}return n&&n.length?n:e.parent()}var n="zui.dropdown",o=".dropdown-backdrop",a="[data-toggle=dropdown]",s=function(e){t(e).on("click."+n,this.toggle)};s.prototype.toggle=function(o){var a=t(this);if(!a.is(".disabled, :disabled")){var s=i(a),r=s.hasClass("open");if(e(),!r){if("ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t('',a={icons:{},type:"default",placement:"top",time:4e3,parent:"body",close:!0,fade:!0,scale:!0},s={},r=function(e,r){t.isPlainObject(e)?r=t.extend({},r,e):e&&(r?r.content=e:r={content:e});var l=this;r=l.options=t.extend({},a,r),l.id=r.id||n++;var h=s[l.id];h&&h.destroy(),s[l.id]=l,l.$=t(o.format(r)).toggleClass("fade",r.fade).toggleClass("scale",r.scale).attr("id","messager-"+l.id),r.cssClass&&l.$.addClass(r.cssClass);var c=!1,d=l.$.find(".messager-actions"),u=function(e){var n=t('"; @@ -2006,6 +2009,10 @@ class productModel extends model $projectID = isset($output['projectID']) ? $output['projectID'] : 0; $link = helper::createLink($module, $method, "productID=%s&branch=" . ($branch ? "%s" : '') . "&groupBy=&projectID=$projectID") . "#app=project"; } + elseif($module == 'testcase' and $method == 'browse') + { + $link = helper::createLink('testcase', 'browse', "productID=%s" . ($branch ? "&branch=%s" : '&branch=all') . "&browseType=$extra"); + } elseif($module == 'testreport' and ($method == 'create' or $method == 'edit')) { $vars = $method == 'edit' ? "objectID=%s" : "objectID=&objectType=testtask&extra=%s"; @@ -2039,6 +2046,11 @@ class productModel extends model { return helper::createLink('design', 'browse', "productID=%s"); } + elseif($module == 'project' and $method == 'testcase') + { + $params = explode('|', $extra); + return helper::createLink('project', 'testcase', "projectID={$params[0]}&productID=%s&branch=all&browseType={$params[1]}"); + } elseif($module == 'project' or $module == 'execution') { $objectID = $module == 'project' ? 'projectID' : 'executionID'; diff --git a/module/project/control.php b/module/project/control.php index 022f155e7d..fbfcdfef1d 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -969,7 +969,9 @@ class project extends control $this->session->set('bugList', $this->app->getURI(true), 'project'); $products = array('0' => $this->lang->product->all) + $this->product->getProducts($projectID, 'all', '', false); - $this->lang->modulePageNav = $this->product->select($products, $productID, 'project', 'testcase', '', $branch, 0, '', false); + + $extra = "$projectID|$browseType"; + $this->lang->modulePageNav = $this->product->select($products, $productID, 'project', 'testcase', $extra, $branch, 0, '', false); echo $this->fetch('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&orderBy=$orderBy&recTotal=$orderBy&recPerPage=$recPerPage&pageID=$pageID&projectID=$projectID"); } diff --git a/module/testcase/control.php b/module/testcase/control.php index cf16ddad92..c7a8d13387 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -131,7 +131,7 @@ class testcase extends control } else { - $this->qa->setMenu($this->products, $productID, $branch); + $this->qa->setMenu($this->products, $productID, $branch, $browseType); } $uri = $this->app->getURI(true); From 11d9ad6044be0aae99ac19c1d1d2bd080e0e7316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B9=BF=E6=98=8E?= Date: Mon, 6 Dec 2021 02:37:20 +0000 Subject: [PATCH 14/30] Revert "Merge branch 'sprint/175_tianshujie_17056' into 'master'" This reverts merge request !781 --- module/execution/js/kanban.js | 6 +++--- module/story/css/view.css | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index 0dbdd5cbd1..11d735ea65 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -80,11 +80,11 @@ function renderStoryItem(item, $item, col) var $title = $item.find('.title'); if(!$title.length) { - $title = $('' + (scaleSize <= 1 ? ' ' : '') + ''); + $title = $('' + (scaleSize <= 1 ? ' ' : '') + '') + .attr('href', $.createLink('story', 'view', 'storyID=' + item.id, '', true)); $title.appendTo($item); } - $title.attr('title', item.title).find('.text').html('' + item.title + ''); - $title.find('.text > a').attr('href', $.createLink('story', 'view', 'storyID=' + item.id, '', true)); + $title.attr('title', item.title).find('.text').text(item.title); } if(scaleSize <= 2) diff --git a/module/story/css/view.css b/module/story/css/view.css index 7ff8690e99..a8a0febfde 100644 --- a/module/story/css/view.css +++ b/module/story/css/view.css @@ -2,4 +2,3 @@ .side-col #legendProjectAndTask .list-unstyled {padding: 10px; border-top: 0px; margin: 0px;} #legendStories ul li {padding: 10px 0 0 12px; line-height: 20px;} .main-actions .btn-toolbar .btn {padding-right: 6px; padding-left: 6px;} -.body-modal #mainMenu>.btn-toolbar .page-title>.text {max-width: 85% !important;} From 69304124b5cd8522600cf3b2f9da2b106248b4d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B9=BF=E6=98=8E?= Date: Mon, 6 Dec 2021 10:58:52 +0800 Subject: [PATCH 15/30] * Change for upgrade. --- VERSION | 2 +- config/config.php | 2 +- doc/CHANGELOG | 250 +++++++++++++++++++++++--------- module/action/lang/de.php | 35 +++-- module/action/lang/en.php | 5 + module/bug/lang/en.php | 2 + module/common/lang/en.php | 4 + module/dev/lang/en.php | 187 ++++++++++++------------ module/execution/lang/en.php | 1 + module/gitlab/lang/en.php | 2 +- module/kanban/lang/en.php | 6 +- module/misc/lang/de.php | 20 +++ module/misc/lang/en.php | 18 +-- module/misc/lang/fr.php | 20 +++ module/misc/lang/vi.php | 20 +++ module/misc/lang/zh-cn.php | 18 +-- module/mr/lang/en.php | 17 ++- module/product/lang/en.php | 2 + module/productplan/lang/en.php | 10 +- module/programplan/lang/en.php | 2 +- module/project/lang/en.php | 3 - module/report/lang/zh-cn.php | 1 + module/story/lang/en.php | 1 + module/task/lang/en.php | 2 + module/testtask/lang/en.php | 5 +- module/upgrade/lang/version.php | 1 + 26 files changed, 427 insertions(+), 209 deletions(-) diff --git a/VERSION b/VERSION index 563f2f6bc4..cfac36bbc5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -15.8 +16.0.beta1 diff --git a/config/config.php b/config/config.php index 07a836a83c..89e8e1e0b8 100644 --- a/config/config.php +++ b/config/config.php @@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}} if(!function_exists('getWebRoot')){function getWebRoot(){}} /* 基本设置。Basic settings. */ -$config->version = '15.8'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. +$config->version = '16.0.beta1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. $config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP. $config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time. $config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php. diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 04b9c75f2c..a1410a5242 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,73 +1,189 @@ -2021-11-19 15.8 +2021-12-06 16.0.beat1 完成的需求 -28965 实现分支的新增/编辑操作 -28941 重新登陆系统后产品下拉菜单应当保持上次选中的产品名称 -28932 实现分支的批量操作 -28931 调整分支管理功能 -28904 优化项目列表“我参与的”筛选结果 -28833 创建执行页面可以直接维护相关负责人信息 -28819 调整项目集/产品/项目/执行重名规则 -28510 项目列表中增加项目代号字段显示 -28509 项目概况中增加项目代号的显示 -28466 测试Bug列表中增加按所属项目的搜索条件 -28138 员工负载表中增加项目名称信息 -28131 待处理任务列表中子任务名称前显示父任务 -28098 需求批量转任务时对已经转换过任务的需求进行提示 -25673 分支增加排序功能 -25670 多分支产品浏览需求的时候将所有和主干区分开 -25667 将所有分支概念改为主干并处理历史数据 -25666 可以将某一个分支关闭 -25665 梳理项目和执行关联产品分支的逻辑 -15478 我的地盘bug列表增加确认字段 -14877 根据分支提示上次版本计划名称 -14778 分支设置默认分支功能 -14772 需求修改所属分支时如果有冲突给出提示 -14771 启用多分支功能后增加分支字样显示的控制 -14761 选择某一个分支之后点击其他菜单希望能够保持分支下拉菜单状态 -14005 能够按照平台分支浏览用户需求 -29147 产品下软件需求列表需求名称前显示主干的分支名 -29145 项目和执行关联了产品的多个分支及计划时调整概况页面显示方式 -29144 所有分支下批量编辑需求/BUG/用例,所属模块数据默认为所有分支的模块时,需要处理分支与模块不一致的问题 -29143 批量创建需求/BUG/用例时所属模块选择同上,需要检测上一行数据的所属分支和当前行的所属分支是否一致 -29142 启用多分支功能后要Bug增加分支字样显示的控制 -29141 启用多分支功能后要用例增加分支字样显示的控制 -29059 多分支产品批量创建需求时分支字段设为默认项 -28974 产品列表批量调整计划时在计划名称前显示分支信息 -28973 提交Bug时分支与影响版本要跟着联动 -28972 产品列表左侧的模块设置调整为显示设置 -28310 未开始的项目集有项目开始的时候自动将项目集状态设置为开始 -28309 未开始的项目有执行开始的时候自动将项目状态设置为开始 -28308 未开始的执行有任务开始的时候自动将执行状态设置为开始 +14005 能够按照平台分支浏览用户需求 +14429 父需求支持变更 +14761 选择某一个分支之后点击其他菜单希望能够保持分支下拉菜单状态 +14771 启用多分支功能后增加分支字样显示的控制 +14772 需求修改所属分支时如果有冲突给出提示 +14778 分支设置默认分支功能 +14877 根据分支提示上次版本计划名称 +15134 员工负载表增加备注说明 +15470 看板可以设置一个单元格里面卡片的排列方式 +15478 我的地盘bug列表增加确认字段 +25665 梳理项目和执行关联产品分支的逻辑 +25666 可以将某一个分支关闭 +25667 将所有分支概念改为主干并处理历史数据 +25670 多分支产品浏览需求的时候将所有和主干区分开 +25673 分支增加排序功能 +27484 文档库右侧目录增加文件的浮动操作菜单 +27485 文档库右侧目录增加目录的浮动操作菜单 +27486 wiki目录中,当鼠标悬浮到文章名称时展示文章快捷操作 +27487 wiki目录中,鼠标悬浮到具体章节时展示章节的快捷操作 +27927 执行看板默认只显示一屏滚动时再往下加载 +28098 需求批量转任务时对已经转换过任务的需求进行提示 +28131 待处理任务列表中子任务名称前显示父任务 +28138 员工负载表中增加项目名称信息 +28147 统计列表中具备横向滚动条的列表可以直接展示出来 +28153 Bug创建表中优化执行查询条件 +28235 关闭项目时增加实际完成日期的记录 +28236 项目工时统计中增加实际开始和实际完成的信息 +28237 执行启动时增加实际开始日期的记录 +28238 关闭执行时增加实际完成日期的记录 +28239 执行工时统计中增加实际开始和实际完成的信息 +28310 未开始的项目 +28466 测试Bug列表中增加按所属项目的搜索条件 +28509 项目概况中增加项目代号的显示 +28510 项目列表中增加项目代号字段显示 +28719 项目看板中看板列显示数量汇总 +28727 计划创建迭代时选择项目点击下一步后自动关闭选择弹窗 +28809 执行看板中进行中项目排序规则调整 +28810 执行看板中已关闭的执行只展示最近2期数据 +28811 执行看板中执行支持拖动调整看板列和状态 +28811 执行看板中执行支持拖动调整看板列和状态 +28812 项目看板中调整项目集和项目的排序规则 +28813 项目看板中已关闭的项目只展示最近2个数据 +28814 项目看板中项目支持拖动调整看板列和状态 +28814 项目看板中项目支持拖动调整看板列和状态 +28815 产品看板中看板列显示数量汇总 +28816 产品看板中调整项目集和产品的排序规则 +28817 项目集看板中调整项目集和产品的排序规则 +28818 项目集看板中看板列显示数量汇总 +28819 调整项目集/产品/项目/执行重名规则 +28833 创建执行页面可以直接维护相关负责人信息 +28834 项目的分组权限中移除无用的模块和方法 +28835 关联多个产品的项目也可以选择归并方式 +28904 优化项目列表“我参与的”筛选结果 结 +28928 可以设置哪些人不需要提醒 +28929 编辑bug修改状态时如果未修改成功希望有错误提示 +28931 调整分支管理功能 +28932 实现分支的批量操作 +28941 重新登陆系统后产品下拉菜单应当保持上次选中的产品名称 +28944 在开源版中增加瀑布模型的相关功能 +28959 老版本升级新版本数据归并的时候,可以修改项目、执行名称。 +28960 调整产品列表页面的宽度展示比例 +28965 实现分支的新增/编辑操作 +28970 需求列表批量选中希望可以通过shift快捷键操作 +28972 产品列表左侧的模块设置调整为显示设置 +28973 提交Bug时分支与影响版本要跟着联动 +28974 产品列表批量调整计划时在计划名称前显示分支信息 +28993 创建或者编辑用例时调整所属需求的查询逻辑 +29000 产品列表中调整字段显示宽度 +29002 动态支持按正序/倒序切换排序 +29030 已挂起的项目/执行下面的任务不在待办/待处理的任务中展示 +29059 多分支产品批量创建需求时分支字段设为默认项 +29069 组织团队成员任务列表增加优先级排序功能 +29074 用户下拉菜单中增加人员的头像/部门/职位信息 +29108 提交/编辑软件需求页面中增加反馈者和通知邮箱信息 +29109 提交/编辑Bug页面中增加反馈者和通知邮箱信息 +29116 创建/编辑发布信息的通知人员中增加反馈者 +29127 计划的Bug列表中增加批量编辑和调整计划功能 +29131 产品概况中增加评审人员的设置 +29134 看板页面的刷新不要抖动用更加平滑的方式呈现 +29141 启用多分支功能后要用例增加分支字样显示的控制 +29142 启用多分支功能后要Bug增加分支字样显示的控制 +29143 批量创建需求/BUG/用例时所属模块选择同上,需要检测上一行数据的所属分支和当前行的所属分支是否一致 +29144 所有分支下批量编辑需求/BUG/用例,所属模块数据默认为所有分支的模块时,需要处理分支与模块不一致的问题 +29145 项目和执行关联了产品的多个分支及计划时调整概况页面显示方式 +29147 产品下软件需求列表需求名称前显示主干的分支名 +29156 启用多分支功能后项目需求列表增加是否显示分支名 +29157 启用多分支功能后执行需求列表增加是否显示分支名 +29158 启用多分支功能后执行任务列表增加是否显示分支名 +29166 需求调整分支时,需求所属模块为主干的不用清空所属模块 +29167 Bug调整分支时所属模块为主干的不用清空所属模块 +29168 用例调整分支时所属模块为主干的不用清空所属模块 +29173 项目关联产品计划时不允许关联父计划 +29174 执行关联产品计划时不允许关联父计划 +29182 分支下拉菜单中显示已关闭的分支状态 +29192 归并数据遇到重名数据时可修改重名的数据 +29193 调整发布中消息通知的触发方式 +29218 分支的状态全部为关闭时才能调整产品类型为正常 +29234 梳理分支逻辑 +29438 在执行1下创建测试用例在执行2用例列表中也能看到 修复的BUG -15826 后台评审流程开启后产品中批量创建研发需求没有默认需要评审 -15798 报告导出之后不展示饼状图 -15780 更改项目集的父项目集时,下面的产品线不能变更到顶层项目集 -15695 建用例,有默认所属模块可选择所有需求 -15694 执行下创建用例,可以选择产品所有的模块和需求 -15693 卡片展示项目时,项目状态显示不正确 -15691 套件的用例列表右上角的操作按钮样式不一致 -15690 切换产品后,新建用例未显示在用例列表中 -15689 测试单的报表百分比换行 -15688 新建用例,模块和需求对应错误 -15687 自定义任务优先级展示问题 -15686 创建项目填充数据后,再选择项目集数据被清空 -15665 维护目录和版本管理前的icon图标一样 -12023 产品下分支页面建议优化 -11290 邮件列表中主题字段内容部分遮挡 -16302 项目软件需求下搜索下拉列中所属分支显示为%s -16257 创建执行的时候已经关闭的项目仍然可以选择 -16139 设为分支为默认分支icon没有显示完全 -16130 项目下创建测试用例时相关需求列出的数据不对 -16018 项目-测试-BUG界面提交BUG不显示多分支/平台 -16000 执行测试用例下用例标题换行显示 -15828 项目集列表中删除顶级项目,跳转错误 -15781 项目创建版本时选择不到产品分支 -15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息 -14101 青春蓝-引导页国际版配图为中文 -13756 提bug页面没有正常显示所属产品分支的控件 -6978 多分支产品bug搜索影响版本不太清晰 6917 用例转bug编号会变化 - +6978 多分支产品bug搜索影响版本不太清晰 +11290 邮件列表中主题字段内容部分遮挡 +12023 产品下分支页面建议优化 +13756 提bug页面没有正常显示所属产品分支的控件 +14101 青春蓝-引导页国际版配图为中文 +15665 维护目录和版本管理前的icon图标一样 +15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息 +15675 版本下解决又激活的bug,重新解决的时候,应该带有之前版本信息 +15686 创建项目填充数据后,再选择项目集数据被清空 +15687 自定义任务优先级展示问题 +15688 新建用例,模块和需求对应错误 +15689 测试单的报表百分比换行 +15690 切换产品后,新建用例未显示在用例列表中 +15691 套件的用例列表右上角的操作按钮样式不一致 +15693 卡片展示项目时,项目状态显示不正确 +15694 执行下创建用例,可以选择产品所有的模块和需求 +15695 建用例,有默认所属模块可选择所有需求 +15737 统计视图无法通过权限控制取消 +15780 更改项目集的父项目集时,下面的产品线不能变更到顶层项目集 +15781 项目创建版本时选择不到产品分支 +15798 报告导出之后不展示饼状图 +15826 后台评审流程开启后产品中批量创建研发需求没有默认需要评审 +15828 项目集列表中删除顶级项目,跳转错误 +16000 执行测试用例下用例标题换行显示 +16018 项目-测试-BUG界面提交BUG不显示多分支/平台 +16130 项目下创建测试用例时相关需求列出的数据不对 +16139 设为分支为默认分支icon没有显示完全 +16257 创建执行的时候已经关闭的项目仍然可以选择 +16302 项目软件需求下搜索下拉列中所属分支显示为%s +16527 批量编辑用例时,列出了所有分支 +16567 多分支产品的任务名称前主干分支名称显示其他分支名称不显示 +16570 经典模式多分支产品批量提bug时标题未填写点击保存没做提示 +16573 经典模式多分支产品批量创建用例未填写用例标题保存直接跳转列表没做提示 +16574 关联产品页面已关联产品可以下拉选择其他未关联的分支 +16582 分支1版本可以关联其他分支需求 +16583 批量编辑测试用例分支显示错误导致无法选择模块 +16584 执行版本不能按照所属分支搜索 +16585 主干版本前未显示主干标识 +16587 需求编辑页面所处阶段处分支展示方式建议优化 +16588 项目/执行下显示了未关联的分支需求 +16589 多分支产品测试用例列表用例类型展示有遮挡 +16591 批量编辑研发需求修改分支后再修改回去计划没有随之联动 +16592 多分支产品项目的研发需求模块展示不对 +16593 测试下Bug页面中左侧模块树默认高亮了主干 +16603 项目列表中项目名称显示不全 +16605 项目的用例下显示了所有的分支 +16608 编辑模块页面选择分支后上级模块列出的还是主干模块 +16609 导出用例的模板显示了所有分支 +16612 用例模板没显示分支下的模块 +16616 导入用例分支下拉列表显示了所有分支 +16620 研发需求变动列表一条用例显示多次 +16621 搜索用例时,所属分支列出了所有分支 +16622 产品下研发需求页搜索的所属模块下拉只列出了主干下的模块 +16623 多分支产品关闭的分支在项目关联产品的时候仍然显示 +16624 产品详情页中左上角产品下拉菜单中无当前产品选项 +16626 测试套件中不显示其他分支模块只显示主干模块 +16631 套件的用例名称前不显示主干 +16637 测试单关联用例列表,用例列表显示分支标识 +16639 测试用例详情页指派给用户显示数字 +16640 测试单的优先级显示为0 +16641 地盘待处理下用例批量编辑页面相关研发需求未带出 +16643 地盘下批量编辑任务页面“贡献”菜单位置显示不对 +16645 创建Gitlab动态没有链接地址 +16646 文档的产品库中产品显示错误 +16647 测试单生成报告提示没有关联的非Trunk测试单 +16648 项目列表中项目名称完全折叠隐藏 +16650 多分支产品测试套件详情所属模块只展示主干模块 +16653 发布可以关联所有分支的需求 +16676 地盘待处理下批量执行用例页面有代码报错 +16680 产品库创建文档时所属文档库下拉无法选择其他产品库 +16681 导入用例库测试用例分支和模块不对应 +16682 地盘贡献下复制用例页面有代码报错 +16683 测试单关联测试用例不能选择主干 +16684 套件中用例标题的主干分支不显示 +16685 测试单关联测试用例分支=空搜索到的数据为主干的测试用例 +16689 测试单用例列表不显示测试用例相关模块 +16690 产品下需求批量编辑页面计划显示不对 +16692 项目下软件需求批量编辑页面分支显示不对 +16694 提交测试的测试单不应该受左上角选择分支影响 +16697 测试单关联测试用例选择所属分支应该只能选择版本关联的分支 +16700 项目创建发布选择版本后产品分支会消失 +16708 批量编辑多分支产品的研发需求报错 +16713 产品需求模块中主干模块直接显示不用增加层级 2021-11-02 15.7.1 修复的BUG 15835 创建产品选择产品线选中样式不对 diff --git a/module/action/lang/de.php b/module/action/lang/de.php index e7f2ca54bf..f1efa44c41 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -9,18 +9,29 @@ * @version $Id: de.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->action->common = 'Log'; -$lang->action->product = $lang->productCommon; -$lang->action->project = 'Project'; -$lang->action->execution = $lang->execution->common; -$lang->action->objectType = 'Object Type'; -$lang->action->objectID = 'ID'; -$lang->action->objectName = 'Objekt Name'; -$lang->action->actor = 'Handler'; -$lang->action->action = 'Aktion'; -$lang->action->actionID = 'Aktion ID'; -$lang->action->date = 'Datum'; -$lang->action->extra = 'Wertschöpfung'; +global $config; + +$lang->action->common = 'Log'; +$lang->action->id = 'ID'; +$lang->action->product = $lang->productCommon; +$lang->action->project = 'Project'; +$lang->action->execution = $lang->execution->common; +$lang->action->objectType = 'Object Type'; +$lang->action->objectID = 'ID'; +$lang->action->objectName = 'Objekt Name'; +$lang->action->actor = 'Handler'; +$lang->action->action = 'Aktion'; +$lang->action->actionID = 'Aktion ID'; +$lang->action->date = 'Datum'; +$lang->action->extra = 'Wertschöpfung'; +$lang->action->system = 'System'; +$lang->action->url = 'URL'; +$lang->action->contentType = 'Content Type'; +$lang->action->data = 'Data'; +$lang->action->result = 'Result'; +$lang->action->modified = 'Modified'; +$lang->action->old = 'Old'; +$lang->action->new = 'New'; $lang->action->trash = 'Aufräumen'; $lang->action->undelete = 'Wiederherstellen'; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index d5f0fd0622..d30f55cafa 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -29,6 +29,9 @@ $lang->action->url = 'URL'; $lang->action->contentType = 'Content Type'; $lang->action->data = 'Data'; $lang->action->result = 'Result'; +$lang->action->modified = 'Modified'; +$lang->action->old = 'Old'; +$lang->action->new = 'New'; $lang->action->trash = 'Recycle'; $lang->action->undelete = 'Restore'; @@ -295,6 +298,8 @@ $lang->action->label->startProgram = '(The start of the project sets th $lang->action->label->createmr = 'Merge Request Linked'; $lang->action->label->deletemr = 'Merge Request Unlinked'; $lang->action->label->mergedmr = 'Merge Request Merged'; +$lang->action->label->compilepass = 'Compile Success'; +$lang->action->label->compilefail = 'Compile Fail'; $lang->action->label->reopen = 'Reopen'; $lang->action->label->approve = 'Passed'; $lang->action->label->reject = 'Rejected'; diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 902709a2f4..52773b0205 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -186,6 +186,7 @@ $lang->bug->legendComment = 'Note'; $lang->bug->legendLife = 'Bug Life'; $lang->bug->legendMisc = 'Misc.'; $lang->bug->legendRelated = 'Related Info'; +$lang->bug->legendThisWeekCreated = 'This Week Created'; /* Button. */ $lang->bug->buttonConfirm = 'Confirm'; @@ -280,6 +281,7 @@ $lang->bug->statusList['active'] = 'Active'; $lang->bug->statusList['resolved'] = 'Resolved'; $lang->bug->statusList['closed'] = 'Closed'; +$lang->bug->confirmedList[''] = ''; $lang->bug->confirmedList[1] = 'Yes'; $lang->bug->confirmedList[0] = 'No'; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index e2e937bfb1..3df8b20a9c 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -108,6 +108,10 @@ $lang->customMenu = 'Custom Menu'; $lang->customField = 'Custom Field'; $lang->lineNumber = 'Line No.'; $lang->tutorialConfirm = 'You are using ZenTao tutorial. Do you want to quit right now?'; +$lang->levelExceeded = 'The level has exceeded the display range. For more information, please go to the web page or view it through search.'; + +$lang->serviceAgreement = "Service Agreement"; +$lang->privacyPolicy = "Privacy Policy"; $lang->preShortcutKey = '[Shortcut:←]'; $lang->nextShortcutKey = '[Shortcut:→]'; diff --git a/module/dev/lang/en.php b/module/dev/lang/en.php index 5f3ab803b5..831fc433d9 100644 --- a/module/dev/lang/en.php +++ b/module/dev/lang/en.php @@ -28,96 +28,103 @@ $lang->dev->fields['length'] = 'Length'; $lang->dev->fields['null'] = 'Null'; $lang->dev->tableList = array(); -$lang->dev->tableList['action'] = 'Action'; -$lang->dev->tableList['bug'] = 'Bug'; -$lang->dev->tableList['build'] = 'Build'; -$lang->dev->tableList['burn'] = 'Burndown Chart'; -$lang->dev->tableList['case'] = 'Test Case'; -$lang->dev->tableList['casestep'] = 'Case Step'; -$lang->dev->tableList['company'] = 'Company'; -$lang->dev->tableList['config'] = 'Configuration'; -$lang->dev->tableList['custom'] = 'Custom'; -$lang->dev->tableList['dept'] = 'Department'; -$lang->dev->tableList['doc'] = 'Document'; -$lang->dev->tableList['doclib'] = 'Document Library'; -$lang->dev->tableList['effort'] = 'Effort'; -$lang->dev->tableList['extension'] = 'Extension'; -$lang->dev->tableList['file'] = 'File'; -$lang->dev->tableList['group'] = 'Group'; -$lang->dev->tableList['grouppriv'] = 'Privilege'; -$lang->dev->tableList['history'] = 'History'; -$lang->dev->tableList['lang'] = 'Language'; -$lang->dev->tableList['module'] = 'Module'; -$lang->dev->tableList['program'] = 'Program'; -$lang->dev->tableList['product'] = $lang->productCommon; -$lang->dev->tableList['productplan'] = $lang->productCommon . 'Plan'; -$lang->dev->tableList['project'] = 'Project'; -$lang->dev->tableList['projectproduct'] = 'Project' . $lang->productCommon; -$lang->dev->tableList['projectstory'] = 'Project Story'; -$lang->dev->tableList['execution'] = $lang->executionCommon; -$lang->dev->tableList['release'] = 'Release'; -$lang->dev->tableList['story'] = 'Story'; -$lang->dev->tableList['storyspec'] = 'Story Description'; -$lang->dev->tableList['task'] = 'Task'; -$lang->dev->tableList['taskestimate'] = 'Estimates'; -$lang->dev->tableList['team'] = 'Team'; -$lang->dev->tableList['testresult'] = 'Test Result'; -$lang->dev->tableList['testrun'] = 'Test Run'; -$lang->dev->tableList['testtask'] = 'Test Request'; -$lang->dev->tableList['todo'] = 'Todo'; -$lang->dev->tableList['user'] = 'User'; -$lang->dev->tableList['usercontact'] = 'User Contact'; -$lang->dev->tableList['usergroup'] = 'User Group'; -$lang->dev->tableList['userquery'] = 'User Query'; -$lang->dev->tableList['usertpl'] = 'User Template'; -$lang->dev->tableList['admin'] = 'Admin'; -$lang->dev->tableList['api'] = 'API'; -$lang->dev->tableList['backup'] = 'Backup'; -$lang->dev->tableList['common'] = 'Common'; -$lang->dev->tableList['convert'] = 'Convert'; -$lang->dev->tableList['dev'] = 'Develop'; -$lang->dev->tableList['git'] = 'GIT'; -$lang->dev->tableList['index'] = 'Home'; -$lang->dev->tableList['install'] = 'Install'; -$lang->dev->tableList['mail'] = 'Email'; -$lang->dev->tableList['misc'] = 'Misc.'; -$lang->dev->tableList['my'] = 'Dashboard'; -$lang->dev->tableList['qa'] = 'Test'; -$lang->dev->tableList['report'] = 'Report'; -$lang->dev->tableList['search'] = 'Search'; -$lang->dev->tableList['sso'] = 'SSO'; -$lang->dev->tableList['svn'] = 'SVN'; -$lang->dev->tableList['testcase'] = 'Test Case'; -$lang->dev->tableList['testreport'] = 'Test Report'; -$lang->dev->tableList['testsuite'] = 'Test Suite'; -$lang->dev->tableList['caselib'] = 'Case Library'; -$lang->dev->tableList['tree'] = 'Module Tree'; -$lang->dev->tableList['upgrade'] = 'Update'; -$lang->dev->tableList['cron'] = 'Cron'; -$lang->dev->tableList['datatable'] = 'Data Table'; -$lang->dev->tableList['block'] = 'Block'; -$lang->dev->tableList['branch'] = 'Branch'; -$lang->dev->tableList['doccontent'] = 'Doc Content'; -$lang->dev->tableList['storystage'] = 'Story Phase'; -$lang->dev->tableList['tutorial'] = 'Tutorial'; -$lang->dev->tableList['suitecase'] = 'Suite Case'; -$lang->dev->tableList['score'] = 'Score'; -$lang->dev->tableList['entry'] = 'Application'; -$lang->dev->tableList['webhook'] = 'WebHook'; -$lang->dev->tableList['log'] = 'Log'; -$lang->dev->tableList['message'] = 'Message'; -$lang->dev->tableList['notify'] = 'Notification'; -$lang->dev->tableList['userview'] = 'User Privilege'; -$lang->dev->tableList['repo'] = 'Code'; -$lang->dev->tableList['repohistory'] = 'Repo History'; -$lang->dev->tableList['repofiles'] = 'Repo Files'; -$lang->dev->tableList['repobranch'] = 'Repo Branch'; -$lang->dev->tableList['ci'] = 'CI'; -$lang->dev->tableList['compile'] = 'Compile'; -$lang->dev->tableList['jenkins'] = 'Jenkins'; -$lang->dev->tableList['job'] = 'Job'; -$lang->dev->tableList['searchdict'] = 'Search dict'; -$lang->dev->tableList['searchindex'] = 'Search index'; +$lang->dev->tableList['action'] = 'Action'; +$lang->dev->tableList['bug'] = 'Bug'; +$lang->dev->tableList['build'] = 'Build'; +$lang->dev->tableList['burn'] = 'Burndown Chart'; +$lang->dev->tableList['case'] = 'Test Case'; +$lang->dev->tableList['casestep'] = 'Case Step'; +$lang->dev->tableList['company'] = 'Company'; +$lang->dev->tableList['config'] = 'Configuration'; +$lang->dev->tableList['custom'] = 'Custom'; +$lang->dev->tableList['dept'] = 'Department'; +$lang->dev->tableList['doc'] = 'Document'; +$lang->dev->tableList['doclib'] = 'Document Library'; +$lang->dev->tableList['effort'] = 'Effort'; +$lang->dev->tableList['extension'] = 'Extension'; +$lang->dev->tableList['file'] = 'File'; +$lang->dev->tableList['group'] = 'Group'; +$lang->dev->tableList['grouppriv'] = 'Privilege'; +$lang->dev->tableList['history'] = 'History'; +$lang->dev->tableList['lang'] = 'Language'; +$lang->dev->tableList['module'] = 'Module'; +$lang->dev->tableList['program'] = 'Program'; +$lang->dev->tableList['product'] = $lang->productCommon; +$lang->dev->tableList['productplan'] = $lang->productCommon . 'Plan'; +$lang->dev->tableList['project'] = 'Project'; +$lang->dev->tableList['projectproduct'] = 'Project' . $lang->productCommon; +$lang->dev->tableList['projectstory'] = 'Project Story'; +$lang->dev->tableList['execution'] = $lang->executionCommon; +$lang->dev->tableList['release'] = 'Release'; +$lang->dev->tableList['story'] = 'Story'; +$lang->dev->tableList['storyspec'] = 'Story Description'; +$lang->dev->tableList['task'] = 'Task'; +$lang->dev->tableList['taskestimate'] = 'Estimates'; +$lang->dev->tableList['team'] = 'Team'; +$lang->dev->tableList['testresult'] = 'Test Result'; +$lang->dev->tableList['testrun'] = 'Test Run'; +$lang->dev->tableList['testtask'] = 'Test Request'; +$lang->dev->tableList['todo'] = 'Todo'; +$lang->dev->tableList['user'] = 'User'; +$lang->dev->tableList['usercontact'] = 'User Contact'; +$lang->dev->tableList['usergroup'] = 'User Group'; +$lang->dev->tableList['userquery'] = 'User Query'; +$lang->dev->tableList['usertpl'] = 'User Template'; +$lang->dev->tableList['admin'] = 'Admin'; +$lang->dev->tableList['api'] = 'API'; +$lang->dev->tableList['backup'] = 'Backup'; +$lang->dev->tableList['common'] = 'Common'; +$lang->dev->tableList['convert'] = 'Convert'; +$lang->dev->tableList['dev'] = 'Develop'; +$lang->dev->tableList['git'] = 'GIT'; +$lang->dev->tableList['index'] = 'Home'; +$lang->dev->tableList['install'] = 'Install'; +$lang->dev->tableList['mail'] = 'Email'; +$lang->dev->tableList['misc'] = 'Misc.'; +$lang->dev->tableList['my'] = 'Dashboard'; +$lang->dev->tableList['qa'] = 'Test'; +$lang->dev->tableList['report'] = 'Report'; +$lang->dev->tableList['search'] = 'Search'; +$lang->dev->tableList['sso'] = 'SSO'; +$lang->dev->tableList['svn'] = 'SVN'; +$lang->dev->tableList['testcase'] = 'Test Case'; +$lang->dev->tableList['testreport'] = 'Test Report'; +$lang->dev->tableList['testsuite'] = 'Test Suite'; +$lang->dev->tableList['caselib'] = 'Case Library'; +$lang->dev->tableList['tree'] = 'Module Tree'; +$lang->dev->tableList['upgrade'] = 'Update'; +$lang->dev->tableList['cron'] = 'Cron'; +$lang->dev->tableList['datatable'] = 'Data Table'; +$lang->dev->tableList['block'] = 'Block'; +$lang->dev->tableList['branch'] = 'Branch'; +$lang->dev->tableList['doccontent'] = 'Doc Content'; +$lang->dev->tableList['storystage'] = 'Story Phase'; +$lang->dev->tableList['tutorial'] = 'Tutorial'; +$lang->dev->tableList['suitecase'] = 'Suite Case'; +$lang->dev->tableList['score'] = 'Score'; +$lang->dev->tableList['entry'] = 'Application'; +$lang->dev->tableList['webhook'] = 'WebHook'; +$lang->dev->tableList['log'] = 'Log'; +$lang->dev->tableList['message'] = 'Message'; +$lang->dev->tableList['notify'] = 'Notification'; +$lang->dev->tableList['userview'] = 'User Privilege'; +$lang->dev->tableList['repo'] = 'Code'; +$lang->dev->tableList['repohistory'] = 'Repo History'; +$lang->dev->tableList['repofiles'] = 'Repo Files'; +$lang->dev->tableList['repobranch'] = 'Repo Branch'; +$lang->dev->tableList['ci'] = 'CI'; +$lang->dev->tableList['compile'] = 'Compile'; +$lang->dev->tableList['jenkins'] = 'Jenkins'; +$lang->dev->tableList['job'] = 'Job'; +$lang->dev->tableList['searchdict'] = 'Search dict'; +$lang->dev->tableList['searchindex'] = 'Search index'; +$lang->dev->tableList['kanbanlane'] = 'Kanban Lane'; +$lang->dev->tableList['kanbancolumn'] = 'Kanban Column'; +$lang->dev->tableList['stakeholder'] = 'Stakeholder'; +$lang->dev->tableList['im_chat_message_index'] = 'Zentao Client Message'; +$lang->dev->tableList['im_message_backup'] = 'Zentao Client Backup'; +$lang->dev->tableList['im_message_index'] = 'Zentao Client Message Index'; +$lang->dev->tableList['im_userdevice'] = 'Zentao Client User Device'; $lang->dev->groupList['my'] = 'Dashboard'; $lang->dev->groupList['program'] = 'Program'; diff --git a/module/execution/lang/en.php b/module/execution/lang/en.php index 76cce78e04..1f5ecdef08 100644 --- a/module/execution/lang/en.php +++ b/module/execution/lang/en.php @@ -103,6 +103,7 @@ $lang->execution->copyNoExecution = 'There are no ' . $lang->executionCommon . $lang->execution->noTeam = 'No team members at the moment'; $lang->execution->or = ' or '; $lang->execution->selectProject = 'Please select project'; +$lang->execution->unfoldClosed = 'Unfold Closed'; $lang->execution->editName = 'Edit Name'; $lang->execution->setWIP = 'WIP Settings'; $lang->execution->sortColumn = 'Kanban Card Sorting'; diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php index 4ec1cdea56..07c7ad4e7f 100644 --- a/module/gitlab/lang/en.php +++ b/module/gitlab/lang/en.php @@ -154,7 +154,7 @@ $lang->gitlab->group->requestAccessEnabledTip = "Allow users to $lang->gitlab->group->lfsEnabled = 'Large File Storage'; $lang->gitlab->group->lfsEnabledTip = "Allow projects within this group to use Git LFS(This setting can be overridden in each project)"; $lang->gitlab->group->projectCreationLevel = "Allowed to create projects"; -$lang->gitlab->group->projectCreationLevelList['none'] = "No one"; +$lang->gitlab->group->projectCreationLevelList['noone'] = "No one"; $lang->gitlab->group->projectCreationLevelList['maintainer'] = "Maintainers"; $lang->gitlab->group->projectCreationLevelList['developer'] = "Developers + Maintainers"; $lang->gitlab->group->subgroupCreationLevel = "Allowed to create projects"; diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 5f49e1f9b5..73f6560c61 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -21,15 +21,15 @@ $lang->kanban->group->task['default'] = "Default"; $lang->kanban->group->task['pri'] = "Task Priority"; $lang->kanban->group->task['type'] = "Task Type"; $lang->kanban->group->task['module'] = "Task Module"; -$lang->kanban->group->task['story'] = "Story"; $lang->kanban->group->task['assignedTo'] = "Assigned To"; +$lang->kanban->group->task['story'] = "Story"; $lang->kanban->group->bug = array(); $lang->kanban->group->bug['default'] = "Default"; $lang->kanban->group->bug['pri'] = "Bug Priority"; -$lang->kanban->group->bug['type'] = "Bug Type"; -$lang->kanban->group->bug['module'] = "Bug Module"; $lang->kanban->group->bug['severity'] = "Bug Severity"; +$lang->kanban->group->bug['module'] = "Bug Module"; +$lang->kanban->group->bug['type'] = "Bug Type"; $lang->kanban->group->bug['assignedTo'] = "Assigned To"; $lang->kanban->WIP = 'WIP'; diff --git a/module/misc/lang/de.php b/module/misc/lang/de.php index 540eae8091..901cd084bd 100644 --- a/module/misc/lang/de.php +++ b/module/misc/lang/de.php @@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Letzte Version'; $lang->misc->feature->detailed = 'Details'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; +$lang->misc->releaseDate['15.7.1'] = '2021-11-02'; +$lang->misc->releaseDate['15.7'] = '2021-10-18'; +$lang->misc->releaseDate['15.6'] = '2021-10-12'; +$lang->misc->releaseDate['15.5'] = '2021-09-14'; +$lang->misc->releaseDate['15.4'] = '2021-08-23'; +$lang->misc->releaseDate['15.3'] = '2021-08-04'; +$lang->misc->releaseDate['15.2'] = '2021-07-20'; +$lang->misc->releaseDate['15.0.3'] = '2021-06-24'; +$lang->misc->releaseDate['15.0.2'] = '2021-06-12'; $lang->misc->releaseDate['15.0.1'] = '2021-06-06'; $lang->misc->releaseDate['15.0'] = '2021-04-30'; $lang->misc->releaseDate['15.0.rc3'] = '2021-04-16'; @@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); +$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details,Fix bug', 'desc' => ''); diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 1608e7f6d3..b34ce0bee2 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -94,7 +94,7 @@ $lang->misc->feature->downloadFile = 'Download introduction'; $lang->misc->feature->tutorialDesc = '

    ZenTao 15.0 has new functions, and you know how to use it through the "Tutorial".

    Click your [Avatar-Theme-Young Blue] to set it.

    '; $lang->misc->feature->themeDesc = '

    ZenTao 15.0+ a new "Youth Blue" theme, the pages are more beautiful and the experience is more friendly.

    Click your [Avatar-Theme-Young Blue] to set it.

    '; -$lang->misc->releaseDate['15.8'] = '2021-11-19'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; $lang->misc->releaseDate['15.7.1'] = '2021-11-02'; $lang->misc->releaseDate['15.7'] = '2021-10-18'; $lang->misc->releaseDate['15.6'] = '2021-10-12'; @@ -163,14 +163,14 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; -$lang->misc->feature->all['15.8'][] = array('title' => 'Optimize the branch management and its details. Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); -$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); -$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); -$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); $lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); diff --git a/module/misc/lang/fr.php b/module/misc/lang/fr.php index 26ae8b15ed..3271ed9f1d 100644 --- a/module/misc/lang/fr.php +++ b/module/misc/lang/fr.php @@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Dernière Version'; $lang->misc->feature->detailed = 'Détail'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; +$lang->misc->releaseDate['15.7.1'] = '2021-11-02'; +$lang->misc->releaseDate['15.7'] = '2021-10-18'; +$lang->misc->releaseDate['15.6'] = '2021-10-12'; +$lang->misc->releaseDate['15.5'] = '2021-09-14'; +$lang->misc->releaseDate['15.4'] = '2021-08-23'; +$lang->misc->releaseDate['15.3'] = '2021-08-04'; +$lang->misc->releaseDate['15.2'] = '2021-07-20'; +$lang->misc->releaseDate['15.0.3'] = '2021-06-24'; +$lang->misc->releaseDate['15.0.2'] = '2021-06-12'; $lang->misc->releaseDate['15.0.1'] = '2021-06-06'; $lang->misc->releaseDate['15.0'] = '2021-04-30'; $lang->misc->releaseDate['15.0.rc3'] = '2021-04-16'; @@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); +$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust details, fix bug.', 'desc' => ''); diff --git a/module/misc/lang/vi.php b/module/misc/lang/vi.php index 417344e346..e0410ae5b5 100644 --- a/module/misc/lang/vi.php +++ b/module/misc/lang/vi.php @@ -84,6 +84,16 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Latest Version'; $lang->misc->feature->detailed = 'Chi tiết'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; +$lang->misc->releaseDate['15.7.1'] = '2021-11-02'; +$lang->misc->releaseDate['15.7'] = '2021-10-18'; +$lang->misc->releaseDate['15.6'] = '2021-10-12'; +$lang->misc->releaseDate['15.5'] = '2021-09-14'; +$lang->misc->releaseDate['15.4'] = '2021-08-23'; +$lang->misc->releaseDate['15.3'] = '2021-08-04'; +$lang->misc->releaseDate['15.2'] = '2021-07-20'; +$lang->misc->releaseDate['15.0.3'] = '2021-06-24'; +$lang->misc->releaseDate['15.0.2'] = '2021-06-12'; $lang->misc->releaseDate['15.0.1'] = '2021-06-06'; $lang->misc->releaseDate['15.0'] = '2021-04-30'; $lang->misc->releaseDate['15.0.rc3'] = '2021-04-16'; @@ -143,6 +153,16 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['16.0.beta1'][] = array('title' => 'Add waterfall model project, add task kanban, improved branch management, and fixed bugs.', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => 'Add API Lib. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => 'Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => 'Add Program / Product / Project Kanban, global addition function and novice guidance. Fix bug.', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => 'Fix bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => 'Adjust interface style and document, fix bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => 'Optimize the new version upgrade process, add execution kanban.', 'desc' => ''); +$lang->misc->feature->all['15.0.3'][] = array('title' => 'Fix Bug', 'desc' => ''); +$lang->misc->feature->all['15.0.2'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.1'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0'][] = array('title' => 'Fix Bug', 'desc' => ''); $lang->misc->feature->all['15.0.rc3'][] = array('title' => 'Adjust detail, fix bug.', 'desc' => ''); diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index ca0b6feaec..d635055797 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -94,7 +94,7 @@ $lang->misc->feature->downloadFile = '下载新版本功能介绍文档'; $lang->misc->feature->tutorialDesc = "

    禅道15系列新增了多项功能,您可以通过“新手引导教程”快速了解禅道的基本使用方法。

    通过鼠标经过 [头像-新手引导],点击新手引导,即可进入新手引导教程。

    "; $lang->misc->feature->themeDesc = "

    禅道15系列上线了全新的“青春蓝”主题,页面呈现更加美观,体验更加友好。

    通过鼠标经过 [头像-主题-青春蓝],点击青春蓝,即可设置成功。

    "; -$lang->misc->releaseDate['15.8'] = '2021-11-19'; +$lang->misc->releaseDate['16.0.beta1'] = '2021-12-06'; $lang->misc->releaseDate['15.7.1'] = '2021-11-02'; $lang->misc->releaseDate['15.7'] = '2021-10-18'; $lang->misc->releaseDate['15.6'] = '2021-10-12'; @@ -163,14 +163,14 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; -$lang->misc->feature->all['15.8'][] = array('title' => '完善分支管理和细节。修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.7.1'][] = array('title' => '修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.7'][] = array('title' => '新增接口库。修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.6'][] = array('title' => '修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.5'][] = array('title' => '增加项目集/产品/项目看板视图、全局添加功能、新手引导。 修复Bug。', 'desc' => ''); -$lang->misc->feature->all['15.4'][] = array('title' => '修复Bug', 'desc' => ''); -$lang->misc->feature->all['15.3'][] = array('title' => '实现界面风格改动和文档优化,修复Bug', 'desc' => ''); -$lang->misc->feature->all['15.2'][] = array('title' => '优化新版本升级流程,增加执行看板。', 'desc' => ''); +$lang->misc->feature->all['16.0.beta1'][] = array('title' => '新增瀑布模型项目,新增任务看板,完善分支管理和细节,修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.7.1'][] = array('title' => '修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.7'][] = array('title' => '新增接口库。修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.6'][] = array('title' => '修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.5'][] = array('title' => '增加项目集/产品/项目看板视图、全局添加功能、新手引导。 修复Bug。', 'desc' => ''); +$lang->misc->feature->all['15.4'][] = array('title' => '修复Bug', 'desc' => ''); +$lang->misc->feature->all['15.3'][] = array('title' => '实现界面风格改动和文档优化,修复Bug', 'desc' => ''); +$lang->misc->feature->all['15.2'][] = array('title' => '优化新版本升级流程,增加执行看板。', 'desc' => ''); $lang->misc->feature->all['15.0.3'][] = array('title' => '修复Bug', 'desc' => ''); $lang->misc->feature->all['15.0.2'][] = array('title' => '修复Bug', 'desc' => ''); diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index 25d79820fc..102d6f192c 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -37,6 +37,9 @@ $lang->mr->gitlabID = 'GitLab'; $lang->mr->repoID = 'Repo'; $lang->mr->jobID = 'Compile job'; +$lang->mr->canMerge = "Can merge"; +$lang->mr->cantMerge = "不可合并"; + $lang->mr->approval = 'Approval'; $lang->mr->approve = 'Approve'; $lang->mr->reject = 'Reject'; @@ -74,12 +77,14 @@ $lang->mr->mergeStatusList['checking'] = 'checking'; $lang->mr->mergeStatusList['can_be_merged'] = 'can be merged'; $lang->mr->mergeStatusList['cannot_be_merged'] = 'cannot be merged'; -$lang->mr->description = 'Description'; -$lang->mr->confirmDelete = 'Are you sure to delete this merge request?'; -$lang->mr->sourceProject = 'Source project'; -$lang->mr->sourceBranch = 'Source branch'; -$lang->mr->targetProject = 'Target project'; -$lang->mr->targetBranch = 'Target branch'; +$lang->mr->description = 'Description'; +$lang->mr->confirmDelete = 'Are you sure to delete this merge request?'; +$lang->mr->sourceProject = 'Source project'; +$lang->mr->sourceBranch = 'Source branch'; +$lang->mr->targetProject = 'Target project'; +$lang->mr->targetBranch = 'Target branch'; +$lang->mr->noCompileJob = 'No Compile Job'; +$lang->mr->compileUnexecuted = 'Compile Unexecuted'; $lang->mr->notFound = "Merge Request does not exist!"; $lang->mr->toCreatedMessage = "The merge request you submitted:%s, the build task succeeded."; diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 386387d4d6..b7ed529b21 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -55,6 +55,7 @@ $lang->product->project = $lang->executionCommon . ' List'; $lang->product->build = 'Build List'; $lang->product->moreProduct = "More Product"; $lang->product->projectInfo = "Projects that are linked to this {$lang->productCommon} are listed below."; +$lang->product->progress = "Progress"; $lang->product->currentExecution = "Current Execution"; $lang->product->activeStories = 'Active [S]'; @@ -77,6 +78,7 @@ $lang->product->assignToNullBugs = 'Unassigned [B]'; $lang->product->assignToNullBugsTitle = 'Unassigned Bugs'; $lang->product->closedBugs = 'Closed Bug'; $lang->product->bugFixedRate = 'Bug Repair rate'; +$lang->product->unfoldClosed = 'Unfold Closed'; $lang->product->confirmDelete = " Do you want to delete the {$lang->productCommon}?"; $lang->product->errorNoProduct = "No {$lang->productCommon} is created yet!"; diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index d4f1596ed2..0f61f73e15 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -79,10 +79,12 @@ $lang->productplan->endList[93] = '3 Months'; $lang->productplan->endList[186] = '6 Months'; $lang->productplan->endList[365] = '1 Year'; -$lang->productplan->errorNoTitle = 'ID %s title should not be empty.'; -$lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.'; -$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.'; -$lang->productplan->beginGeEnd = 'ID %s begin time should not be >= end time.'; +$lang->productplan->errorNoTitle = 'ID %s title should not be empty.'; +$lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.'; +$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.'; +$lang->productplan->beginGeEnd = 'ID %s begin time should not be >= end time.'; +$lang->productplan->beginLetterParent = "The start date of the parent plan: %s, the start date cannot be less than the start date of the parent plan."; +$lang->productplan->endGreaterParent = "The completion date of the parent plan: %s, the completion date cannot be greater than the completion date of the parent plan."; $lang->productplan->featureBar['browse']['all'] = 'All'; $lang->productplan->featureBar['browse']['unexpired'] = 'Unexpired'; diff --git a/module/programplan/lang/en.php b/module/programplan/lang/en.php index de70969dc4..8e749e7d78 100644 --- a/module/programplan/lang/en.php +++ b/module/programplan/lang/en.php @@ -51,8 +51,8 @@ $lang->programplan->exporting = 'Exporting'; $lang->programplan->exportFail = 'Failed'; $lang->programplan->hideCriticalPath = 'Hide Critical Path'; $lang->programplan->showCriticalPath = 'Show Critical Path'; -$lang->programplan->errorEnd = "Project end date: %s, end date should be <= project end date."; $lang->programplan->errorBegin = "Project begin date: %s, begin date should be >= project begin date."; +$lang->programplan->errorEnd = "Project end date: %s, end date should be <= project end date."; $lang->programplan->milestoneList[1] = 'Yes'; $lang->programplan->milestoneList[0] = 'No'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 4fab2f1b2c..3e26598ab8 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -180,9 +180,6 @@ $lang->project->createExecution = "There is no {$lang->executionCommon} u $lang->project->unlinkExecutionMember = "The user participated in %s executions such as %s%s. Do you want to remove the user from those executions as well? (The data related to this user will not be deleted.)"; $lang->project->unlinkExecutionMembers = "The team members you are removing are also in the execution team of this project. Do you want to remove them from the execution team too?"; -$lang->project->realEndNotEmpty = 'Actual End should not be empty.'; -$lang->project->realEndNotFuture = 'Actual End should be < = today.'; - $lang->project->tenThousand = ''; $lang->project->unitList['CNY'] = 'RMB'; diff --git a/module/report/lang/zh-cn.php b/module/report/lang/zh-cn.php index 8b5dc45830..c88541dcd9 100644 --- a/module/report/lang/zh-cn.php +++ b/module/report/lang/zh-cn.php @@ -112,6 +112,7 @@ $lang->report->proVersion = 'Try ZenTao Pro for more!'; $lang->report->workloadDesc = '工作负载=用户所有任务剩余工时之和/选择的时间天数*每天的工时。例如:起止时间设为1月1日~1月7日、工作日天数5天、每天工时8h,统计的是所有指派给该人员的未完成的任务,在5天内,每天8h的情况下的工作负载。'; + $lang->report->annualData = new stdclass(); $lang->report->annualData->title = "%s %s年工作汇总"; $lang->report->annualData->exportByZentao = "由禅道系统导出"; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index d5da3bf802..4842c41a97 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -250,6 +250,7 @@ $lang->story->legendChildStories = 'Child Stories'; $lang->story->legendSpec = 'Description'; $lang->story->legendVerify = 'Acceptance'; $lang->story->legendMisc = 'Misc.'; +$lang->story->legendInformation = 'Story Information'; $lang->story->lblChange = 'Change'; $lang->story->lblReview = 'Review'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index 56fea24343..b2c4b83bd8 100644 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -25,6 +25,7 @@ $lang->task->delayed = 'Delayed'; $lang->task->view = "Task Detail"; $lang->task->logEfforts = "Effort"; $lang->task->record = "Estimates"; +$lang->task->teamConsumed = "Tean Consumed"; $lang->task->start = "Start"; $lang->task->startAction = "Start Task"; $lang->task->restart = "Continue"; @@ -197,6 +198,7 @@ $lang->task->legendBasic = 'Basic Info'; $lang->task->legendEffort = 'Effort'; $lang->task->legendLife = 'Task Life'; $lang->task->legendDesc = 'Task Description'; +$lang->task->legendDetail = 'Task Detail'; $lang->task->confirmDelete = "Do you want to delete this task?"; $lang->task->confirmDeleteEstimate = "Do you want to delete it?"; diff --git a/module/testtask/lang/en.php b/module/testtask/lang/en.php index b664c40091..3254494df6 100644 --- a/module/testtask/lang/en.php +++ b/module/testtask/lang/en.php @@ -37,9 +37,11 @@ $lang->testtask->next = 'Next'; $lang->testtask->start = "Start"; $lang->testtask->close = "Close"; $lang->testtask->wait = "Waiting"; +$lang->testtask->waitAB = "Waiting"; $lang->testtask->block = "Block"; $lang->testtask->activate = "Activate"; $lang->testtask->testing = "Testing"; +$lang->testtask->testingAB = "Testing"; $lang->testtask->blocked = "Blocked"; $lang->testtask->done = "Tested"; $lang->testtask->totalStatus = "All"; @@ -116,10 +118,9 @@ $lang->testtask->statusList['doing'] = 'Doing'; $lang->testtask->statusList['done'] = 'Closed'; $lang->testtask->statusList['blocked'] = 'Blocked'; -$lang->testtask->priList[0] = ''; -$lang->testtask->priList[3] = '3'; $lang->testtask->priList[1] = '1'; $lang->testtask->priList[2] = '2'; +$lang->testtask->priList[3] = '3'; $lang->testtask->priList[4] = '4'; $lang->testtask->unlinkedCases = 'Unlinked Case'; diff --git a/module/upgrade/lang/version.php b/module/upgrade/lang/version.php index 6b05bfaf8a..2baec88f6a 100644 --- a/module/upgrade/lang/version.php +++ b/module/upgrade/lang/version.php @@ -147,3 +147,4 @@ $lang->upgrade->fromVersions['15_5'] = '15.5'; $lang->upgrade->fromVersions['15_6'] = '15.6'; $lang->upgrade->fromVersions['15_7'] = '15.7'; $lang->upgrade->fromVersions['15_7_1'] = '15.7.1'; +$lang->upgrade->fromVersions['16_0_beta1'] = '16.0.beta1'; From bb6dba1a7812013d935cded4394cda049bad1c01 Mon Sep 17 00:00:00 2001 From: songchenxuan Date: Mon, 6 Dec 2021 11:12:21 +0800 Subject: [PATCH 16/30] *Fix bug #17111. --- module/program/model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/program/model.php b/module/program/model.php index 2455b423cf..3115650a18 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -449,7 +449,6 @@ class programModel extends model ->where('t1.deleted')->eq('0') ->beginIF($this->config->systemMode == 'new')->andWhere('t1.type')->eq('project')->fi() ->beginIF($this->config->systemMode == 'new' and ($this->cookie->involved or $involved))->andWhere('t2.type')->eq('project')->fi() - ->beginIF($this->config->systemMode == 'new' and ($this->cookie->involved or $involved))->andWhere('t3.objectType')->eq('project')->fi() ->beginIF($browseType != 'all' and $browseType != 'undone')->andWhere('t1.status')->eq($browseType)->fi() ->beginIF($browseType == 'undone')->andWhere('t1.status')->in('wait,doing')->fi() ->beginIF($path)->andWhere('t1.path')->like($path . '%')->fi() From 8d08be2f57f2b2ea89feea2df7ce4fadd0b6a072 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 6 Dec 2021 11:18:49 +0800 Subject: [PATCH 17/30] * Fix cards count incorrect on some kanbans. --- module/common/view/kanban.html.php | 15 --------------- module/product/js/kanban.js | 24 +++++++++++++++++------- module/program/js/kanban.js | 21 +++++++++++++++------ module/project/js/kanban.js | 21 +++++++++++++++------ 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/module/common/view/kanban.html.php b/module/common/view/kanban.html.php index 24f9a91645..449585b97e 100644 --- a/module/common/view/kanban.html.php +++ b/module/common/view/kanban.html.php @@ -436,21 +436,6 @@ $.extend($.fn.kanban.Constructor.DEFAULTS, var color = kanbanColorList[lane.$index % kanbanColorList.length]; $name.css('background-color', color); }, - onRenderKanban: function($kanban, kanbanData) - { - /* Update project count and execution count */ - var doingProjectCount = 0; - var doingExecutionCount = 0; - var $doingProjectItems = $kanban.find('.kanban-lane-col[data-type="doingProject"] > .kanban-lane-items'); - if($doingProjectItems.length) - { - doingProjectCount = $doingProjectItems.find('.project-item').length; - doingExecutionCount = $doingProjectItems.find('.execution-item').length; - } - - $kanban.find('.kanban-header-col[data-type="doingProject"] > .title > .count').text(doingProjectCount || 0); - $kanban.find('.kanban-header-col[data-type="doingExecution"] > .title > .count').text(doingExecutionCount || 0); - }, onCreate: function(kanban) { kanban.$.on('scroll', tryUpdateKanbanAffix); diff --git a/module/product/js/kanban.js b/module/product/js/kanban.js index 30d2879cc2..674434c117 100644 --- a/module/product/js/kanban.js +++ b/module/product/js/kanban.js @@ -9,14 +9,22 @@ function processKanbanData(key, programsData) var kanbanId = key; /* Generate columns */ - var columns = []; + var columns = []; var hasDoingProject = false; + var executionsCol; $.each(kanbanColumns, function(_, column) { var colType = column.type; + if(colType === 'doingProject') hasDoingProject = true; + column = $.extend({}, column, + { + kanban: kanbanId, + id: kanbanId + '-' + colType, + parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false, + }); + if(colType === 'doingProject') { - hasDoingProject = true; columns.push( { kanban: kanbanId, @@ -27,12 +35,12 @@ function processKanbanData(key, programsData) count: '' }); } - columns.push($.extend({}, column, + else if(colType === 'doingExecution') { - kanban: kanbanId, - id: kanbanId + '-' + colType, - parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false, - })); + executionsCol = column; + executionsCol.count = 0; + } + columns.push(column); }); /* Format lanes data */ @@ -76,6 +84,8 @@ function processKanbanData(key, programsData) var execution = latestExecutions[projectID]; if(!execution || !execution.id) return; + + executionsCol.count++; projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id}); }); } diff --git a/module/program/js/kanban.js b/module/program/js/kanban.js index 8e46008db4..28c36e6796 100644 --- a/module/program/js/kanban.js +++ b/module/program/js/kanban.js @@ -10,9 +10,17 @@ function processKanbanData(key, programsData) /* Generate columns */ var columns = []; + var executionsCol; $.each(kanbanColumns, function(_, column) { var colType = column.type; + column = $.extend({}, column, + { + kanban: kanbanId, + id: kanbanId + '-' + column.type, + parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, + }); + if(colType === 'doingProject') { columns.push( @@ -25,13 +33,12 @@ function processKanbanData(key, programsData) count: '' }); } - - columns.push($.extend({}, column, + else if(colType === 'doingExecution') { - kanban: kanbanId, - id: kanbanId + '-' + column.type, - parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, - })); + executionsCol = column; + executionsCol.count = 0; + } + columns.push(column); }); /* Format lanes data */ @@ -87,6 +94,8 @@ function processKanbanData(key, programsData) var execution = project.execution; if(!execution || !execution.id) return; + + executionsCol.count++; projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id}); }); } diff --git a/module/project/js/kanban.js b/module/project/js/kanban.js index 506d68b027..6b0b993da5 100644 --- a/module/project/js/kanban.js +++ b/module/project/js/kanban.js @@ -10,9 +10,17 @@ function processKanbanData(key, programGroup) /* Generate columns */ var columns = []; + var executionsCol; $.each(kanbanColumns, function(_, column) { var colType = column.type; + column = $.extend({}, column, + { + kanban: kanbanId, + id: kanbanId + '-' + column.type, + parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, + }); + if(colType === 'doingProject') { columns.push( @@ -25,13 +33,13 @@ function processKanbanData(key, programGroup) count: '' }); } - - columns.push($.extend({}, column, + else if(colType === 'doingExecution') { - kanban: kanbanId, - id: kanbanId + '-' + column.type, - parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false, - })); + executionsCol = column; + executionsCol.count = 0; + } + + columns.push(column); }); /* Format lanes data */ var lanes = []; @@ -58,6 +66,7 @@ function processKanbanData(key, programGroup) var execution = latestExecutions[projectID]; if(execution && execution.id) { + executionsCol.count++; projectItem.execution = $.extend({}, execution, {id: 'execution-' + execution.id, _id: execution.id}); } } From 50ad00b1c4e76705792b8815399f6a623b00ba74 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 6 Dec 2021 11:19:05 +0800 Subject: [PATCH 18/30] * Fix dnd not work in project kanban. --- module/project/js/kanban.js | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/module/project/js/kanban.js b/module/project/js/kanban.js index 6b0b993da5..3e020ce7a1 100644 --- a/module/project/js/kanban.js +++ b/module/project/js/kanban.js @@ -154,13 +154,6 @@ function changeCardColType(card, fromColType, toColType, kanbanID) var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '80%', url: link}); modalTrigger.show(); } - - /* - // TODO: The server must return a updated kanban data 服务器返回更新后的看板数据 - - // 调用 updateKanban 更新看板数据 - updateKanban(kanbanID, newKanbanData); - */ } /** @@ -170,7 +163,7 @@ function changeCardColType(card, fromColType, toColType, kanbanID) */ function handleFinishDrop(event) { - var $card = $(event.element); // The drag card + var $card = $(event.element).closest('.kanban-item'); // The drag card var $dragCol = $card.closest('.kanban-lane-col'); var $dropCol = $(event.target); @@ -180,8 +173,6 @@ function handleFinishDrop(event) var toColType = $dropCol.data('type'); var kanbanID = $card.closest('.kanban').data('id'); - if(fromColType == 'doingProject') card = $card.parent().parent().data('item'); - changeCardColType(card, fromColType, toColType, kanbanID); } @@ -206,7 +197,7 @@ $(function() virtualize: true, droppable: { - selector: '.kanban-item:not(.execution-item)', + selector: '.kanban-card:not(.execution-item)', target: findDropColumns, finish: handleFinishDrop, mouseButton: 'left' From 8debfb8ad866cce8533de7b0d1874dab9086821d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B9=BF=E6=98=8E?= Date: Mon, 6 Dec 2021 11:25:34 +0800 Subject: [PATCH 19/30] * Remove version. --- module/upgrade/lang/version.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/upgrade/lang/version.php b/module/upgrade/lang/version.php index 2baec88f6a..6b05bfaf8a 100644 --- a/module/upgrade/lang/version.php +++ b/module/upgrade/lang/version.php @@ -147,4 +147,3 @@ $lang->upgrade->fromVersions['15_5'] = '15.5'; $lang->upgrade->fromVersions['15_6'] = '15.6'; $lang->upgrade->fromVersions['15_7'] = '15.7'; $lang->upgrade->fromVersions['15_7_1'] = '15.7.1'; -$lang->upgrade->fromVersions['16_0_beta1'] = '16.0.beta1'; From 78af43d78c97d2233efb00c545938978cd9f9cc9 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 6 Dec 2021 11:26:27 +0800 Subject: [PATCH 20/30] * Fix bug #17115. --- module/caselib/css/createcase.css | 7 +- module/caselib/js/createcase.js | 108 ++++++-- module/caselib/view/createcase.html.php | 332 ++++++++++++------------ 3 files changed, 248 insertions(+), 199 deletions(-) diff --git a/module/caselib/css/createcase.css b/module/caselib/css/createcase.css index ff92b8cd36..bc54a9a26d 100644 --- a/module/caselib/css/createcase.css +++ b/module/caselib/css/createcase.css @@ -4,11 +4,11 @@ #steps .btn-group .btn {padding-left: 0; padding-right: 0; min-width: 30px;} .step-actions {width: 100px;} #steps .active td {transition: background-color .5s;} -#steps .step-group .step-steps {resize: none; max-height: 30px;} -#steps .step-group .step-expects {display: none;} +#steps .step-steps {resize: none; max-height: 30px;} +#steps .step-expects {display: none;} #steps .step-item .step-item-id {display: table-cell; min-width: 40px;} #steps .step-item .step-id {color: transparent;} -#steps .step-group .step-id {font-weight: bold;} +#steps .step-id {font-weight: bold;} #steps .step-actions {width: 90px; text-align: center;} #steps .btn-step-move {cursor: move;} @@ -19,7 +19,6 @@ #steps.sortable-sorting > tr.drag-row + tr > td {box-shadow: inset 0 4px 2px rgba(0,0,0,.2);} #steps.sortable-sorting > tr.drag-row > td {background-color: #edf3fe !important;} #steps.sortable > tr.drop-success > td {background-color: #cfe0ff; transition: background-color 2s;} -#steps .step-type-toggle {padding: 0;} #steps .step-type-menu-box {position: relative;} #steps .step-type-menu {position: absolute; top: 25px; right: 0; z-index: 10; box-shadow: 0 6px 12px rgba(0,0,0,.175); background-color: #fff; display: none; border: 1px solid #bbb; min-width: 60px;} #steps .step-step[data-type="item"] .step-type-menu > a[data-value="item"] {display: none;} diff --git a/module/caselib/js/createcase.js b/module/caselib/js/createcase.js index af418f5064..41b2fcd30e 100644 --- a/module/caselib/js/createcase.js +++ b/module/caselib/js/createcase.js @@ -19,64 +19,70 @@ function loadLibModules(libID) */ function initSteps(selector) { + /* Fix task #4832. Auto adjust textarea height. */ + $('textarea.autosize').each(function() + { + $.autoResizeTextarea(this); + }); + var $steps = $(selector || '#steps'); var $stepTemplate = $('#stepTemplate').detach().removeClass('template').attr('id', null); - var initSortableCallTask = null; var groupNameText = $steps.data('groupName'); - var insertStepRow = function($row, count, type) + var insertStepRow = function($row, count, type, notFocus) { if(count === undefined) count = 1; + var $step; for(var i = 0; i < count; ++i) { - var $step = $stepTemplate.clone(); + $step = $stepTemplate.clone(); if($row) $row.after($step); else $steps.append($step); $step.addClass('step-new'); - setTimeout(function(){$step.find('.step-steps').focus();}, 10); + if(type) $step.find('.step-type').val(type); } + if(!notFocus && $step) setTimeout(function(){$step.find('.step-steps').focus();}, 10); }; var updateStepType = function($step, type) { var targetIsGroup = type =='group'; - $step.attr('data-type', type).find('.step-steps').toggleClass('autosize', !targetIsGroup).attr('placeholder', targetIsGroup ? groupNameText : null).focus(); - - var displayType = (type =='item' && $step.hasClass('step-step')) ? 'step' : type; - - var activeTypeText = $step.find('.step-type-menu > a').removeClass('active').filter('[data-value="' + displayType + '"]').addClass('active').text(); - $step.find('.step-type-current > span').text(activeTypeText); + $step.attr('data-type', type).find('.step-steps').addClass('autosize').attr('placeholder', targetIsGroup ? groupNameText : null); }; - var refreshSteps = function() + var getStepsElements = function() + { + return $steps.children('.step:not(.drag-shadow)'); + }; + var refreshSteps = function(skipAutoAddStep) { var parentId = 1, childId = 0; - $steps.children('.step:not(.drag-shadow)').each(function(idx) + getStepsElements().each(function(idx) { - var $step = $(this); + var $step = $(this).attr('data-index', idx + 1); var type = $step.find('.step-type').val(); var stepID; if(type == 'group') { - $step.removeClass('step-item step-step').addClass('step-group'); + $step.removeClass('step-item').removeClass('step-step').addClass('step-group'); stepID = parentId++; $step.find('.step-id').text(stepID); childId = 1; } else if(type == 'step') { - $step.removeClass('step-item step-group').addClass('step-step'); + $step.removeClass('step-item').removeClass('step-group').addClass('step-step'); stepID = parentId++; $step.find('.step-id').text(stepID); childId = 0; } - else + else // step type is not set { - if(childId) // as child + if(childId) // type as child { stepID = (parentId - 1) + '.' + (childId++); - $step.removeClass('step-step step-group').addClass('step-item').find('.step-item-id').text(stepID); + $step.removeClass('step-step').removeClass('step-group').addClass('step-item').find('.step-item-id').text(stepID); } - else + else // type as step { - $step.removeClass('step-item step-group').addClass('step-step'); + $step.removeClass('step-item').removeClass('step-group').addClass('step-step'); stepID = parentId++; $step.find('.step-id').text(stepID); } @@ -87,6 +93,25 @@ function initSteps(selector) updateStepType($step, type); }); + + /* Auto insert step to group without any steps */ + if(!skipAutoAddStep) + { + var needRefresh = false; + getStepsElements().each(function(idx) + { + var $step = $(this).attr('data-index', idx + 1); + if($step.attr('data-type') !== 'group') return; + var $nextStep = $step.next('.step:not(.drag-shadow)'); + if(!$nextStep.length || $nextStep.attr('data-type') !== 'item') + { + insertStepRow($step, 1, 'item', true); + needRefresh = true; + } + }); + + if(needRefresh) refreshSteps(true); + } }; var initSortable = function() { @@ -110,7 +135,7 @@ function initSteps(selector) { if(!isMouseDown) return; var $targetStep = $(this); - $steps.children('.step').each(function(idx) + getStepsElements().each(function(idx) { $(this).data('order', idx); }); @@ -133,14 +158,47 @@ function initSteps(selector) refreshSteps(); }).on('click', '.btn-step-delete', function() { - if($('tbody#steps tr.step').size() == 1) return false; + if($steps.children('.step').length == 1) return; $(this).closest('.step').remove(); refreshSteps(); - }).on('click', '.step-type-menu a', function() + }).on('change', '.step-group-toggle', function() { - var $a = $(this); - $a.closest('.step').find('.step-type').val($a.data('value')); + var $checkbox = $(this); + var $step = $checkbox.closest('.step'); + var isChecked = $checkbox.is(':checked'); + var suggestType = isChecked ? 'group' : 'item'; + if(!isChecked) + { + var $prevStep = $step.prev('.step:not(.drag-shadow)'); + var suggestChild = $prevStep.length && $prevStep.is('.step-group') && $step.next('.step:not(.drag-shadow)').length; + suggestType = suggestChild ? 'item' : 'step'; + } + $step.find('.step-type').val(suggestType); + + /* Auto insert step to group without any steps */ + if(suggestType === 'group') + { + var $nextStep = $step.next('.step:not(.drag-shadow)'); + if(!$nextStep.length || $nextStep.find('.step-type').val() !== 'item') + { + insertStepRow($step, 1, 'item', true); + } + } + refreshSteps(); + }).on('change', '.form-control', function() + { + var $control = $(this); + if($control.val()) + { + var $step = $control.closest('.step'); + if($step.data('index') === getStepsElements().length) + { + insertStepRow($step, 1, 'step', true); + if($step.is('.step-item,.step-group')) insertStepRow($step, 1, 'item', true); + refreshSteps(); + } + } }); initSortable(); refreshSteps(); diff --git a/module/caselib/view/createcase.html.php b/module/caselib/view/createcase.html.php index 0e83d94e66..864d900ff1 100644 --- a/module/caselib/view/createcase.html.php +++ b/module/caselib/view/createcase.html.php @@ -26,184 +26,176 @@
    - - - - - - - - - - - - - - - + + + - - - - - - - - + + + + + + + + + + + From 18c0ef3210197c10d6cf7eee9cb4cdace6aee731 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 6 Dec 2021 11:30:11 +0800 Subject: [PATCH 21/30] * Custom dnd rules for project kanban. --- module/project/js/kanban.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/module/project/js/kanban.js b/module/project/js/kanban.js index 3e020ce7a1..33cc274a05 100644 --- a/module/project/js/kanban.js +++ b/module/project/js/kanban.js @@ -81,6 +81,15 @@ function processKanbanData(key, programGroup) return {id: kanbanId, columns: columns, lanes: lanes}; } +/** Define kanban d-n-d rules */ +var projectDropRules = +{ + waitProject: ['doingProject', 'closedProject'], + doingProject: ['closedProject'], + closedProject: ['doingProject'], +}; +window.kanbanDropRules = {my: projectDropRules, other: projectDropRules}; + /* * Find drop columns * @param {JQuery} $element Drag element From bb635e3c4849251437c85f0b29461f691150501c Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 6 Dec 2021 11:36:33 +0800 Subject: [PATCH 22/30] * Modify the code format of caselib js file. --- module/caselib/js/createcase.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/module/caselib/js/createcase.js b/module/caselib/js/createcase.js index 41b2fcd30e..d4a5019d54 100644 --- a/module/caselib/js/createcase.js +++ b/module/caselib/js/createcase.js @@ -19,7 +19,7 @@ function loadLibModules(libID) */ function initSteps(selector) { - /* Fix task #4832. Auto adjust textarea height. */ + /* Auto adjust textarea height. */ $('textarea.autosize').each(function() { $.autoResizeTextarea(this); @@ -36,7 +36,7 @@ function initSteps(selector) { $step = $stepTemplate.clone(); if($row) $row.after($step); - else $steps.append($step); + if(!$row) $steps.append($step); $step.addClass('step-new'); if(type) $step.find('.step-type').val(type); } @@ -163,15 +163,15 @@ function initSteps(selector) refreshSteps(); }).on('change', '.step-group-toggle', function() { - var $checkbox = $(this); - var $step = $checkbox.closest('.step'); - var isChecked = $checkbox.is(':checked'); + var $checkbox = $(this); + var $step = $checkbox.closest('.step'); + var isChecked = $checkbox.is(':checked'); var suggestType = isChecked ? 'group' : 'item'; if(!isChecked) { - var $prevStep = $step.prev('.step:not(.drag-shadow)'); + var $prevStep = $step.prev('.step:not(.drag-shadow)'); var suggestChild = $prevStep.length && $prevStep.is('.step-group') && $step.next('.step:not(.drag-shadow)').length; - suggestType = suggestChild ? 'item' : 'step'; + suggestType = suggestChild ? 'item' : 'step'; } $step.find('.step-type').val(suggestType); From 9b7a85cdd758ba6c80a353bca1e5856296da5927 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 6 Dec 2021 11:44:07 +0800 Subject: [PATCH 23/30] * Fix kanban columns width not fit the layout sometimes in flex mode. --- www/js/zui/kanban/min.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/js/zui/kanban/min.css b/www/js/zui/kanban/min.css index 069a39a9f2..951e7637d5 100644 --- a/www/js/zui/kanban/min.css +++ b/www/js/zui/kanban/min.css @@ -1,6 +1,6 @@ /*! - * ZUI: ZUI Kanban View - v1.10.0 - 2021-12-02 + * ZUI: ZUI Kanban View - v1.10.0 - 2021-12-06 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2021 cnezsoft.com; Licensed MIT - */.kanban{min-height:300px}.kanban-header{position:relative;background-color:rgba(0,0,0,.07)}.use-flex .kanban-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-col{min-width:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.no-flex .kanban-col{position:absolute;top:0;bottom:0}.kanban-col+.kanban-col{border-left:2px solid #fff}.kanban-header-cols{position:absolute;top:0;right:0;bottom:0;left:auto}.kanban-header-col{position:relative}.kanban-header-col>.title>.icon{display:inline-block;vertical-align:middle}.kanban-header-col>.title>.text{display:inline-block;margin:0 5px;overflow:hidden;font-weight:700;text-overflow:clip;white-space:nowrap;vertical-align:middle}.kanban-header-col>.title>.count{position:relative;top:1px;display:inline-block;color:#8b91a2;vertical-align:middle}.kanban-affixed .kanban-header-col>.title>.count{color:#ededed}.use-flex .kanban-header-col{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;min-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 30px;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-col>.title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-width:100%;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.no-flex .kanban-header-col>.title{position:absolute;top:50%;right:30px;left:30px;margin-top:-10px;line-height:20px;text-align:center;white-space:nowrap}.kanban-header-col>.actions{position:absolute;top:0;right:0}.kanban-header-col>.actions>.btn,.kanban-header-col>.actions>a{min-width:20px}.kanban-header-col>.actions>.btn>.icon,.kanban-header-col>.actions>a>.icon{opacity:.5}.kanban-affixed .kanban-header-col>.actions>.btn,.kanban-affixed .kanban-header-col>.actions>a{color:#fff}.kanban-header-parent-col>.kanban-header-col,.kanban-header-parent-col>.kanban-header-sub-cols{height:50%}.use-flex .kanban-header-parent-col{padding:0;flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.kanban-header-sub-cols{position:relative;margin-top:-1px;margin-left:-2px;border-top:2px solid #fff}.use-flex .kanban-header-sub-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-sub-cols>.kanban-col{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-col:first-child>.kanban-header-sub-cols{margin-left:0}.kanban-lane,.kanban-sub-lane{position:relative;background-color:#f1f3f5}.use-flex .kanban-lane,.use-flex .kanban-sub-lane{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.kanban-lane+.kanban-lane{margin-top:2px}.kanban-lane>*{opacity:1;-webkit-transition:opacity .1s;-o-transition:opacity .1s;transition:opacity .1s}.kanban-lane.virtual-pending>*{opacity:0}.kanban-lane .has-sub-lane{background:0 0}.no-flex .kanban-lane-cols{position:absolute;top:0;right:0;bottom:0}.no-flex .kanban-sub-lane-cols{position:absolute;top:0;right:0;bottom:0;left:0}.kanban-sub-lane{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-lane-name{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:20px;overflow:hidden;color:#fff;text-align:center;background-color:#3dc6fd;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.kanban-lane-name>.text{position:absolute;top:5px;bottom:5px;left:0;display:block;overflow:hidden;line-height:20px;text-align:center;white-space:nowrap;-webkit-writing-mode:tb-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;writing-mode:vertical-rl}.no-flex .kanban-lane-name{position:absolute;top:0;bottom:0;left:0}.use-flex .kanban-sub-lanes{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column}.no-flex .kanban-sub-lanes{position:absolute;top:0;right:0;bottom:0}.kanban-sub-lanes.no-sub-lane{background-color:#f1f3f5}.kanban-dragging .kanban-lane-col{-webkit-transition:-webkit-box-shadow .1s;-o-transition:box-shadow .1s;transition:-webkit-box-shadow .1s;transition:box-shadow .1s;transition:box-shadow .1s,-webkit-box-shadow .1s}.kanban-lane-col.drop-target{-webkit-box-shadow:inset 0 0 0 3px rgba(255,152,0,.25);box-shadow:inset 0 0 0 3px rgba(255,152,0,.25)}.kanban-lane-col.drop-to{-webkit-box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75);box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75)}.kanban-lane-col.drop-to .kanban-lane-actions>.btn{background-color:rgba(255,152,0,.25);border:1px dotted #ff9800}.kanban-lane-col.drop-to .kanban-lane-actions>.btn>span{opacity:0}.kanban-lane-col[data-type=EMPTY]{background-color:#fff}.kanban-lane-items{height:100%;overflow:auto}.kanban-lane-actions{padding:10px 15px}.use-flex .kanban-items-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start}.kanban-card{position:relative;padding:8px 10px;background:#fff;border:1px solid #fff;border-radius:4px;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .2s;-o-transition:box-shadow .2s,-o-transform .2s;transition:-webkit-box-shadow .2s,-webkit-transform .2s;transition:box-shadow .2s,transform .2s;transition:box-shadow .2s,transform .2s,-webkit-box-shadow .2s,-webkit-transform .2s,-o-transform .2s}.drag-from .kanban-card{background-color:#aaa;opacity:.2}.kanban-card:hover{border-color:rgba(0,0,0,.1);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.09);box-shadow:0 4px 10px 0 rgba(0,0,0,.09)}.drag-shadow .kanban-card{z-index:10;border-color:rgba(0,0,0,.2);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;-o-transition:box-shadow .2s,-o-transform .4s!important;transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;transition:box-shadow .2s,transform .4s!important;transition:box-shadow .2s,transform .4s,-webkit-box-shadow .2s,-webkit-transform .4s,-o-transform .4s!important}.drag-shadow .kanban-card.in{-webkit-transform:scale(1.1) rotate(5deg);-ms-transform:scale(1.1) rotate(5deg);-o-transform:scale(1.1) rotate(5deg);transform:scale(1.1) rotate(5deg)}.kanban-dragging{cursor:move} \ No newline at end of file + */.kanban{min-height:300px}.kanban-header{position:relative;background-color:rgba(0,0,0,.07)}.use-flex .kanban-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-col{min-width:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.no-flex .kanban-col{position:absolute;top:0;bottom:0}.kanban-col+.kanban-col{border-left:2px solid #fff}.kanban-header-cols{position:absolute;top:0;right:0;bottom:0;left:auto}.kanban-header-col{position:relative}.kanban-header-col>.title>.icon{display:inline-block;vertical-align:middle}.kanban-header-col>.title>.text{display:inline-block;margin:0 5px;overflow:hidden;font-weight:700;text-overflow:clip;white-space:nowrap;vertical-align:middle}.kanban-header-col>.title>.count{position:relative;top:1px;display:inline-block;color:#8b91a2;vertical-align:middle}.kanban-affixed .kanban-header-col>.title>.count{color:#ededed}.use-flex .kanban-header-col{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;min-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 30px;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-col>.title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-width:100%;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.no-flex .kanban-header-col>.title{position:absolute;top:50%;right:30px;left:30px;margin-top:-10px;line-height:20px;text-align:center;white-space:nowrap}.kanban-header-col>.actions{position:absolute;top:0;right:0}.kanban-header-col>.actions>.btn,.kanban-header-col>.actions>a{min-width:20px}.kanban-header-col>.actions>.btn>.icon,.kanban-header-col>.actions>a>.icon{opacity:.5}.kanban-affixed .kanban-header-col>.actions>.btn,.kanban-affixed .kanban-header-col>.actions>a{color:#fff}.kanban-header-parent-col>.kanban-header-col,.kanban-header-parent-col>.kanban-header-sub-cols{height:50%}.use-flex .kanban-header-parent-col{padding:0;flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.kanban-header-sub-cols{position:relative;margin-top:-1px;margin-left:-2px;border-top:2px solid #fff}.use-flex .kanban-header-sub-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.use-flex .kanban-header-sub-cols>.kanban-col{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-col:first-child>.kanban-header-sub-cols{margin-left:0}.kanban-lane,.kanban-sub-lane{position:relative;background-color:#f1f3f5}.use-flex .kanban-lane,.use-flex .kanban-sub-lane{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;flex-direction:row;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.kanban-lane+.kanban-lane{margin-top:2px}.kanban-lane>*{opacity:1;-webkit-transition:opacity .1s;-o-transition:opacity .1s;transition:opacity .1s}.kanban-lane.virtual-pending>*{opacity:0}.kanban-lane .has-sub-lane{background:0 0}.no-flex .kanban-lane-cols{position:absolute;top:0;right:0;bottom:0}.no-flex .kanban-sub-lane-cols{position:absolute;top:0;right:0;bottom:0;left:0}.kanban-sub-lane{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-lane-name{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:20px;overflow:hidden;color:#fff;text-align:center;background-color:#3dc6fd;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.kanban-lane-name>.text{position:absolute;top:5px;bottom:5px;left:0;display:block;overflow:hidden;line-height:20px;text-align:center;white-space:nowrap;-webkit-writing-mode:tb-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;writing-mode:vertical-rl}.no-flex .kanban-lane-name{position:absolute;top:0;bottom:0;left:0}.use-flex .kanban-sub-lanes{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column}.no-flex .kanban-sub-lanes{position:absolute;top:0;right:0;bottom:0}.kanban-sub-lanes.no-sub-lane{background-color:#f1f3f5}.kanban-dragging .kanban-lane-col{-webkit-transition:-webkit-box-shadow .1s;-o-transition:box-shadow .1s;transition:-webkit-box-shadow .1s;transition:box-shadow .1s;transition:box-shadow .1s,-webkit-box-shadow .1s}.kanban-lane-col.drop-target{-webkit-box-shadow:inset 0 0 0 3px rgba(255,152,0,.25);box-shadow:inset 0 0 0 3px rgba(255,152,0,.25)}.kanban-lane-col.drop-to{-webkit-box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75);box-shadow:inset 0 0 1px 4px rgba(255,152,0,.75)}.kanban-lane-col.drop-to .kanban-lane-actions>.btn{background-color:rgba(255,152,0,.25);border:1px dotted #ff9800}.kanban-lane-col.drop-to .kanban-lane-actions>.btn>span{opacity:0}.kanban-lane-col[data-type=EMPTY]{background-color:#fff}.kanban-lane-items{height:100%;overflow:auto}.kanban-lane-actions{padding:10px 15px}.use-flex .kanban-items-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start}.kanban-card{position:relative;padding:8px 10px;background:#fff;border:1px solid #fff;border-radius:4px;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .2s;-o-transition:box-shadow .2s,-o-transform .2s;transition:-webkit-box-shadow .2s,-webkit-transform .2s;transition:box-shadow .2s,transform .2s;transition:box-shadow .2s,transform .2s,-webkit-box-shadow .2s,-webkit-transform .2s,-o-transform .2s}.drag-from .kanban-card{background-color:#aaa;opacity:.2}.kanban-card:hover{border-color:rgba(0,0,0,.1);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.09);box-shadow:0 4px 10px 0 rgba(0,0,0,.09)}.drag-shadow .kanban-card{z-index:10;border-color:rgba(0,0,0,.2);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;-o-transition:box-shadow .2s,-o-transform .4s!important;transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;transition:box-shadow .2s,transform .4s!important;transition:box-shadow .2s,transform .4s,-webkit-box-shadow .2s,-webkit-transform .4s,-o-transform .4s!important}.drag-shadow .kanban-card.in{-webkit-transform:scale(1.1) rotate(5deg);-ms-transform:scale(1.1) rotate(5deg);-o-transform:scale(1.1) rotate(5deg);transform:scale(1.1) rotate(5deg)}.kanban-dragging{cursor:move} \ No newline at end of file From 0dc84860e9ed723ff1f90c0fd6025635cf888b6f Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 6 Dec 2021 11:55:46 +0800 Subject: [PATCH 24/30] * Fix bug#17113. --- module/testcase/control.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/module/testcase/control.php b/module/testcase/control.php index 8817d56461..3f8dbc97b1 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -1847,11 +1847,16 @@ class testcase extends control $caseLang = $this->lang->testcase; $caseConfig = $this->config->testcase; $branches = $this->loadModel('branch')->getPairs($productID); - $modules = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, empty($branches) ? 0 : array_keys($branches)); $stories = $this->loadModel('story')->getProductStoryPairs($productID, $branch); $fields = $this->testcase->getImportFields($productID); $fields = array_flip($fields); + $branchModules = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, empty($branches) ? array(0) : array_keys($branches)); + foreach($branchModules as $branchID => $moduleList) + { + foreach($moduleList as $moduleID => $moduleName) $modules[$moduleID] = $moduleName; + } + if(!empty($maxImport) and file_exists($tmpFile)) { $data = unserialize(file_get_contents($tmpFile)); From 641929d5fcc308d202a39273d31505130acabe3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Mon, 6 Dec 2021 11:55:50 +0800 Subject: [PATCH 25/30] * adjust for status name for api. --- api/v1/entries/bugs.php | 6 ++++-- api/v1/entries/executionbugs.php | 6 ++++-- api/v1/entries/executioncases.php | 2 +- api/v1/entries/projectbugs.php | 6 ++++-- api/v1/entries/projectcases.php | 2 +- api/v1/entries/user.php | 8 +++++--- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/api/v1/entries/bugs.php b/api/v1/entries/bugs.php index 5fa3a8a862..9e6621a61d 100644 --- a/api/v1/entries/bugs.php +++ b/api/v1/entries/bugs.php @@ -39,7 +39,8 @@ class bugsEntry extends entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $result[$bug->id] = $this->format($bug, 'activatedDate:time,openedBy:user,openedDate:time,assignedTo:user,assignedDate:time,mailto:userList,resolvedBy:user,resolvedDate:time,closedBy:user,closedDate:time,lastEditedBy:user,lastEditedDate:time,deadline:date,deleted:bool'); } @@ -53,7 +54,8 @@ class bugsEntry extends entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $result[$bugID]->status = $status; + $result[$bugID]->status = $status['code']; + $result[$bugID]->statusName = $status['name']; } return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result))); diff --git a/api/v1/entries/executionbugs.php b/api/v1/entries/executionbugs.php index 0a47390a56..65a19f92f4 100644 --- a/api/v1/entries/executionbugs.php +++ b/api/v1/entries/executionbugs.php @@ -39,7 +39,8 @@ class executionBugsEntry extends entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $result[$bug->id] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool'); } @@ -53,7 +54,8 @@ class executionBugsEntry extends entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $result[$bugID]->status = $status; + $result[$bugID]->status = $status['code']; + $result[$bugID]->statusName = $status['name']; } return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result))); diff --git a/api/v1/entries/executioncases.php b/api/v1/entries/executioncases.php index fbdd958a41..8cef23bee0 100644 --- a/api/v1/entries/executioncases.php +++ b/api/v1/entries/executioncases.php @@ -35,7 +35,7 @@ class executionCasesEntry extends entry $result = array(); foreach($cases as $case) { - $case->status = array('code' => $case->status, 'name' => $this->lang->testcase->statusList[$case->status]); + $case->statusName = 'name' => $this->lang->testcase->statusList[$case->status]; $result[] = $this->format($case, 'openedDate:time,reviewedDate:date,lastEditedDate:time,lastRunDate:time'); } diff --git a/api/v1/entries/projectbugs.php b/api/v1/entries/projectbugs.php index c0fd1ce86e..7468563e61 100644 --- a/api/v1/entries/projectbugs.php +++ b/api/v1/entries/projectbugs.php @@ -39,7 +39,8 @@ class projectBugsEntry extends entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $result[$bug->id] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool'); } @@ -53,7 +54,8 @@ class projectBugsEntry extends entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $result[$bugID]->status = $status; + $result[$bugID]->status = $status['code']; + $result[$bugID]->statusName = $status['name']; } return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => array_values($result))); diff --git a/api/v1/entries/projectcases.php b/api/v1/entries/projectcases.php index e96f69196a..d237ce1b6e 100644 --- a/api/v1/entries/projectcases.php +++ b/api/v1/entries/projectcases.php @@ -38,7 +38,7 @@ class projectCasesEntry extends entry $result = array(); foreach($cases as $case) { - $case->status = array('code' => $case->status, 'name' => $this->lang->testcase->statusList[$case->status]); + $case->statusName = $this->lang->testcase->statusList[$case->status]; $result[] = $this->format($case, 'openedDate:time,reviewedDate:date,lastEditedDate:time,lastRunDate:time'); } diff --git a/api/v1/entries/user.php b/api/v1/entries/user.php index 0630c3ca98..0201193876 100644 --- a/api/v1/entries/user.php +++ b/api/v1/entries/user.php @@ -221,7 +221,8 @@ class userEntry extends Entry if($bug->status == 'active' and $bug->confirmed) $status = array('code' => 'confirmed', 'name' => $this->lang->bug->labelConfirmed); if($bug->resolution == 'postponed') $status = array('code' => 'postponed', 'name' => $this->lang->bug->labelPostponed); if(!empty($bug->delay)) $status = array('code' => 'delay', 'name' => $this->lang->bug->overdueBugs); - $bug->status = $status; + $bug->status = $status['code']; + $bug->statusName = $status['name']; $bugs[$bug->id] = $bug; } @@ -235,7 +236,8 @@ class userEntry extends Entry foreach($storyChangeds as $bugID) { $status = array('code' => 'storyChanged', 'name' => $this->lang->bug->changed); - $bugs[$bugID]->status = $status; + $bugs[$bugID]->status = $status['code']; + $bugs[$bugID]->statusName = $status['name']; } $info->bug['total'] = $data->data->pager->recTotal; @@ -271,7 +273,7 @@ class userEntry extends Entry $stories = array(); foreach($data->data->stories as $story) { - $story->status = array('code' => $story->status, 'name' => $this->lang->story->statusList[$story->status]); + $story->statusName = $this->lang->story->statusList[$story->status]; $stories[$story->id] = $story; } From 05d9182e31adb2abad1acf2b66a623802a5c28d5 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 6 Dec 2021 12:09:15 +0800 Subject: [PATCH 26/30] * Fix bug #17116, bug #17117. --- module/testcase/control.php | 6 ++++++ module/testcase/view/view.html.php | 2 +- module/testtask/view/caseheader.html.php | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/module/testcase/control.php b/module/testcase/control.php index 9fb683a8cf..47d766ef16 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -1365,6 +1365,12 @@ class testcase extends control */ public function export($productID, $orderBy, $taskID = 0, $browseType = '') { + if(strpos($orderBy, 'case') !== false) + { + list($field, $sort) = explode('_', $orderBy); + $orderBy = '`' . $field . '`_' . $sort; + } + $product = $this->loadModel('product')->getById($productID); if($product->type != 'normal') $this->lang->testcase->branch = $this->lang->product->branchName[$product->type]; if($_POST) diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php index db1001db61..b87f82e4bf 100644 --- a/module/testcase/view/view.html.php +++ b/module/testcase/view/view.html.php @@ -131,7 +131,7 @@ id", $case, 'button', '', '', 'showinonlybody'); if(!$isLibCase and $case->auto != 'unit') common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'button', 'copy'); - if($isLibCase and common::hasPriv('caselib', 'createCase')) echo html::a($this->createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id", $case), "", '', "class='btn' title='{$lang->testcase->copy}'"); + if($isLibCase and common::hasPriv('caselib', 'createCase')) echo html::a($this->createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id"), "", '', "class='btn' title='{$lang->testcase->copy}'"); common::printIcon('testcase', 'delete', "caseID=$case->id", $case, 'button', 'trash', 'hiddenwin', ''); ?> diff --git a/module/testtask/view/caseheader.html.php b/module/testtask/view/caseheader.html.php index 5d55265d62..ea8c25bd69 100644 --- a/module/testtask/view/caseheader.html.php +++ b/module/testtask/view/caseheader.html.php @@ -37,7 +37,7 @@
    id", $task, 'button', 'link'); - common::printIcon('testcase', 'export', "productID=$productID&orderBy=`case`_desc&taskID=$task->id", '', 'button', '', '', 'export'); + common::printIcon('testcase', 'export', "productID=$productID&orderBy=case_desc&taskID=$task->id", '', 'button', '', '', 'export'); common::printIcon('testtask', 'report', "productID=$productID&taskID=$task->id&browseType=$browseType&branchID=$task->branch&moduleID=" . (empty($moduleID) ? '' : $moduleID)); common::printIcon('testtask', 'view', "taskID=$task->id", '', 'button', 'list-alt'); common::printBack($this->session->testtaskList, 'btn btn-link'); From 22ac002432c70ad1a5d81837c8d41a99afe390c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B9=BF=E6=98=8E?= Date: Mon, 6 Dec 2021 13:59:36 +0800 Subject: [PATCH 27/30] * Fix code error. --- module/release/lang/zh-cn.php | 2 +- module/upgrade/control.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index 644767324c..75304b8ae9 100644 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -56,7 +56,7 @@ $lang->release->createdBugs = '本次共遗留 %s 个Bug'; $lang->release->export = '导出HTML'; $lang->release->yesterday = '昨日发布'; $lang->release->all = '所有'; -$lang->release->notify = '通知'; +$lang->release->notify = '发送通知'; $lang->release->notifyUsers = '通知人员'; $lang->release->mailto = '抄送给'; $lang->release->mailContent = '

    尊敬的用户,您好!

    您反馈的如下需求和Bug已经在 %s版本中发布,请联系客户经理查看最新版本。

    '; diff --git a/module/upgrade/control.php b/module/upgrade/control.php index 80d6f1421c..1dd48d2d36 100644 --- a/module/upgrade/control.php +++ b/module/upgrade/control.php @@ -392,7 +392,7 @@ class upgrade extends control foreach($projectProducts as $projectProduct) { $data = new stdclass(); - $data->project = $projectList[$projectProduct->project]; + $data->project = $_POST['projectType'] == 'execution' ? $projectList : $projectList[$projectProduct->project]; $data->product = $projectProduct->product; $data->plan = $projectProduct->plan; $data->branch = $projectProduct->branch; From bd28d11c757335a9f03ea6c1c05f1f0e29337e31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B9=BF=E6=98=8E?= Date: Mon, 6 Dec 2021 15:04:33 +0800 Subject: [PATCH 28/30] * Fix bug. --- module/testreport/control.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module/testreport/control.php b/module/testreport/control.php index b5ce1cfbe5..91f2239081 100644 --- a/module/testreport/control.php +++ b/module/testreport/control.php @@ -250,6 +250,7 @@ class testreport extends control $execution = $this->execution->getById($executionID); $tasks = $this->testtask->getExecutionTasks($executionID); + $task = $objectID ? $this->testtask->getById($objectID) : key($tasks); $owners = array(); $buildIdList = array(); $productIdList = array(); @@ -287,8 +288,8 @@ class testreport extends control $builds = $this->build->getByList($buildIdList); $stories = !empty($builds) ? $this->testreport->getStories4Test($builds) : $this->story->getExecutionStories($execution->id);; - $begin = !empty($begin) ? date("Y-m-d", strtotime($begin)) : $execution->begin; - $end = !empty($end) ? date("Y-m-d", strtotime($end)) : $execution->end; + $begin = !empty($begin) ? date("Y-m-d", strtotime($begin)) : $task->begin; + $end = !empty($end) ? date("Y-m-d", strtotime($end)) : $task->end; $owner = current($owners); $bugs = $this->testreport->getBugs4Test($builds, $productIdList, $begin, $end, 'execution'); From ccff5c236651a006cec64ea626c2eb91ddb315f4 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 6 Dec 2021 17:19:29 +0800 Subject: [PATCH 29/30] * Update kanban lib and compatible with duplicate columns definition. --- www/js/zui/kanban/min.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/js/zui/kanban/min.js b/www/js/zui/kanban/min.js index de64e49a2c..3733872db2 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 - 2021-12-02 + * ZUI: ZUI Kanban View - v1.10.0 - 2021-12-06 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2021 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)}if("auto"===r.droppable&&(r.droppable=!r.readonly),r.droppable){var o=0,s={dropOnMouseleave:!0,selector:".kanban-item",target:'.kanban-lane-col:not([data-type="EMPTY"])',drop:function(a){"function"==typeof r.droppable?r.droppable(a):r.onAction&&r.onAction("dropItem",a.element,a,d)},start:function(e){d.$.addClass("kanban-dragging"),o&&clearTimeout(o),o=setTimeout(function(){a(e.shadowElement).addClass("in"),o=0},50)},always:function(){d.$.removeClass("kanban-dragging"),o&&(clearTimeout(o),o=0)}};"object"==typeof r.droppable&&a.extend(s,r.droppable),d.$.droppable(s)}if(!r.useFlex){var l=0;a(window).on("resize",function(){l&&a.zui.clearAsap(l),l=a.zui.asap(function(){l=0,d.adjustSize()})})}r.onCreate&&r.onCreate(d)};t.prototype.setOptions=function(e){var t=this,r=a.extend({},t.options,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 t=e.data||[];e.options.beforeRender&&e.options.beforeRender(e,t),e.$.toggleClass("kanban-readonly",!!e.options.readonly).toggleClass("kanban-no-lane-name",!!e.options.noLaneName),e.$.children(".kanban-board").addClass("kanban-expired");for(var r=0;r0&&t.subLaneSpace&&(k.$height+=t.subLaneSpace)}}else for(var y=k.items||k.cards||{},g=0;g-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,p=null,u=0;u.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 p=c.find(".title>.text").text(e.name);if(e.color&&p.css("color",e.color),i.showCount){var u=void 0!==e.count?e.count:e.$cardsCount;i.showZeroCount||u||(u="");var h=c.find(".title>.count").text(u);i.onRenderCount&&i.onRenderCount(h,u,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 p=t?100/t.subs.length:d.$layout.columnWidth;o.useFlex?l.css("flex","1 1 "+p+"%"):l.css({left:(t?e.$subIndex:e.$index)*p+"%",width:p+"%"}),l.find(".title>.icon").attr("class","icon icon-"+(e.icon||""));var u=l.find(".title>.text").text(e.name);if(e.color&&u.css("color",e.color),o.showCount){var h=void 0!==e.count?e.count:e.$cardsCount;o.showZeroCount||h||(h="");var b=l.find(".title>.count").text(h);o.onRenderCount&&o.onRenderCount(b,h,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}),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}),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;l1).attr("data-cards-per-row",s),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){var i=this.options,o=n.children('.kanban-item[data-id="'+e.id+'"]');o.length?o.removeClass("kanban-expired"):(o=a('
    ').appendTo(n),i.wrapCard&&o.append('
    '));var s=t.cardsPerRow||r.cardsPerRow||d.cardsPerRow||i.cardsPerRow;o.data("item",e).css({padding:i.cardSpace/2,width:s>1?100/s+"%":""});var l=i.wrapCard?o.children(".kanban-card"):o;l.css("height",i.cardHeight);var c=i.cardRender||i.itemRender;if(c)c(e,l,t,r,d);else{var p=l.find(".title");p.length||(p=a('
    ').appendTo(l)),p.text(e.name||e.title)}return l},t.prototype.tryAdjustKanbanSize=function(a,e,n){},t.prototype.adjustKanbanSize=function(a,e){},t.prototype.adjustLaneSize=function(a,e){},t.prototype.adjustSize=function(){},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:"添加条目",createColumnText:"添加看板列",useFlex:!0,cardRender:null,calcColHeight:null,droppable:"auto",readonly:!1,laneColClass:"",noLaneName:!1,showCount:!0,showZeroCount:!1,virtualize:!1},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 e(e,a){return n&&!a?requestAnimationFrame(e):setTimeout(e,a||0)}function a(e){return n?cancelAnimationFrame(e):void clearTimeout(e)}var n="function"==typeof window.requestAnimationFrame;$.zui({asap:e,clearAsap:a})}(),function(e){"use strict";function a(a,n){"string"==typeof a&&(a=e(a)),a instanceof e&&(a=a[0]);var t=a.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(a,r){"function"==typeof r&&(r={render:r});var d=this;d.name=n,d.$=e(a),d.options=r=e.extend({},t.DEFAULTS,this.$.data(),r),d.rendered=!1;var i=r.container;"function"==typeof i&&(i=i(d));var o=e(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||!a(n.$))&&(n.renderTaskID&&e.zui.clearAsap(n.renderTaskID),n.renderTaskID=e.zui.asap(function(){n.renderTaskID=null;var e=n.options.render(n.$);e!==!1&&(n.rendered=!0,n.destroy())},n.options.delay),!0)},t.prototype.destroy=function(){var a=this;a.renderTaskID&&e.zui.clearAsap(a.renderTaskID),a.scrollListener&&(a.$container.off("scroll",a.scrollListener),a.scrollListener=null);var t=a.options.pendingClass;t&&a.$.removeClass(t),a.$.removeData(n)},t.DEFAULTS={pendingClass:"virtual-pending"},e.fn.virtualRender=function(a){return this.each(function(){var r=e(this),d=r.data(n);if(d){if("string"==typeof a)return d[a]();d.destroy()}r.data(n,d=new t(this,a))})},e.zui.isElementInViewport=a}(jQuery),function(e){"use strict";var a="zui.kanban",n="object"==typeof CSS&&CSS.supports("display","flex"),t=function(n,r){var d=this;if(d.name=a,d.$=e(n).addClass("kanban"),r=d.setOptions(e.extend({},t.DEFAULTS,this.$.data(),r)),r.onAction){var i=function(a){var n=e(this);r.onAction(n.data("action"),n,a,d)};d.$.on("click",".action",i).on("dblclick",".action-dbc",i)}if("auto"===r.droppable&&(r.droppable=!r.readonly),r.droppable){var o=0,s={dropOnMouseleave:!0,selector:".kanban-item",target:'.kanban-lane-col:not([data-type="EMPTY"])',drop:function(e){"function"==typeof r.droppable?r.droppable(e):r.onAction&&r.onAction("dropItem",e.element,e,d)},start:function(a){d.$.addClass("kanban-dragging"),o&&clearTimeout(o),o=setTimeout(function(){e(a.shadowElement).addClass("in"),o=0},50)},always:function(){d.$.removeClass("kanban-dragging"),o&&(clearTimeout(o),o=0)}};"object"==typeof r.droppable&&e.extend(s,r.droppable),d.$.droppable(s)}if(!r.useFlex){var l=0;e(window).on("resize",function(){l&&e.zui.clearAsap(l),l=e.zui.asap(function(){l=0,d.adjustSize()})})}r.onCreate&&r.onCreate(d)};t.prototype.setOptions=function(a){var t=this,r=e.extend({},t.options,a);t.options=r,r.useFlex&&!n&&(r.useFlex=!1),t.$.toggleClass("no-flex",!r.useFlex).toggleClass("use-flex",!!r.useFlex);var d=!!e.fn.virtualRender&&r.virtualize;return d&&("object"!=typeof d&&(d={lane:!0}),t.virtualize=e.extend({},d)),t.data=r.data||[],t.render(t.data),r},t.prototype.render=function(e){var a=this;e&&(a.data=e),a.data&&!Array.isArray(a.data)&&(a.data=[a.data]);var t=a.data||[];a.options.beforeRender&&a.options.beforeRender(a,t),a.$.toggleClass("kanban-readonly",!!a.options.readonly).toggleClass("kanban-no-lane-name",!!a.options.noLaneName),a.$.children(".kanban-board").addClass("kanban-expired");for(var r=0;r0&&t.subLaneSpace&&(k.$height+=t.subLaneSpace)}}else for(var y=k.items||k.cards||{},g=0;g-1){var r=n.data[t];a=e.extend(r,a),n.data[t]=a}else n.data.push(a)}a.id||(a.id=e.zui.uuid());var d=a.id,i=n.options,o=n.$,s=o.children('.kanban-board[data-id="'+d+'"]');s.length?s.removeClass("kanban-expired"):s=e('
    ').appendTo(o),n.layoutKanban(a,s),n.renderKanbanHeader(a,s),s.children(".kanban-lane").addClass("kanban-expired");for(var l=a.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",a.$layout.laneNameWidth).children(".kanban-col").addClass("kanban-expired");for(var s=a.columns,l=a.$layout.columnsMap||{},c=null,p=null,u=0;u.kanban-col").addClass("kanban-expired"):o=e(['
    ','
    ','
    ','','',i.showCount?'':"","
    ","
    ",'
    ',"
    ","
    "].join("")),s&&s.length?s.after(o):n.prepend(o),o.data("col",a).attr("data-type",a.type);var l=r.$layout.columnWidth;i.useFlex?o.css("flex",a.subs.length+" "+a.subs.length+" "+l*a.subs.length+"%"):o.css({width:l*a.subs.length+"%",left:a.$index*l+"%"});var c=o.children(".kanban-header-col");c.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var p=c.find(".title>.text").text(a.name);if(a.color&&p.css("color",a.color),i.showCount){var u=void 0!==a.count?a.count:a.$cardsCount;i.showZeroCount||u||(u="");var h=c.find(".title>.count").text(u);i.onRenderCount&&i.onRenderCount(h,u,a,d)}i.onRenderHeaderCol&&i.onRenderHeaderCol(o,a,n,r)},t.prototype.renderHeaderCol=function(a,n,t,r,d){var i=this,o=i.options;if(a.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="'+a.id+'"]'),c=r?n.children('.kanban-header-col[data-id="'+r.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):l=e(['
    ','
    ','','',o.showCount?'':"","
    ",'
    ',"
    "].join("")),c&&c.length?c.after(l):n.prepend(l),l.data("col",a).attr("data-type",a.type);var p=t?100/t.subs.length:d.$layout.columnWidth;o.useFlex?l.css("flex","1 1 "+p+"%"):l.css({left:(t?a.$subIndex:a.$index)*p+"%",width:p+"%"}),l.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var u=l.find(".title>.text").text(a.name);if(a.color&&u.css("color",a.color),o.showCount){var h=void 0!==a.count?a.count:a.$cardsCount;o.showZeroCount||h||(h="");var b=l.find(".title>.count").text(h);o.onRenderCount&&o.onRenderCount(b,h,a,i)}o.onRenderHeaderCol&&o.onRenderHeaderCol(l,a,n,d)},t.prototype.renderLane=function(a,t,r,d){var i=this,o=i.options;r=r||i.$.children('.kanban-board[data-id="'+a.kanban+'"]');var s=r.children('.kanban-lane[data-id="'+a.id+'"]');s.length?s.removeClass("kanban-expired"):(s=e('
    ').appendTo(r),n||s.addClass("clearfix"));var l=a.subLanes?a.subLanes.length:0;s.attr("data-index",a.$index).data("lane",a).toggleClass("has-sub-lane",l>0).css({height:a.$height}),i.virtualizeRender(d,"lane",s,function(){if(!o.noLaneName){var n=s.children('.kanban-lane-name[data-id="'+a.id+'"]');n.length||(n=e('
    ').prependTo(s)),n.empty().css("width",o.laneNameWidth).attr("title",a.name).append(e('').text(a.name)),a.color&&n.css("background-color",a.color),o.onRenderLaneName&&o.onRenderLaneName(n,a,r,t,d)}s.children(".kanban-cols,.kanban-sub-lanes").addClass("kanban-expired");var l;l=a.subLanes?i.renderSubLanes(a,t,s,d):i.renderLaneCols(t,a.items||a.cards||{},s,a,d),o.useFlex||l.css("left",d.$layout.laneNameWidth),s.children(".kanban-expired").remove()},{lane:a,columns:t,kanban:d})},t.prototype.virtualizeRender=function(a,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(e.extend({render:r},i.options.virtualRenderOptions))):r()},t.prototype.renderSubLanes=function(a,n,t,r){var d=this,i=t.children(".kanban-sub-lanes");i.length?i.removeClass("kanban-expired"):i=e('
    ').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",a).css({height:a.$height}),o.children(".kanban-col").addClass("kanban-expired");var s=a.items||a.cards;s&&this.renderLaneCols(t,s,o,a,d),o.children(".kanban-expired").remove()},t.prototype.renderLaneCols=function(a,n,t,r,d){var i=this,o=t.children(".kanban-cols");o.length?o.removeClass("kanban-expired"):o=e('
    ').appendTo(t),o.children(".kanban-col").addClass("kanban-expired");for(var s=null,l=0;l1).attr("data-cards-per-row",s),d.children(".kanban-expired").remove()},t.prototype.renderLaneCol=function(a,n,t){var r=this,d=r.options,i=n.children('.kanban-lane-col[data-id="'+a.id+'"]'),o=t?n.children('.kanban-lane-col[data-id="'+t.id+'"]:not(.kanban-expired)'):null;i.length?i.removeClass("kanban-expired"):(i=e(['
    ','
    ',"
    "].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":a.parentType?a.parentType:null,"data-type":a.type}).data("col",a);var s=a.$kanbanData.$layout.columnWidth;return d.useFlex?i.css("flex","1 1 "+s+"%"):i.css({left:a.$index*s+"%",width:s+"%"}),i},t.prototype.renderCard=function(a,n,t,r,d){var i=this.options,o=n.children('.kanban-item[data-id="'+a.id+'"]');o.length?o.removeClass("kanban-expired"):(o=e('
    ').appendTo(n),i.wrapCard&&o.append('
    '));var s=t.cardsPerRow||r.cardsPerRow||d.cardsPerRow||i.cardsPerRow;o.data("item",a).css({padding:i.cardSpace/2,width:s>1?100/s+"%":""});var l=i.wrapCard?o.children(".kanban-card"):o;l.css("height",i.cardHeight);var c=i.cardRender||i.itemRender;if(c)c(a,l,t,r,d);else{var p=l.find(".title");p.length||(p=e('
    ').appendTo(l)),p.text(a.name||a.title)}return l},t.prototype.tryAdjustKanbanSize=function(e,a,n){},t.prototype.adjustKanbanSize=function(e,a){},t.prototype.adjustLaneSize=function(e,a){},t.prototype.adjustSize=function(){},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:"添加条目",createColumnText:"添加看板列",useFlex:!0,cardRender:null,calcColHeight:null,droppable:"auto",readonly:!1,laneColClass:"",noLaneName:!1,showCount:!0,showZeroCount:!1,virtualize:!1},e.fn.kanban=function(n){return this.each(function(){var r=e(this),d=r.data(a),i="object"==typeof n&&n;d||r.data(a,d=new t(this,i)),"string"==typeof n&&d[n]()})},t.NAME=a,e.fn.kanban.Constructor=t}(jQuery); \ No newline at end of file From 88eac3a1da0449030f89bebf6df8d888d4874660 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 6 Dec 2021 20:09:06 +0800 Subject: [PATCH 30/30] * Fallback version of the xuanxuan folder. --- db/zentao.sql | 2 +- .../module/admin/ext/view/xuanxuan.html.php | 0 .../ext/view/dashboard.xuanxuan.html.hook.php | 0 .../module/group/ext/lang/en/xuanxuan.php | 5 ++ .../module/group/ext/lang/zh-cn/xuanxuan.php | 5 ++ xuanxuan/module/im/ext/config/xuanxuan.php | 1 - xuanxuan/module/im/ext/lang/en/xuanxuan.php | 5 ++ .../module/im/ext/lang/zh-cn/xuanxuan.php | 5 ++ xuanxuan/module/im/ext/view/debug.html.php | 0 xuanxuan/module/index/ext/control/index.php | 39 ---------- .../module/index/ext/css/index/xuanxuan.css | 0 .../module/index/ext/js/index/xuanxuan.js | 0 .../ext/view/index.xuanxuan.html.hook.php | 73 ------------------ .../module/message/ext/config/xuanxuan.php | 11 +-- .../misc/ext/control/ajaxgetclientpackage.php | 0 .../misc/ext/control/ajaxgetpackagesize.php | 0 .../misc/ext/control/ajaxsetclientconfig.php | 0 .../misc/ext/control/downloadclient.php | 0 xuanxuan/www/data/xuanxuan/sdk/sdk.min.js | 4 - .../www/data/xuanxuan/zentao-integrated.zip | Bin 93645 -> 61682 bytes 20 files changed, 27 insertions(+), 123 deletions(-) mode change 100755 => 100644 xuanxuan/module/admin/ext/view/xuanxuan.html.php mode change 100755 => 100644 xuanxuan/module/block/ext/view/dashboard.xuanxuan.html.hook.php mode change 100755 => 100644 xuanxuan/module/im/ext/view/debug.html.php delete mode 100644 xuanxuan/module/index/ext/control/index.php delete mode 100644 xuanxuan/module/index/ext/css/index/xuanxuan.css delete mode 100644 xuanxuan/module/index/ext/js/index/xuanxuan.js delete mode 100644 xuanxuan/module/index/ext/view/index.xuanxuan.html.hook.php mode change 100755 => 100644 xuanxuan/module/misc/ext/control/ajaxgetclientpackage.php mode change 100755 => 100644 xuanxuan/module/misc/ext/control/ajaxgetpackagesize.php mode change 100755 => 100644 xuanxuan/module/misc/ext/control/ajaxsetclientconfig.php mode change 100755 => 100644 xuanxuan/module/misc/ext/control/downloadclient.php delete mode 100644 xuanxuan/www/data/xuanxuan/sdk/sdk.min.js diff --git a/db/zentao.sql b/db/zentao.sql index d05177fe58..626398945f 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -653,7 +653,7 @@ CREATE TABLE IF NOT EXISTS `zt_kanbanlane` ( `name` varchar(255) NOT NULL DEFAULT '', `color` char(30) NOT NULL, `order` smallint(6) NOT NULL DEFAULT '0', - `lastEditedDate` datetime NOT NULL, + `lastEditedTime` datetime NOT NULL, `deleted` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/xuanxuan/module/admin/ext/view/xuanxuan.html.php b/xuanxuan/module/admin/ext/view/xuanxuan.html.php old mode 100755 new mode 100644 diff --git a/xuanxuan/module/block/ext/view/dashboard.xuanxuan.html.hook.php b/xuanxuan/module/block/ext/view/dashboard.xuanxuan.html.hook.php old mode 100755 new mode 100644 diff --git a/xuanxuan/module/group/ext/lang/en/xuanxuan.php b/xuanxuan/module/group/ext/lang/en/xuanxuan.php index a9895fa8df..4bd6677579 100644 --- a/xuanxuan/module/group/ext/lang/en/xuanxuan.php +++ b/xuanxuan/module/group/ext/lang/en/xuanxuan.php @@ -8,6 +8,11 @@ $lang->resource->setting->xuanxuan = 'xuanxuan'; $lang->setting->methodOrder[26] = 'xuanxuan'; $lang->resource->im = new stdclass(); +$lang->resource->im->getChatUsers = 'getChatUsers'; +$lang->resource->im->getChatGroups = 'getChatGroups'; +$lang->resource->im->notifyMSG = 'notifyMSG'; +$lang->resource->im->sendNotification = 'sendNotification'; +$lang->resource->im->sendChatMessage = 'sendChatMessage'; $lang->resource->im->downloadXxdPackage = 'downloadXXD'; $lang->resource->client = new stdclass(); diff --git a/xuanxuan/module/group/ext/lang/zh-cn/xuanxuan.php b/xuanxuan/module/group/ext/lang/zh-cn/xuanxuan.php index a9895fa8df..4bd6677579 100644 --- a/xuanxuan/module/group/ext/lang/zh-cn/xuanxuan.php +++ b/xuanxuan/module/group/ext/lang/zh-cn/xuanxuan.php @@ -8,6 +8,11 @@ $lang->resource->setting->xuanxuan = 'xuanxuan'; $lang->setting->methodOrder[26] = 'xuanxuan'; $lang->resource->im = new stdclass(); +$lang->resource->im->getChatUsers = 'getChatUsers'; +$lang->resource->im->getChatGroups = 'getChatGroups'; +$lang->resource->im->notifyMSG = 'notifyMSG'; +$lang->resource->im->sendNotification = 'sendNotification'; +$lang->resource->im->sendChatMessage = 'sendChatMessage'; $lang->resource->im->downloadXxdPackage = 'downloadXXD'; $lang->resource->client = new stdclass(); diff --git a/xuanxuan/module/im/ext/config/xuanxuan.php b/xuanxuan/module/im/ext/config/xuanxuan.php index 2f3e26a02e..617c1a8b09 100644 --- a/xuanxuan/module/im/ext/config/xuanxuan.php +++ b/xuanxuan/module/im/ext/config/xuanxuan.php @@ -14,4 +14,3 @@ $config->im->cards['task']['view'] = array('width' => '700px', 'height' => ' $config->im->cards['doc']['view'] = array('width' => '700px', 'height' => '500px'); $config->im->cards['story']['view'] = array('width' => '700px', 'height' => '500px'); $config->im->cards['testcase']['view'] = array('width' => '700px', 'height' => '500px'); -$config->im->cards['productplan']['view'] = array('width' => '700px', 'height' => '447px'); diff --git a/xuanxuan/module/im/ext/lang/en/xuanxuan.php b/xuanxuan/module/im/ext/lang/en/xuanxuan.php index 957c9c0bfd..e1328f898d 100644 --- a/xuanxuan/module/im/ext/lang/en/xuanxuan.php +++ b/xuanxuan/module/im/ext/lang/en/xuanxuan.php @@ -7,6 +7,11 @@ $lang->im->xxdServer = 'ZenTao Server'; $lang->im->downloadXXD = 'Download XXD'; $lang->im->zentaoIntegrate = 'ZenTao Integrated'; $lang->im->zentaoClient = 'ZenTao Desktop is added!'; +$lang->im->getChatUsers = 'Get Chat Users'; +$lang->im->getChatGroups = 'Get Chat Groups'; +$lang->im->notifyMSG = 'Notification'; +$lang->im->sendNotification = 'Push message to notification Center'; +$lang->im->sendChatMessage = 'Push messages to the discussion group'; $lang->im->createBug = 'Create Bug'; $lang->im->createDoc = 'Create Doc'; diff --git a/xuanxuan/module/im/ext/lang/zh-cn/xuanxuan.php b/xuanxuan/module/im/ext/lang/zh-cn/xuanxuan.php index 9fecf6b9fd..3197a8210e 100644 --- a/xuanxuan/module/im/ext/lang/zh-cn/xuanxuan.php +++ b/xuanxuan/module/im/ext/lang/zh-cn/xuanxuan.php @@ -7,6 +7,11 @@ $lang->im->xxdServer = '禅道服务器'; $lang->im->downloadXXD = '下载喧喧服务端'; $lang->im->zentaoIntegrate = '禅道集成'; $lang->im->zentaoClient = '新增禅道客户端!'; +$lang->im->getChatUsers = '获取用户'; +$lang->im->getChatGroups = '获取讨论组'; +$lang->im->notifyMSG = '消息通知'; +$lang->im->sendNotification = '向通知中心推送通知消息'; +$lang->im->sendChatMessage = '向指定的讨论组推送通知消息'; $lang->im->createBug = '创建 Bug'; $lang->im->createDoc = '创建文档'; diff --git a/xuanxuan/module/im/ext/view/debug.html.php b/xuanxuan/module/im/ext/view/debug.html.php old mode 100755 new mode 100644 diff --git a/xuanxuan/module/index/ext/control/index.php b/xuanxuan/module/index/ext/control/index.php deleted file mode 100644 index aff59ef5da..0000000000 --- a/xuanxuan/module/index/ext/control/index.php +++ /dev/null @@ -1,39 +0,0 @@ -view->pageBodyClass = 'xxc-embed'; - } - else - { - $this->loadModel('im'); - - $xuanConfig = new stdclass(); - $token = $this->im->userGetAuthToken($this->app->user->id, 'zentaoweb'); - $clientUrl = isset($this->config->webClientUrl) ? $this->config->webClientUrl : 'data/xuanxuan/web/'; - - $xuanConfig->clientUrl = $clientUrl; - $xuanConfig->server = $this->im->getServer('zentao'); - $xuanConfig->account = $this->app->user->account; - $xuanConfig->authKey = $token->token; - $xuanConfig->debug = $this->config->debug; - $xuanConfig->serverTime = (int)(microtime(true) * 1000); - $xuanConfig->serverNowTime = (int)round(time() / $tokenAuthWindow); - - $this->view->xuanConfig = $xuanConfig; - } - - return parent::index($open); - } -} diff --git a/xuanxuan/module/index/ext/css/index/xuanxuan.css b/xuanxuan/module/index/ext/css/index/xuanxuan.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/xuanxuan/module/index/ext/js/index/xuanxuan.js b/xuanxuan/module/index/ext/js/index/xuanxuan.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/xuanxuan/module/index/ext/view/index.xuanxuan.html.hook.php b/xuanxuan/module/index/ext/view/index.xuanxuan.html.hook.php deleted file mode 100644 index 196eb44690..0000000000 --- a/xuanxuan/module/index/ext/view/index.xuanxuan.html.hook.php +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - diff --git a/xuanxuan/module/message/ext/config/xuanxuan.php b/xuanxuan/module/message/ext/config/xuanxuan.php index 2c118573b6..7e1ba6a874 100644 --- a/xuanxuan/module/message/ext/config/xuanxuan.php +++ b/xuanxuan/module/message/ext/config/xuanxuan.php @@ -1,6 +1,7 @@ message->available['xuanxuan']['story'] = $config->message->objectTypes['story']; -$config->message->available['xuanxuan']['task'] = $config->message->objectTypes['task']; -$config->message->available['xuanxuan']['bug'] = $config->message->objectTypes['bug']; -$config->message->available['xuanxuan']['todo'] = $config->message->objectTypes['todo']; -$config->message->setting['xuanxuan']['setting'] = $config->message->available['xuanxuan']; +$config->message->available['xuanxuan']['story'] = $config->message->objectTypes['story']; +$config->message->available['xuanxuan']['task'] = $config->message->objectTypes['task']; +$config->message->available['xuanxuan']['bug'] = $config->message->objectTypes['bug']; +$config->message->available['xuanxuan']['todo'] = $config->message->objectTypes['todo']; +$config->message->available['xuanxuan']['release'] = $config->message->objectTypes['release']; +$config->message->setting['xuanxuan']['setting'] = $config->message->available['xuanxuan']; diff --git a/xuanxuan/module/misc/ext/control/ajaxgetclientpackage.php b/xuanxuan/module/misc/ext/control/ajaxgetclientpackage.php old mode 100755 new mode 100644 diff --git a/xuanxuan/module/misc/ext/control/ajaxgetpackagesize.php b/xuanxuan/module/misc/ext/control/ajaxgetpackagesize.php old mode 100755 new mode 100644 diff --git a/xuanxuan/module/misc/ext/control/ajaxsetclientconfig.php b/xuanxuan/module/misc/ext/control/ajaxsetclientconfig.php old mode 100755 new mode 100644 diff --git a/xuanxuan/module/misc/ext/control/downloadclient.php b/xuanxuan/module/misc/ext/control/downloadclient.php old mode 100755 new mode 100644 diff --git a/xuanxuan/www/data/xuanxuan/sdk/sdk.min.js b/xuanxuan/www/data/xuanxuan/sdk/sdk.min.js deleted file mode 100644 index 7d4c3078be..0000000000 --- a/xuanxuan/www/data/xuanxuan/sdk/sdk.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(()=>{var u=Object.defineProperty;var m=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,g=Object.prototype.propertyIsEnumerable;var b=(t,e,i)=>e in t?u(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,r=(t,e)=>{for(var i in e||(e={}))_.call(e,i)&&b(t,i,e[i]);if(m)for(var i of m(e))g.call(e,i)&&b(t,i,e[i]);return t};function y(t){return typeof t=="number"?t===0?0:`${t}px`:t}function f(t,e,i){i=i||document;let o=e.querySelector("style");o||(o=i.createElement("style"),e.appendChild(o)),o.innerHTML="",o.appendChild(i.createTextNode(t))}function w(){let t=document.getElementById("xx-embed-container");return t||(t=document.createElement("div"),t.id="xx-embed-container",f(["#xx-embed-container {position:fixed;z-index:1200;top:0;bottom:0;right:0;left:0;justify-content:center;align-items:center;pointer-events:none}","#xx-embed-container .xx-embed {position:absolute;pointer-events:auto;background-color:#fff;border:1px solid #ddd;box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);display:flex;flex-direction:column;}","#xx-embed-container .xx-embed-has-animation {transition:.2s;transition-property:width,height,left,top,bottom,right;}","#xx-embed-container .xx-embed-header {flex:none;display:flex;flex-direction:row;align-items:center;justify-content:space-between;background-color:#f1f1f1;user-select:none;border-bottom: 1px solid #ddd;}","#xx-embed-container .xx-embed-hide-header .xx-embed-header {display: none!important}","#xx-embed-container .xx-embed-title {padding:0 5px;font-size:13px;opacity:.7;font-weight:bold; display: flex; align-items:center;}","#xx-embed-container .xx-embed-notice-badge {line-height: 14px; min-width: 14px; padding: 0 4px; border-radius: 7px; background-color: #ff0040; color: #fff; font-size:12px;box-sizing: border-box;text-align:center;margin-right:4px}","#xx-embed-container .xx-embed-nav {display:flex;flex-direction:row;align-items:center;}","#xx-embed-container .xx-embed-btn {display:flex;width:24px;height:24px;align-items:center;justify-content:center;opacity:.5;cursor:pointer}","#xx-embed-container .xx-embed-btn:hover {opacity:1;background-color:rgba(0,0,0,.1)}","#xx-embed-container .xx-embed-btn-expand {display:none}","#xx-embed-container .xx-embed-collapsed .xx-embed-btn-expand {display:block}","#xx-embed-container .xx-embed-collapsed .xx-embed-btn-collapse {display:none}","#xx-embed-container .xx-embed-collapsed {height:24px!important;width:200px!important}","#xx-embed-container .xx-embed-collapsed .xx-embed-body {display:none!important}","#xx-embed-container .xx-embed-hidden {display:none!important}","#xx-embed-container .xx-embed-body {flex:auto;position:relative}","#xx-embed-container .xx-embed-iframe {width:100%;height:100%;position:absolute}","#xx-embed-container .xx-embed-close-confirm {display:none;position:absolute;left:0;top:0;right:0;bottom:0;z-index:10;background-color:rgba(0,0,0,0.5);}","#xx-embed-container .xx-embed-close-confirm-shown .xx-embed-close-confirm {display:flex;justify-content:center;align-items:center;}","#xx-embed-container .xx-embed-close-confirm-dialog {background-color:#fff;padding:20px 20px;box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);border-radius:4px}","#xx-embed-container .xx-embed-close-confirm-text {margin-bottom: 15px}","#xx-embed-container .xx-embed-close-confirm-btn {display: inline-block; padding: 5px 10px; margin-right: 10px; background-color: #f1f1f1; color: #A3A2BC; border: 1px solid #A3A2BC; min-width: 80px; text-align: center;border-radius:4px; cursor:pointer}","#xx-embed-container .xx-embed-close-confirm-btn-confirm {background-color: #6129c4; color: #fff; border-color: #6129c4;}"].join(` -`),t),document.body.appendChild(t)),t}function L(t,e,i){let o={width:e,height:i};t==="bottom-right"?Object.assign(o,{bottom:0,right:0}):t==="bottom-left"?Object.assign(o,{bottom:0,left:0}):t==="bottom-center"?Object.assign(o,{bottom:0,left:Math.floor((window.innerWidth-e)/2)}):t==="bottom"?Object.assign(o,{bottom:0,left:0,width:"100%"}):t==="left"?Object.assign(o,{bottom:0,left:0,height:"100%"}):t==="right"?Object.assign(o,{bottom:0,right:0,height:"100%"}):t==="top"?Object.assign(o,{top:0,left:0,width:"100%"}):t==="top-center"?Object.assign(o,{top:0,left:Math.floor((window.innerWidth-e)/2)}):t==="center"?Object.assign(o,{left:Math.floor((window.innerWidth-e)/2),top:Math.floor((window.innerHeight-i)/2)}):t&&typeof t=="object"&&Object.assign(o,t);let n=[];for(let s in o)n.push(`${s}:${y(o[s])}`);return n.join(";")}var a=0;function v(){if(document.body.clientWidth>=window.innerWidth)return 0;if(!a){let t=document.createElement("div");t.className="scrollbar-measure",t.style.position="absolute",t.style.top="-9999px",t.style.width="50px",t.style.height="50px",t.style.overflow="scroll",document.body.appendChild(t),a=t.offsetWidth-t.clientWidth,document.body.removeChild(t)}return a}function C(){if(v()){let t=parseInt(getComputedStyle(document.body)["padding-right"]||0,10);return a&&(document.body.style.paddingRight=`${t+a}px`,document.body.style.overflowY="hidden"),a}return 0}function S(){document.body.style.paddingRight="",document.body.style.overflowY=""}var T=Date.now(),d={clientUrl:"./client/",showHeader:!0,width:800,height:480,position:"bottom-right",debug:!1,lang:"zh-cn",animation:!0,autoUpdateTitle:!1,showNoticeBadge:!0,hideOnCollapse:!1,closeAsCollapse:!1,showCollapseButtons:!0,closeBtnHtml:'',expandBtnHtml:'',collapseBtnHtml:''},j=100,c=new Map,h={"zh-cn":{title:"\u55A7\u55A7",closeConfirm:"\u8981\u9000\u51FA\u804A\u5929\u5417\uFF1F",confirm:"\u786E\u5B9A",cancel:"\u53D6\u6D88",collapse:"\u6536\u8D77",expand:"\u5C55\u5F00",close:"\u5173\u95ED"},"zh-tw":{title:"\u55A7\u55A7",closeConfirm:"\u8981\u9000\u51FA\u804A\u5929\u55CE\uFF1F",confirm:"\u78BA\u5B9A",cancel:"\u53D6\u6D88",collapse:"\u6536\u8D77",expand:"\u5C55\u958B",close:"\u95DC\u9589"},en:{title:"Xuanxuan",closeConfirm:"Are you sure to quit chat?",confirm:"Confirm",cancel:"Cancel",collapse:"Collapse",expand:"Expand",close:"Quit"}},x=class{constructor(e){this._options=r(r({},d),e),this._id=`xx-${(T++).toString(36)}`,this._zIndex=j++,this._element=null,this._showed=!1,this._collapsed=!1,this._iframeWindow=null,this._noticeCount=0,this._noticeInfo={},this.disableScrollbar=this.disableScrollbar.bind(this),this.enableScrollbar=this.enableScrollbar.bind(this),this._lang=this._options.lang&&typeof this._options.lang=="object"?Object.assign({},h[d.lang],this._options.lang):(typeof this._options.lang=="string"?h[this._options.lang]:null)||h[d.lang],(this._options.show||this._options.preload)&&this.show(),c.set(this._id,this),this._createTime=Date.now(),this._options.onCreated&&this._options.onCreated.call(this,this)}get id(){return this._id}get shown(){return this._showed}get collapsed(){return!this._collapsed}get url(){let e=[this._options.clientUrl,this._options.clientUrl.indexOf("?")<0?"?":"&","&origin=",encodeURIComponent(window.location.origin),"&embedId=",encodeURIComponent(this._id)];return this._options.account&&e.push("&account=",encodeURIComponent(this._options.account)),this._options.server&&e.push("&server=",encodeURIComponent(this._options.server)),this._options.authKey&&e.push("&authKey=",encodeURIComponent(this._options.authKey)),this._options.injectCss&&e.push("&embedCss=",encodeURIComponent(this._options.injectCss)),this._options.injectStyle&&e.push("&embedStyle=",encodeURIComponent(this._options.injectStyle)),this._options.injectScript&&e.push("&embedScript=",encodeURIComponent(this._options.injectScript)),this._options.chat?e.push("#/chats/recents/",this._options.chat):this._options.path&&e.push(this._options.path[0]==="#"?"":"#",this._options.path),e.join("")}get hasAccountInfo(){return this._options.server&&this._options.account&&this._options.authKey}get createTime(){return this._createTime}get loadedTime(){return this._loadedTime}get startTime(){return this._startTime}get firstLoginTime(){return this._firstLoginTime}get lastLoginTime(){return this._lastLoginTime}get noticeCount(){return this._noticeCount}get noticeInfo(){return this._noticeInfo}handleMessage(e,i){switch(e){case"titleUpdated":this._options.autoUpdateTitle&&i&&i[0]&&this._element&&(this._element.querySelector(".xx-embed-title-text").innerText=i[0]),this._options.onTitleUpdate&&this._options.onTitleUpdate.call(this,...i);break;case"login":this._lastLoginTime=Date.now(),this._firstLoginTime||(this._firstLoginTime=this._lastLoginTime),this._options.onLogin&&this._options.onLogin.call(this,...i);break;case"logout":this._options.onLogout&&this._options.onLogout.call(this,...i),this._options.closeOnLogout&&this.close(!0);break;case"loaded":this._loadedTime=Date.now(),this._options.onLoaded&&this._options.onLoaded.call(this,...i);break;case"start":this._startTime=Date.now(),this._options.onStart&&this._options.onStart.call(this,...i);break;case"sendMessage":this._options.onSendMessage&&this._options.onSendMessage.call(this,...i);break;case"receiveMessage":this._options.onReceiveMessage&&this._options.onReceiveMessage.call(this,...i);break;case"notice":if(this._options.showNoticeBadge&&this._element){let o=i[0].total,n=this._element.querySelector(".xx-embed-notice-badge");n.style.display=o&&o>0?"inline-block":"none",n.innerText=o||"",this._noticeCount=o,this._noticeInfo=i[0]}this._options.onNotice&&this._options.onNotice.call(this,...i);break;default:this._options.onClientEvent&&this._options.onClientEvent.call(this,e,...i);break}}postMessage(e,...i){let n=document.getElementById(`xx-embed-iframe-${this._id}`).contentWindow,s=new URL(this._options.clientUrl);try{n.postMessage([this._id,e,i],s.origin)}catch(p){if(console.info(`Cannot send message to client for type "${e}"`,i),Array.isArray(i)){n.postMessage([this._id,e,JSON.parse(JSON.stringify(i))],s.origin);return}console.error(`Cannot send message to client for type "${e}"`,i)}}executeCommand(e,...i){this.postMessage("executeCommand",e,...i)}executeCommandLine(e){this.postMessage("executeCommandLine",e)}show(e){if(this._options.preload&&this._createTime&&e&&typeof e=="object"){let s=!1;if(e.server&&e.server!==this._options.server&&(this._options.server=e.server,s=!0),e.account&&e.account!==this._options.account&&(this._options.account=e.account,s=!0),e.authKey&&e.authKey!==this._options.authKey&&(this._options.authKey=e.authKey,s=!0),s){this.postMessage("requestLogin",{server:this._options.server,account:this._options.account,authKey:this._options.authKey}),setTimeout(()=>{this.show()},500);return}}let i=this._id;if(!this._element){let s=document.createElement("div");s.id=i,s.classList.add("xx-embed"),s.classList.add("xx-embed-hidden"),this._options.showHeader||s.classList.add("xx-embed-hide-header");let p=['
    ',`
    ${this._options.title||this._lang.title}
    `,'","
    ",'
    ',``,"
    ",'
    ','
    ','
    ',this._lang.closeConfirm,"
    ",'","
    ","
    "];s.innerHTML=p.join(` -`),this._options.animation&&s.classList.add("xx-embed-has-animation"),w().appendChild(s),this._element=s,this._options.showCollapseButtons&&(s.querySelector(".xx-embed-btn-expand").addEventListener("click",l=>{this.expand(),l.stopPropagation()}),s.querySelector(".xx-embed-btn-collapse").addEventListener("click",l=>{this.collapse(),l.stopPropagation()})),s.querySelector(".xx-embed-btn-close").addEventListener("click",l=>{this._options.closeAsCollapse?this.collapse():this.close(),l.stopPropagation()}),s.querySelector(".xx-embed-header").addEventListener("dblclick",l=>{this.toggleCollapse()}),s.querySelector(".xx-embed-close-confirm-btn-confirm").addEventListener("click",()=>{this.close(!0)}),s.querySelector(".xx-embed-close-confirm-btn-cancel").addEventListener("click",()=>{this.cancelClose()}),s.addEventListener("mouseenter",this.disableScrollbar),s.addEventListener("mouseleave",this.enableScrollbar)}let o=L(this._options.position||"bottom-right",this._options.width,this._options.height),n=[`#${i} {${o}}`,`#${i} .xx-embed-body {min-width: ${this._options.width}px; min-height: ${this._options.height-24}px}`];typeof this._options.cssStyle=="string"&&n.push(this._options.cssStyle.replace(/#id/g,`#${this._id}`)),f(n.join(` -`),this._element),(!this._options.preload||this._createTime)&&(this._element.classList.remove("xx-embed-hidden"),this._collapsed&&this.expand(),this._showed=!0,this._options.onShow&&this._options.onShow(this))}redirect(e){e.startsWith("#")||(e=`#${e}`),this.postMessage("setRoute",e)}hide(){!this._showed||!this._element||(this._element.classList.add("xx-embed-hidden"),this._showed=!1,this._options.onHide&&this._options.onHide(this))}toggle(){this._showed?this.hide():this.show()}collapse(){if(!(!this._showed||!this._element||this._collapsed)){if(this._options.hideOnCollapse){this.hide(),this._options.onCollapse&&this._options.onCollapse(this);return}this._element.classList.add("xx-embed-collapsed"),this._collapsed=!0,this._options.onCollapse&&this._options.onCollapse(this)}}expand(){!this._showed||!this._element||!this._collapsed||(this._element.classList.remove("xx-embed-collapsed"),this._collapsed=!1,this._options.onExpand&&this._options.onExpand(this))}toggleCollapse(){this._collapsed?this.expand():this.collapse()}reload(){!this._element||(document.getElementById(`xx-embed-iframe-${this._id}`).src=this.url,this._options.onLoad&&this._options.onLoad(this))}close(e){if(!!this._element&&!(this._options.onClose&&this._options.onClose(this)===!1)){if(!e){this._showed?this.expand():this.show(),this._element.classList.add("xx-embed-close-confirm-shown");return}this.postMessage("logout"),this._element.classList.add("xx-embed-hidden"),this._showed=!1,setTimeout(()=>{this._element.removeEventListener("mouseenter",this.disableScrollbar),this._element.removeEventListener("mouseleave",this.enableScrollbar),this._element.remove(),this._element=null},1e3),this._options.onClosed&&this._options.onClosed(this),c.delete(this._id)}}cancelClose(){!this._element||this._element.classList.remove("xx-embed-close-confirm-shown")}disableScrollbar(){let e=C();e&&(this._element.style.transform=`translateX(-${e}px)`)}enableScrollbar(){S(),this._element.style.transform=""}};x.setGlobalOptions=t=>{Object.assign(d,t)};window.addEventListener("message",t=>{if(!Array.isArray(t.data))return;let e=c.get(t.data[0]);!e||e.handleMessage(t.data[1],t.data[2])},!1);window.Xuanxuan=x;})(); diff --git a/xuanxuan/www/data/xuanxuan/zentao-integrated.zip b/xuanxuan/www/data/xuanxuan/zentao-integrated.zip index 064a737660ab300c224d0bdafcd1e4489c58d5ac..75d0f95e28833e8857637db16dd8369b2e60796d 100644 GIT binary patch delta 39635 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 A;Q#;t delta 71826 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
    testcase->lib;?> -
    - -
    -
    -
    - testcase->module?> - "; - echo html::a($this->createLink('tree', 'browse', "rootID=$libID&view=caselib¤tModuleID=0", 'html', true), "", '', "data-toggle='tooltip' class='btn iframe' title='{$lang->tree->manage}'"); - echo ''; - echo ""; - echo html::a("javascript:void(0)", "", '', "class='btn refresh' title='{$lang->refresh}' onclick='loadLibModules($libID)'"); - echo ''; - } - ?> -
    -
    testcase->type;?>testcase->typeList, $type, "class='form-control chosen'");?> -
    - testcase->stage?> - testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?> -
    -
    testcase->title;?> -
    -
    - -
    - - - -
    +
    testcase->lib;?> +
    +
    - - testcase->pri;?> +
    +
    + testcase->module?> testcase->priList as $priKey => $priValue) + echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelated();' class='form-control chosen'"); + if(count($moduleOptionMenu) == 1) { - if(!empty($priKey) and (string)$priKey != (string)$priValue) - { - $hasCustomPri = true; - break; - } - } - $priList = $lang->testcase->priList; - if(end($priList)) unset($priList[0]); - if(!isset($priList[$pri])) - { - reset($priList); - $pri = key($priList); + echo ""; + echo html::a($this->createLink('tree', 'browse', "rootID=$libID&view=caselib¤tModuleID=0", 'html', true), "", '', "data-toggle='tooltip' class='btn iframe' title='{$lang->tree->manage}'"); + echo ''; + echo ""; + echo html::a("javascript:void(0)", "", '', "class='btn refresh' title='{$lang->refresh}' onclick='loadLibModules($libID)'"); + echo ''; } ?> - - - - -
    - -
    - - -
    -
    testcase->precondition;?>
    testcase->steps;?> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + +
    testcase->stepID;?>testcase->stepDesc;?>testcase->stepExpect;?>actions;?>
    -
    testcase->type;?>testcase->typeList, $type, "class='form-control chosen'");?> +
    + testcase->stage?> + testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?> +
    +
    testcase->title;?> +
    +
    + +
    + + + +
    +
    + + testcase->pri;?> + testcase->priList as $priKey => $priValue) + { + if(!empty($priKey) and (string)$priKey != (string)$priValue) + { + $hasCustomPri = true; + break; + } + } + $priList = $lang->testcase->priList; + if(end($priList)) unset($priList[0]); + if(!isset($priList[$pri])) + { + reset($priList); + $pri = key($priList); + } + ?> + + + + +
    + + +
    + + +
    +
    testcase->precondition;?>
    testcase->steps;?> + + + + + + + + + + + + + - - - - $step):?> - - - + + + + $step):?> + + + - - - - - -
    testcase->stepID;?>testcase->stepDesc;?>testcase->stepExpect;?>actions;?>
    +
    + + + + +
    + +
    -
    - - -
    -
    - - - -
    -
    -
    - - desc, "rows='1' class='form-control autosize step-steps'") ?> - - type)) $step->type = 'step';?> - -
    +
    + + + +
    +
    +
    + + desc, "rows='1' class='form-control autosize step-steps'") ?> + + type)) $step->type = 'step';?> + +
    + type === 'group') echo ' checked' ?>> +
    -
    - - -
    expect, "rows='1' class='form-control autosize step-expects'") ?> -
    - - - -
    -
    -
    testcase->keywords;?>
    testcase->files;?>fetch('file', 'buildform');?>
    expect, "rows='1' class='form-control autosize step-expects'") ?> +
    + + + +
    +
    +
    testcase->keywords;?>
    testcase->files;?>fetch('file', 'buildform');?>