From 17773dee900beb22e8292112b86ab84fdec661f2 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 12 Aug 2022 16:00:00 +0800 Subject: [PATCH 001/223] * Code for story of add draft status. --- db/demo.sql | 8 +- db/endemo.sql | 8 +- db/zentao.sql | 2 +- extension/lite/story/ext/view/view.html.php | 2 +- module/action/lang/de.php | 3 + module/action/lang/en.php | 3 + module/action/lang/fr.php | 3 + module/action/lang/vi.php | 3 + module/action/lang/zh-cn.php | 3 + module/execution/control.php | 2 +- module/execution/js/kanban.js | 2 +- module/execution/js/taskkanban.js | 2 +- module/execution/model.php | 4 +- module/group/lang/resource.php | 48 ++-- module/kanban/model.php | 2 +- module/mr/control.php | 2 +- module/product/control.php | 26 +-- module/product/model.php | 2 +- module/product/view/all.html.php | 8 +- module/product/view/view.html.php | 4 +- module/productplan/control.php | 2 +- module/productplan/model.php | 2 +- module/program/view/product.html.php | 8 +- module/project/control.php | 2 +- module/project/model.php | 2 +- module/report/view/productsummary.html.php | 10 +- module/story/config.php | 2 +- module/story/control.php | 85 ++++++- module/story/css/edit.css | 3 +- module/story/js/batchcreate.js | 15 ++ module/story/js/create.js | 19 ++ module/story/lang/de.php | 19 +- module/story/lang/en.php | 19 +- module/story/lang/fr.php | 19 +- module/story/lang/vi.php | 19 +- module/story/lang/zh-cn.php | 19 +- module/story/lang/zh-tw.php | 11 +- module/story/model.php | 233 +++++++++++++++----- module/story/view/activate.html.php | 2 + module/story/view/batchcreate.html.php | 3 +- module/story/view/create.html.php | 8 +- module/story/view/edit.html.php | 16 +- module/story/view/review.html.php | 6 - module/tutorial/model.php | 38 ++-- 44 files changed, 495 insertions(+), 204 deletions(-) diff --git a/db/demo.sql b/db/demo.sql index d2d0550d63..2277a6a1d4 100644 --- a/db/demo.sql +++ b/db/demo.sql @@ -15,7 +15,7 @@ INSERT INTO `zt_action` (`id`, `objectType`, `objectID`, `product`, `project`, ` (11, 'story', 1, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:09:49', '', '', '0'), (12, 'story', 2, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:16:37', '', '', '0'), (13, 'story', 3, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:18:10', '', '', '0'), -(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changed', '2012-06-05 10:19:06', '', '', '0'), +(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changing', '2012-06-05 10:19:06', '', '', '0'), (15, 'story', 4, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:20:16', '', '', '0'), (16, 'story', 5, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:21:39', '', '', '0'), (17, 'story', 6, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:23:11', '', '', '0'), @@ -589,9 +589,9 @@ INSERT INTO `zt_story` (`id`, `parent`, `product`, `branch`, `module`, `plan`, ` (2, 0, 1, 0, 2, '1', 'po', '', 0, '新闻中心的设计和开发。', '', 'story', 1, 1, 'active', '', '', 'projected', '', '', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:25:33', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), (3, 0, 1, 0, 3, '1', 'po', '', 0, '成果展示的设计和开发', '', 'story', 1, 0, 'active', '', '', 'developing', '', '', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:25:38', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 2, '0', '0'), (4, 0, 1, 0, 4, '1', 'po', '', 0, '售后服务的设计和开发', '', 'story', 1, 1, 'active', '', '', 'developed', '', '', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:25:42', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), -(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), -(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), -(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'); +(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), +(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), +(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'); INSERT INTO `zt_storyspec` (`story`, `version`, `title`, `spec`, `verify`) VALUES (1, 1, '首页设计和开发', '作为一名本公司的用户,我希望可以在首页看到该公司网站的基本内容,例如最新动态、部分成果展示、联系信息、工商信息等。
', '开发并通过验收
'), (2, 1, '新闻中心的设计和开发。', '作为一名本公司的用户,我希望可以在新闻中心看到该公司网站的企业新闻,这样可以通过新闻了解企业的最新动态。
', ''), diff --git a/db/endemo.sql b/db/endemo.sql index d2d0550d63..2277a6a1d4 100644 --- a/db/endemo.sql +++ b/db/endemo.sql @@ -15,7 +15,7 @@ INSERT INTO `zt_action` (`id`, `objectType`, `objectID`, `product`, `project`, ` (11, 'story', 1, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:09:49', '', '', '0'), (12, 'story', 2, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:16:37', '', '', '0'), (13, 'story', 3, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:18:10', '', '', '0'), -(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changed', '2012-06-05 10:19:06', '', '', '0'), +(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changing', '2012-06-05 10:19:06', '', '', '0'), (15, 'story', 4, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:20:16', '', '', '0'), (16, 'story', 5, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:21:39', '', '', '0'), (17, 'story', 6, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:23:11', '', '', '0'), @@ -589,9 +589,9 @@ INSERT INTO `zt_story` (`id`, `parent`, `product`, `branch`, `module`, `plan`, ` (2, 0, 1, 0, 2, '1', 'po', '', 0, '新闻中心的设计和开发。', '', 'story', 1, 1, 'active', '', '', 'projected', '', '', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:25:33', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), (3, 0, 1, 0, 3, '1', 'po', '', 0, '成果展示的设计和开发', '', 'story', 1, 0, 'active', '', '', 'developing', '', '', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:25:38', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 2, '0', '0'), (4, 0, 1, 0, 4, '1', 'po', '', 0, '售后服务的设计和开发', '', 'story', 1, 1, 'active', '', '', 'developed', '', '', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:25:42', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), -(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), -(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), -(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'); +(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), +(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'), +(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'); INSERT INTO `zt_storyspec` (`story`, `version`, `title`, `spec`, `verify`) VALUES (1, 1, '首页设计和开发', '作为一名本公司的用户,我希望可以在首页看到该公司网站的基本内容,例如最新动态、部分成果展示、联系信息、工商信息等。
', '开发并通过验收
'), (2, 1, '新闻中心的设计和开发。', '作为一名本公司的用户,我希望可以在新闻中心看到该公司网站的企业新闻,这样可以通过新闻了解企业的最新动态。
', ''), diff --git a/db/zentao.sql b/db/zentao.sql index ca94b63909..13ab4024b8 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1403,7 +1403,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` ( `category` varchar(30) NOT NULL default 'feature', `pri` tinyint(3) unsigned NOT NULL default '3', `estimate` float unsigned NOT NULL, - `status` enum('','changed','active','draft','closed') NOT NULL default '', + `status` enum('','changing','active','draft', 'reviewing', 'closed') NOT NULL default '', `subStatus` varchar(30) NOT NULL default '', `color` char(7) NOT NULL, `stage` enum('','wait','planned','projected','developing','developed','testing','tested','verified','released', 'closed') NOT NULL DEFAULT 'wait', diff --git a/extension/lite/story/ext/view/view.html.php b/extension/lite/story/ext/view/view.html.php index 894e92145c..6636f8b094 100644 --- a/extension/lite/story/ext/view/view.html.php +++ b/extension/lite/story/ext/view/view.html.php @@ -147,7 +147,7 @@ common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true); common::printIcon('story', 'activate', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true); - if($from == 'execution' and strpos('draft,closed', $story->status) === false) common::printIcon('task', 'create', "execution=$param&storyID=$story->id&moduleID=$story->module", $story, 'button', 'plus', '', 'showinonlybody'); + if($from == 'execution' and strpos('draft,reviewing,closed', $story->status) === false) common::printIcon('task', 'create', "execution=$param&storyID=$story->id&moduleID=$story->module", $story, 'button', 'plus', '', 'showinonlybody'); echo "
"; common::printIcon('story', 'edit', "storyID=$story->id", $story); diff --git a/module/action/lang/de.php b/module/action/lang/de.php index 7e0ee16529..1b1b57b13d 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -218,6 +218,7 @@ $lang->action->desc->updatetolib = '$date, updated to ' . $lang->testca $lang->action->desc->adjusttasktowait = '$date, System Reminder: The task status will be set to Not Started as the consumed work hour is adjusted to 0. ' . "\n"; $lang->action->desc->reopen = '$date, reopened by $actor .' . "\n"; $lang->action->desc->merged = '$date, merged by $actor .' . "\n"; +$lang->action->desc->submitreview = '$date, submitted for review by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -275,6 +276,7 @@ $lang->action->label->blocked = 'blocked '; $lang->action->label->resolved = 'resolved '; $lang->action->label->reviewed = 'reviewed '; $lang->action->label->recalled = 'recalled'; +$lang->action->label->recalledchange = 'undo changes'; $lang->action->label->moved = 'moved '; $lang->action->label->confirmed = 'Confirm Story'; $lang->action->label->bugconfirmed = 'Confirmed'; @@ -388,6 +390,7 @@ $lang->action->label->tolib = 'imported'; $lang->action->label->updatetolib = 'updated'; $lang->action->label->ganttdrag = 'dragged'; $lang->action->label->ganttmove = 'sorted'; +$lang->action->label->submitreview = 'submitted'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 9a2d0e1634..96a4b07587 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -218,6 +218,7 @@ $lang->action->desc->updatetolib = '$date, updated to ' . $lang->testca $lang->action->desc->adjusttasktowait = '$date, System Reminder: The task status will be set to Not Started as the consumed work hour is adjusted to 0. ' . "\n"; $lang->action->desc->reopen = '$date, reopened by $actor .' . "\n"; $lang->action->desc->merged = '$date, merged by $actor .' . "\n"; +$lang->action->desc->submitreview = '$date, submitted for review by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -275,6 +276,7 @@ $lang->action->label->blocked = 'blocked '; $lang->action->label->resolved = 'resolved '; $lang->action->label->reviewed = 'reviewed '; $lang->action->label->recalled = 'recalled'; +$lang->action->label->recalledchange = 'undo changes'; $lang->action->label->moved = 'moved '; $lang->action->label->confirmed = 'confirmed Story '; $lang->action->label->bugconfirmed = 'confirmed'; @@ -388,6 +390,7 @@ $lang->action->label->tolib = 'imported'; $lang->action->label->updatetolib = 'updated'; $lang->action->label->ganttdrag = 'dragged'; $lang->action->label->ganttmove = 'sorted'; +$lang->action->label->submitreview = 'submitted'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php index 3f9c6bc522..ac4e02a0e3 100644 --- a/module/action/lang/fr.php +++ b/module/action/lang/fr.php @@ -218,6 +218,7 @@ $lang->action->desc->updatetolib = '$date, MàJ de ' . $lang->testcase- $lang->action->desc->adjusttasktowait = '$date, System Reminder: The task status will be set to Not Started as the consumed work hour is adjusted to 0. ' . "\n"; $lang->action->desc->reopen = '$date, reopened by $actor .' . "\n"; $lang->action->desc->merged = '$date, merged by $actor .' . "\n"; +$lang->action->desc->submitreview = '$date, submitted for review by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor a créé un sous-tâche $extra。' . "\n"; @@ -275,6 +276,7 @@ $lang->action->label->blocked = 'a bloqué '; $lang->action->label->resolved = 'a résolu '; $lang->action->label->reviewed = 'a revu '; $lang->action->label->recalled = 'recalled'; +$lang->action->label->recalledchange = 'undo changes'; $lang->action->label->moved = 'a déplacé '; $lang->action->label->confirmed = 'a confirmé Story '; $lang->action->label->bugconfirmed = 'a confirmé le Bug '; @@ -388,6 +390,7 @@ $lang->action->label->tolib = 'Importé'; $lang->action->label->updatetolib = 'MàJ'; $lang->action->label->ganttdrag = 'dragged'; $lang->action->label->ganttmove = 'sorted'; +$lang->action->label->submitreview = 'submitted'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/action/lang/vi.php b/module/action/lang/vi.php index 09f6928001..a71ec98167 100644 --- a/module/action/lang/vi.php +++ b/module/action/lang/vi.php @@ -178,6 +178,7 @@ $lang->action->desc->syncproject = '$date, starting the execution sets the p $lang->action->desc->syncexecution = '$date, starting the task sets the execution status as Ongoing.' . "\n"; $lang->action->desc->reopen = '$date, reopened by $actor .' . "\n"; $lang->action->desc->merged = '$date, merged by $actor .' . "\n"; +$lang->action->desc->submitreview = '$date, submitted for review by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -223,6 +224,7 @@ $lang->action->label->blocked = 'blocked '; $lang->action->label->resolved = 'resolved '; $lang->action->label->reviewed = 'reviewed '; $lang->action->label->recalled = 'recalled'; +$lang->action->label->recalledchange = 'undo changes'; $lang->action->label->moved = 'moved '; $lang->action->label->confirmed = 'confirmed Story '; $lang->action->label->bugconfirmed = 'Đã xác nhận'; @@ -298,6 +300,7 @@ $lang->action->label->syncprogram = 'start'; $lang->action->label->syncproject = 'start'; $lang->action->label->syncexecution = 'start'; $lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)'; +$lang->action->label->submitreview = 'submitted'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index af8c1ee524..35e2f634cb 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -218,6 +218,7 @@ $lang->action->desc->updatetolib = '$date, 由 $actor $lang->action->desc->adjusttasktowait = '$date, 系统判断由于消耗工时调整为0,将任务状态置为未开始。' . "\n"; $lang->action->desc->reopen = '$date, 由 $actor 重新打开。' . "\n"; $lang->action->desc->merged = '$date, 由 $actor 合并。' . "\n"; +$lang->action->desc->submitreview = '$date, 由 $actor 提交评审。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -275,6 +276,7 @@ $lang->action->label->blocked = '阻塞了'; $lang->action->label->resolved = '解决了'; $lang->action->label->reviewed = '评审了'; $lang->action->label->recalled = '撤销评审'; +$lang->action->label->recalledchange = '撤销变更'; $lang->action->label->moved = '移动了'; $lang->action->label->confirmed = "确认了{$lang->SRCommon}"; $lang->action->label->bugconfirmed = '确认了'; @@ -388,6 +390,7 @@ $lang->action->label->tolib = '导入了'; $lang->action->label->updatetolib = '更新了'; $lang->action->label->ganttdrag = '拖动了'; $lang->action->label->ganttmove = '排序了'; +$lang->action->label->submitreview = '提交了评审'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/execution/control.php b/module/execution/control.php index 282e2bedee..b7bd2ed29f 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -3997,7 +3997,7 @@ class execution extends control { foreach($planStory as $id => $story) { - if($story->status == 'draft') + if($story->status == 'draft' or $story->status == 'reviewing') { $count++; unset($planStory[$id]); diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index e5b9e41801..f56f57160a 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -1130,7 +1130,7 @@ function changeCardColType(cardID, fromColID, toColID, fromLaneID, toLaneID, car if(data) { data = $.parseJSON(data); - if(data.status == 'draft' || data.status == 'changed') + if(data.status == 'draft' || data.status == 'changing' || data.status == 'reviewing') { bootbox.alert(executionLang.storyDragError); } diff --git a/module/execution/js/taskkanban.js b/module/execution/js/taskkanban.js index 5ad57d972c..dd817a899a 100644 --- a/module/execution/js/taskkanban.js +++ b/module/execution/js/taskkanban.js @@ -810,7 +810,7 @@ function changeCardColType(cardID, fromColID, toColID, fromLaneID, toLaneID, car if(data) { data = $.parseJSON(data); - if(data.status == 'draft' || data.status == 'changed') + if(data.status == 'draft' || data.status == 'changing' || data.status == 'reviewing') { bootbox.alert(executionLang.storyDragError); } diff --git a/module/execution/model.php b/module/execution/model.php index 14d8e21126..4c62cd73e1 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -2510,7 +2510,7 @@ class executionModel extends model parse_str($extra, $output); foreach($stories as $key => $storyID) { - $notAllowedStatus = $this->app->rawMethod == 'batchcreate' ? 'closed' : 'draft,closed'; + $notAllowedStatus = $this->app->rawMethod == 'batchcreate' ? 'closed' : 'draft,reviewing,closed'; if(strpos($notAllowedStatus, $storyList[$storyID]->status) !== false) continue; if(isset($linkedStories[$storyID])) continue; @@ -2605,7 +2605,7 @@ class executionModel extends model { foreach($planStory as $id => $story) { - if($story->status == 'draft') + if($story->status == 'draft' or $story->status == 'reviewing') { unset($planStory[$id]); continue; diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 333ecfee8e..675a1f3494 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -492,8 +492,10 @@ $lang->resource->story->delete = 'deleteAction'; $lang->resource->story->view = 'view'; $lang->resource->story->change = 'changeAction'; $lang->resource->story->review = 'reviewAction'; +$lang->resource->story->submitReview = 'submitReview'; $lang->resource->story->batchReview = 'batchReview'; $lang->resource->story->recall = 'recall'; +$lang->resource->story->recallChange = 'recallChange'; $lang->resource->story->assignTo = 'assignAction'; $lang->resource->story->close = 'closeAction'; $lang->resource->story->batchClose = 'batchClose'; @@ -523,29 +525,31 @@ $lang->story->methodOrder[25] = 'delete'; $lang->story->methodOrder[30] = 'view'; $lang->story->methodOrder[35] = 'change'; $lang->story->methodOrder[40] = 'review'; -$lang->story->methodOrder[45] = 'batchReview'; -$lang->story->methodOrder[50] = 'recall'; -$lang->story->methodOrder[55] = 'close'; -$lang->story->methodOrder[60] = 'batchClose'; -$lang->story->methodOrder[65] = 'batchChangePlan'; -$lang->story->methodOrder[70] = 'batchChangeStage'; -$lang->story->methodOrder[75] = 'assignTo'; -$lang->story->methodOrder[80] = 'batchAssignTo'; -$lang->story->methodOrder[85] = 'activate'; -$lang->story->methodOrder[90] = 'tasks'; -$lang->story->methodOrder[95] = 'bugs'; -$lang->story->methodOrder[100] = 'cases'; -$lang->story->methodOrder[105] = 'zeroCase'; -$lang->story->methodOrder[110] = 'report'; -$lang->story->methodOrder[115] = 'linkStory'; -$lang->story->methodOrder[120] = 'batchChangeBranch'; -$lang->story->methodOrder[125] = 'batchChangeModule'; -$lang->story->methodOrder[130] = 'batchToTask'; -$lang->story->methodOrder[135] = 'track'; -$lang->story->methodOrder[140] = 'processStoryChange'; -$lang->story->methodOrder[145] = 'linkStories'; +$lang->story->methodOrder[45] = 'submitReview'; +$lang->story->methodOrder[50] = 'batchReview'; +$lang->story->methodOrder[55] = 'recall'; +$lang->story->methodOrder[60] = 'recallChange'; +$lang->story->methodOrder[65] = 'close'; +$lang->story->methodOrder[70] = 'batchClose'; +$lang->story->methodOrder[75] = 'batchChangePlan'; +$lang->story->methodOrder[80] = 'batchChangeStage'; +$lang->story->methodOrder[85] = 'assignTo'; +$lang->story->methodOrder[90] = 'batchAssignTo'; +$lang->story->methodOrder[95] = 'activate'; +$lang->story->methodOrder[100] = 'tasks'; +$lang->story->methodOrder[105] = 'bugs'; +$lang->story->methodOrder[110] = 'cases'; +$lang->story->methodOrder[115] = 'zeroCase'; +$lang->story->methodOrder[120] = 'report'; +$lang->story->methodOrder[125] = 'linkStory'; +$lang->story->methodOrder[130] = 'batchChangeBranch'; +$lang->story->methodOrder[135] = 'batchChangeModule'; +$lang->story->methodOrder[140] = 'batchToTask'; +$lang->story->methodOrder[145] = 'track'; +$lang->story->methodOrder[150] = 'processStoryChange'; +$lang->story->methodOrder[155] = 'linkStories'; -if($config->URAndSR) $lang->story->methodOrder[150] = 'linkRequirements'; +if($config->URAndSR) $lang->story->methodOrder[160] = 'linkRequirements'; /* Product plan. */ $lang->resource->productplan = new stdclass(); diff --git a/module/kanban/model.php b/module/kanban/model.php index 020e6ab7d9..5de21602b1 100755 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -3867,7 +3867,7 @@ class kanbanModel extends model { $menu = array(); - $toTaskPriv = strpos('draft,closed', $story->status) !== false ? false : true; + $toTaskPriv = strpos('draft,reviewing,closed', $story->status) !== false ? false : true; if(common::hasPriv('story', 'edit') and $this->story->isClickable($story, 'edit')) $menu[] = array('label' => $this->lang->story->edit, 'icon' => 'edit', 'url' => helper::createLink('story', 'edit', "storyID=$story->id", '', true), 'size' => '95%'); if(common::hasPriv('story', 'change') and $this->story->isClickable($story, 'change')) $menu[] = array('label' => $this->lang->story->change, 'icon' => 'alter', 'url' => helper::createLink('story', 'change', "storyID=$story->id", '', true), 'size' => '95%'); if(common::hasPriv('story', 'review') and $this->story->isClickable($story, 'review')) $menu[] = array('label' => $this->lang->story->review, 'icon' => 'search', 'url' => helper::createLink('story', 'review', "storyID=$story->id", '', true), 'size' => '95%'); diff --git a/module/mr/control.php b/module/mr/control.php index b9494df0ef..442a19f219 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -630,7 +630,7 @@ class mr extends control } else { - $allStories = $this->story->getProductStories($productID, 0, '0', 'draft,active,changed', 'story', 'id_desc', false, array_keys($linkedStories), $pager); + $allStories = $this->story->getProductStories($productID, 0, '0', 'draft,reviewing,active,changing', 'story', 'id_desc', false, array_keys($linkedStories), $pager); } $this->view->modules = $modules; diff --git a/module/product/control.php b/module/product/control.php index e4c45cf9cf..a9cb681ac3 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -1450,27 +1450,27 @@ class product extends control $productStats = $this->product->getStats('program_desc,line_desc,' . $orderBy, null, $status); foreach($productStats as $i => $product) { - $product->line = zget($lines, $product->line, ''); + $product->line = zget($lines, $product->line, ''); if($this->config->URAndSR) { $product->activeRequirements = (int) $product->requirements['active']; - $product->changedRequirements = (int) $product->requirements['changed']; + $product->changedRequirements = (int) $product->requirements['changing']; $product->draftRequirements = (int) $product->requirements['draft']; $product->closedRequirements = (int) $product->requirements['closed']; $product->totalRequirements = $product->activeRequirements + $product->changedRequirements + $product->draftRequirements + $product->closedRequirements; $product->requireCompleteRate = ($product->totalRequirements == 0 ? 0 : round($product->closedRequirements / $product->totalRequirements, 3) * 100) . '%'; } - $product->activeStories = (int)$product->stories['active']; - $product->changedStories = (int)$product->stories['changed']; - $product->draftStories = (int)$product->stories['draft']; - $product->closedStories = (int)$product->stories['closed']; - $product->totalStories = $product->activeStories + $product->changedStories + $product->draftStories + $product->closedStories; - $product->storyCompleteRate = ($product->totalStories == 0 ? 0 : round($product->closedStories / $product->totalStories, 3) * 100) . '%'; - $product->unResolvedBugs = (int)$product->unResolved; - $product->assignToNullBugs = (int)$product->assignToNull; - $product->closedBugs = (int)$product->closedBugs; - $product->bugFixedRate = (($product->unResolved + $product->fixedBugs) == 0 ? 0 : round($product->fixedBugs / ($product->unResolved + $product->fixedBugs), 3) * 100) . '%'; - $product->program = $product->programName; + $product->activeStories = (int)$product->stories['active']; + $product->changedStories = (int)$product->stories['changing']; + $product->draftStories = (int)$product->stories['draft']; + $product->closedStories = (int)$product->stories['closed']; + $product->totalStories = $product->activeStories + $product->changedStories + $product->draftStories + $product->closedStories; + $product->storyCompleteRate = ($product->totalStories == 0 ? 0 : round($product->closedStories / $product->totalStories, 3) * 100) . '%'; + $product->unResolvedBugs = (int)$product->unResolved; + $product->assignToNullBugs = (int)$product->assignToNull; + $product->closedBugs = (int)$product->closedBugs; + $product->bugFixedRate = (($product->unResolved + $product->fixedBugs) == 0 ? 0 : round($product->fixedBugs / ($product->unResolved + $product->fixedBugs), 3) * 100) . '%'; + $product->program = $product->programName; /* get rowspan data */ if($lastProgram == '' or $product->program != $lastProgram) diff --git a/module/product/model.php b/module/product/model.php index bda572234c..89ebf0f571 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -1019,7 +1019,7 @@ class productModel extends model if($browseType == 'closedbyme') $stories = $this->story->getByClosedBy($productID, $branch, $modules, $this->app->user->account, $type, $sort, $pager); if($browseType == 'draftstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'draft', $type, $sort, $pager); if($browseType == 'activestory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'active', $type, $sort, $pager); - if($browseType == 'changedstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'changed', $type, $sort, $pager); + if($browseType == 'changedstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'changing', $type, $sort, $pager); if($browseType == 'willclose') $stories = $this->story->get2BeClosed($productID, $branch, $modules, $type, $sort, $pager); if($browseType == 'closedstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'closed', $type, $sort, $pager); if($browseType == 'assignedbyme') $stories = $this->story->getByAssignedBy($productID, $branch, $modules, $this->app->user->account, $type, $sort, $pager); diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index d22acc3ac8..2238fabfe4 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -179,8 +179,8 @@ $product):?> stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed']; - $totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed']; + $totalStories = $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changing']; + $totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changing']; $trClass = ''; if($product->line) @@ -217,12 +217,12 @@ config->URAndSR):?> requirements['draft'];?> requirements['active'];?> - requirements['changed'];?> + requirements['changing'];?> requirements['closed'] / $totalRequirements, 3) * 100;?>% stories['draft'];?> stories['active'];?> - stories['changed'];?> + stories['changing'];?> stories['closed'] / $totalStories, 3) * 100;?>% unResolved;?> closedBugs;?> diff --git a/module/product/view/view.html.php b/module/product/view/view.html.php index 5e666130d8..8bdeddae92 100644 --- a/module/product/view/view.html.php +++ b/module/product/view/view.html.php @@ -142,8 +142,8 @@ bugs?> - story->statusList['changed'] . $space . $lang->story->common;?> - stories['changed']?> + story->statusList['changing'] . $space . $lang->story->common;?> + stories['changing']?> product->releases?> releases?> product->cases?> diff --git a/module/productplan/control.php b/module/productplan/control.php index 7e1cd9bd23..ab439e0d2b 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -688,7 +688,7 @@ class productplan extends control } else { - $allStories = $this->story->getProductStories($this->view->product->id, $plan->branch ? "0,{$plan->branch}" : 0, $moduleID = '0', $status = 'draft,active,changed', 'story', 'id_desc', $hasParent = false, array_keys($planStories), $pager); + $allStories = $this->story->getProductStories($this->view->product->id, $plan->branch ? "0,{$plan->branch}" : 0, '0', 'draft,reviewing,active,changing', 'story', 'id_desc', $hasParent = false, array_keys($planStories), $pager); } $modules = $this->loadModel('tree')->getOptionMenu($plan->product, 'story', 0, 'all'); diff --git a/module/productplan/model.php b/module/productplan/model.php index 81e5f7ac69..54ff91e7b5 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -1025,7 +1025,7 @@ class productplanModel extends model { foreach($planStory as $id => $story) { - if($story->status == 'draft') + if($story->status == 'draft' or $story->status == 'reviewing') { unset($planStory[$id]); continue; diff --git a/module/program/view/product.html.php b/module/program/view/product.html.php index 24586b1a78..a923e8c916 100644 --- a/module/program/view/product.html.php +++ b/module/program/view/product.html.php @@ -76,8 +76,8 @@ stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed']; - $totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed']; + $totalStories = $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changing']; + $totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changing']; ?> @@ -91,12 +91,12 @@ config->URAndSR):?> requirements['draft'];?> requirements['active'];?> - requirements['changed'];?> + requirements['changing'];?> requirements['closed'] / $totalRequirements, 3) * 100;?>% stories['draft'];?> stories['active'];?> - stories['changed'];?> + stories['changing'];?> stories['closed'] / $totalStories, 3) * 100;?>% unResolved;?> closedBugs;?> diff --git a/module/project/control.php b/module/project/control.php index 96f41a566d..ab1fe2201f 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -466,7 +466,7 @@ class project extends control { foreach($planStory as $id => $story) { - if($story->status == 'draft') + if($story->status == 'draft' or $story->status == 'reviewing') { unset($planStory[$id]); continue; diff --git a/module/project/model.php b/module/project/model.php index 98d88ee606..188701c671 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -350,7 +350,7 @@ class projectModel extends model */ public function getTotalStoriesByProject($projectIdList = 0) { - return $this->dao->select("t1.project, count(t2.id) as allStories, count(if(t2.status = 'active' or t2.status = 'changed', 1, null)) as leftStories, count(if(t2.status = 'closed' and t2.closedReason = 'done', 1, null)) as doneStories")->from(TABLE_PROJECTSTORY)->alias('t1') + return $this->dao->select("t1.project, count(t2.id) as allStories, count(if(t2.status = 'active' or t2.status = 'changing', 1, null)) as leftStories, count(if(t2.status = 'closed' and t2.closedReason = 'done', 1, null)) as doneStories")->from(TABLE_PROJECTSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story=t2.id') ->where('t1.project')->in($projectIdList) ->andWhere('t2.type')->eq('story') diff --git a/module/report/view/productsummary.html.php b/module/report/view/productsummary.html.php index 16ea2e1e5c..83633ad364 100644 --- a/module/report/view/productsummary.html.php +++ b/module/report/view/productsummary.html.php @@ -49,7 +49,7 @@ productplan->end;?> story->statusList['draft'];?> story->statusList['active'];?> - story->statusList['changed'];?> + story->statusList['changing'];?> story->statusList['closed'];?> report->total;?> @@ -71,10 +71,10 @@ begin == '2030-01-01' ? $lang->productplan->future : $plan->begin;?> end == '2030-01-01' ? $lang->productplan->future : $plan->end;?> status['draft']) ? $plan->status['draft'] : 0; - $activeCount = isset($plan->status['active']) ? $plan->status['active'] : 0; - $changedCount = isset($plan->status['changed']) ? $plan->status['changed'] : 0; - $closedCount = isset($plan->status['closed']) ? $plan->status['closed'] : 0; + $draftCount = isset($plan->status['draft']) ? $plan->status['draft'] : 0; + $activeCount = isset($plan->status['active']) ? $plan->status['active'] : 0; + $changedCount = isset($plan->status['changing']) ? $plan->status['changing'] : 0; + $closedCount = isset($plan->status['closed']) ? $plan->status['closed'] : 0; ?> diff --git a/module/story/config.php b/module/story/config.php index df09db9db9..e8fe422682 100644 --- a/module/story/config.php +++ b/module/story/config.php @@ -22,7 +22,7 @@ $config->story->review->requiredFields = ''; $config->story->editor = new stdclass(); $config->story->editor->create = array('id' => 'spec,verify', 'tools' => 'simpleTools'); $config->story->editor->change = array('id' => 'spec,verify,comment', 'tools' => 'simpleTools'); -$config->story->editor->edit = array('id' => 'comment', 'tools' => 'simpleTools'); +$config->story->editor->edit = array('id' => 'spec,verify,comment', 'tools' => 'simpleTools'); $config->story->editor->view = array('id' => 'comment,lastComment', 'tools' => 'simpleTools'); $config->story->editor->close = array('id' => 'comment', 'tools' => 'simpleTools'); $config->story->editor->review = array('id' => 'comment', 'tools' => 'simpleTools'); diff --git a/module/story/control.php b/module/story/control.php index 3abd90d2f6..4b63c96087 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -824,7 +824,7 @@ class story extends control $reviewerList = $this->story->getReviewerPairs($story->id, $story->version); $reviewerList = array_keys($reviewerList); $reviewedBy = explode(',', trim($story->reviewedBy, ',')); - if(array_diff($reviewerList, $reviewedBy) and strpos('draft,changed', $story->status) !== false) $isShowReviewer = true; + if($story->status == 'draft' or (array_diff($reviewerList, $reviewedBy) and strpos('draft,changing', $story->status) !== false)) $isShowReviewer = true; $reviewedReviewer = array(); foreach($reviewedBy as $reviewer) $reviewedReviewer[] = zget($users, $reviewer); @@ -1448,9 +1448,9 @@ class story extends control $reviewers = $this->story->getReviewerPairs($storyID, $story->version); $this->lang->story->resultList = $this->lang->story->reviewResultList; - if($story->status == 'draft' and $story->version == 1) unset($this->lang->story->resultList['revert']); + if($story->status == 'reviewing' and $story->version == 1) unset($this->lang->story->resultList['revert']); - if($story->status == 'changed') unset($this->lang->story->resultList['reject']); + if($story->status == 'changing') unset($this->lang->story->resultList['reject']); if(count($reviewers) > 1) unset($this->lang->story->resultList['revert']); @@ -1515,6 +1515,79 @@ class story extends control echo js::locate($locateLink, 'parent'); } + /** + * Recall story change. + * + * @param int $storyID + * @access public + * @return void + */ + public function recallChange($storyID, $confirm = 'no') + { + $story = $this->story->getById($storyID); + + if($confirm == 'no') + { + return print(js::confirm($this->lang->story->recallChangeTips, $this->createLink('story', 'recallChange', "story=$storyID&confirm=yes"))); + } + else + { + $this->story->recallChange($storyID); + $this->loadModel('action')->create('story', $storyID, 'recalledChange'); + + $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); + echo js::locate($locateLink, 'parent'); + } + } + + /** + * Submit review. + * + * @param int $storyID + * @access public + * @return void + */ + public function submitReview($storyID) + { + if($_POST) + { + $changes = $this->story->submitReview($storyID); + if(dao::isError()) return print(js::error(dao::getError())); + + if($changes) + { + $actionID = $this->loadModel('action')->create('story', $storyID, 'submitReview'); + $this->action->logHistory($actionID, $changes); + } + + if(isonlybody()) return print(js::closeModal('parent.parent', 'this')); + return print(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); + } + + /* Get story and product. */ + $story = $this->story->getById($storyID); + $product = $this->product->getById($story->product); + + /* Set menu. */ + $this->product->setMenu($story->product, $story->branch); + + /* Get reviewers. */ + $reviewers = $product->reviewer; + if(!$reviewers and $product->acl != 'open') $reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', '', ''); + + /* Get story reviewer. */ + $reviewerList = $this->story->getReviewerPairs($story->id, $story->version); + $story->reviewer = array_keys($reviewerList); + + $this->view->story = $story; + $this->view->actions = $this->action->getList('story', $storyID); + $this->view->reviewers = $this->user->getPairs('noclosed|nodeleted', '', 0, $reviewers); + $this->view->users = $this->user->getPairs('noclosed|noletter'); + $this->view->needReview = (($this->app->user->account == $product->PO || $this->config->story->needReview == 0) and empty($story->reviewer)) ? "checked='checked'" : ""; + + $this->display(); + } + /** * Close a story. * @@ -2608,9 +2681,9 @@ class story extends control { $oldStory = $this->dao->findById((int)$params['storyID'])->from(TABLE_STORY)->fetch(); $status = $oldStory->status; - if($params['changed'] and $oldStory->status == 'active' and empty($params['needNotReview'])) $status = 'changed'; - if($params['changed'] and $oldStory->status == 'active' and $this->story->checkForceReview()) $status = 'changed'; - if($params['changed'] and $oldStory->status == 'draft' and $params['needNotReview']) $status = 'active'; + if($params['changing'] and $oldStory->status == 'active' and empty($params['needNotReview'])) $status = 'changing'; + if($params['changing'] and $oldStory->status == 'active' and $this->story->checkForceReview()) $status = 'changing'; + if($params['changing'] and $oldStory->status == 'draft' and $params['needNotReview']) $status = 'active'; } elseif($method == 'review') { diff --git a/module/story/css/edit.css b/module/story/css/edit.css index 81268bed5e..dbd7d9df3a 100644 --- a/module/story/css/edit.css +++ b/module/story/css/edit.css @@ -1,3 +1,4 @@ -#product_chosen .chosen-single{border-right-width:1px} +#product_chosen .chosen-single {border-right-width: 1px} .linkStoryTitle {white-space: nowrap; text-overflow: ellipsis;} .linkStoryTd > ul {margin-top: -10px;} +.titleBox {margin: 0px 10px 10px 10px;} diff --git a/module/story/js/batchcreate.js b/module/story/js/batchcreate.js index c4de3579a9..66e70dfda8 100644 --- a/module/story/js/batchcreate.js +++ b/module/story/js/batchcreate.js @@ -14,6 +14,21 @@ $(function() saveCustomFields('batchCreateFields', 8, $name, 200); return false; }); + + $('#saveButton').on('click', function() + { + $('#saveButton').attr('disabled', true); + $('#saveDraftButton').attr('disabled', true); + $('#batchCreateForm').submit(); + }); + + $('#saveDraftButton').on('click', function() + { + $('#saveButton').attr('disabled', true); + $('#saveDraftButton').attr('disabled', true); + $('').attr('type', 'hidden').attr('name', 'status').attr('value', 'draft').appendTo('#batchCreateForm'); + $('#batchCreateForm').submit(); + }); }); $(document).on('click', '.chosen-with-drop', function() diff --git a/module/story/js/create.js b/module/story/js/create.js index 979300b4bb..fbdb2105c3 100644 --- a/module/story/js/create.js +++ b/module/story/js/create.js @@ -74,6 +74,25 @@ $(function() return false; }); + + $('#saveButton').on('click', function() + { + $('#saveButton').attr('disabled', true); + $('#saveDraftButton').attr('disabled', true); + + var storyStatus = $('#reviewer').val() ? 'reviewing' : 'active'; + $('').attr('type', 'hidden').attr('name', 'status').attr('value', storyStatus).appendTo('#dataform'); + $('#dataform').submit(); + }); + + $('#saveDraftButton').on('click', function() + { + $('#saveButton').attr('disabled', true); + $('#saveDraftButton').attr('disabled', true); + + $('').attr('type', 'hidden').attr('name', 'status').attr('value', 'draft').appendTo('#dataform'); + $('#dataform').submit(); + }); }); /** diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 0aa71b39bf..0f573eaad9 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -23,10 +23,13 @@ $lang->story->change = "Ändern"; $lang->story->changed = 'Geändert'; $lang->story->assignTo = 'Assign'; $lang->story->review = 'Prüfen'; +$lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; +$lang->story->recallChange = 'Undo Changes'; $lang->story->needReview = 'Need Review'; $lang->story->batchReview = 'Mehere prüfen'; $lang->story->edit = "Bearbeiten"; +$lang->story->editDraft = "Entwurf bearbeiten"; $lang->story->batchEdit = "Mehere bearbeiten"; $lang->story->subdivide = 'Aufteilen'; $lang->story->link = 'Link'; @@ -70,6 +73,7 @@ $lang->story->batchToTask = 'Batch Convert to Task'; $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; +$lang->story->saveDraft = 'Save as draft'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Change Story"; @@ -130,6 +134,8 @@ $lang->story->closedBy = 'Geschlossen von'; $lang->story->closedDate = 'Geschlossen am'; $lang->story->closedReason = 'Geschlossen weil'; $lang->story->rejectedReason = 'Abgelehnt weil'; +$lang->story->changedBy = 'ChangedBy'; +$lang->story->changedDate = 'ChangedDate'; $lang->story->reviewedBy = 'Prüfer'; $lang->story->reviewer = $lang->story->reviewedBy; $lang->story->reviewers = 'Reviewers'; @@ -181,11 +187,12 @@ $lang->story->needNotReviewList[1] = 'Need Not Review'; $lang->story->useList[0] = 'Ja'; $lang->story->useList[1] = 'Nein'; -$lang->story->statusList[''] = ''; -$lang->story->statusList['draft'] = 'Entwurf'; -$lang->story->statusList['active'] = 'Aktiv'; -$lang->story->statusList['closed'] = 'Geschlossen'; -$lang->story->statusList['changed'] = 'Geändert'; +$lang->story->statusList[''] = ''; +$lang->story->statusList['draft'] = 'Entwurf'; +$lang->story->statusList['reviewing'] = 'Wird geprüft'; +$lang->story->statusList['active'] = 'Aktiv'; +$lang->story->statusList['closed'] = 'Geschlossen'; +$lang->story->statusList['changing'] = 'Geändert'; $lang->story->stageList[''] = ''; $lang->story->stageList['wait'] = 'Wartend'; @@ -294,6 +301,7 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; +$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Story Bereich'; @@ -324,6 +332,7 @@ $lang->story->action->linkrelatedstory = array('main' => '$date, verknüpft $lang->story->action->subdividestory = array('main' => '$date, aufgeteilt von $actor mit Story $extra.'); $lang->story->action->unlinkrelatedstory = array('main' => '$date, Verknüpfung aufgelöst durch $actor von Story $extra.'); $lang->story->action->unlinkchildstory = array('main' => '$date, Verknüpfung aufgelöst durch $actor Story $extra.'); +$lang->story->action->recalledchange = array('main' => '$date, Undo changes by \$actor.'); /* Statistical statement. */ $lang->story->report = new stdclass(); diff --git a/module/story/lang/en.php b/module/story/lang/en.php index dfa303141f..e13eaaacee 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -23,10 +23,13 @@ $lang->story->change = "Change"; $lang->story->changed = 'Change'; $lang->story->assignTo = 'Assign'; $lang->story->review = 'Review'; +$lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; +$lang->story->recallChange = 'Undo Changes'; $lang->story->needReview = 'Need Review'; $lang->story->batchReview = 'Batch Review'; $lang->story->edit = "Edit Story"; +$lang->story->editDraft = "Edit Draft"; $lang->story->batchEdit = "Batch Edit"; $lang->story->subdivide = 'Decompose'; $lang->story->link = 'Link'; @@ -70,6 +73,7 @@ $lang->story->batchToTask = 'Batch Convert to Task'; $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; +$lang->story->saveDraft = 'Save as draft'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Change {$lang->SRCommon}"; @@ -130,6 +134,8 @@ $lang->story->closedBy = 'ClosedBy'; $lang->story->closedDate = 'ClosedDate'; $lang->story->closedReason = 'Reason'; $lang->story->rejectedReason = 'Reject Reason'; +$lang->story->changedBy = 'ChangedBy'; +$lang->story->changedDate = 'ChangedDate'; $lang->story->reviewedBy = 'ReviewedBy'; $lang->story->reviewer = $lang->story->reviewedBy; $lang->story->reviewers = 'Reviewers'; @@ -181,11 +187,12 @@ $lang->story->needNotReviewList[1] = 'No Review'; $lang->story->useList[0] = 'Yes'; $lang->story->useList[1] = 'No'; -$lang->story->statusList[''] = ''; -$lang->story->statusList['draft'] = 'Draft'; -$lang->story->statusList['active'] = 'Active'; -$lang->story->statusList['closed'] = 'Closed'; -$lang->story->statusList['changed'] = 'Changed'; +$lang->story->statusList[''] = ''; +$lang->story->statusList['draft'] = 'Draft'; +$lang->story->statusList['reviewing'] = 'Reviewing'; +$lang->story->statusList['active'] = 'Active'; +$lang->story->statusList['closed'] = 'Closed'; +$lang->story->statusList['changing'] = 'Changing'; $lang->story->stageList[''] = ''; $lang->story->stageList['wait'] = 'Waiting'; @@ -294,6 +301,7 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; +$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Scope'; @@ -324,6 +332,7 @@ $lang->story->action->linkrelatedstory = array('main' => '$date, linked by $lang->story->action->subdividestory = array('main' => '$date, decomposed by $actor to Story $extra.'); $lang->story->action->unlinkrelatedstory = array('main' => '$date, unlinked by $actor from Story $extra.'); $lang->story->action->unlinkchildstory = array('main' => '$date, unlinked by $actor Decomposed Story $extra.'); +$lang->story->action->recalledchange = array('main' => '$date, Undo changes by \$actor.'); /* Statistical statement. */ $lang->story->report = new stdclass(); diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index f4b2e3c1a0..3aeb9a9ed4 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -23,10 +23,13 @@ $lang->story->change = "Changer"; $lang->story->changed = 'Changée'; $lang->story->assignTo = 'Affecter'; $lang->story->review = 'Valider'; +$lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; +$lang->story->recallChange = 'Undo Changes'; $lang->story->needReview = 'Validation requise'; $lang->story->batchReview = 'Validation par lot'; $lang->story->edit = "Editer Story"; +$lang->story->editDraft = "Modifier le projet"; $lang->story->batchEdit = "Editer par Lot"; $lang->story->subdivide = 'Décomposer'; $lang->story->link = 'Link'; @@ -70,6 +73,7 @@ $lang->story->batchToTask = 'Batch Convert to Task'; $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; +$lang->story->saveDraft = 'Save as draft'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Changer Story"; @@ -130,6 +134,8 @@ $lang->story->closedBy = 'Fermée par'; $lang->story->closedDate = 'Date Fermeture'; $lang->story->closedReason = 'Raison'; $lang->story->rejectedReason = 'Raison du Rejet'; +$lang->story->changedBy = 'ChangedBy'; +$lang->story->changedDate = 'ChangedDate'; $lang->story->reviewedBy = 'Validée par'; $lang->story->reviewer = $lang->story->reviewedBy; $lang->story->reviewers = 'Reviewers'; @@ -181,11 +187,12 @@ $lang->story->needNotReviewList[1] = 'Need Not Review'; $lang->story->useList[0] = 'Oui'; $lang->story->useList[1] = 'Non'; -$lang->story->statusList[''] = ''; -$lang->story->statusList['draft'] = 'Brouillon'; -$lang->story->statusList['active'] = 'Active'; -$lang->story->statusList['closed'] = 'Fermée'; -$lang->story->statusList['changed'] = 'Changée'; +$lang->story->statusList['']  = ''; +$lang->story->statusList['draft']  = 'Brouillon'; +$lang->story->statusList['reviewing'] = 'Examen en cours'; +$lang->story->statusList['active'] = 'Active'; +$lang->story->statusList['closed'] = 'Fermée'; +$lang->story->statusList['changing'] = 'Changée'; $lang->story->stageList[''] = ''; $lang->story->stageList['wait'] = 'En Attente'; @@ -294,6 +301,7 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; +$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Périmètre'; @@ -324,6 +332,7 @@ $lang->story->action->linkrelatedstory = array('main' => '$date, associée $lang->story->action->subdividestory = array('main' => '$date, décomposée par $actor en Story $extra.'); $lang->story->action->unlinkrelatedstory = array('main' => '$date, dissociée par $actor de la Story $extra.'); $lang->story->action->unlinkchildstory = array('main' => '$date, dissociée par $actor de la sous-Story $extra.'); +$lang->story->action->recalledchange = array('main' => '$date, Undo changes by \$actor.'); /* Statistical statement. */ $lang->story->report = new stdclass(); diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php index 8cb2bb50bc..cd3fc1aeff 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -23,10 +23,13 @@ $lang->story->change = "Thay đổi"; $lang->story->changed = "Đã đổi"; $lang->story->assignTo = 'Giao cho'; $lang->story->review = 'Xét duyệt'; +$lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; +$lang->story->recallChange = 'Undo Changes'; $lang->story->needReview = 'Duyệt nhu cầu'; $lang->story->batchReview = 'Duyệt hàng loạt'; $lang->story->edit = "Sửa câu chuyện"; +$lang->story->editDraft = "Sửa soạn thảo"; $lang->story->batchEdit = "Sửa hàng loạt"; $lang->story->subdivide = 'Phân rã'; $lang->story->link = 'Link'; @@ -68,6 +71,7 @@ $lang->story->batchToTask = 'Batch Convert to Task'; $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; +$lang->story->saveDraft = 'Save as draft'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Change {$lang->SRCommon}"; @@ -124,6 +128,8 @@ $lang->story->closedBy = 'Người đóng'; $lang->story->closedDate = 'Ngày đóng'; $lang->story->closedReason = 'Lý do'; $lang->story->rejectedReason = 'Lý do từ chối'; +$lang->story->changedBy = 'ChangedBy'; +$lang->story->changedDate = 'ChangedDate'; $lang->story->reviewedBy = 'Người duyệt'; $lang->story->reviewer = $lang->story->reviewedBy; $lang->story->reviewers = 'Reviewers'; @@ -174,11 +180,12 @@ $lang->story->needNotReviewList[1] = 'Need Not Review'; $lang->story->useList[0] = 'Có'; $lang->story->useList[1] = 'Không'; -$lang->story->statusList[''] = ''; -$lang->story->statusList['draft'] = 'Nháp'; -$lang->story->statusList['active'] = 'Kích hoạt'; -$lang->story->statusList['closed'] = 'Đã đóng'; -$lang->story->statusList['changed'] = 'Đã thay đổi'; +$lang->story->statusList[''] = ''; +$lang->story->statusList['draft'] = 'Nháp'; +$lang->story->statusList['reviewing'] = 'Đang xem xét'; +$lang->story->statusList['active'] = 'Kích hoạt'; +$lang->story->statusList['closed'] = 'Đã đóng'; +$lang->story->statusList['changing'] = 'Đã thay đổi'; $lang->story->stageList[''] = ''; $lang->story->stageList['wait'] = 'Đang đợi'; @@ -285,6 +292,7 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; +$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Phạm vi'; @@ -315,6 +323,7 @@ $lang->story->action->linkrelatedstory = array('main' => '$date, liên kế $lang->story->action->subdividestory = array('main' => '$date, được phân rã bởi $actor tới Câu chuyện $extra.'); $lang->story->action->unlinkrelatedstory = array('main' => '$date, bị hủy bởi $actor từ Câu chuyện $extra.'); $lang->story->action->unlinkchildstory = array('main' => '$date, bị hủy bởi $actor Câu chuyện được phân rã $extra.'); +$lang->story->action->recalledchange = array('main' => '$date, Undo changes by \$actor.'); /* Statistical statement. */ $lang->story->report = new stdclass(); diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index cdec11db27..53d05dbb09 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -23,10 +23,13 @@ $lang->story->change = "变更"; $lang->story->changed = "{$lang->SRCommon}变更"; $lang->story->assignTo = '指派'; $lang->story->review = '评审'; +$lang->story->submitReview = "提交评审"; $lang->story->recall = '撤销评审'; +$lang->story->recallChange = '撤销变更'; $lang->story->needReview = '需要评审'; $lang->story->batchReview = '批量评审'; $lang->story->edit = "编辑"; +$lang->story->editDraft = "编辑草稿"; $lang->story->batchEdit = "批量编辑"; $lang->story->subdivide = '细分'; $lang->story->link = '关联'; @@ -70,6 +73,7 @@ $lang->story->batchToTask = '批量转任务'; $lang->story->convertRelations = '换算关系'; $lang->story->undetermined = '待定'; $lang->story->order = '排序'; +$lang->story->saveDraft = '存为草稿'; $lang->story->editAction = "编辑{$lang->SRCommon}"; $lang->story->changeAction = "变更{$lang->SRCommon}"; @@ -130,6 +134,8 @@ $lang->story->closedBy = '由谁关闭'; $lang->story->closedDate = '关闭日期'; $lang->story->closedReason = '关闭原因'; $lang->story->rejectedReason = '拒绝原因'; +$lang->story->changedBy = '由谁变更'; +$lang->story->changedDate = '变更时间'; $lang->story->reviewedBy = '由谁评审'; $lang->story->reviewer = $lang->story->reviewedBy; $lang->story->reviewers = '评审人员'; @@ -181,11 +187,12 @@ $lang->story->needNotReviewList[1] = '不需要评审'; $lang->story->useList[0] = '不使用'; $lang->story->useList[1] = '使用'; -$lang->story->statusList[''] = ''; -$lang->story->statusList['draft'] = '草稿'; -$lang->story->statusList['active'] = '激活'; -$lang->story->statusList['closed'] = '已关闭'; -$lang->story->statusList['changed'] = '已变更'; +$lang->story->statusList[''] = ''; +$lang->story->statusList['draft'] = '草稿'; +$lang->story->statusList['reviewing'] = '评审中'; +$lang->story->statusList['active'] = '激活'; +$lang->story->statusList['closed'] = '已关闭'; +$lang->story->statusList['changing'] = '变更中'; $lang->story->stageList[''] = ''; $lang->story->stageList['wait'] = '未开始'; @@ -294,6 +301,7 @@ $lang->story->estimateMustBePlus = '估算值不能是负数'; $lang->story->confirmChangeBranch = $lang->SRCommon . '%s已关联在之前所属分支的计划中,调整分支后,' . $lang->SRCommon . '将从之前所属分支的计划中移除,请确认是否继续修改上述' . $lang->SRCommon . '的分支。'; $lang->story->confirmChangePlan = $lang->SRCommon . '%s已关联在之前计划的所属分支中,调整分支后,' . $lang->SRCommon . '将会从计划中移除,请确认是否继续修改计划的所属分支。'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s不存在'; +$lang->story->recallChangeTips = "撤销变更后,需求内容会回退至变更前的版本,您确定要撤销吗?"; $lang->story->form = new stdclass(); $lang->story->form->area = "该{$lang->SRCommon}所属范围"; @@ -324,6 +332,7 @@ $lang->story->action->linkrelatedstory = array('main' => "\$date, 由 story->action->subdividestory = array('main' => "\$date, 由 \$actor 细分为{$lang->SRCommon} \$extra。"); $lang->story->action->unlinkrelatedstory = array('main' => "\$date, 由 \$actor 移除相关{$lang->SRCommon} \$extra。"); $lang->story->action->unlinkchildstory = array('main' => "\$date, 由 \$actor 移除细分{$lang->SRCommon} \$extra。"); +$lang->story->action->recalledchange = array('main' => "\$date, 由 \$actor 撤销变更。"); /* 统计报表。*/ $lang->story->report = new stdclass(); diff --git a/module/story/lang/zh-tw.php b/module/story/lang/zh-tw.php index ae595fa813..d94b563c2a 100644 --- a/module/story/lang/zh-tw.php +++ b/module/story/lang/zh-tw.php @@ -172,11 +172,12 @@ $lang->story->needNotReviewList[1] = '不需要評審'; $lang->story->useList[0] = '不使用'; $lang->story->useList[1] = '使用'; -$lang->story->statusList[''] = ''; -$lang->story->statusList['draft'] = '草稿'; -$lang->story->statusList['active'] = '激活'; -$lang->story->statusList['closed'] = '已關閉'; -$lang->story->statusList['changed'] = '已變更'; +$lang->story->statusList[''] = ''; +$lang->story->statusList['draft'] = '草稿'; +$lang->story->statusList['reviewing'] = '评审中'; +$lang->story->statusList['active'] = '激活'; +$lang->story->statusList['closed'] = '已關閉'; +$lang->story->statusList['changing'] = '變更中'; $lang->story->stageList[''] = ''; $lang->story->stageList['wait'] = '未開始'; diff --git a/module/story/model.php b/module/story/model.php index 0c260471b1..0f1108a022 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -211,11 +211,9 @@ class storyModel extends model ->cleanInt('product,module,pri,plan') ->callFunc('title', 'trim') ->add('version', 1) - ->add('status', 'draft') ->setDefault('plan,verify,notifyEmail', '') ->setDefault('openedBy', $this->app->user->account) ->setDefault('openedDate', $now) - ->setIF($this->post->needNotReview, 'status', 'active') ->setIF($this->post->plan > 0, 'stage', 'planned') ->setIF($this->post->estimate, 'estimate', (float)$this->post->estimate) ->setIF(!in_array($this->post->source, $this->config->story->feedbackSource), 'feedbackBy', '') @@ -232,8 +230,8 @@ class storyModel extends model $result = $this->loadModel('common')->removeDuplicate('story', $story, "product={$story->product}"); if(isset($result['stop']) and $result['stop']) return array('status' => 'exists', 'id' => $result['duplicate']); - if($this->checkForceReview()) $story->status = 'draft'; - if($story->status == 'draft') $story->stage = $this->post->plan > 0 ? 'planned' : 'wait'; + if($story->status != 'draft' and $this->checkForceReview()) $story->status = 'reviewing'; + if(strpos('draft,reviewing', $story->status) !== false) $story->stage = $this->post->plan > 0 ? 'planned' : 'wait'; $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->create['id'], $this->post->uid); $requiredFields = "," . $this->config->story->create->requiredFields . ","; @@ -469,6 +467,13 @@ class storyModel extends model $mails = array(); $stories = fixer::input('post')->get(); + $saveDraft = false; + if(isset($stories->status)) + { + if($stories->status == 'draft') $saveDraft = true; + unset($stories->status); + } + $result = $this->loadModel('common')->removeDuplicate('story', $stories, "product={$productID}"); $stories = $result['data']; @@ -510,7 +515,7 @@ class storyModel extends model $story->category = $stories->category[$i]; $story->pri = $stories->pri[$i]; $story->estimate = $stories->estimate[$i]; - $story->status = (empty($stories->reviewer[$i]) and !$forceReview) ? 'active' : 'draft'; + $story->status = $saveDraft ? 'draft' : ((empty($stories->reviewer[$i]) and !$forceReview) ? 'active' : 'reviewing'); $story->stage = ($this->app->tab == 'project' or $this->app->tab == 'execution') ? 'projected' : 'wait'; $story->keywords = $stories->keywords[$i]; $story->sourceNote = $stories->sourceNote[$i]; @@ -697,7 +702,7 @@ class storyModel extends model ->add('lastEditedDate', $now) ->setIF(!$this->post->assignedTo, 'assignedTo', '') ->setIF($specChanged, 'version', $oldStory->version + 1) - ->setIF($specChanged and $oldStory->status == 'active' and $this->post->needNotReview == false, 'status', 'changed') + ->setIF($specChanged and $oldStory->status == 'active' and $this->post->needNotReview == false, 'status', 'changing') ->setIF($oldStory->status == 'draft' and $this->post->needNotReview, 'status', 'active') ->setIF($specChanged, 'reviewedBy', '') ->setIF($specChanged, 'changedBy', $this->app->user->account) @@ -709,7 +714,7 @@ class storyModel extends model ->stripTags($this->config->story->editor->change['id'], $this->config->allowedTags) ->remove('files,labels,reviewer,comment,needNotReview,uid') ->get(); - if($specChanged and isset($story->status) && $story->status == 'active' and $this->checkForceReview()) $story->status = 'changed'; + if($specChanged and isset($story->status) && $story->status == 'active' and $this->checkForceReview()) $story->status = 'changing'; $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid); $this->dao->update(TABLE_STORY)->data($story, 'spec,verify') ->autoCheck() @@ -885,8 +890,15 @@ class storyModel extends model $story->reviewers = implode(',', array_keys($this->getReviewerPairs($storyID, $oldStory->version))); } + $specChanged = false; + $oldSpec = $this->dao->select('title,spec,verify')->from(TABLE_STORYSPEC)->where('story')->eq((int)$storyID)->andWhere('version')->eq($oldStory->version)->fetch(); + $oldStory->title = isset($oldSpec->title) ? $oldSpec->title : ''; + $oldStory->spec = isset($oldSpec->spec) ? $oldSpec->spec : ''; + $oldStory->verify = isset($oldSpec->verify) ? $oldSpec->verify : ''; + if($story->spec != $oldStory->spec or $story->verify != $oldStory->verify or $story->title != $oldStory->title) $specChanged = true; + $this->dao->update(TABLE_STORY) - ->data($story, 'reviewers') + ->data($story, 'reviewers,spec,verify') ->autoCheck() ->checkIF(isset($story->closedBy), 'closedReason', 'notempty') ->checkIF(isset($story->closedReason) and $story->closedReason == 'done', 'stage', 'notempty') @@ -897,6 +909,15 @@ class storyModel extends model if(!dao::isError()) { + if($specChanged) + { + $data = new stdclass(); + $data->title = $story->title; + $data->spec = $story->spec; + $data->verify = $story->verify; + $this->dao->update(TABLE_STORYSPEC)->data($data)->where('story')->eq((int)$storyID)->andWhere('version')->eq($oldStory->version)->exec(); + } + if($story->product != $oldStory->product) { $this->updateStoryProduct($storyID, $story->product); @@ -1063,10 +1084,10 @@ class storyModel extends model if(empty($childrenStatus)) return $this->dao->update(TABLE_STORY)->set('parent')->eq('0')->where('id')->eq($parentID)->exec(); $status = $oldParentStory->status; - if(count($childrenStatus) == 1 and $oldParentStory->status != 'changed') + if(count($childrenStatus) == 1 and $oldParentStory->status != 'changing') { $status = current($childrenStatus); - if($status == 'draft' or $status == 'changed') $status = 'active'; + if($status == 'draft' or $status == 'changing') $status = 'active'; } elseif(count($childrenStatus) != 1 and $oldParentStory->status == 'closed') { @@ -1298,7 +1319,7 @@ class storyModel extends model $story->version = $story->title == $oldStory->title ? $oldStory->version : $oldStory->version + 1; if($story->stage != $oldStory->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : ''; - if($story->title != $oldStory->title and $story->status != 'draft') $story->status = 'changed'; + if($story->title != $oldStory->title and $story->status != 'draft') $story->status = 'changing'; if($story->closedBy != false and $oldStory->closedDate == '') $story->closedDate = $now; if($story->closedReason != false and $oldStory->closedDate == '') $story->closedDate = $now; if($story->closedBy != false or $story->closedReason != false) $story->status = 'closed'; @@ -1388,8 +1409,6 @@ class storyModel extends model */ public function review($storyID) { - if($this->post->result == 'revert' and $this->post->preVersion == false) return print(js::alert($this->lang->story->mustChoosePreVersion)); - if(strpos($this->config->story->review->requiredFields, 'comment') !== false and !$this->post->comment) { dao::$errors[] = sprintf($this->lang->error->notempty, $this->lang->comment); @@ -1412,14 +1431,15 @@ class storyModel extends model ->setDefault('reviewedDate', $date) ->stripTags($this->config->story->editor->review['id'], $this->config->allowedTags) ->setIF(!$this->post->assignedTo, 'assignedTo', '') - ->setIF($this->post->result == 'revert', 'version', $this->post->preVersion) + ->setIF($this->post->result == 'revert', 'version', $oldStory->version - 1) ->setIF($this->post->result == 'clarify', 'assignedTo', $oldStory->lastEditedBy ? $oldStory->lastEditedBy : $oldStory->openedBy) + ->setIF($this->post->result == 'clarify', 'status', 'draft') ->removeIF($this->post->result != 'reject', 'closedReason, duplicateStory, childStories') ->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'duplicate', 'duplicateStory') ->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'subdivided', 'childStories') ->add('reviewedBy', $oldStory->reviewedBy . ',' . $this->app->user->account) ->add('id', $storyID) - ->remove('result,preVersion,comment') + ->remove('result,comment') ->get(); $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->review['id'], $this->post->uid); @@ -1447,7 +1467,7 @@ class storyModel extends model ->where('id')->eq($storyID)->exec(); if($this->post->result == 'revert') { - $preTitle = $this->dao->select('title')->from(TABLE_STORYSPEC)->where('story')->eq($storyID)->andWHere('version')->eq($this->post->preVersion)->fetch('title'); + $preTitle = $this->dao->select('title')->from(TABLE_STORYSPEC)->where('story')->eq($storyID)->andWHere('version')->eq($oldStory->version - 1)->fetch('title'); $this->dao->update(TABLE_STORY)->set('title')->eq($preTitle)->where('id')->eq($storyID)->exec(); /* Delete versions that is after this version. */ @@ -1491,7 +1511,7 @@ class storyModel extends model $oldStory = $oldStories[$storyID]; $isSuperReviewer = strpos(',' . trim(zget($this->config->story, 'superReviewers', ''), ',') . ',', ',' . $this->app->user->account . ','); - if($oldStory->status != 'draft' and $oldStory->status != 'changed') continue; + if($oldStory->status != 'draft' and $oldStory->status != 'changing') continue; if(!in_array($this->app->user->account, array_keys($reviewerList[$storyID])) and $isSuperReviewer === false) continue; if(isset($hasResult[$storyID]) and $hasResult[$storyID]->version == $oldStories[$storyID]->version) continue; @@ -1554,6 +1574,83 @@ class storyModel extends model $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($story->version)->exec(); } + /** + * Recall the story change. + * + * @param int $storyID + * @access public + * @return void + */ + public function recallChange($storyID) + { + $story = $this->getById($storyID); + $preVersion = $story->version - 1; + + /* Update story title and version and status. */ + $preTitle = $this->dao->select('title')->from(TABLE_STORYSPEC)->where('story')->eq($storyID)->andWHere('version')->eq($preVersion)->fetch('title'); + $this->dao->update(TABLE_STORY)->set('title')->eq($preTitle)->set('version')->eq($preVersion)->set('status')->eq('active')->where('id')->eq($storyID)->exec(); + + /* Delete versions that is after this version. */ + $this->dao->delete()->from(TABLE_STORYSPEC)->where('story')->eq($storyID)->andWHere('version')->eq($story->version)->exec(); + $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($story->version)->exec(); + + $this->dao->delete()->from(TABLE_FILE)->where('objectType')->eq('story')->andWhere('objectID')->eq($storyID)->andWhere('extra')->eq($story->version)->exec(); + } + + /** + * Submit review. + * + * @param int $storyID + * @access public + * @return array|bool + */ + public function submitReview($storyID) + { + if(isset($_POST['reviewer'])) $_POST['reviewer'] = array_filter($_POST['reviewer']); + if(!$this->post->needNotReview and empty($_POST['reviewer'])) + { + dao::$errors[] = $this->lang->story->errorEmptyReviewedBy; + return false; + } + + $oldStory = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch(); + $reviewerList = $this->getReviewerPairs($oldStory->id, $oldStory->version); + $oldStory->reviewer = implode(',', array_keys($reviewerList)); + + $story = fixer::input('post') + ->setDefault('status', 'active') + ->setDefault('reviewer', '') + ->remove('needNotReview') + ->join('reviewer', ',') + ->get(); + + $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($oldStory->version)->exec(); + + if(isset($_POST['reviewer'])) + { + $assignedTo = ''; + foreach($this->post->reviewer as $reviewer) + { + if(empty($reviewer)) continue; + + $reviewData = new stdclass(); + $reviewData->story = $storyID; + $reviewData->version = $oldStory->version; + $reviewData->reviewer = $reviewer; + $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); + + if(empty($assignedTo)) $assignedTo = $reviewer; + } + if($assignedTo) $this->dao->update(TABLE_STORY)->set('assignedTo')->eq($assignedTo)->set('assignedDate')->eq(helper::now())->where('id')->eq($storyID)->exec(); + $story->status = 'reviewing'; + } + + $this->dao->update(TABLE_STORY)->set('status')->eq($story->status)->where('id')->eq($storyID)->exec(); + if(!dao::isError()) return common::createChanges($oldStory, $story); + + return false; + } + /** * Subdivide story * @@ -2253,6 +2350,8 @@ class storyModel extends model ->add('closedDate', '0000-00-00') ->add('reviewedBy', '') ->add('reviewedDate', '0000-00-00') + ->add('changedBy', '') + ->add('changedDate', '0000-00-00') ->add('duplicateStory', 0) ->add('childStories', '') ->setDefault('lastEditedBy', $this->app->user->account) @@ -2828,7 +2927,7 @@ class storyModel extends model ->beginIF($fieldName == 'reviewBy') ->andWhere('t2.reviewer')->eq($this->app->user->account) ->andWhere('t2.result')->eq('') - ->andWhere('t1.status')->in('draft,changed') + ->andWhere('t1.status')->in('draft,changing') ->fi() ->beginIF($fieldName == 'assignedBy')->andWhere('t1.id')->in($actionIDList)->andWhere('t1.status')->ne('closed')->fi() ->orderBy($orderBy) @@ -2951,11 +3050,11 @@ class storyModel extends model if($this->app->moduleName == 'release' or $this->app->moduleName == 'build') { - $storyQuery .= " AND `status` NOT IN ('draft')"; // Fix bug #990. + $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing')"; // Fix bug #990. } else { - $storyQuery .= " AND `status` NOT IN ('draft', 'closed')"; + $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing', 'closed')"; } if($this->app->rawModule == 'build' and $this->app->rawMethod == 'linkstory') $storyQuery .= " AND `parent` != '-1'"; @@ -3123,16 +3222,16 @@ class storyModel extends model ->beginIF($execution->type == 'project') ->beginIF(!empty($productID))->andWhere('t1.product')->eq($productID) ->beginIF($type == 'bybranch' and $branchParam !== '')->andWhere('t2.branch')->in("0,$branchParam")->fi() - ->beginIF(strpos('changed|closed', $type) !== false)->andWhere('t2.status')->eq($type)->fi() + ->beginIF(strpos('changing|closed', $type) !== false)->andWhere('t2.status')->eq($type)->fi() ->beginIF($type == 'unclosed')->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi() ->beginIF($type == 'linkedexecution')->andWhere('t2.id')->in($storyIdList)->fi() ->beginIF($type == 'unlinkedexecution')->andWhere('t2.id')->notIn($storyIdList)->fi() ->fi() ->beginIF($execution->type != 'project') ->beginIF(!empty($productParam))->andWhere('t1.product')->eq($productParam)->fi() - ->beginIF($this->session->executionStoryBrowseType and strpos('changed|', $this->session->executionStoryBrowseType) !== false)->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi() + ->beginIF($this->session->executionStoryBrowseType and strpos('changing|', $this->session->executionStoryBrowseType) !== false)->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi() ->fi() - ->beginIF($this->session->storyBrowseType and strpos('changed|', $this->session->storyBrowseType) !== false)->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi() + ->beginIF($this->session->storyBrowseType and strpos('changing|', $this->session->storyBrowseType) !== false)->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi() ->beginIF($modules)->andWhere('t2.module')->in($modules)->fi() ->andWhere('t2.deleted')->eq(0) ->andWhere('t3.deleted')->eq(0) @@ -3195,7 +3294,7 @@ class storyModel extends model ->beginIF($branch !== 'all')->andWhere('t2.branch')->in("0,$branch")->fi() ->beginIF($moduleIdList)->andWhere('t2.module')->in($moduleIdList)->fi() ->beginIF($status == 'unclosed')->andWhere('t2.status')->ne('closed')->fi() - ->beginIF($status == 'review')->andWhere('t2.status')->in('draft,changed')->fi() + ->beginIF($status == 'review')->andWhere('t2.status')->in('draft,changing')->fi() ->beginIF($status == 'active')->andWhere('t2.status')->eq('active')->fi() ->orderBy('t1.`order` desc, t1.`story` desc') ->fetchAll('id'); @@ -3347,7 +3446,7 @@ class storyModel extends model ->beginIF($type != 'closedBy' and $this->app->moduleName == 'block')->andWhere('t1.status')->ne('closed')->fi() ->beginIF($type != 'all') ->beginIF($type == 'assignedTo')->andWhere('t1.assignedTo')->eq($account)->fi() - ->beginIF($type == 'reviewBy')->andWhere('t3.reviewer')->eq($account)->andWhere('t3.result')->eq('')->andWhere('t1.status')->in('draft,changed')->fi() + ->beginIF($type == 'reviewBy')->andWhere('t3.reviewer')->eq($account)->andWhere('t3.result')->eq('')->andWhere('t1.status')->in('reviewing,changing')->fi() ->beginIF($type == 'openedBy')->andWhere('t1.openedBy')->eq($account)->fi() ->beginIF($type == 'reviewedBy')->andWhere("CONCAT(',', t1.reviewedBy, ',')")->like("%,$account,%")->fi() ->beginIF($type == 'closedBy')->andWhere('t1.closedBy')->eq($account)->fi() @@ -4019,9 +4118,9 @@ class storyModel extends model $isSuperReviewer = strpos(',' . trim(zget($config->story, 'superReviewers', ''), ',') . ',', ',' . $app->user->account . ','); - if($action == 'change') return ($isSuperReviewer !== false or count($story->reviewer) == 0 or count($story->notReview) == 0) and $story->status != 'closed'; - if($action == 'review') return (($isSuperReviewer !== false or in_array($app->user->account, $story->notReview)) and ($story->status == 'draft' or $story->status == 'changed')); - if($action == 'recall') return empty($story->reviewedBy) and strpos('draft,changed', $story->status) !== false and !empty($story->reviewer) and ($app->user->account == $story->openedBy); + if($action == 'change') return ($isSuperReviewer !== false or count($story->reviewer) == 0 or count($story->notReview) == 0) and $story->status != 'closed' and $story->status != 'draft'; + if($action == 'review') return (($isSuperReviewer !== false or in_array($app->user->account, $story->notReview)) and ($story->status == 'reviewing' or $story->status == 'changing')); + if($action == 'recall') return empty($story->reviewedBy) and strpos('reviewing,changing', $story->status) !== false and !empty($story->reviewer) and ($app->user->account == $story->openedBy); if($action == 'close') return $story->status != 'closed'; if($action == 'activate') return $story->status == 'closed'; if($action == 'assignto') return $story->status != 'closed'; @@ -4055,44 +4154,53 @@ class storyModel extends model if($story->URChanged) return $this->buildMenu('story', 'processStoryChange', $params, $story, $type, 'search', '', 'iframe', true, '', $this->lang->confirm); $isClick = $this->isClickable($story, 'change'); - $title = (!$isClick and $story->status != 'closed') ? $this->lang->story->changeTip : ''; + $title = (!$isClick and $story->status != 'closed' and $story->status != 'draft') ? $this->lang->story->changeTip : ''; $menu .= $this->buildMenu('story', 'change', $params . "&from=$story->from", $story, $type, 'alter', '', 'showinonlybody', false, '', $title); - $isClick = $this->isClickable($story, 'review'); - $title = $this->lang->story->review; - if(!$isClick and $story->status != 'closed') + if($story->status == 'draft') { - if($story->status == 'active') - { - $title = $this->lang->story->reviewTip['active']; - } - elseif($storyReviewer and in_array($this->app->user->account, $storyReviewer)) - { - $title = $this->lang->story->reviewTip['reviewed']; - } - elseif($storyReviewer and !in_array($this->app->user->account, $storyReviewer)) - { - $title = $this->lang->story->reviewTip['notReviewer']; - } - elseif(empty($storyReviewer)) - { - $title = $this->lang->story->reviewTip['recalled']; - } + $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id", $story, $type, 'sub-review', '', 'iframe', true); } - $menu .= $this->buildMenu('story', 'review', $params . "&from=$story->from", $story, $type, 'search', '', 'showinonlybody', false, '', $title); + else + { + $isClick = $this->isClickable($story, 'review'); + $title = $this->lang->story->review; + if(!$isClick and $story->status != 'closed') + { + if($story->status == 'active') + { + $title = $this->lang->story->reviewTip['active']; + } + elseif($storyReviewer and in_array($this->app->user->account, $storyReviewer)) + { + $title = $this->lang->story->reviewTip['reviewed']; + } + elseif($storyReviewer and !in_array($this->app->user->account, $storyReviewer)) + { + $title = $this->lang->story->reviewTip['notReviewer']; + } + elseif(empty($storyReviewer)) + { + $title = $this->lang->story->reviewTip['recalled']; + } + } + $menu .= $this->buildMenu('story', 'review', $params . "&from=$story->from", $story, $type, 'search', '', 'showinonlybody', false, '', $title); + } + $title = $this->lang->story->recall; $isClick = $this->isClickable($story, 'recall'); if(!$isClick and $story->status != 'closed') { if($story->status == 'draft' and empty($storyReviewer)) $title = $this->lang->story->recallTip['recalled']; if($story->status == 'draft' and !empty($storyReviewer)) $title = $this->lang->story->recallTip['reviewed']; - if(empty($story->reviewedBy) and strpos('draft,changed', $story->status) !== false and !empty($story->reviewer) and $this->app->user->account != $story->openedBy) $title = $this->lang->story->recallTip['notOpenedBy']; + if(empty($story->reviewedBy) and strpos('draft,changing', $story->status) !== false and !empty($story->reviewer) and $this->app->user->account != $story->openedBy) $title = $this->lang->story->recallTip['notOpenedBy']; if($story->status == 'active' and empty($story->reviewer)) $title = $this->lang->story->recallTip['actived']; } - $menu .= $this->buildMenu('story', 'recall', $params, $story, $type, 'undo', 'hiddenwin', 'showinonlybody', '', '', $title); + $method = $story->status == 'changing' ? 'recallChange' : 'recall'; + $menu .= $this->buildMenu('story', $method, $params, $story, $type, 'undo', 'hiddenwin', 'showinonlybody', '', '', $story->status == 'changing' ? '' : $title); $menu .= $this->buildMenu('story', 'close', $params, $story, $type, '', '', 'iframe', true); - $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type, '', '', 'showinonlybody'); + $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type, '', '', 'showinonlybody', false, '', $story->status == 'draft' ? $this->lang->story->editDraft : ''); $tab = $this->app->tab == 'project' ? 'project' : 'qa'; if($story->type != 'requirement' and $this->config->vision != 'lite') $menu .= $this->buildMenu('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$params", $story, $type, 'sitemap', '', 'showinonlybody', false, "data-app='$tab'"); @@ -4170,7 +4278,7 @@ class storyModel extends model $menu .= $this->buildFlowMenu('story', $story, $type, 'direct'); $menu .= "
"; - $menu .= $this->buildMenu('story', 'edit', $params, $story, $type); + $menu .= $this->buildMenu('story', 'edit', $params, $story, $type, $story->status == 'draft' ? 'draft-edit' : '', '', 'showinonlybody', '', '', $story->status == 'draft' ? $this->lang->story->editDraft : ''); $menu .= $this->buildMenu('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&{$params}&executionID=0&bugID=0&planID=0&todoID=0&extra=&type=$story->type", $story, $type, 'copy', '', '', '', "data-width='1050'"); $menu .= $this->buildMenu('story', 'delete', $params, $story, 'button', 'trash', 'hiddenwin', 'showinonlybody', true); } @@ -4189,14 +4297,14 @@ class storyModel extends model if(common::hasPriv('story', 'review')) { - $reviewDisabled = in_array($this->app->user->account, $story->notReview) and ($story->status == 'draft' or $story->status == 'changed') ? '' : 'disabled'; + $reviewDisabled = in_array($this->app->user->account, $story->notReview) and ($story->status == 'draft' or $story->status == 'changing') ? '' : 'disabled'; $story->from = 'execution'; $menu .= common::printIcon('story', 'review', "story={$story->id}&from=story", $story, 'list', 'search', '', $reviewDisabled, false, "data-group=execution"); } if(common::hasPriv('story', 'recall')) { - $recallDisabled = empty($story->reviewedBy) and strpos('draft,changed', $story->status) !== false and !empty($story->reviewer) ? '' : 'disabled'; + $recallDisabled = empty($story->reviewedBy) and strpos('draft,changing', $story->status) !== false and !empty($story->reviewer) ? '' : 'disabled'; $menu .= common::printIcon('story', 'recall', "story={$story->id}", $story, 'list', 'undo', 'hiddenwin', $recallDisabled, '', '', $this->lang->story->recall); } @@ -5377,23 +5485,32 @@ class storyModel extends model public function setStatusByReviewRules($reviewerList) { $status = ''; + $results = ''; $passCount = 0; $rejectCount = 0; $reviewRule = $this->config->story->reviewRules; foreach($reviewerList as $reviewer => $reviewResult) { + if($reviewResult == 'clarify') return 'draft'; + $passCount = $reviewResult == 'pass' ? $passCount + 1 : $passCount; $rejectCount = $reviewResult == 'reject' ? $rejectCount + 1 : $rejectCount; + + $results .= $reviewResult . ','; } if($reviewRule == 'allpass') { + if(strpos($results, 'reject') !== false) return 'closed'; + if($passCount == count($reviewerList)) $status = 'active'; if($rejectCount == count($reviewerList)) $status = 'closed'; } if($reviewRule == 'halfpass') { + if($rejectCount == floor(count($revireList) / 2)) return 'closed'; + if($passCount >= floor(count($reviewerList) / 2) + 1) $status = 'active'; if($rejectCount >= floor(count($reviewerList) / 2) + 1) $status = 'closed'; } @@ -5432,7 +5549,7 @@ class storyModel extends model { if($story->status == 'closed') $this->action->create('story', $story->id, 'ReviewRejected'); if($story->status == 'active') $this->action->create('story', $story->id, 'ReviewPassed'); - if(!array_diff(array_keys($reviewers), $reviewedBy) and ($story->status == 'draft' or $story->status == 'changed')) $this->action->create('story', $story->id, 'ReviewClarified'); + if(!array_diff(array_keys($reviewers), $reviewedBy) and ($story->status == 'draft' or $story->status == 'changing')) $this->action->create('story', $story->id, 'ReviewClarified'); } return $actionID; @@ -5487,11 +5604,11 @@ class storyModel extends model public function superReview($storyID, $oldStory, $story, $result = '', $reason = '') { $now = helper::now(); - $status = ''; + $status = $oldStory->status; $result = isset($_POST['result']) ? $this->post->result : $result; if(strpos('revert,pass', $result) !== false) $status = 'active'; if($result == 'reject') $status = 'closed'; - if($result == 'clarify' or empty($status)) $status = $oldStory->status; + if($result == 'clarify') $status = 'draft'; $story->status = $status; diff --git a/module/story/view/activate.html.php b/module/story/view/activate.html.php index 18c08dfe88..a494c19786 100644 --- a/module/story/view/activate.html.php +++ b/module/story/view/activate.html.php @@ -34,6 +34,8 @@ story->statusList['']); unset($lang->story->statusList['closed']); + unset($lang->story->statusList['changing']); + unset($lang->story->statusList['reviewing']); echo html::select('status', $lang->story->statusList, 'active', 'class="form-control chosen"'); ?> diff --git a/module/story/view/batchcreate.html.php b/module/story/view/batchcreate.html.php index 07f38f0967..c152e297ae 100755 --- a/module/story/view/batchcreate.html.php +++ b/module/story/view/batchcreate.html.php @@ -131,7 +131,8 @@ - save);?> + story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?> + save, "id='saveButton'", 'btn btn-primary btn-wide');?> diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index 9b485e3d92..783cecc073 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -270,10 +270,6 @@ foreach(explode(',', $config->story->create->requiredFields) as $field) story->verify;?> - - story->status;?> - - printExtendFields('', 'table', 'columns=4');?> story->legendAttatch;?> @@ -300,7 +296,9 @@ foreach(explode(',', $config->story->create->requiredFields) as $field) - + + story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?> + save, "id='saveButton'", 'btn btn-primary btn-wide');?> goback, '', 'class="btn btn-wide"') : html::backButton('', $source == 'bug' ? 'data-app=qa' : '');?> diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index 193efa168f..a53e6e5539 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -34,7 +34,7 @@
-
+
@@ -43,16 +43,20 @@
- title, 'class="form-control disabled story-title" disabled="disabled"');?> + title, 'class="form-control disabled story-title"' . ($story->status == 'draft' ? '' : ' disabled="disabled"'));?>
story->legendSpec;?>
-
spec;?>
+
+ status == 'draft' ? html::textarea('spec', htmlSpecialString($story->spec), "rows='5' class='form-control'") : $story->spec;?> +
story->verify;?>
-
verify;?>
+
+ status == 'draft' ? html::textarea('verify', htmlSpecialString($story->verify), "rows='5' class='form-control'") : $story->verify;?> +
printExtendFields($story, 'div', 'position=left');?>
@@ -241,15 +245,14 @@ printExtendFields($story, 'div', 'position=right');?> + status == 'closed'):?>
story->legendMisc;?>
- status == 'closed'):?> -
story->duplicateStory;?> duplicateStory == 0 ? '' : $story->duplicateStory, "class='form-control'");?>
story->linkStory;?> @@ -280,6 +283,7 @@
+
diff --git a/module/story/view/review.html.php b/module/story/view/review.html.php index 73cfdc29d5..43316a92ce 100644 --- a/module/story/view/review.html.php +++ b/module/story/view/review.html.php @@ -55,12 +55,6 @@ story->childStories;?> - status == 'changed' or ($story->status == 'draft' and $story->version > 1)):?> - - story->preVersion;?> - version - 1, 1), range($story->version - 1, 1)), $story->version - 1);?> - - story->status;?> status);?> diff --git a/module/tutorial/model.php b/module/tutorial/model.php index 604148087a..f549488e83 100644 --- a/module/tutorial/model.php +++ b/module/tutorial/model.php @@ -98,24 +98,26 @@ class tutorialModel extends model { $product = $this->getProduct(); $product->stories = array(); - $product->stories[0] = ''; - $product->stories[1] = 'draft'; - $product->stories[2] = 'active'; - $product->stories[3] = 'closed'; - $product->stories[4] = 'changed'; - $product->stories[''] = 0; - $product->stories['draft'] = 0; - $product->stories['active'] = 0; - $product->stories['closed'] = 0; - $product->stories['changed'] = 0; - $product->requirements = $product->stories; - $product->plans = 0; - $product->releases = 0; - $product->bugs = 0; - $product->unResolved = 0; - $product->closedBugs = 0; - $product->fixedBugs = 0; - $product->assignToNull = 0; + $product->stories[0] = ''; + $product->stories[1] = 'draft'; + $product->stories[2] = 'reviewing'; + $product->stories[3] = 'active'; + $product->stories[4] = 'closed'; + $product->stories[5] = 'changing'; + $product->stories[''] = 0; + $product->stories['draft'] = 0; + $product->stories['reviewing'] = 0; + $product->stories['active'] = 0; + $product->stories['closed'] = 0; + $product->stories['changing'] = 0; + $product->requirements = $product->stories; + $product->plans = 0; + $product->releases = 0; + $product->bugs = 0; + $product->unResolved = 0; + $product->closedBugs = 0; + $product->fixedBugs = 0; + $product->assignToNull = 0; $productStat[$product->program][$product->line]['products'][$product->id] = $product; return $productStat; From 7bbaee5a6ab969d98c63b0a77f4a402d39aea18b Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Sat, 13 Aug 2022 13:41:53 +0800 Subject: [PATCH 002/223] * Add file of submit review story. --- module/story/css/submitreview.css | 3 ++ module/story/view/submitreview.html.php | 65 +++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 module/story/css/submitreview.css create mode 100644 module/story/view/submitreview.html.php diff --git a/module/story/css/submitreview.css b/module/story/css/submitreview.css new file mode 100644 index 0000000000..b9ff94d49c --- /dev/null +++ b/module/story/css/submitreview.css @@ -0,0 +1,3 @@ +.needNotReviewBox {width: 130px;} +.needNotReviewBox span.input-group-addon {border: 1px solid #dcdcdc; border-left-width: 0px;} +.table > tbody > tr > th {vertical-align: top; padding-top: 13px;} diff --git a/module/story/view/submitreview.html.php b/module/story/view/submitreview.html.php new file mode 100644 index 0000000000..d8865c9955 --- /dev/null +++ b/module/story/view/submitreview.html.php @@ -0,0 +1,65 @@ + + * @package story + * @version $Id: submitreview.html.php 935 2022-07-20 09:49:24Z $ + * @link https://www.zentao.net + */ +?> + + +
+
+
+

+ id;?> + title'>" . $story->title . '') : html::a($this->createLink('story', 'view', 'story=' . $story->id), $story->title);?> + + arrow . $lang->story->submitReview;?> + +

+
+
+ + + + + + + + +
story->reviewedBy;?>reviewer)) echo "class='required'";?>> +
+ story->checkForceReview()):?> +
+ reviewer, "class='form-control picker-select' multiple");?> +
+
+ +
+ /> + +
+
+
+ +
+ reviewer, "class='form-control picker-select' multiple required");?> +
+ +
+
+ id);?> + + goback, $this->session->storyList, '', '', 'btn btn-wide');?> +
+
+
+ +
+
+ From d9a8156b768e827c803aff6aeed5ac0c6fbac777 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 15 Aug 2022 22:03:08 +0800 Subject: [PATCH 003/223] * Modify changing process. --- db/update17.5.sql | 1 + module/story/control.php | 73 +++++++++++++++++++++++++------ module/story/js/common.js | 34 ++++++++++++++ module/story/js/create.js | 19 -------- module/story/js/submitreview.js | 16 +++++++ module/story/lang/zh-cn.php | 5 +++ module/story/model.php | 50 +++++++++++---------- module/story/test.php | 5 +++ module/story/view/change.html.php | 6 ++- module/story/view/create.html.php | 2 +- module/story/view/edit.html.php | 18 +++++--- module/story/view/recall.html.php | 43 ++++++++++++++++++ 12 files changed, 210 insertions(+), 62 deletions(-) create mode 100644 db/update17.5.sql create mode 100644 module/story/js/submitreview.js create mode 100644 module/story/test.php create mode 100644 module/story/view/recall.html.php diff --git a/db/update17.5.sql b/db/update17.5.sql new file mode 100644 index 0000000000..ea7b0c6a44 --- /dev/null +++ b/db/update17.5.sql @@ -0,0 +1 @@ +UPDATE `zt_story` SET `status` = 'changing' WHERE `status` = 'changed'; diff --git a/module/story/control.php b/module/story/control.php index 4b63c96087..755e5715ca 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -824,7 +824,7 @@ class story extends control $reviewerList = $this->story->getReviewerPairs($story->id, $story->version); $reviewerList = array_keys($reviewerList); $reviewedBy = explode(',', trim($story->reviewedBy, ',')); - if($story->status == 'draft' or (array_diff($reviewerList, $reviewedBy) and strpos('draft,changing', $story->status) !== false)) $isShowReviewer = true; + if(strpos('draft,changing', $story->status) !== false or array_diff($reviewerList, $reviewedBy)) $isShowReviewer = true; $reviewedReviewer = array(); foreach($reviewedBy as $reviewer) $reviewedReviewer[] = zget($users, $reviewer); @@ -1496,39 +1496,67 @@ class story extends control } /** - * Recall the story review. + * Recall the story review or story change. * * @param int $storyID - * @param string $from + * @param string $from list + * @param string $confirm no|yes * @access public * @return void */ - public function recall($storyID, $from = 'list') + public function recall($storyID, $from = 'list', $confirm = 'no') { $story = $this->story->getById($storyID); - $this->story->recall($storyID); - $this->loadModel('action')->create('story', $storyID, 'Recalled'); - if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID={$storyID}&from=view"))); + if($story->status == 'changing') + { + echo $this->fetch('story', 'recallChange', "storyID=$storyID&confrim=$confirm"); + } + elseif($story->status == 'reviewing' and empty($story->changedBy)) + { + /* When the story are in the status of reviewing but not changed, only recall review.*/ + echo $this->fetch('story', 'recallReview', "storyID=$storyID&from=$from"); + } + elseif($story->status == 'reviewing' and !empty($story->changedBy)) + { + if($_POST) + { + $recallResult = $this->post->recallList; + if($recallResult == 'recallReview') + { + $this->story->recallReview($storyID); + $this->loadModel('action')->create('story', $storyID, 'Recalled'); + } + if($recallResult == 'recallChange') + { + $this->story->recallChange($storyID); + $this->loadModel('action')->create('story', $storyID, 'recalledChange'); + } - $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); - echo js::locate($locateLink, 'parent'); + $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); + echo js::locate($locateLink, 'parent.parent'); + } + + $this->view->story = $story; + $this->view->users = $this->user->getPairs('noclosed|noletter'); + $this->view->actions = $this->action->getList('story', $storyID); + $this->display(); + } } /** - * Recall story change. + * Recall the story change. * * @param int $storyID + * @param string $confirm * @access public * @return void */ public function recallChange($storyID, $confirm = 'no') { - $story = $this->story->getById($storyID); - if($confirm == 'no') { - return print(js::confirm($this->lang->story->recallChangeTips, $this->createLink('story', 'recallChange', "story=$storyID&confirm=yes"))); + return print(js::confirm($this->lang->story->recallChangeTips, $this->createLink('story', 'recall', "story=$storyID&from=lite&confirm=yes"))); } else { @@ -1540,6 +1568,25 @@ class story extends control } } + /** + * Recall the story review. + * + * @param int $storyID + * @param string $from + * @access public + * @return void + */ + public function recallReview($storyID, $from = 'list') + { + $this->story->recallReview($storyID); + $this->loadModel('action')->create('story', $storyID, 'Recalled'); + + if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID={$storyID}&from=view"))); + + $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); + echo js::locate($locateLink, 'parent'); + } + /** * Submit review. * diff --git a/module/story/js/common.js b/module/story/js/common.js index 191033a664..ce4a67d484 100644 --- a/module/story/js/common.js +++ b/module/story/js/common.js @@ -11,6 +11,40 @@ $(function() $("#navbar .nav li[data-id=" + storyType + ']').addClass('active'); $('#subNavbar li[data-id="' + storyType + '"]').addClass('active'); } + + $('#saveButton').on('click', function() + { + $('#saveButton').attr('disabled', true); + $('#saveDraftButton').attr('disabled', true); + + var storyStatus = !$('#reviewer').val() || $('#needNotReview').is(':checked') ? 'active' : 'reviewing'; + $('').attr('type', 'hidden').attr('name', 'status').attr('value', storyStatus).appendTo('#dataform'); + $('#dataform').submit(); + + setTimeout(function() + { + $('#saveButton').removeAttr('disabled'); + $('#saveDraftButton').removeAttr('disabled'); + }, 1000); + }); + + $('#saveDraftButton').on('click', function() + { + $('#saveButton').attr('disabled', true); + $('#saveDraftButton').attr('disabled', true); + + storyStatus = 'draft'; + if(typeof(page) != 'undefined' && page == 'change') storyStatus = 'changing'; + if(typeof(page) !== 'undefined' && page == 'edit' && $('#status').val() == 'changing') storyStatus = 'changing'; + $('').attr('type', 'hidden').attr('name', 'status').attr('value', storyStatus).appendTo('#dataform'); + $('#dataform').submit(); + + setTimeout(function() + { + $('#saveButton').removeAttr('disabled'); + $('#saveDraftButton').removeAttr('disabled'); + }, 1000); + }); }) /** diff --git a/module/story/js/create.js b/module/story/js/create.js index fbdb2105c3..979300b4bb 100644 --- a/module/story/js/create.js +++ b/module/story/js/create.js @@ -74,25 +74,6 @@ $(function() return false; }); - - $('#saveButton').on('click', function() - { - $('#saveButton').attr('disabled', true); - $('#saveDraftButton').attr('disabled', true); - - var storyStatus = $('#reviewer').val() ? 'reviewing' : 'active'; - $('').attr('type', 'hidden').attr('name', 'status').attr('value', storyStatus).appendTo('#dataform'); - $('#dataform').submit(); - }); - - $('#saveDraftButton').on('click', function() - { - $('#saveButton').attr('disabled', true); - $('#saveDraftButton').attr('disabled', true); - - $('').attr('type', 'hidden').attr('name', 'status').attr('value', 'draft').appendTo('#dataform'); - $('#dataform').submit(); - }); }); /** diff --git a/module/story/js/submitreview.js b/module/story/js/submitreview.js new file mode 100644 index 0000000000..3734ca5b4e --- /dev/null +++ b/module/story/js/submitreview.js @@ -0,0 +1,16 @@ +$(function() +{ + $('#needNotReview').on('change', function() + { + $('#reviewer').text('').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated'); + if($(this).is(':checked')) + { + $('#reviewerBox').removeClass('required'); + } + else + { + $('#reviewerBox').addClass('required'); + } + }); + if(!$('#reviewer').val()) $('#needNotReview').change(); +}); diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 53d05dbb09..00a7f66502 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -26,6 +26,7 @@ $lang->story->review = '评审'; $lang->story->submitReview = "提交评审"; $lang->story->recall = '撤销评审'; $lang->story->recallChange = '撤销变更'; +$lang->story->recallAction = '撤销'; $lang->story->needReview = '需要评审'; $lang->story->batchReview = '批量评审'; $lang->story->edit = "编辑"; @@ -460,3 +461,7 @@ $lang->story->subDivideTip['notActive'] = '需求不是激活状态,无法进 $lang->story->featureBar['browse']['all'] = $lang->all; $lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; + +$lang->story->recallList = array(); +$lang->story->recallList['recallReview'] = '撤销评审'; +$lang->story->recallList['recallChange'] = '撤销变更'; diff --git a/module/story/model.php b/module/story/model.php index 0f1108a022..d0704b37bf 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -702,8 +702,6 @@ class storyModel extends model ->add('lastEditedDate', $now) ->setIF(!$this->post->assignedTo, 'assignedTo', '') ->setIF($specChanged, 'version', $oldStory->version + 1) - ->setIF($specChanged and $oldStory->status == 'active' and $this->post->needNotReview == false, 'status', 'changing') - ->setIF($oldStory->status == 'draft' and $this->post->needNotReview, 'status', 'active') ->setIF($specChanged, 'reviewedBy', '') ->setIF($specChanged, 'changedBy', $this->app->user->account) ->setIF($specChanged, 'changedDate', $now) @@ -711,10 +709,11 @@ class storyModel extends model ->setIF($specChanged, 'closedReason', '') ->setIF($specChanged and $oldStory->reviewedBy, 'reviewedDate', '0000-00-00') ->setIF($specChanged and $oldStory->closedBy, 'closedDate', '0000-00-00') + ->setIF(!$specChanged, 'status', $oldStory->status) ->stripTags($this->config->story->editor->change['id'], $this->config->allowedTags) ->remove('files,labels,reviewer,comment,needNotReview,uid') ->get(); - if($specChanged and isset($story->status) && $story->status == 'active' and $this->checkForceReview()) $story->status = 'changing'; + $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid); $this->dao->update(TABLE_STORY)->data($story, 'spec,verify') ->autoCheck() @@ -794,17 +793,24 @@ class storyModel extends model return false; } + $oldSpec = $this->dao->select('title,spec,verify')->from(TABLE_STORYSPEC)->where('story')->eq((int)$storyID)->andWhere('version')->eq($oldStory->version)->fetch(); + $oldStory->title = isset($oldSpec->title) ? $oldSpec->title : ''; + $oldStory->spec = isset($oldSpec->spec) ? $oldSpec->spec : ''; + $oldStory->verify = isset($oldSpec->verify) ? $oldSpec->verify : ''; + $story = fixer::input('post') ->cleanInt('product,module,pri,duplicateStory') ->cleanFloat('estimate') ->setDefault('assignedDate', $oldStory->assignedDate) ->setDefault('lastEditedBy', $this->app->user->account) ->setDefault('reviewedBy', $oldStory->reviewedBy) + ->setDefault('title', $oldStory->title) + ->setDefault('spec', $oldStory->spec) + ->setDefault('verify', $oldStory->verify) ->setDefault('mailto', '') ->add('id', $storyID) ->add('lastEditedDate', $now) ->setDefault('plan,notifyEmail', '') - ->setDefault('status', $oldStory->status) ->setDefault('product', $oldStory->product) ->setDefault('branch', $oldStory->branch) ->setIF(!$this->post->linkStories, 'linkStories', '') @@ -827,6 +833,7 @@ class storyModel extends model if($oldStory->type == 'story' and !isset($story->linkStories)) $story->linkStories = ''; if($oldStory->type == 'requirement' and !isset($story->linkRequirements)) $story->linkRequirements = ''; + if($oldStory->status == 'changing' and $story->status == 'draft') $story->status = 'changing'; if(isset($story->plan) and is_array($story->plan)) $story->plan = trim(join(',', $story->plan), ','); if(isset($_POST['branch']) and $_POST['branch'] == 0) $story->branch = 0; @@ -890,12 +897,6 @@ class storyModel extends model $story->reviewers = implode(',', array_keys($this->getReviewerPairs($storyID, $oldStory->version))); } - $specChanged = false; - $oldSpec = $this->dao->select('title,spec,verify')->from(TABLE_STORYSPEC)->where('story')->eq((int)$storyID)->andWhere('version')->eq($oldStory->version)->fetch(); - $oldStory->title = isset($oldSpec->title) ? $oldSpec->title : ''; - $oldStory->spec = isset($oldSpec->spec) ? $oldSpec->spec : ''; - $oldStory->verify = isset($oldSpec->verify) ? $oldSpec->verify : ''; - if($story->spec != $oldStory->spec or $story->verify != $oldStory->verify or $story->title != $oldStory->title) $specChanged = true; $this->dao->update(TABLE_STORY) ->data($story, 'reviewers,spec,verify') @@ -909,7 +910,7 @@ class storyModel extends model if(!dao::isError()) { - if($specChanged) + if($story->spec != $oldStory->spec or $story->verify != $oldStory->verify or $story->title != $oldStory->title) { $data = new stdclass(); $data->title = $story->title; @@ -1567,10 +1568,11 @@ class storyModel extends model * @access public * @return void */ - public function recall($storyID) + public function recallReview($storyID) { $story = $this->getById($storyID); - $this->dao->update(TABLE_STORY)->set('status')->eq('draft')->where('id')->eq($storyID)->exec(); + $status = $story->changedBy ? 'changing' : 'draft'; + $this->dao->update(TABLE_STORY)->set('status')->eq($status)->where('id')->eq($storyID)->exec(); $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($story->version)->exec(); } @@ -4118,9 +4120,9 @@ class storyModel extends model $isSuperReviewer = strpos(',' . trim(zget($config->story, 'superReviewers', ''), ',') . ',', ',' . $app->user->account . ','); - if($action == 'change') return ($isSuperReviewer !== false or count($story->reviewer) == 0 or count($story->notReview) == 0) and $story->status != 'closed' and $story->status != 'draft'; - if($action == 'review') return (($isSuperReviewer !== false or in_array($app->user->account, $story->notReview)) and ($story->status == 'reviewing' or $story->status == 'changing')); - if($action == 'recall') return empty($story->reviewedBy) and strpos('reviewing,changing', $story->status) !== false and !empty($story->reviewer) and ($app->user->account == $story->openedBy); + if($action == 'change') return ($isSuperReviewer !== false or $story->status == 'active'); + if($action == 'review') return (($isSuperReviewer !== false or in_array($app->user->account, $story->notReview)) and $story->status == 'reviewing'); + if($action == 'recall') return strpos('reviewing,changing', $story->status) !== false; if($action == 'close') return $story->status != 'closed'; if($action == 'activate') return $story->status == 'closed'; if($action == 'assignto') return $story->status != 'closed'; @@ -4157,7 +4159,7 @@ class storyModel extends model $title = (!$isClick and $story->status != 'closed' and $story->status != 'draft') ? $this->lang->story->changeTip : ''; $menu .= $this->buildMenu('story', 'change', $params . "&from=$story->from", $story, $type, 'alter', '', 'showinonlybody', false, '', $title); - if($story->status == 'draft') + if(strpos('draft,changing', $story->status) !== false) { $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id", $story, $type, 'sub-review', '', 'iframe', true); } @@ -4187,7 +4189,10 @@ class storyModel extends model $menu .= $this->buildMenu('story', 'review', $params . "&from=$story->from", $story, $type, 'search', '', 'showinonlybody', false, '', $title); } - $title = $this->lang->story->recall; + $title = $this->lang->story->recallAction; + $iframe = ($story->status == 'reviewing' and !empty($story->changedBy)) ? 'iframe' : 'showinonlybody'; + if($story->status == 'changing') $title = $this->lang->story->recallChange; + if($story->status == 'reviewing' and empty($story->changedBy)) $title = $this->lang->story->recall; $isClick = $this->isClickable($story, 'recall'); if(!$isClick and $story->status != 'closed') { @@ -4196,11 +4201,10 @@ class storyModel extends model if(empty($story->reviewedBy) and strpos('draft,changing', $story->status) !== false and !empty($story->reviewer) and $this->app->user->account != $story->openedBy) $title = $this->lang->story->recallTip['notOpenedBy']; if($story->status == 'active' and empty($story->reviewer)) $title = $this->lang->story->recallTip['actived']; } - $method = $story->status == 'changing' ? 'recallChange' : 'recall'; - $menu .= $this->buildMenu('story', $method, $params, $story, $type, 'undo', 'hiddenwin', 'showinonlybody', '', '', $story->status == 'changing' ? '' : $title); + $menu .= $this->buildMenu('story', 'recall', $params, $story, $type, 'undo', 'hiddenwin', $iframe, true, 'data-width="40%"', $title); $menu .= $this->buildMenu('story', 'close', $params, $story, $type, '', '', 'iframe', true); - $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type, '', '', 'showinonlybody', false, '', $story->status == 'draft' ? $this->lang->story->editDraft : ''); + $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type, '', '', 'showinonlybody', false, '', ($story->status == 'draft' or $story->status == 'changing') ? $this->lang->story->editDraft : ''); $tab = $this->app->tab == 'project' ? 'project' : 'qa'; if($story->type != 'requirement' and $this->config->vision != 'lite') $menu .= $this->buildMenu('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$params", $story, $type, 'sitemap', '', 'showinonlybody', false, "data-app='$tab'"); @@ -5574,7 +5578,9 @@ class storyModel extends model $reviewedBy = explode(',', trim($story->reviewedBy, ',')); if(!array_diff(array_keys($reviewerList), $reviewedBy)) { - $status = $this->post->result == 'revert' ? 'active' : $this->setStatusByReviewRules($reviewerList); + $status = $this->post->result == 'revert' ? 'active' : $this->setStatusByReviewRules($reviewerList); + $status = ($status == 'draft' and $oldStory->changedBy) ? 'changing' : $status; + $story->status = $status ? $status : $oldStory->status; if($story->status == 'closed') { diff --git a/module/story/test.php b/module/story/test.php new file mode 100644 index 0000000000..5e68873ad6 --- /dev/null +++ b/module/story/test.php @@ -0,0 +1,5 @@ +arrow . ' ' . $lang->story->change;?>
-
+ @@ -87,7 +87,8 @@ @@ -107,4 +108,5 @@ type);?> app->rawModule);?> +app->rawMethod);?> diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index 783cecc073..4b9bc179c6 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -297,8 +297,8 @@ foreach(explode(',', $config->story->create->requiredFields) as $field) diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index a53e6e5539..852af611c7 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -43,19 +43,19 @@ - title, 'class="form-control disabled story-title"' . ($story->status == 'draft' ? '' : ' disabled="disabled"'));?> + title, 'class="form-control disabled story-title"' . (strpos('draft,changing', $story->status) !== false ? '' : ' disabled="disabled"'));?>
story->legendSpec;?>
- status == 'draft' ? html::textarea('spec', htmlSpecialString($story->spec), "rows='5' class='form-control'") : $story->spec;?> + status) !== false ? html::textarea('spec', htmlSpecialString($story->spec), "rows='5' class='form-control'") : $story->spec;?>
story->verify;?>
- status == 'draft' ? html::textarea('verify', htmlSpecialString($story->verify), "rows='5' class='form-control'") : $story->verify;?> + status) !== false ? html::textarea('verify', htmlSpecialString($story->verify), "rows='5' class='form-control'") : $story->verify;?>
printExtendFields($story, 'div', 'position=left');?> @@ -68,7 +68,15 @@
lastEditedDate); - echo html::submitButton($lang->save); + if(strpos('draft,changing', $story->status) !== false) + { + echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide'); + echo html::commonButton($lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide'); + } + else + { + echo html::submitButton($lang->save); + } if(!isonlybody()) echo html::backButton(); ?>
@@ -157,7 +165,7 @@ status);?> - status != 'draft' and $story->type == 'story'):?> + status) !== false and $story->type == 'story'):?> - + - + @@ -158,12 +158,12 @@ config->URAndSR):?> - + - + From a61ad52efae32e8b06b8522815bb5789b449af74 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 17 Aug 2022 08:41:05 +0800 Subject: [PATCH 005/223] * Code for task#62968. --- module/action/model.php | 3 +- module/story/control.php | 50 +++++++++++++++++------------ module/story/model.php | 37 ++++++++++++++++++++- module/story/view/activate.html.php | 4 --- 4 files changed, 67 insertions(+), 27 deletions(-) diff --git a/module/action/model.php b/module/action/model.php index 98b6cfe56c..3188e18d2a 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -510,7 +510,8 @@ class actionModel extends model elseif(($actionName == 'closed' and $action->objectType == 'story') or ($actionName == 'resolved' and $action->objectType == 'bug')) { $action->appendLink = ''; - if(strpos($action->extra, ':')!== false) + if(strpos($action->extra, '|') !== false) $action->extra = substr($action->extra, 0, strpos($action->extra, '|')); + if(strpos($action->extra, ':') !== false) { list($extra, $id) = explode(':', $action->extra); $action->extra = $extra; diff --git a/module/story/control.php b/module/story/control.php index 755e5715ca..7cfa34ee84 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1201,6 +1201,7 @@ class story extends control } $this->commonAction($storyID); + $this->story->setActivateStatus($storyID); /* Assign. */ $this->view->title = $this->lang->story->activate . "STORY" . $this->lang->colon . $this->view->story->title; @@ -1645,6 +1646,8 @@ class story extends control */ public function close($storyID, $from = '') { + $story = $this->story->getById($storyID); + if(!empty($_POST)) { $changes = $this->story->close($storyID); @@ -1653,7 +1656,10 @@ class story extends control if($changes) { - $actionID = $this->action->create('story', $storyID, 'Closed', $this->post->comment, ucfirst($this->post->closedReason) . ($this->post->duplicateStory ? ':' . (int)$this->post->duplicateStory : '')); + $preStatus = $story->status; + if($preStatus == 'reviewing') $preStatus = $story->changedBy ? 'changing' : 'draft'; + + $actionID = $this->action->create('story', $storyID, 'Closed', $this->post->comment, ucfirst($this->post->closedReason) . ($this->post->duplicateStory ? ':' . (int)$this->post->duplicateStory : '') . "|$preStatus"); $this->action->logHistory($actionID, $changes); } @@ -1699,7 +1705,6 @@ class story extends control } /* Get story and product. */ - $story = $this->story->getById($storyID); $product = $this->dao->findById($story->product)->from(TABLE_PRODUCT)->fields('name, id')->fetch(); $this->story->replaceURLang($story->type); @@ -1736,30 +1741,12 @@ class story extends control */ public function batchClose($productID = 0, $executionID = 0, $storyType = 'story', $from = '') { - if($this->post->comments) - { - $data = fixer::input('post')->get(); - $allChanges = $this->story->batchClose(); - - if($allChanges) - { - foreach($allChanges as $storyID => $changes) - { - $actionID = $this->action->create('story', $storyID, 'Closed', htmlSpecialString($this->post->comments[$storyID]), ucfirst($this->post->closedReasons[$storyID]) . ($this->post->duplicateStoryIDList[$storyID] ? ':' . (int)$this->post->duplicateStoryIDList[$storyID] : '')); - $this->action->logHistory($actionID, $changes); - } - } - - if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); - return print(js::locate($this->session->storyList, 'parent')); - } - if(!$this->post->storyIdList) return print(js::locate($this->session->storyList, 'parent')); $storyIdList = $this->post->storyIdList; $storyIdList = array_unique($storyIdList); /* Get edited stories. */ - $stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($storyIdList)->fetchAll('id'); + $stories = $this->story->getByList($storyIdList); foreach($stories as $story) { if($story->parent == -1) @@ -1774,6 +1761,27 @@ class story extends control } } + if($this->post->comments) + { + $data = fixer::input('post')->get(); + $allChanges = $this->story->batchClose(); + + if($allChanges) + { + foreach($allChanges as $storyID => $changes) + { + $preStatus = $stories[$storyID]->status; + if($preStatus == 'reviewing') $preStatus = $stories[$storyID]->changedBy ? 'changing' : 'draft'; + + $actionID = $this->action->create('story', $storyID, 'Closed', htmlSpecialString($this->post->comments[$storyID]), ucfirst($this->post->closedReasons[$storyID]) . ($this->post->duplicateStoryIDList[$storyID] ? ':' . (int)$this->post->duplicateStoryIDList[$storyID] : '') . "|$preStatus"); + $this->action->logHistory($actionID, $changes); + } + } + + if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); + return print(js::locate($this->session->storyList, 'parent')); + } + $errorTips = ''; if(isset($closedStory)) $errorTips .= sprintf($this->lang->story->closedStory, join(',', $closedStory)); if(isset($skipStory)) $errorTips .= sprintf($this->lang->story->skipStory, join(',', $skipStory)); diff --git a/module/story/model.php b/module/story/model.php index d0704b37bf..03e79c8ae9 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -5551,7 +5551,7 @@ class storyModel extends model if($result != 'revert') { - if($story->status == 'closed') $this->action->create('story', $story->id, 'ReviewRejected'); + if($story->status == 'closed') $this->action->create('story', $story->id, 'ReviewRejected', '', empty($story->changedBy) ? 'draft' : 'changing'); if($story->status == 'active') $this->action->create('story', $story->id, 'ReviewPassed'); if(!array_diff(array_keys($reviewers), $reviewedBy) and ($story->status == 'draft' or $story->status == 'changing')) $this->action->create('story', $story->id, 'ReviewClarified'); } @@ -5853,4 +5853,39 @@ class storyModel extends model return $stories; } + + /** + * Set the selectable status when activated. + * + * @param int $storyID + * @access public + * @return void + */ + public function setActivateStatus($storyID) + { + $lastRecord = $this->dao->select('action,extra')->from(TABLE_ACTION) + ->where('objectType')->eq('story') + ->andWhere('objectID')->eq($storyID) + ->orderBy('id_desc') + ->fetch(); + + $lastAction = $lastRecord->action; + $preStatus = $lastRecord->extra; + if(strpos($preStatus, '|') !== false) $preStatus = substr($preStatus, strpos($preStatus, '|') + 1); + + if(strpos('closed,reviewrejected', $lastAction) !== false) + { + foreach($this->lang->story->statusList as $status => $lang) + { + if($preStatus == $status or $status == 'active') continue; + unset($this->lang->story->statusList[$status]); + } + + if($this->checkForceReview() and $preStatus != 'active') unset($this->lang->story->statusList['active']); + } + else + { + foreach(array('', 'closed', 'changing', 'reviewing') as $status) unset($this->lang->story->statusList[$status]); + } + } } diff --git a/module/story/view/activate.html.php b/module/story/view/activate.html.php index a494c19786..565035f2f2 100644 --- a/module/story/view/activate.html.php +++ b/module/story/view/activate.html.php @@ -32,10 +32,6 @@ From 7fd5c4352d90fa9c31d18f6e64f769d4cc5ba52c Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 17 Aug 2022 09:03:38 +0800 Subject: [PATCH 006/223] * Modify svae draft sauccess lang. --- module/story/control.php | 2 +- module/story/lang/de.php | 13 +++++++------ module/story/lang/en.php | 13 +++++++------ module/story/lang/fr.php | 13 +++++++------ module/story/lang/vi.php | 12 +++++++----- module/story/lang/zh-cn.php | 13 +++++++------ 6 files changed, 36 insertions(+), 30 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 7cfa34ee84..5f050e5691 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -189,7 +189,7 @@ class story extends control $message = $this->executeHooks($storyID); if($message) $this->lang->saveSuccess = $message; - $response['message'] = $this->lang->saveSuccess; + $response['message'] = $this->post->status == 'draft' ? $this->lang->story->saveDraftSuccess : $this->lang->saveSuccess; if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $storyID)); diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 0f573eaad9..8986c547a1 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -86,12 +86,13 @@ $lang->story->deleteAction = "Delete Story"; $lang->story->exportAction = "Export Story"; $lang->story->reportAction = "Story Report"; -$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; -$lang->story->closedStory = 'Story %s is closed and will not be closed.'; -$lang->story->batchToTaskTips = "The closed {$lang->SRCommon} will not be converted into tasks."; -$lang->story->successToTask = "Converted to task."; -$lang->story->storyRound = '%s time estimation'; -$lang->story->float = "『%s』should be positive number, decimals included."; +$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; +$lang->story->closedStory = 'Story %s is closed and will not be closed.'; +$lang->story->batchToTaskTips = "The closed {$lang->SRCommon} will not be converted into tasks."; +$lang->story->successToTask = "Converted to task."; +$lang->story->storyRound = '%s time estimation'; +$lang->story->float = "『%s』should be positive number, decimals included."; +$lang->story->saveDraftSuccess = 'Save as draft succeeded.'; $lang->story->id = 'ID'; $lang->story->parent = 'Parent'; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index e13eaaacee..46b4c090c8 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -86,12 +86,13 @@ $lang->story->deleteAction = "Delete {$lang->SRCommon}"; $lang->story->exportAction = "Export {$lang->SRCommon}"; $lang->story->reportAction = "Report"; -$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; -$lang->story->closedStory = 'Story %s is closed and will not be closed.'; -$lang->story->batchToTaskTips = "The closed {$lang->SRCommon} will not be converted into tasks."; -$lang->story->successToTask = "Converted to task."; -$lang->story->storyRound = '%s time estimation'; -$lang->story->float = "『%s』should have positive number, or decimals."; +$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; +$lang->story->closedStory = 'Story %s is closed and will not be closed.'; +$lang->story->batchToTaskTips = "The closed {$lang->SRCommon} will not be converted into tasks."; +$lang->story->successToTask = "Converted to task."; +$lang->story->storyRound = '%s time estimation'; +$lang->story->float = "『%s』should have positive number, or decimals."; +$lang->story->saveDraftSuccess = 'Save as draft succeeded.'; $lang->story->id = 'ID'; $lang->story->parent = 'Parent'; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index 3aeb9a9ed4..a0fba9d794 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -86,12 +86,13 @@ $lang->story->deleteAction = "Supprimer Story"; $lang->story->exportAction = "Exporter Story"; $lang->story->reportAction = "Rapport de Story"; -$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; -$lang->story->closedStory = 'Story %s is closed and will not be closed.'; -$lang->story->batchToTaskTips = "The closed {$lang->SRCommon} will not be converted into tasks."; -$lang->story->successToTask = "Converted to task."; -$lang->story->storyRound = '%s time estimation'; -$lang->story->float = "『 %s 』doit avoir des nombres positifs ou décimaux."; +$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; +$lang->story->closedStory = 'Story %s is closed and will not be closed.'; +$lang->story->batchToTaskTips = "The closed {$lang->SRCommon} will not be converted into tasks."; +$lang->story->successToTask = "Converted to task."; +$lang->story->storyRound = '%s time estimation'; +$lang->story->float = "『 %s 』doit avoir des nombres positifs ou décimaux."; +$lang->story->saveDraftSuccess = 'Save as draft succeeded.'; $lang->story->id = 'ID'; $lang->story->parent = 'Parent'; diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php index cd3fc1aeff..e57339ed30 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -84,11 +84,13 @@ $lang->story->deleteAction = "Delete {$lang->SRCommon}"; $lang->story->exportAction = "Export {$lang->SRCommon}"; $lang->story->reportAction = "Report"; -$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; -$lang->story->closedStory = 'Story %s is closed and will not be closed.'; -$lang->story->batchToTaskTips = "This action will create a task with the same name as the selected {$lang->SRCommon} and link {$lang->SRCommon} to the task. The closed {$lang->SRCommon} will not be converted into tasks."; -$lang->story->successToTask = "Converted to task."; -$lang->story->storyRound = '%s time estimation'; +$lang->story->skipStory = '%s is a parent story. It cannot be closed.'; +$lang->story->closedStory = 'Story %s is closed and will not be closed.'; +$lang->story->batchToTaskTips = "This action will create a task with the same name as the selected {$lang->SRCommon} and link {$lang->SRCommon} to the task. The closed {$lang->SRCommon} will not be converted into tasks."; +$lang->story->successToTask = "Converted to task."; +$lang->story->storyRound = '%s time estimation'; +$lang->story->float = "『%s』should be positive number, decimals included."; +$lang->story->saveDraftSuccess = 'Save as draft succeeded.'; $lang->story->id = 'ID'; $lang->story->parent = 'Mẹ'; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 00a7f66502..ddcc91e248 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -87,12 +87,13 @@ $lang->story->deleteAction = "删除{$lang->SRCommon}"; $lang->story->exportAction = "导出{$lang->SRCommon}"; $lang->story->reportAction = "统计报表"; -$lang->story->skipStory = '需求:%s 为父需求,将不会被关闭。'; -$lang->story->closedStory = '需求:%s 已关闭,将不会被关闭。'; -$lang->story->batchToTaskTips = "已关闭的需求不会转为任务。"; -$lang->story->successToTask = '批量转任务成功'; -$lang->story->storyRound = '第 %s 轮估算'; -$lang->story->float = "『%s』应当是正数,可以是小数。"; +$lang->story->skipStory = '需求:%s 为父需求,将不会被关闭。'; +$lang->story->closedStory = '需求:%s 已关闭,将不会被关闭。'; +$lang->story->batchToTaskTips = "已关闭的需求不会转为任务。"; +$lang->story->successToTask = '批量转任务成功'; +$lang->story->storyRound = '第 %s 轮估算'; +$lang->story->float = "『%s』应当是正数,可以是小数。"; +$lang->story->saveDraftSuccess = '存为草稿成功'; $lang->story->id = '编号'; $lang->story->parent = '父需求'; From 3881b0b34d730a66a88f1203a14a8c29af59a634 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 17 Aug 2022 13:15:41 +0800 Subject: [PATCH 007/223] * Add reviewer in edit story page. --- module/story/control.php | 28 +++++++++----------- module/story/css/edit.css | 2 ++ module/story/js/edit.js | 47 +++++++++++++++++++++++++-------- module/story/model.php | 15 ++++++----- module/story/view/edit.html.php | 31 ++++++++++++++++++++-- 5 files changed, 88 insertions(+), 35 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 5f050e5691..941d485945 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -746,6 +746,8 @@ class story extends control */ public function edit($storyID, $kanbanGroup = 'default') { + $story = $this->story->getById($storyID, 0, true); + if(!empty($_POST)) { $changes = $this->story->update($storyID); @@ -756,8 +758,8 @@ class story extends control $actionID = $this->action->create('story', $storyID, $action, $this->post->comment); $this->action->logHistory($actionID, $changes); - $story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch(); - if(isset($_POST['reviewer'])) $this->story->recordReviewAction($story); + $editedStory = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch(); + if(isset($_POST['reviewer']) and $story->status == 'reviewing') $this->story->recordReviewAction($editedStory); } $this->executeHooks($storyID); @@ -812,7 +814,6 @@ class story extends control $products = $myProducts + $othersProducts; /* Assign. */ - $story = $this->story->getById($storyID, 0, true); $product = $this->product->getById($story->product); $stories = $this->story->getParentStoryPairs($story->product, $story->parent); if(isset($stories[$storyID])) unset($stories[$storyID]); @@ -820,15 +821,6 @@ class story extends control /* Get users. */ $users = $this->user->getPairs('pofirst|nodeleted|noclosed', "$story->assignedTo,$story->openedBy,$story->closedBy"); - $isShowReviewer = false; - $reviewerList = $this->story->getReviewerPairs($story->id, $story->version); - $reviewerList = array_keys($reviewerList); - $reviewedBy = explode(',', trim($story->reviewedBy, ',')); - if(strpos('draft,changing', $story->status) !== false or array_diff($reviewerList, $reviewedBy)) $isShowReviewer = true; - - $reviewedReviewer = array(); - foreach($reviewedBy as $reviewer) $reviewedReviewer[] = zget($users, $reviewer); - if($this->app->tab == 'project' or $this->app->tab == 'execution') { $objectID = $this->app->tab == 'project' ? $this->session->project : $this->session->execution; @@ -846,6 +838,12 @@ class story extends control $branchTagOption[$branchInfo->id] = $branchInfo->name . ($branchInfo->status == 'closed' ? ' (' . $this->lang->branch->statusList['closed'] . ')' : ''); } + /* Get story reviewers. */ + $reviewedReviewer = array(); + $reviewerList = $this->story->getReviewerPairs($story->id, $story->version); + $reviewedBy = explode(',', trim($story->reviewedBy, ',')); + foreach($reviewedBy as $reviewer) $reviewedReviewer[] = zget($users, $reviewer); + /* Get product reviewers. */ $productReviewers = $product->reviewer; if(!$productReviewers and $product->acl != 'open') $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', '', ''); @@ -863,10 +861,10 @@ class story extends control $this->view->products = $products; $this->view->branchOption = $branchOption; $this->view->branchTagOption = $branchTagOption; - $this->view->reviewers = implode(',', $reviewerList); + $this->view->reviewers = array_keys($reviewerList); $this->view->reviewedReviewer = $reviewedReviewer; - $this->view->productReviewers = $this->user->getPairs('noclosed|nodeleted', $reviewerList, 0, $productReviewers); - $this->view->isShowReviewer = $isShowReviewer; + $this->view->productReviewers = $this->user->getPairs('noclosed|nodeleted', array_keys($reviewerList), 0, $productReviewers); + $this->display(); } diff --git a/module/story/css/edit.css b/module/story/css/edit.css index dbd7d9df3a..2bae76d3c1 100644 --- a/module/story/css/edit.css +++ b/module/story/css/edit.css @@ -2,3 +2,5 @@ .linkStoryTitle {white-space: nowrap; text-overflow: ellipsis;} .linkStoryTd > ul {margin-top: -10px;} .titleBox {margin: 0px 10px 10px 10px;} +.needNotReviewBox {width: 130px;} +.needNotReviewBox span.input-group-addon {border: 1px solid #dcdcdc; border-left-width: 0px;} diff --git a/module/story/js/edit.js b/module/story/js/edit.js index f3b8ffb683..6050a76534 100644 --- a/module/story/js/edit.js +++ b/module/story/js/edit.js @@ -1,24 +1,49 @@ $(function() { $('.main-side #branch').closest('td').find('#product_chosen .chosen-single').css('width', '153px'); - $('#reviewer_chosen .search-choice').each(function() - { - if(reviewedReviewer.indexOf($(this).find('span').text()) != -1) $(this).css('pointer-events', 'none'); - }) - $('#reviewer').change(function() + if(storyStatus == 'reviewing') { - if($('#reviewer_chosen .search-choice').length === 1) + $('#reviewer').next().find('.picker-selection').each(function() { - alert(reviewerNotEmpty); - $('#reviewer').val(reviewers); - $('#reviewer').trigger('chosen:updated'); + if(reviewedReviewer.indexOf($(this).find('span').text()) != -1) $(this).css('pointer-events', 'none'); + }) + + $('#reviewer').change(function() + { + if($('#reviewer').next().find('.picker-selection').length === 0) + { + alert(reviewerNotEmpty); + $('#reviewer').val(reviewers); + $('#reviewer').trigger('chosen:updated'); + } + else + { + reviewers = $('#reviewer').val(); + } + }); + } + else + { + $('#reviewer').change(function() + { + if(!$('#reviewer').val()) $('#needNotReview').attr('checked', true).change(); + }); + } + + $('#needNotReview').on('change', function() + { + $('#reviewer').text('').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated'); + if($(this).is(':checked')) + { + $('#reviewerBox').removeClass('required'); } else { - reviewers = $('#reviewer').val(); + $('#reviewerBox').addClass('required'); } - }) + }); + if(!$('#reviewer').val()) $('#needNotReview').change(); $('#source').on('change', function() { diff --git a/module/story/model.php b/module/story/model.php index 03e79c8ae9..755e5bb7e9 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -823,12 +823,11 @@ class storyModel extends model ->setIF(!in_array($this->post->source, $this->config->story->feedbackSource), 'notifyEmail', '') ->setIF(!empty($_POST['plan'][0]) and $oldStory->stage == 'wait', 'stage', 'planned') ->stripTags($this->config->story->editor->edit['id'], $this->config->allowedTags) - ->join('reviewedBy', ',') ->join('mailto', ',') ->join('linkStories', ',') ->join('linkRequirements', ',') ->join('childStories', ',') - ->remove('files,labels,comment,contactListMenu,stages,reviewer') + ->remove('files,labels,comment,contactListMenu,stages,reviewer,needNotReview') ->get(); if($oldStory->type == 'story' and !isset($story->linkStories)) $story->linkStories = ''; @@ -870,9 +869,9 @@ class storyModel extends model if(isset($story->stage) and $oldStory->stage != $story->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : ''; $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->edit['id'], $this->post->uid); - if(isset($_POST['reviewer'])) + if(isset($_POST['reviewer']) or isset($_POST['needNotReview'])) { - $_POST['reviewer'] = array_filter($_POST['reviewer']); + $_POST['reviewer'] = isset($_POST['needNotReview']) ? array() : array_filter($_POST['reviewer']); $oldReviewer = $this->getReviewerPairs($storyID, $oldStory->version); if(array_diff($_POST['reviewer'], array_keys($oldReviewer)) or array_diff(array_keys($oldReviewer), $_POST['reviewer'])) { @@ -889,15 +888,17 @@ class storyModel extends model $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); } - $story->reviewedBy = $oldStory->reviewedBy; - $story = $this->updateStoryByReview($storyID, $oldStory, $story); + if($story->status == 'reviewing') + { + $story->reviewedBy = $oldStory->reviewedBy; + $story = $this->updateStoryByReview($storyID, $oldStory, $story); + } } $oldStory->reviewers = implode(',', array_keys($oldReviewer)); $story->reviewers = implode(',', array_keys($this->getReviewerPairs($storyID, $oldStory->version))); } - $this->dao->update(TABLE_STORY) ->data($story, 'reviewers,spec,verify') ->autoCheck() diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index 852af611c7..b06f6d50d5 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -19,9 +19,10 @@ app->rawModule);?> story->module);?> - + story->notice->reviewerNotEmpty);?> story->feedbackSource); ?> +status);?>
@@ -46,6 +47,32 @@ title, 'class="form-control disabled story-title"' . (strpos('draft,changing', $story->status) !== false ? '' : ' disabled="disabled"'));?>
+ status) !== false):?> +
+
story->reviewers;?>
+
+
+ story->checkForceReview()):?> +
+ +
+
+ +
+ /> + +
+
+
+ +
+ +
+ +
+
+
+
story->legendSpec;?>
@@ -232,7 +259,7 @@ status == 'closed' ? $users + array('closed' => 'Closed') : $users;?>
- + status == 'reviewing'):?> From c49353ae13cb9dac39101b811cf93eee0d89f616 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 17 Aug 2022 13:36:10 +0800 Subject: [PATCH 008/223] * Add error comment when empty reviewer. --- module/story/js/edit.js | 2 +- module/story/model.php | 6 ++++++ module/story/view/edit.html.php | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/module/story/js/edit.js b/module/story/js/edit.js index 6050a76534..852681c02f 100644 --- a/module/story/js/edit.js +++ b/module/story/js/edit.js @@ -7,7 +7,7 @@ $(function() $('#reviewer').next().find('.picker-selection').each(function() { if(reviewedReviewer.indexOf($(this).find('span').text()) != -1) $(this).css('pointer-events', 'none'); - }) + }); $('#reviewer').change(function() { diff --git a/module/story/model.php b/module/story/model.php index 755e5bb7e9..5251dc5584 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -793,6 +793,12 @@ class storyModel extends model return false; } + if($this->checkForceReview() and empty($_POST['reviewer'])) + { + dao::$errors[] = $this->lang->story->errorEmptyReviewedBy; + return false; + } + $oldSpec = $this->dao->select('title,spec,verify')->from(TABLE_STORYSPEC)->where('story')->eq((int)$storyID)->andWhere('version')->eq($oldStory->version)->fetch(); $oldStory->title = isset($oldSpec->title) ? $oldSpec->title : ''; $oldStory->spec = isset($oldSpec->spec) ? $oldSpec->spec : ''; diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index b06f6d50d5..476413146f 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -66,7 +66,7 @@
- +
From d39529acb8d86e07af8adc3ab30ce48e18ed13fa Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 17 Aug 2022 13:53:02 +0800 Subject: [PATCH 009/223] * Modify do not submit lang. --- module/story/lang/de.php | 1 + module/story/lang/en.php | 1 + module/story/lang/fr.php | 1 + module/story/lang/vi.php | 1 + module/story/lang/zh-cn.php | 1 + module/story/view/change.html.php | 2 +- 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 8986c547a1..7819d294ac 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -74,6 +74,7 @@ $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; $lang->story->saveDraft = 'Save as draft'; +$lang->story->doNotSubmit = 'Do Not Submit'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Change Story"; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index 46b4c090c8..8d286633ef 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -74,6 +74,7 @@ $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; $lang->story->saveDraft = 'Save as draft'; +$lang->story->doNotSubmit = 'Do Not Submit'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Change {$lang->SRCommon}"; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index a0fba9d794..bddd17bf19 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -74,6 +74,7 @@ $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; $lang->story->saveDraft = 'Save as draft'; +$lang->story->doNotSubmit = 'Do Not Submit'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Changer Story"; diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php index e57339ed30..e22c0280ff 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -72,6 +72,7 @@ $lang->story->convertRelations = 'Convert Relations'; $lang->story->undetermined = 'undetermined'; $lang->story->order = 'Order'; $lang->story->saveDraft = 'Save as draft'; +$lang->story->doNotSubmit = 'Do Not Submit'; $lang->story->editAction = "Edit {$lang->SRCommon}"; $lang->story->changeAction = "Change {$lang->SRCommon}"; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index ddcc91e248..0f76ee0468 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -75,6 +75,7 @@ $lang->story->convertRelations = '换算关系'; $lang->story->undetermined = '待定'; $lang->story->order = '排序'; $lang->story->saveDraft = '存为草稿'; +$lang->story->doNotSubmit = '保存暂不提交'; $lang->story->editAction = "编辑{$lang->SRCommon}"; $lang->story->changeAction = "变更{$lang->SRCommon}"; diff --git a/module/story/view/change.html.php b/module/story/view/change.html.php index 32480fb32f..a843850270 100644 --- a/module/story/view/change.html.php +++ b/module/story/view/change.html.php @@ -88,7 +88,7 @@ lastEditedDate); echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide'); - echo html::commonButton($lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide'); + echo html::commonButton($lang->story->doNotSubmit, "id='saveDraftButton'", 'btn btn-secondary btn-wide'); if(!isonlybody()) echo html::backButton(); ?> From 63c69a104ee3a38270a4fcc1abc62ff1b5796003 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 17 Aug 2022 14:35:27 +0800 Subject: [PATCH 010/223] * Unit test of bug. --- module/bug/model.php | 1 - test/class/bug.class.php | 89 ++++++++++++++++++++++++++++ test/model/bug/getrelatedobjects.php | 33 +++++++++++ test/model/bug/getreviewbugs.php | 39 ++++++++++++ test/model/bug/getstatistic.php | 27 +++++++++ 5 files changed, 188 insertions(+), 1 deletion(-) create mode 100755 test/model/bug/getrelatedobjects.php create mode 100755 test/model/bug/getreviewbugs.php create mode 100755 test/model/bug/getstatistic.php diff --git a/module/bug/model.php b/module/bug/model.php index 34c06d1800..164caa3f5c 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -1558,7 +1558,6 @@ class bugModel extends model $bugCount = $this->dao->select("count(id) as num, date_format($field, '%m/%d') as date")->from(TABLE_BUG) ->where('product')->eq($productID) ->andWhere($field)->ne('0000-00-00 00:00:00') - ->andWhere($field)->ne('') ->andWhere('deleted')->eq(0) ->andWhere($field)->between($startDate, $endDate . ' 23:50:59') ->groupBy('date') diff --git a/test/class/bug.class.php b/test/class/bug.class.php index 9ff50201bf..f9a54a65f9 100644 --- a/test/class/bug.class.php +++ b/test/class/bug.class.php @@ -2080,4 +2080,93 @@ class bugTest return $title; } } + + /** + * Test get statistic. + * + * @param int $productID + * @access public + * @return string + */ + public function getStatisticTest($productID = 0) + { + $dates = $this->objectModel->getStatistic($productID); + $returns = array(); + $today = date('m/d', time()); + foreach($dates as $dateType => $dateList) + { + $returns[$dateType] = $dateList[$today]; + } + + if(dao::isError()) + { + return dao::getError(); + } + else + { + return $returns; + } + } + + /** + * Test get bugs to review. + * + * @param array $productIDList + * @param int|string $branch + * @param array $modules + * @param array $executions + * @param string $orderBy + * @access public + * @return string + */ + public function getReviewBugsTest($productIDList, $branch, $modules, $executions, $orderBy) + { + $bugs = $this->objectModel->getReviewBugs($productIDList, $branch, $modules, $executions, $orderBy); + $ids = ''; + foreach($bugs as $bug) + { + $ids .= ",$bug->id"; + } + $ids = trim($ids, ','); + + if(dao::isError()) + { + return dao::getError(); + } + else + { + return $ids; + } + } + + /** + * Test get related objects id lists. + * + * @param array $productIDList + * @param int|string $branch + * @param array $modules + * @param array $executions + * @param string $orderBy + * @access public + * @return string + */ + public function getRelatedObjectsTest($object, $pairs) + { + $objects = $this->objectModel->getRelatedObjects($object, $pairs); + $ids = ''; + foreach($objects as $objectID => $object) + { + $ids .= ",$objectID:$object"; + } + $ids = trim($ids, ','); + + if(dao::isError()) + { + return dao::getError(); + } + else + { + return $ids; + } + } } diff --git a/test/model/bug/getrelatedobjects.php b/test/model/bug/getrelatedobjects.php new file mode 100755 index 0000000000..47b535517c --- /dev/null +++ b/test/model/bug/getrelatedobjects.php @@ -0,0 +1,33 @@ +#!/usr/bin/env php +getRelatedObjects(); +cid=1 +pid=1 + +获取bug关联的 branch 的 id,name >> :,0: +获取bug关联的 task 的 id,name >> :,0: +获取bug关联的 case 的 id,title >> :,0: +获取bug关联的 resolvedBuild 的 id,name >> :,0:,trunk:主干 +获取bug关联的 openedBuild 的 id,name >> :,0:,trunk:主干,1:项目版本版本1 +获取bug关联的 story 的 id,title >> :,0:,2:软件需求2,6:软件需求6,10:软件需求10,14:软件需求14,18:软件需求18,22:软件需求22,26:软件需求26,30:软件需求30,34:软件需求34 + +*/ + +$objects = array('branch', 'task', 'case', 'resolvedBuild', 'openedBuild', 'story'); +$pairs = array('id,name', 'id,title'); + +$bug=new bugTest(); +$_SESSION['bugQueryCondition'] = 'id < 10'; + +r($bug->getRelatedObjectsTest($objects[0], $pairs[0])) && p() && e(':,0:'); // 获取bug关联的 branch 的 id,name +r($bug->getRelatedObjectsTest($objects[1], $pairs[0])) && p() && e(':,0:'); // 获取bug关联的 task 的 id,name +r($bug->getRelatedObjectsTest($objects[2], $pairs[1])) && p() && e(':,0:'); // 获取bug关联的 case 的 id,title +r($bug->getRelatedObjectsTest($objects[3], $pairs[0])) && p() && e(':,0:,trunk:主干'); // 获取bug关联的 resolvedBuild 的 id,name +r($bug->getRelatedObjectsTest($objects[4], $pairs[0])) && p() && e(':,0:,trunk:主干,1:项目版本版本1'); // 获取bug关联的 openedBuild 的 id,name +r($bug->getRelatedObjectsTest($objects[5], $pairs[1])) && p() && e(':,0:,2:软件需求2,6:软件需求6,10:软件需求10,14:软件需求14,18:软件需求18,22:软件需求22,26:软件需求26,30:软件需求30,34:软件需求34'); // 获取bug关联的 story 的 id,title diff --git a/test/model/bug/getreviewbugs.php b/test/model/bug/getreviewbugs.php new file mode 100755 index 0000000000..d02b3b45d8 --- /dev/null +++ b/test/model/bug/getreviewbugs.php @@ -0,0 +1,39 @@ +#!/usr/bin/env php +getReviewBugs(); +cid=1 +pid=1 + +*/ + +$productIDList = array('1,2,3,1000001', '1,3'); +$branch = array('all', '1'); +$moduleIDList = array('1821,1825,1832,1000001', '1821, 1825'); +$executions = array(array(101,102), array(101,111)); +$orderBy = 'id_asc'; + +$bug=new bugTest(); + +r($bug->getReviewBugsTest($productIDList[0], $branch[0], $moduleIDList[0], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支all 模块1821, 1825, 1832 不存在的模块1000001 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[0], $branch[1], $moduleIDList[0], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支1 模块1821, 1825, 1832 不存在的模块1000001 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[0], $branch[0], $moduleIDList[1], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支all 模块1821, 1825 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[0], $branch[1], $moduleIDList[1], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支1 模块1821, 1825 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[0], $branch[0], $moduleIDList[0], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支all 模块1821, 1825, 1832 不存在的模块1000001 执行101 111下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[0], $branch[1], $moduleIDList[0], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支1 模块1821, 1825, 1832 不存在的模块1000001 执行101 111下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[0], $branch[0], $moduleIDList[1], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支all 模块1821, 1825 执行101 111下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[0], $branch[1], $moduleIDList[1], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 2 3 不存在的产品10001 与分支1 模块1821, 1825 执行101 111下审批人为当前用户的bug +// +r($bug->getReviewBugsTest($productIDList[1], $branch[0], $moduleIDList[0], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支all 模块1821, 1825, 1832 不存在的模块1000001 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[0], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支1 模块1821, 1825, 1832 不存在的模块1000001 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[0], $moduleIDList[1], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支all 模块1821, 1825 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[1], $executions[0], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支1 模块1821, 1825 执行101 102下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[0], $moduleIDList[0], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支all 模块1821, 1825, 1832 不存在的模块1000001 执行101 111下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[0], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支1 模块1821, 1825, 1832 不存在的模块1000001 执行101 111下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[0], $moduleIDList[1], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支all 模块1821, 1825 执行101 111下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[1], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支1 模块1821, 1825 执行101 111下审批人为当前用户的bug diff --git a/test/model/bug/getstatistic.php b/test/model/bug/getstatistic.php new file mode 100755 index 0000000000..0277bfe50b --- /dev/null +++ b/test/model/bug/getstatistic.php @@ -0,0 +1,27 @@ +#!/usr/bin/env php +getStatistic(); +cid=1 +pid=1 + +*/ + +$productIDList = array('1', '11', '31', '61', '91', '10001'); + +$bug=new bugTest(); + +r($bug->getStatisticTest()) && p('openedDate:num') && e('0'); // 查询product id为0创建日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[0])) && p('openedDate:num') && e('0'); // 查询product id为1创建日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[0])) && p('resolvedDate:num') && e('0'); // 查询product id为1创建日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[0])) && p('closedDate:num') && e('0'); // 查询product id为1创建日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[1])) && p('openedDate:num') && e('1'); // 查询product id为11解决日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[2])) && p('openedDate:num') && e('0'); // 查询product id为31解决日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[3])) && p('openedDate:num') && e('0'); // 查询product id为61解决日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[4])) && p('openedDate:num') && e('0'); // 查询product id为91关闭日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[5])) && p('openedDate:num') && e('0'); // 查询product id为10001关闭日期在今天的统计信息 From 6c1dba2561fd0859e1261bcfb5cea8259fd82d3d Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 18 Aug 2022 00:08:40 +0800 Subject: [PATCH 011/223] * Add product and story lang. --- module/product/lang/de.php | 60 ++++++++++++++++++----------------- module/product/lang/en.php | 60 ++++++++++++++++++----------------- module/product/lang/fr.php | 60 ++++++++++++++++++----------------- module/product/lang/vi.php | 52 +++++++++++++++--------------- module/product/lang/zh-cn.php | 60 ++++++++++++++++++----------------- module/product/model.php | 3 +- module/story/lang/de.php | 5 +++ module/story/lang/en.php | 5 +++ module/story/lang/fr.php | 9 ++++-- module/story/lang/vi.php | 7 +++- module/story/lang/zh-cn.php | 4 +-- 11 files changed, 178 insertions(+), 147 deletions(-) diff --git a/module/product/lang/de.php b/module/product/lang/de.php index 7bf83d2c21..a12f8a7022 100644 --- a/module/product/lang/de.php +++ b/module/product/lang/de.php @@ -132,21 +132,22 @@ $lang->product->createdDate = 'Created Date'; $lang->product->createdVersion = 'Created Version'; $lang->product->mailto = 'Mailto'; -$lang->product->searchStory = 'Suche'; -$lang->product->assignedToMe = 'Mir zuweisen'; -$lang->product->openedByMe = 'Von mir erstellt'; -$lang->product->reviewedByMe = 'Von mir geprüft'; -$lang->product->reviewByMe = 'ReviewByMe'; -$lang->product->closedByMe = 'Von mir geschlossen'; -$lang->product->draftStory = 'Entwurf'; -$lang->product->activeStory = 'Aktiviert'; -$lang->product->changedStory = 'Geändert'; -$lang->product->willClose = 'Zu schließen'; -$lang->product->closedStory = 'Geschlossen'; -$lang->product->unclosed = 'Offen'; -$lang->product->unplan = 'Warten'; -$lang->product->viewByUser = 'By User'; -$lang->product->assignedByMe = 'AssignedByMe'; +$lang->product->searchStory = 'Suche'; +$lang->product->assignedToMe = 'Mir zuweisen'; +$lang->product->openedByMe = 'Von mir erstellt'; +$lang->product->reviewedByMe = 'Von mir geprüft'; +$lang->product->reviewByMe = 'ReviewByMe'; +$lang->product->closedByMe = 'Von mir geschlossen'; +$lang->product->draftStory = 'Entwurf'; +$lang->product->activeStory = 'Aktiviert'; +$lang->product->changingStory = 'Ändern'; +$lang->product->reviewingStory = 'Wird geprüft'; +$lang->product->willClose = 'Zu schließen'; +$lang->product->closedStory = 'Geschlossen'; +$lang->product->unclosed = 'Offen'; +$lang->product->unplan = 'Warten'; +$lang->product->viewByUser = 'By User'; +$lang->product->assignedByMe = 'AssignedByMe'; /* Product Kanban. */ $lang->product->myProduct = 'Products Ownedbyme'; @@ -204,22 +205,23 @@ $lang->product->noModule = '
Kein Modul
Jetzt verwalten
product->noProduct = 'Kein Produkt. '; $lang->product->noMatched = '"%s" kann nicht gefunden werden.' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changedstory'] = $lang->product->changedStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 5c30a03101..7f0ccfad62 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -132,21 +132,22 @@ $lang->product->createdDate = 'createdDate'; $lang->product->createdVersion = 'Created Version'; $lang->product->mailto = 'Mailto'; -$lang->product->searchStory = 'Search'; -$lang->product->assignedToMe = 'AssignedToMe'; -$lang->product->openedByMe = 'CreatedByMe'; -$lang->product->reviewedByMe = 'ReviewedByMe'; -$lang->product->reviewByMe = 'ReviewByMe'; -$lang->product->closedByMe = 'ClosedByMe'; -$lang->product->draftStory = 'Draft'; -$lang->product->activeStory = 'Activated'; -$lang->product->changedStory = 'Changed'; -$lang->product->willClose = 'ToBeClosed'; -$lang->product->closedStory = 'Closed'; -$lang->product->unclosed = 'Open'; -$lang->product->unplan = 'Unplanned'; -$lang->product->viewByUser = 'By User'; -$lang->product->assignedByMe = 'AssignedByMe'; +$lang->product->searchStory = 'Search'; +$lang->product->assignedToMe = 'AssignedToMe'; +$lang->product->openedByMe = 'CreatedByMe'; +$lang->product->reviewedByMe = 'ReviewedByMe'; +$lang->product->reviewByMe = 'ReviewByMe'; +$lang->product->closedByMe = 'ClosedByMe'; +$lang->product->draftStory = 'Draft'; +$lang->product->activeStory = 'Activated'; +$lang->product->changingStory = 'Changing'; +$lang->product->reviewingStory = 'Reviewing'; +$lang->product->willClose = 'ToBeClosed'; +$lang->product->closedStory = 'Closed'; +$lang->product->unclosed = 'Open'; +$lang->product->unplan = 'Unplanned'; +$lang->product->viewByUser = 'By User'; +$lang->product->assignedByMe = 'AssignedByMe'; /* Product Kanban. */ $lang->product->myProduct = 'Products Ownedbyme'; @@ -204,22 +205,23 @@ $lang->product->noModule = '
You have no modules.
Manage No $lang->product->noProduct = "No {$lang->productCommon} yet. "; $lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changedstory'] = $lang->product->changedStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/fr.php b/module/product/lang/fr.php index 04c0a205f9..12c402d91a 100644 --- a/module/product/lang/fr.php +++ b/module/product/lang/fr.php @@ -132,21 +132,22 @@ $lang->product->createdDate = 'Créé le'; $lang->product->createdVersion = 'Created Version'; $lang->product->mailto = 'Mailto'; -$lang->product->searchStory = 'Recherche'; -$lang->product->assignedToMe = 'Affectées à Moi'; -$lang->product->openedByMe = 'Créées par Moi'; -$lang->product->reviewedByMe = 'Validées par Moi'; -$lang->product->reviewByMe = 'ReviewByMe'; -$lang->product->closedByMe = 'Fermées par Moi'; -$lang->product->draftStory = 'A étudier'; -$lang->product->activeStory = 'Actives'; -$lang->product->changedStory = 'Changées'; -$lang->product->willClose = 'A Fermer'; -$lang->product->closedStory = 'Fermées'; -$lang->product->unclosed = 'Ouvertes'; -$lang->product->unplan = 'Non planifiées'; -$lang->product->viewByUser = 'Par Utilisateur'; -$lang->product->assignedByMe = 'AssignedByMe'; +$lang->product->searchStory = 'Recherche'; +$lang->product->assignedToMe = 'Affectées à Moi'; +$lang->product->openedByMe = 'Créées par Moi'; +$lang->product->reviewedByMe = 'Validées par Moi'; +$lang->product->reviewByMe = 'ReviewByMe'; +$lang->product->closedByMe = 'Fermées par Moi'; +$lang->product->draftStory = 'A étudier'; +$lang->product->activeStory = 'Actives'; +$lang->product->changingStory = 'Changement en cours'; +$lang->product->reviewingStory = 'Examen en cours'; +$lang->product->willClose = 'A Fermer'; +$lang->product->closedStory = 'Fermées'; +$lang->product->unclosed = 'Ouvertes'; +$lang->product->unplan = 'Non planifiées'; +$lang->product->viewByUser = 'Par Utilisateur'; +$lang->product->assignedByMe = 'AssignedByMe'; /* Product Kanban. */ $lang->product->myProduct = 'Products Ownedbyme'; @@ -204,22 +205,23 @@ $lang->product->noModule = "
Vous n'avez aucun modules.
Gé $lang->product->noProduct = "No {$lang->productCommon} à ce jour. "; $lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changedstory'] = $lang->product->changedStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/vi.php b/module/product/lang/vi.php index 126ea41ec2..a69df13a80 100644 --- a/module/product/lang/vi.php +++ b/module/product/lang/vi.php @@ -115,19 +115,20 @@ $lang->product->iterationView = 'Chi tiết'; $lang->product->createdBy = 'Người tạo'; $lang->product->createdDate = 'Ngày tạo'; -$lang->product->searchStory = 'Tìm kiếm'; -$lang->product->assignedToMe = 'Giao cho bạn'; -$lang->product->openedByMe = 'Tạo bởi bạn'; -$lang->product->reviewedByMe = 'Duyệt bởi bạn'; -$lang->product->closedByMe = 'Đóng bởi bạn'; -$lang->product->draftStory = 'Nháp'; -$lang->product->activeStory = 'Đã kích hoạt'; -$lang->product->changedStory = 'Đã thay đổi'; -$lang->product->willClose = 'Đã đóng'; -$lang->product->closedStory = 'Đã đóng'; -$lang->product->unclosed = 'Mở'; -$lang->product->unplan = 'Chưa kế hoạch'; -$lang->product->viewByUser = 'Theo người dùng'; +$lang->product->searchStory = 'Tìm kiếm'; +$lang->product->assignedToMe = 'Giao cho bạn'; +$lang->product->openedByMe = 'Tạo bởi bạn'; +$lang->product->reviewedByMe = 'Duyệt bởi bạn'; +$lang->product->closedByMe = 'Đóng bởi bạn'; +$lang->product->draftStory = 'Nháp'; +$lang->product->activeStory = 'Đã kích hoạt'; +$lang->product->changingStory = 'Biến'; +$lang->product->reviewingStory = 'Đang xem xét'; +$lang->product->willClose = 'Đã đóng'; +$lang->product->closedStory = 'Đã đóng'; +$lang->product->unclosed = 'Mở'; +$lang->product->unplan = 'Chưa kế hoạch'; +$lang->product->viewByUser = 'Theo người dùng'; $lang->product->allStory = 'Tất cả '; $lang->product->allProduct = 'Tất cả'; @@ -165,20 +166,21 @@ $lang->product->noModule = '
Chưa có Module.
Quản lý n $lang->product->noProduct = "Không có {$lang->productCommon} nào."; $lang->product->noMatched = '"%s" không thể tìm thấy ' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changedstory'] = $lang->product->changedStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index f13204cd93..85ee8e22e5 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -132,21 +132,22 @@ $lang->product->createdDate = '创建日期'; $lang->product->createdVersion = '创建版本'; $lang->product->mailto = '抄送给'; -$lang->product->searchStory = '搜索'; -$lang->product->assignedToMe = '指给我'; -$lang->product->openedByMe = '我创建'; -$lang->product->reviewedByMe = '我评审'; -$lang->product->reviewByMe = '待我评审'; -$lang->product->closedByMe = '我关闭'; -$lang->product->draftStory = '草稿'; -$lang->product->activeStory = '激活'; -$lang->product->changedStory = '已变更'; -$lang->product->willClose = '待关闭'; -$lang->product->closedStory = '已关闭'; -$lang->product->unclosed = '未关闭'; -$lang->product->unplan = "未计划"; -$lang->product->viewByUser = '按用户查看'; -$lang->product->assignedByMe = '我指派'; +$lang->product->searchStory = '搜索'; +$lang->product->assignedToMe = '指给我'; +$lang->product->openedByMe = '我创建'; +$lang->product->reviewedByMe = '我评审'; +$lang->product->reviewByMe = '待我评审'; +$lang->product->closedByMe = '我关闭'; +$lang->product->draftStory = '草稿'; +$lang->product->activeStory = '激活'; +$lang->product->changingStory = '变更中'; +$lang->product->reviewingStory = '评审中'; +$lang->product->willClose = '待关闭'; +$lang->product->closedStory = '已关闭'; +$lang->product->unclosed = '未关闭'; +$lang->product->unplan = "未计划"; +$lang->product->viewByUser = '按用户查看'; +$lang->product->assignedByMe = '我指派'; /* Product Kanban. */ $lang->product->myProduct = '我负责的' . $lang->productCommon; @@ -204,22 +205,23 @@ $lang->product->noModule = "
您现在还没有模块信息
$lang->product->noProduct = "暂时没有{$lang->productCommon}。"; $lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = '所有' . $lang->productCommon; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changedstory'] = $lang->product->changedStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/model.php b/module/product/model.php index 89ebf0f571..707c946626 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -1019,7 +1019,8 @@ class productModel extends model if($browseType == 'closedbyme') $stories = $this->story->getByClosedBy($productID, $branch, $modules, $this->app->user->account, $type, $sort, $pager); if($browseType == 'draftstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'draft', $type, $sort, $pager); if($browseType == 'activestory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'active', $type, $sort, $pager); - if($browseType == 'changedstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'changing', $type, $sort, $pager); + if($browseType == 'changingstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'changing', $type, $sort, $pager); + if($browseType == 'reviewingstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'reviewing', $type, $sort, $pager); if($browseType == 'willclose') $stories = $this->story->get2BeClosed($productID, $branch, $modules, $type, $sort, $pager); if($browseType == 'closedstory') $stories = $this->story->getByStatus($productID, $branch, $modules, 'closed', $type, $sort, $pager); if($browseType == 'assignedbyme') $stories = $this->story->getByAssignedBy($productID, $branch, $modules, $this->app->user->account, $type, $sort, $pager); diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 7819d294ac..4cfb5f7f0b 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -26,6 +26,7 @@ $lang->story->review = 'Prüfen'; $lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; $lang->story->recallChange = 'Undo Changes'; +$lang->story->recallAction = 'Undo'; $lang->story->needReview = 'Need Review'; $lang->story->batchReview = 'Mehere prüfen'; $lang->story->edit = "Bearbeiten"; @@ -462,3 +463,7 @@ $lang->story->subDivideTip['notActive'] = 'The Story is not active and cannot be $lang->story->featureBar['browse']['all'] = $lang->all; $lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; + +$lang->story->recallList = array(); +$lang->story->recallList['recallReview'] = $lang->story->recall; +$lang->story->recallList['recallChange'] = $lang->story->recallChange; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index 8d286633ef..92cc28d5db 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -26,6 +26,7 @@ $lang->story->review = 'Review'; $lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; $lang->story->recallChange = 'Undo Changes'; +$lang->story->recallAction = 'Undo'; $lang->story->needReview = 'Need Review'; $lang->story->batchReview = 'Batch Review'; $lang->story->edit = "Edit Story"; @@ -462,3 +463,7 @@ $lang->story->subDivideTip['notActive'] = 'The Story is not active and cannot be $lang->story->featureBar['browse']['all'] = $lang->all; $lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; + +$lang->story->recallList = array(); +$lang->story->recallList['recallReview'] = $lang->story->recall; +$lang->story->recallList['recallChange'] = $lang->story->recallChange; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index bddd17bf19..4d5315f7df 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -26,6 +26,7 @@ $lang->story->review = 'Valider'; $lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; $lang->story->recallChange = 'Undo Changes'; +$lang->story->recallAction = 'Undo'; $lang->story->needReview = 'Validation requise'; $lang->story->batchReview = 'Validation par lot'; $lang->story->edit = "Editer Story"; @@ -189,8 +190,8 @@ $lang->story->needNotReviewList[1] = 'Need Not Review'; $lang->story->useList[0] = 'Oui'; $lang->story->useList[1] = 'Non'; -$lang->story->statusList['']  = ''; -$lang->story->statusList['draft']  = 'Brouillon'; +$lang->story->statusList[''] = ''; +$lang->story->statusList['draft'] = 'Brouillon'; $lang->story->statusList['reviewing'] = 'Examen en cours'; $lang->story->statusList['active'] = 'Active'; $lang->story->statusList['closed'] = 'Fermée'; @@ -462,3 +463,7 @@ $lang->story->subDivideTip['notActive'] = "Cette Story n'est pas active et ne pe $lang->story->featureBar['browse']['all'] = $lang->all; $lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; + +$lang->story->recallList = array(); +$lang->story->recallList['recallReview'] = $lang->story->recall; +$lang->story->recallList['recallChange'] = $lang->story->recallChange; diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php index e22c0280ff..f33f4c7067 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -25,7 +25,8 @@ $lang->story->assignTo = 'Giao cho'; $lang->story->review = 'Xét duyệt'; $lang->story->submitReview = "Submit Review"; $lang->story->recall = 'Revoke'; -$lang->story->recallChange = 'Undo Changes'; +$lang->story->recallChange = 'Undo Changes'; +$lang->story->recallAction = 'Undo'; $lang->story->needReview = 'Duyệt nhu cầu'; $lang->story->batchReview = 'Duyệt hàng loạt'; $lang->story->edit = "Sửa câu chuyện"; @@ -454,3 +455,7 @@ $lang->story->subDivideTip['notActive'] = 'The Story is not active and cannot be $lang->story->featureBar['browse']['all'] = $lang->all; $lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; + +$lang->story->recallList = array(); +$lang->story->recallList['recallReview'] = $lang->story->recall; +$lang->story->recallList['recallChange'] = $lang->story->recallChange; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 0f76ee0468..f721078727 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -465,5 +465,5 @@ $lang->story->featureBar['browse']['all'] = $lang->all; $lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; $lang->story->recallList = array(); -$lang->story->recallList['recallReview'] = '撤销评审'; -$lang->story->recallList['recallChange'] = '撤销变更'; +$lang->story->recallList['recallReview'] = $lang->story->recall; +$lang->story->recallList['recallChange'] = $lang->story->recallChange; From 95df48f63d91da664f56c5e1ca0375143f8e11ce Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 18 Aug 2022 00:09:08 +0800 Subject: [PATCH 012/223] * * Modify not review position. --- module/story/control.php | 5 +- module/story/css/create.css | 2 +- module/story/js/change.js | 18 +----- module/story/js/create.js | 44 +++---------- module/story/js/review.js | 12 ---- module/story/model.php | 13 +--- module/story/view/change.html.php | 6 +- module/story/view/create.html.php | 104 +++++++++++++++--------------- module/story/view/review.html.php | 4 +- 9 files changed, 73 insertions(+), 135 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 941d485945..dcc6c2a808 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1147,7 +1147,7 @@ class story extends control $this->view->title = $this->lang->story->change . "STORY" . $this->lang->colon . $this->view->story->title; $this->view->users = $this->user->getPairs('pofirst|nodeleted|noclosed', $this->view->story->assignedTo); $this->view->position[] = $this->lang->story->change; - $this->view->needReview = ($this->app->user->account == $this->view->product->PO || $this->config->story->needReview == 0) ? "checked='checked'" : ""; + $this->view->needReview = (($this->app->user->account == $this->view->product->PO or $this->config->story->needReview == 0) and empty($reviewer)) ? "checked='checked'" : ""; $this->view->reviewer = implode(',', array_keys($reviewer)); $this->view->productReviewers = $this->user->getPairs('noclosed|nodeleted', $reviewer, 0, $productReviewers); $this->view->files = $this->loadModel('file')->getByObject($story->type, $storyID); @@ -1463,6 +1463,7 @@ class story extends control $this->view->actions = $this->action->getList('story', $storyID); $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noletter', "$story->lastEditedBy,$story->openedBy"); $this->view->reviewers = $reviewers; + $this->view->isLastOne = count(array_diff(array_keys($reviewers), explode(',', $story->reviewedBy))) == 1 ? true : false; /* Get the affcected things. */ $this->story->getAffectedScope($this->view->story); @@ -2759,7 +2760,7 @@ class story extends control */ public function ajaxGetAssignedTo($type = '', $storyID = 0, $assignees = '') { - $users = $this->loadModel('user')->getPairs('noletter|noclosed'); + $users = $this->loadModel('user')->getPairs('noclosed'); if($type == 'create') { diff --git a/module/story/css/create.css b/module/story/css/create.css index 1e646d9c98..c9854e8d17 100644 --- a/module/story/css/create.css +++ b/module/story/css/create.css @@ -9,7 +9,7 @@ #product + .picker{min-width: 400px} #dataform .priBox, #dataform .estimateBox {width: 120px;} #dataform .categoryBox {width: 150px;} -#dataform .needNotReviewBox {width: 130px;} +.needNotReviewBox {width: 130px; display: inline-block; padding: 7px;} .input-group-addon.assignedTo {min-width: 77px;} .input-group .source {display: flex; width: 50%;} .input-group .sourceNote {display: flex; width: 50%;} diff --git a/module/story/js/change.js b/module/story/js/change.js index 3d075f1112..8cd06f0d1b 100644 --- a/module/story/js/change.js +++ b/module/story/js/change.js @@ -2,7 +2,7 @@ $(function() { $('#needNotReview').on('change', function() { - $('#reviewer').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated'); + $('#reviewer').text('').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated'); if($(this).is(':checked')) { $('.input-group-addon').removeClass('required'); @@ -11,12 +11,7 @@ $(function() { $('.input-group-addon').addClass('required'); } - - loadAssignedTo(); }); - $('#needNotReview').change(); - - if($('#reviewer').val()) loadAssignedTo(); if($('.tabs .tab-content .tab-pane.active').children().length == 0) $('.tabs .nav-tabs li.active').css('border-bottom', '1px solid #ccc'); }); @@ -37,15 +32,4 @@ function loadAssignedTo() $('#assignedToBox .picker').remove(); $('#assignedTo').picker(); }); - - if($('#needNotReview').is(':checked')) - { - $('#assignedToBox').removeClass('hidden'); - $('#reviewerBox').attr('colspan', 1); - } - else - { - $('#assignedToBox').addClass('hidden'); - $('#reviewerBox').attr('colspan', 2); - } } diff --git a/module/story/js/create.js b/module/story/js/create.js index 979300b4bb..698eb0e085 100644 --- a/module/story/js/create.js +++ b/module/story/js/create.js @@ -2,23 +2,25 @@ $(function() { $('#needNotReview').on('change', function() { - $('#reviewer').text('').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated'); + $('#reviewer').attr('disabled', $(this).is(':checked') ? 'disabled' : null).trigger('chosen:updated'); + if($(this).is(':checked')) { + $('#reviewerBox').closest('tr').addClass('hidden'); $('#reviewerBox').removeClass('required'); + $('#dataform #needNotReview').val(1); } else { + $('#reviewerBox').closest('tr').removeClass('hidden'); $('#reviewerBox').addClass('required'); + $('#dataform #needNotReview').val(0); } - loadAssignedTo(); getStatus('create', "product=" + $('#product').val() + ",execution=" + executionID + ",needNotReview=" + ($(this).prop('checked') ? 1 : 0)); }); $('#needNotReview').change(); - if($('#reviewer').val()) loadAssignedTo(); - // init pri selector $('#pri').on('change', function() { @@ -36,14 +38,12 @@ $(function() if($.inArray(source, feedbackSource) != -1) { $('#feedbackBox').removeClass('hidden'); - $('#reviewerBox').attr('colspan', $('#assignedToBox').hasClass('hidden') ? 2 : 1); - $('#assignedToBox').attr('colspan', 1); + $('#source, #sourceNoteBox').closest('td').attr('colspan', 1); } else { $('#feedbackBox').addClass('hidden'); - $('#reviewerBox').attr('colspan', $('#assignedToBox').hasClass('hidden') ? 4 : 2); - $('#assignedToBox').attr('colspan', 2); + $('#source, #sourceNoteBox').closest('td').attr('colspan', 2); } }); @@ -56,22 +56,6 @@ $(function() $('#formSettingForm .btn-primary').click(function() { saveCustomFields('createFields'); - - setTimeout(function() - { - var showFieldList = showFields + ','; - if(showFieldList.indexOf(',source,') >= 0) - { - $('#source').trigger("change"); - } - else - { - $('#feedbackBox').addClass('hidden'); - $('#reviewerBox').attr('colspan', $('#assignedToBox').hasClass('hidden') ? 4 : 2); - $('#assignedToBox').attr('colspan', 2); - } - }, 100); - return false; }); }); @@ -92,18 +76,6 @@ function loadAssignedTo() $('#assignedToBox .picker').remove(); $('#assignedTo').picker(); }); - - var colspan = $('#assignedToBox').attr('colspan'); - if($('#needNotReview').is(':checked')) - { - $('#assignedToBox').removeClass('hidden'); - $('#reviewerBox').attr('colspan', colspan); - } - else - { - $('#assignedToBox').addClass('hidden'); - $('#reviewerBox').attr('colspan', colspan * 2); - } } function refreshPlan() diff --git a/module/story/js/review.js b/module/story/js/review.js index afac5139c7..b1001048a5 100644 --- a/module/story/js/review.js +++ b/module/story/js/review.js @@ -7,11 +7,6 @@ function switchShow(result) $('#rejectedReasonBox').show(); $('#preVersionBox').hide(); $('#assignedToBox').hide(); - if(isMultiple) - { - $('#assignedToBox').show(); - loadAssignedTo(); - } } else if(result == 'revert') { @@ -19,8 +14,6 @@ function switchShow(result) $('#rejectedReasonBox').hide(); $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); - $('#assignedToBox').show(); - loadAssignedTo(); } else if(result == 'clarify') { @@ -29,8 +22,6 @@ function switchShow(result) $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); $('#rejectedReasonBox').hide(); - $('#assignedToBox').show(); - loadAssignedTo(); } else { @@ -39,13 +30,10 @@ function switchShow(result) $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); $('#rejectedReasonBox').hide(); - $('#assignedToBox').hide(); if(result == 'pass') { $('#priBox').show(); $('#estimateBox').show(); - $('#assignedToBox').show(); - loadAssignedTo(); } } diff --git a/module/story/model.php b/module/story/model.php index 5251dc5584..8d02b429fe 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -202,7 +202,7 @@ class storyModel extends model if(isset($_POST['reviewer'])) $_POST['reviewer'] = array_filter($_POST['reviewer']); if(!$this->post->needNotReview and empty($_POST['reviewer'])) { - dao::$errors[] = $this->lang->story->errorEmptyReviewedBy; + dao::$errors['reviewer'] = $this->lang->story->errorEmptyReviewedBy; return false; } @@ -283,7 +283,6 @@ class storyModel extends model /* Save the story reviewer to storyreview table. */ if(isset($_POST['reviewer'])) { - $assignedTo = ''; foreach($this->post->reviewer as $reviewer) { if(empty($reviewer)) continue; @@ -293,10 +292,7 @@ class storyModel extends model $reviewData->version = 1; $reviewData->reviewer = $reviewer; $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); - - if(empty($assignedTo)) $assignedTo = $reviewer; } - if($assignedTo) $this->dao->update(TABLE_STORY)->set('assignedTo')->eq($assignedTo)->set('assignedDate')->eq(helper::now())->where('id')->eq($storyID)->exec(); } /* Project or execution linked story. */ @@ -754,7 +750,6 @@ class storyModel extends model } /* Update the reviewer. */ - $assignedTo = ''; foreach($_POST['reviewer'] as $reviewer) { $reviewData = new stdclass(); @@ -762,10 +757,7 @@ class storyModel extends model $reviewData->version = $story->version; $reviewData->reviewer = $reviewer; $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); - - if(empty($assignedTo)) $assignedTo = $reviewer; } - if($assignedTo and $assignedTo != $oldStory->assignedTo) $this->dao->update(TABLE_STORY)->set('assignedTo')->eq($assignedTo)->set('assignedDate')->eq(helper::now())->where('id')->eq($storyID)->exec(); } $this->file->updateObjectID($this->post->uid, $storyID, 'story'); @@ -1440,7 +1432,6 @@ class storyModel extends model ->stripTags($this->config->story->editor->review['id'], $this->config->allowedTags) ->setIF(!$this->post->assignedTo, 'assignedTo', '') ->setIF($this->post->result == 'revert', 'version', $oldStory->version - 1) - ->setIF($this->post->result == 'clarify', 'assignedTo', $oldStory->lastEditedBy ? $oldStory->lastEditedBy : $oldStory->openedBy) ->setIF($this->post->result == 'clarify', 'status', 'draft') ->removeIF($this->post->result != 'reject', 'closedReason, duplicateStory, childStories') ->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'duplicate', 'duplicateStory') @@ -2936,7 +2927,7 @@ class storyModel extends model ->beginIF($fieldName == 'reviewBy') ->andWhere('t2.reviewer')->eq($this->app->user->account) ->andWhere('t2.result')->eq('') - ->andWhere('t1.status')->in('draft,changing') + ->andWhere('t1.status')->eq('reviewing') ->fi() ->beginIF($fieldName == 'assignedBy')->andWhere('t1.id')->in($actionIDList)->andWhere('t1.status')->ne('closed')->fi() ->orderBy($orderBy) diff --git a/module/story/view/change.html.php b/module/story/view/change.html.php index a843850270..c39ad7cdcb 100644 --- a/module/story/view/change.html.php +++ b/module/story/view/change.html.php @@ -24,7 +24,7 @@
story->reviewedBy;?> lastEditedDate); - echo html::submitButton(); + echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide'); + echo html::commonButton($lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide'); if(!isonlybody()) echo html::backButton(); ?>
- story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?> save, "id='saveButton'", 'btn btn-primary btn-wide');?> + story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?> goback, '', 'class="btn btn-wide"') : html::backButton('', $source == 'bug' ? 'data-app=qa' : '');?>
story->stage;?> diff --git a/module/story/view/recall.html.php b/module/story/view/recall.html.php new file mode 100644 index 0000000000..3d3e089421 --- /dev/null +++ b/module/story/view/recall.html.php @@ -0,0 +1,43 @@ + + * @package story + * @version $Id: submitreview.html.php 935 2022-07-20 09:49:24Z $ + * @link https://www.zentao.net + */ +?> + + +
+
+
+

+ id;?> + title'>" . $story->title . '') : html::a($this->createLink('story', 'view', 'story=' . $story->id), $story->title);?> + + arrow . $lang->story->recallAction;?> + +

+
+ + + + + + + + +
story->recallList, 'recallReview');?>
+ +
+ +
+
+ + From 8c2e982023ab8da2b3330707f87426ede0994894 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 16 Aug 2022 09:07:45 +0800 Subject: [PATCH 004/223] * Fix bug of product list page. --- module/product/config.php | 4 ++-- module/product/view/all.html.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module/product/config.php b/module/product/config.php index 63a26fe140..c9fcfb501d 100644 --- a/module/product/config.php +++ b/module/product/config.php @@ -147,8 +147,8 @@ $config->product->report->planLabels = array(); $config->product->report->planLabels[] = ''; $config->product->statisticFields = array(); -$config->product->statisticFields['requirements'] = array('draftRequirements', 'activeRequirements', 'changedRequirements', 'closedRequirements'); -$config->product->statisticFields['stories'] = array('draftStories', 'activeStories', 'changedStories', 'closedStories'); +$config->product->statisticFields['requirements'] = array('draftRequirements', 'activeRequirements', 'changingRequirements', 'closedRequirements'); +$config->product->statisticFields['stories'] = array('draftStories', 'activeStories', 'changingStories', 'closedStories'); $config->product->statisticFields['bugs'] = array('unResolvedBugs', 'closedBugs', 'fixedBugs'); $config->product->statisticFields['plans'] = array('plans'); $config->product->statisticFields['releases'] = array('releases'); diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index 2238fabfe4..b15495516a 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -113,12 +113,12 @@ config->URAndSR):?>
% % % % story->status;?> story->statusList['']); - unset($lang->story->statusList['closed']); - unset($lang->story->statusList['changing']); - unset($lang->story->statusList['reviewing']); echo html::select('status', $lang->story->statusList, 'active', 'class="form-control chosen"'); ?> assignedTo, 'class="form-control chosen"');?>
story->reviewers;?>
- - diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index 4b9bc179c6..64adfb65e5 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -34,6 +34,14 @@ foreach(explode(',', $config->story->create->requiredFields) as $field)

story->create;?>

+ story->checkForceReview()):?> +
+
+ /> + +
+
+
createLink('custom', 'ajaxSaveCustomFields', 'module=story§ion=custom&key=createFields')?> @@ -88,64 +96,24 @@ foreach(explode(',', $config->story->create->requiredFields) as $field) ?>
-
- - - - - - - - + + + + - - + + + + + + + + + + + config->URAndSR):?> diff --git a/module/story/view/review.html.php b/module/story/view/review.html.php index 43316a92ce..b815fa9c4a 100644 --- a/module/story/view/review.html.php +++ b/module/story/view/review.html.php @@ -31,9 +31,9 @@ - + > - + From c9d6687f9b051227cb174e08c4d7ea688bf76904 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 18 Aug 2022 08:40:58 +0800 Subject: [PATCH 013/223] * Modify icon of edit draft story. --- module/story/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 8d02b429fe..e02dda0984 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4202,7 +4202,7 @@ class storyModel extends model $menu .= $this->buildMenu('story', 'recall', $params, $story, $type, 'undo', 'hiddenwin', $iframe, true, 'data-width="40%"', $title); $menu .= $this->buildMenu('story', 'close', $params, $story, $type, '', '', 'iframe', true); - $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type, '', '', 'showinonlybody', false, '', ($story->status == 'draft' or $story->status == 'changing') ? $this->lang->story->editDraft : ''); + $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type, '', '', 'showinonlybody', false); $tab = $this->app->tab == 'project' ? 'project' : 'qa'; if($story->type != 'requirement' and $this->config->vision != 'lite') $menu .= $this->buildMenu('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$params", $story, $type, 'sitemap', '', 'showinonlybody', false, "data-app='$tab'"); @@ -4280,7 +4280,7 @@ class storyModel extends model $menu .= $this->buildFlowMenu('story', $story, $type, 'direct'); $menu .= "
"; - $menu .= $this->buildMenu('story', 'edit', $params, $story, $type, $story->status == 'draft' ? 'draft-edit' : '', '', 'showinonlybody', '', '', $story->status == 'draft' ? $this->lang->story->editDraft : ''); + $menu .= $this->buildMenu('story', 'edit', $params, $story, $type, '', '', 'showinonlybody'); $menu .= $this->buildMenu('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&{$params}&executionID=0&bugID=0&planID=0&todoID=0&extra=&type=$story->type", $story, $type, 'copy', '', '', '', "data-width='1050'"); $menu .= $this->buildMenu('story', 'delete', $params, $story, 'button', 'trash', 'hiddenwin', 'showinonlybody', true); } From 2a82103c45bbc094a099a27170a52011cefbffa9 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 18 Aug 2022 08:49:13 +0800 Subject: [PATCH 014/223] * Fix bug of review story. --- module/story/js/review.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/module/story/js/review.js b/module/story/js/review.js index b1001048a5..da171be002 100644 --- a/module/story/js/review.js +++ b/module/story/js/review.js @@ -14,6 +14,7 @@ function switchShow(result) $('#rejectedReasonBox').hide(); $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); + $('#assignedToBox').show(); } else if(result == 'clarify') { @@ -22,6 +23,7 @@ function switchShow(result) $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); $('#rejectedReasonBox').hide(); + $('#assignedToBox').show(); } else { @@ -30,6 +32,7 @@ function switchShow(result) $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); $('#rejectedReasonBox').hide(); + $('#assignedToBox').show(); if(result == 'pass') { $('#priBox').show(); From 5cc82f3bbfe3781ad35f1c55501063cb9bdd9019 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 18 Aug 2022 09:24:10 +0800 Subject: [PATCH 015/223] * * Fix bug of last one review story. --- module/story/js/review.js | 6 +++--- module/story/model.php | 4 +++- module/story/view/review.html.php | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/module/story/js/review.js b/module/story/js/review.js index da171be002..682d532c83 100644 --- a/module/story/js/review.js +++ b/module/story/js/review.js @@ -14,7 +14,7 @@ function switchShow(result) $('#rejectedReasonBox').hide(); $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); - $('#assignedToBox').show(); + if(isLastOne) $('#assignedToBox').show(); } else if(result == 'clarify') { @@ -23,7 +23,7 @@ function switchShow(result) $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); $('#rejectedReasonBox').hide(); - $('#assignedToBox').show(); + if(isLastOne) $('#assignedToBox').show(); } else { @@ -32,7 +32,7 @@ function switchShow(result) $('#duplicateStoryBox').hide(); $('#childStoriesBox').hide(); $('#rejectedReasonBox').hide(); - $('#assignedToBox').show(); + if(isLastOne) $('#assignedToBox').show(); if(result == 'pass') { $('#priBox').show(); diff --git a/module/story/model.php b/module/story/model.php index e02dda0984..3e53d97509 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -5607,9 +5607,11 @@ class storyModel extends model */ public function superReview($storyID, $oldStory, $story, $result = '', $reason = '') { + $result = isset($_POST['result']) ? $this->post->result : $result; + if(empty($result)) return $story; + $now = helper::now(); $status = $oldStory->status; - $result = isset($_POST['result']) ? $this->post->result : $result; if(strpos('revert,pass', $result) !== false) $status = 'active'; if($result == 'reject') $status = 'closed'; if($result == 'clarify') $status = 'draft'; diff --git a/module/story/view/review.html.php b/module/story/view/review.html.php index b815fa9c4a..fba8b02852 100644 --- a/module/story/view/review.html.php +++ b/module/story/view/review.html.php @@ -84,4 +84,5 @@ type);?> app->rawModule);?> + From a7d8ff275d05481fbeb4a8f3babd2b3d7e497430 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 18 Aug 2022 09:38:44 +0800 Subject: [PATCH 016/223] * Modify lang. --- module/product/lang/zh-tw.php | 38 +++++++++++++++--------------- module/projectstory/lang/de.php | 2 +- module/projectstory/lang/en.php | 2 +- module/projectstory/lang/fr.php | 2 +- module/projectstory/lang/vi.php | 2 +- module/projectstory/lang/zh-cn.php | 2 +- module/projectstory/lang/zh-tw.php | 2 +- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/module/product/lang/zh-tw.php b/module/product/lang/zh-tw.php index 1e7d868f2b..7b568db8e5 100644 --- a/module/product/lang/zh-tw.php +++ b/module/product/lang/zh-tw.php @@ -126,20 +126,20 @@ $lang->product->createdDate = '創建日期'; $lang->product->createdVersion = '創建版本'; $lang->product->mailto = '抄送給'; -$lang->product->searchStory = '搜索'; -$lang->product->assignedToMe = '指給我'; -$lang->product->openedByMe = '我創建'; -$lang->product->reviewedByMe = '我評審'; -$lang->product->reviewByMe = '待我評審'; -$lang->product->closedByMe = '我關閉'; -$lang->product->draftStory = '草稿'; -$lang->product->activeStory = '激活'; -$lang->product->changedStory = '已變更'; -$lang->product->willClose = '待關閉'; -$lang->product->closedStory = '已關閉'; -$lang->product->unclosed = '未關閉'; -$lang->product->unplan = "未計劃"; -$lang->product->viewByUser = '按用戶查看'; +$lang->product->searchStory = '搜索'; +$lang->product->assignedToMe = '指給我'; +$lang->product->openedByMe = '我創建'; +$lang->product->reviewedByMe = '我評審'; +$lang->product->reviewByMe = '待我評審'; +$lang->product->closedByMe = '我關閉'; +$lang->product->draftStory = '草稿'; +$lang->product->activeStory = '激活'; +$lang->product->changingStory = '變更中'; +$lang->product->willClose = '待關閉'; +$lang->product->closedStory = '已關閉'; +$lang->product->unclosed = '未關閉'; +$lang->product->unplan = "未計劃"; +$lang->product->viewByUser = '按用戶查看'; /* Product Kanban. */ $lang->product->myProduct = '我負責的' . $lang->productCommon; @@ -210,8 +210,8 @@ $lang->product->featureBar['all']['all'] = '所有' . $lang->productCommon; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changedstory'] = $lang->product->changedStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/projectstory/lang/de.php b/module/projectstory/lang/de.php index 0af31fe975..712bdfa71a 100644 --- a/module/projectstory/lang/de.php +++ b/module/projectstory/lang/de.php @@ -26,7 +26,7 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; -$lang->projectstory->featureBar['story']['changed'] = $lang->product->changedStory; +$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = 'Linked ' . $lang->execution->common; $lang->projectstory->featureBar['story']['unlinkedExecution'] = 'Unlinked ' . $lang->execution->common; diff --git a/module/projectstory/lang/en.php b/module/projectstory/lang/en.php index 839aa7ab88..7d4d228632 100644 --- a/module/projectstory/lang/en.php +++ b/module/projectstory/lang/en.php @@ -26,7 +26,7 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; -$lang->projectstory->featureBar['story']['changed'] = $lang->product->changedStory; +$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = 'Linked ' . $lang->execution->common; $lang->projectstory->featureBar['story']['unlinkedExecution'] = 'Unlinked ' . $lang->execution->common; diff --git a/module/projectstory/lang/fr.php b/module/projectstory/lang/fr.php index 0af31fe975..712bdfa71a 100644 --- a/module/projectstory/lang/fr.php +++ b/module/projectstory/lang/fr.php @@ -26,7 +26,7 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; -$lang->projectstory->featureBar['story']['changed'] = $lang->product->changedStory; +$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = 'Linked ' . $lang->execution->common; $lang->projectstory->featureBar['story']['unlinkedExecution'] = 'Unlinked ' . $lang->execution->common; diff --git a/module/projectstory/lang/vi.php b/module/projectstory/lang/vi.php index c6a62b731d..94347508b9 100644 --- a/module/projectstory/lang/vi.php +++ b/module/projectstory/lang/vi.php @@ -20,5 +20,5 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; -$lang->projectstory->featureBar['story']['changed'] = $lang->product->changedStory; +$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; diff --git a/module/projectstory/lang/zh-cn.php b/module/projectstory/lang/zh-cn.php index 3df6b06ba2..00b3a4fa8f 100644 --- a/module/projectstory/lang/zh-cn.php +++ b/module/projectstory/lang/zh-cn.php @@ -26,7 +26,7 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; -$lang->projectstory->featureBar['story']['changed'] = $lang->product->changedStory; +$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = '已关联' . $lang->execution->common; $lang->projectstory->featureBar['story']['unlinkedExecution'] = '未关联' . $lang->execution->common; diff --git a/module/projectstory/lang/zh-tw.php b/module/projectstory/lang/zh-tw.php index 7f678d39cd..ebea653298 100644 --- a/module/projectstory/lang/zh-tw.php +++ b/module/projectstory/lang/zh-tw.php @@ -26,7 +26,7 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; -$lang->projectstory->featureBar['story']['changed'] = $lang->product->changedStory; +$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = '已關聯' . $lang->execution->common; $lang->projectstory->featureBar['story']['unlinkedExecution'] = '未關聯' . $lang->execution->common; From 1b906a6e4e0aa76224746f2a50c1f3e55b359ce3 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Thu, 18 Aug 2022 02:12:13 +0000 Subject: [PATCH 017/223] * update zentaoIcon --- www/theme/zui/css/min.css | 4 +- www/theme/zui/fonts/ZentaoIcon.eot | Bin 66046 -> 66150 bytes www/theme/zui/fonts/ZentaoIcon.svg | 5 +- www/theme/zui/fonts/ZentaoIcon.ttf | Bin 65868 -> 65972 bytes www/theme/zui/fonts/ZentaoIcon.woff | Bin 65944 -> 66048 bytes www/theme/zui/fonts/zentaoicon.eot | Bin 66046 -> 0 bytes www/theme/zui/fonts/zentaoicon.svg | 275 ---------------------------- www/theme/zui/fonts/zentaoicon.ttf | Bin 65868 -> 0 bytes www/theme/zui/fonts/zentaoicon.woff | Bin 65944 -> 0 bytes 9 files changed, 5 insertions(+), 279 deletions(-) delete mode 100644 www/theme/zui/fonts/zentaoicon.eot delete mode 100644 www/theme/zui/fonts/zentaoicon.svg delete mode 100644 www/theme/zui/fonts/zentaoicon.ttf delete mode 100644 www/theme/zui/fonts/zentaoicon.woff diff --git a/www/theme/zui/css/min.css b/www/theme/zui/css/min.css index ccc2388046..2846fd52e2 100644 --- a/www/theme/zui/css/min.css +++ b/www/theme/zui/css/min.css @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-08-05 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-08-18 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -13,4 +13,4 @@ * * Copyright (c) 2011-2016 Harvest http://getharvest.com * MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md -*/.chosen-container{position:relative;display:block;font-size:13px;vertical-align:middle;zoom:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;display:none;width:100%;background:#fff;border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-top:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container .chosen-drop.chosen-drop-size-limited{border-top:1px solid rgba(0,0,0,.15)}.chosen-container .chosen-drop.chosen-auto-max-width{min-width:100%;border-top:1px solid rgba(0,0,0,.15);opacity:0}.chosen-container .chosen-drop.chosen-auto-max-width>.chosen-results>li{display:inline-block;white-space:nowrap}.chosen-container .chosen-drop.chosen-auto-max-width.in{opacity:1}.chosen-container .chosen-drop.chosen-auto-max-width.in>.chosen-results>li{display:block;white-space:normal}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap!important}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container.chosen-up .chosen-drop{top:inherit;bottom:100%;margin-top:auto;margin-bottom:-1px;border-radius:2px 2px 0 0;-webkit-box-shadow:0 -3px 5px rgba(0,0,0,.175);box-shadow:0 -3px 5px rgba(0,0,0,.175)}.chosen-container.chosen-highlight-selected .result-selected{color:#0c64eb;background:#e9f2fb}.chosen-container-single .chosen-single{display:block;width:100%;height:32px;padding:5px 8px;overflow:hidden;line-height:1.42857143;color:#222;text-decoration:none;white-space:nowrap;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-single .chosen-default{color:#838a9d}.chosen-container-single .chosen-single>span{display:block;margin-right:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:5px;right:24px;display:block;width:20px;height:20px;font-family:sans-serif;font-size:18px;font-weight:700;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-single .chosen-single abbr:before{display:block;content:'×'}.chosen-container-single .chosen-single abbr:focus,.chosen-container-single .chosen-single abbr:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;height:100%;padding:5px 8px}.chosen-container-single .chosen-single div b{display:inline-block;width:0;height:0;margin-bottom:2px;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent;opacity:.5}.chosen-container-single .chosen-search{position:relative;z-index:1010;padding:3px 4px;margin:0;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{width:100%;height:27px;padding:2px 26px 2px 8px;margin:1px 0;font-size:12px;line-height:1.5;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;outline:0}.chosen-container-single .chosen-search input[type=text]:focus{border-color:#0c64eb}.chosen-container-single .chosen-search:before{position:absolute;top:10px;right:10px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-single .chosen-drop{margin-top:-1px;-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:0 0 4px 4px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;max-height:240px;padding:0;margin:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;padding:5px 10px;margin:0;line-height:15px;list-style:none;-webkit-transition:background-color .2s cubic-bezier(.175,.885,.32,1);-o-transition:background-color .2s cubic-bezier(.175,.885,.32,1);transition:background-color .2s cubic-bezier(.175,.885,.32,1);-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{color:#fff;background-color:#0c64eb}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;width:100%;min-height:32px;min-height:30px\9;padding:0;margin:0;overflow:hidden;cursor:text;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-multi .chosen-choices:after,.chosen-container-multi .chosen-choices:before{display:table;content:" "}.chosen-container-multi .chosen-choices:after{clear:both}.chosen-container-multi .chosen-choices li{display:block;float:left;padding:0 6px;margin:5px 4px;list-style:none}.chosen-container-multi .chosen-choices li.search-field{padding:0;line-height:12px;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:20px;font-size:100%;color:#838a9d;background:0 0!important;border:0!important;border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-field:before{position:absolute;right:8px;bottom:8px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";opacity:0;-webkit-transition:opacity .2s cubic-bezier(.175,.885,.32,1);-o-transition:opacity .2s cubic-bezier(.175,.885,.32,1);transition:opacity .2s cubic-bezier(.175,.885,.32,1);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice{position:relative;padding:3px 20px 3px 5px;line-height:12px;cursor:default;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.chosen-container-multi .chosen-choices li.search-choice:hover{background-color:#fff;border-color:#adb5c6;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 0 rgba(0,0,0,.1)}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:1px;right:0;display:block;width:20px;height:18px;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:focus,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;color:#666;background-color:#e4e4e4;border:1px solid #ccc}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{padding:5px 0;margin:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-bottom-right-radius:0!important;border-bottom-left-radius:0!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active.chosen-with-drop .chosen-single div{background:0 0;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{content:"";border-top:0 dotted;border-bottom:4px solid}.chosen-container-active.chosen-with-drop.chosen-up .chosen-single{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active .chosen-choices{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111!important}.chosen-container-active .chosen-choices li.search-field:before{opacity:1}.chosen-disabled{cursor:default;opacity:.5!important}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{left:0;display:none;padding:3px 4px;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:25px;padding:2px 26px 2px 4px;font-size:inherit}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{top:9px}.chosen-compact.chosen-with-search.chosen-with-drop .chosen-single>.chosen-search{display:block;opacity:1}select.chosen[multiple]{height:32px;overflow:hidden}select.chosen[multiple] option{visibility:hidden}.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.picker-focus .picker-selections{border-color:#0c64eb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6)}.disabled .picker-selections{cursor:not-allowed;background-color:#f5f5f5}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\e928";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\f0d7";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:"\e928"}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:18px;height:18px;text-align:center;cursor:pointer;opacity:.2;-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}.picker-selection-remove:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px;z-index:1}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-multi.picker-sortable .picker-selection-text{cursor:move}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.disabled .picker-search{cursor:not-allowed}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.picker-no-value.picker-focus .picker-placeholder{display:none}.picker-input-empty.picker-focus.picker-no-value .picker-placeholder,.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.42857143;color:#3c4353;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#0c64eb;background:#e9f2fb}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#0c64eb}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option.disabled{cursor:not-allowed!important}.picker-option-text-matched{position:relative;color:#0c64eb}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:2px;content:' ';background-color:#0c64eb;border-radius:2px;opacity:.5}.picker-option-active .picker-option-text-matched,.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option-active .picker-option-text-matched:before,.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ff5d5d}.picker-actions{padding:5px;border-top:1px solid #eee}.picker-no-actions .picker-actions{display:none}.picker-actions .btn{padding:2px 4px}.picker-actions .btn[disabled]{background-color:transparent;filter:grayscale(1);-webkit-filter:grayscale(1)}.picker-actions .btn+.btn{margin-left:4px}.picker-checkable .picker-option{position:relative;padding-left:32px;color:inherit!important;cursor:pointer!important}.picker-checkable .picker-option>.checkbox-primary{position:absolute;top:4px;left:10px}.picker-checkable .picker-option.picker-option-active{background-color:rgba(0,0,0,.05)!important}.picker-checkable .picker-option:hover{background-color:rgba(0,0,0,.075)!important}.picker-checkable .picker-option.picker-option-selected{background-color:#e9f2fb!important}.picker-checkable .picker-option-active .picker-option-text-matched,.picker-checkable .picker-option:hover .picker-option-text-matched{color:#0c64eb!important}.picker-checkable .picker-option-active .picker-option-text-matched:before,.picker-checkable .picker-option:hover .picker-option-text-matched:before{background:#0c64eb!important}:root{--color-primary:#0c64eb;--color-secondary:#16a8f8;--color-pale:#e9f2fb;--color-fore:#3c4353;--color-back:#fff;--color-red:#ff5d5d;--color-yellow:#ff9800;--color-green:#00da88;--color-blue:#2196f3;--color-purple:#8666b8;--color-brown:#bd7b46;--color-danger:#ff5d5d;--color-warning:#ff9800;--color-success:#00da88;--color-info:#2196f3;--color-special:#8666b8;--color-important:#bd7b46;--color-green-pale:#e8f5e9;--color-yellow-pale:#fff3e0;--color-red-pale:#ffebee;--color-blue-pale:#e3f2fd;--color-brown-pale:#efebe9;--color-purple-pale:#f3e5f5;--link-color:#3c4353;--link-hover-color:#0c64eb;--color-gray-darker:#222;--color-gray-dark:#3c495c;--color-gray:#838a9d;--color-gray-light:#cbd0db;--color-gray-lighter:#eee;--color-gray-pale:#f1f1f1;--border-radius:4px;--border-radius-lg:6px;--border-radius-sm:3px;--bg-gradient:linear-gradient(-90deg, #0a48d1 0%, #1183fb 100%)}.container,.container-fixed,.container-fluid{position:relative}.container{max-width:1800px!important}body{background-color:#efefef}body.article-content,body.body-modal{background:0 0}body.body-modal{padding:0}@media screen and (min-width:1920px){body{font-size:14px}}a:active,a:focus,button:active,button:focus{outline:0!important}.strong{font-weight:700}.font-normal{font-weight:400!important}.text-middle{vertical-align:middle!important}.text-bottom{vertical-align:bottom!important}.text-top{vertical-align:top!important}.inline-block{display:inline-block!important}.layer{border-radius:4px;-webkit-box-shadow:0 0 20px 0 #bdc9d8;box-shadow:0 0 20px 0 #bdc9d8}.space{margin-bottom:20px}.space-lg{margin-bottom:30px}.space-sm{margin-bottom:10px}.muted{opacity:.5}.text-muted em{color:#3c4353}.no-animate{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.template{display:none!important}.text-left{text-align:left!important}.text-yellow.icon-folder{color:#ffe066}.table-row{display:table;width:100%;table-layout:fixed}.table-col,.table-row>.col,.table-row>[class*=col-],.table-row>[class*="-col"]{display:table-cell;float:none;vertical-align:top}.side-col{width:200px;padding-right:20px}.side-col.col-4{width:33.3333333%}.col-lg{width:260px}.col-xl{width:320px}.col-sm{width:150px}.col-xs{width:100px}.main-col+.side-col{padding-right:0;padding-left:20px}.row-grid>[class*=col-],.row-grid>[class*="-col"]{padding-top:6px;padding-bottom:6px}hr.space{margin:10px 0;border:none}hr.space-sm{margin:5px 0;border:none}.text-secondary{color:#16a8f8}a.text-primary{color:#0c64eb}.nav-primary>li>a{min-width:100px;padding:5px 8px;color:#838a9d;border-color:#e7f1fc}.nav-primary>li.active>a{color:#0c64eb;background-color:#e7f1fc;border-color:#e7f1fc}.nav-primary>li.active>a:hover{color:#0c64eb;background-color:#c3dcf7;border-color:#c3dcf7}.end-marker{margin-bottom:20px;color:#cbd0db;text-align:center}@-webkit-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@-o-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}.highlight{-webkit-animation:highlight .5s linear 0s 2 alternate;-o-animation:highlight .5s linear 0s 2 alternate;animation:highlight .5s linear 0s 2 alternate}.progress.inline-block{width:100px;margin:0}.w-p5{width:5%!important}.w-p10{width:10%!important}.w-p15{width:15%!important}.w-p20{width:20%!important}.w-p25{width:25%!important}.w-p30{width:30%!important}.w-p35{width:35%!important}.w-p40{width:40%!important}.w-p45{width:45%!important}.w-p50{width:50%!important}.w-p55{width:55%!important}.w-p60{width:60%!important}.w-p65{width:65%!important}.w-p70{width:70%!important}.w-p75{width:75%!important}.w-p80{width:80%!important}.w-p85{width:85%!important}.w-p90{width:90%!important}.w-p94{width:94%!important}.w-p95{width:95%!important}.w-p98{width:98%!important}.w-p99{width:99%!important}.w-p100{width:100%!important}.w-auto{width:auto!important}.w-10px{width:10px!important}.w-20px{width:20px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-60px{width:60px!important}.w-70px{width:70px!important}.w-80px{width:80px!important}.w-90px{width:90px!important}.w-100px{width:100px!important}.w-110px{width:110px!important}.w-120px{width:120px!important}.w-130px{width:130px!important}.w-140px{width:140px!important}.w-150px{width:150px!important}.w-160px{width:160px!important}.w-180px{width:180px!important}.w-200px{width:200px!important}.w-230px{width:230px!important}.w-250px{width:250px!important}.w-300px{width:300px!important}.w-400px{width:400px!important}.w-500px{width:500px!important}.w-600px{width:600px!important}.w-700px{width:700px!important}.w-800px{width:800px!important}.w-900px{width:900px!important}.mw-200px{max-width:200px!important}.mw-300px{max-width:300px!important}.mw-400px{max-width:400px!important}.mw-500px{max-width:500px!important}.mw-600px{max-width:600px!important}.mw-700px{max-width:700px!important}.mw-800px{max-width:800px!important}.mw-900px{max-width:900px!important}.mw-1400px{max-width:1400px!important}.w-id{width:70px!important}.w-pri{width:40px!important}.w-severity{width:50px!important}.w-hour{width:57px!important}.w-date{width:90px!important}.w-status{width:60px!important}.w-resolution,.w-type,.w-user{width:80px!important}.w-p15-f{width:15%!important;min-width:120px!important}.w-p25-f{width:25%!important;min-width:200px!important}.w-p35-f{width:35%!important;min-width:300px!important}.w-p45-f{width:45%!important;min-width:400px!important}.h-5px{height:5px!important}.h-10px{height:10px!important}.h-20px{height:20px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-60px{height:60px!important}.h-70px{height:70px!important}.h-80px{height:80px!important}.h-100px{height:100px!important}.h-120px{height:120px!important}.h-130px{height:130px!important}.h-140px{height:140px!important}.h-150px{height:150px!important}.h-200px{height:200px!important}.pd-0{padding:0!important}.mg-0{margin:0!important}.mgb-20{margin-bottom:20px!important}.mgb-10{margin-bottom:10px!important}.pdb-20{padding-bottom:20px!important}.pdt-20{padding-top:20px!important}.br-0{border-radius:0!important}.bd-0,.bd-none,.borderless{border:none!important}.bg-none{background:0 0!important}.red{color:#ff5d5d!important}.icon-pro-version{font-size:14px!important}.icon-pro-version:before{position:relative;top:-1px;font-size:14px;color:#ff5d5d;content:"\e92b"}.bg-primary{color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb}.bg-primary-pure{color:#fff;background-color:#0c64eb}.bg-primary-pale{color:#0c64eb;background-color:#e9f2fb}.bg-secondary{color:#fff;background:#16a8f8}.hl-tutorial{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 0 0 #000!important;box-shadow:0 0 0 0 #000!important;-webkit-transition:-webkit-box-shadow 1s!important;-o-transition:box-shadow 1s!important;transition:-webkit-box-shadow 1s!important;transition:box-shadow 1s!important;transition:box-shadow 1s,-webkit-box-shadow 1s!important}.hl-tutorial.hl-in{-webkit-box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important;box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important}.btn.tooltip-tutorial,.hl-tutorial.hl-in:hover{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important;box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important}.tooltip-max .tooltip-inner{max-width:1000px;padding:8px 10px}.transition-all *{-webkit-transition:all .2s!important;-o-transition:all .2s!important;transition:all .2s!important}.scroll-x{overflow-x:auto!important}.scroll-y{overflow-y:auto!important}.divider+.divider{display:none}.ie *{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}@font-face{font-family:Oswald;font-weight:400;src:url(../fonts/Oswald-Regular.ttf)}@font-face{font-family:Oswald;font-weight:500;src:url(../fonts/Oswald-Medium.ttf)}@font-face{font-family:Oswald;font-weight:300;src:url(../fonts/Oswald-Light.ttf)}.num{font-family:Oswald;font-weight:400}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(../fonts/ZentaoIcon.eot?v=1.34);src:url(../fonts/ZentaoIcon.eot?#iefix&v=1.34) format('embedded-opentype'),url(../fonts/ZentaoIcon.woff?v=1.34) format('woff'),url(../fonts/ZentaoIcon.ttf?v=1.34) format('truetype'),url(../fonts/ZentaoIcon.svg#regular?v=1.34) format('svg')}.icon,[class*=" icon-"],[class^=icon-]{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}a .icon,a [class*=" icon-"],a [class^=icon-]{display:inline}.icon-lg:before{font-size:1.33333333em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-spin{display:inline-block;-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-spin{display:inline-block;text-decoration:none}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);-o-transform:rotate(359deg);transform:rotate(359deg)}}.icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.icon-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.icon.icon-flip-horizontal,.icon.icon-flip-vertical,.icon.icon-rotate-180,.icon.icon-rotate-270,.icon.icon-rotate-90{display:inline-block}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-help:before{content:"\e968"}.icon-import:before{content:"\e904"}.icon-download:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-plus:before{content:"\e925"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-chart-bar:before{content:"\e95d"}.icon-bar-chart:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before{content:"\e940"}.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-college:before{content:"\e9c8"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-menu-my:before{content:"\e97a"}.icon-home:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before{content:"\e98f"}.icon-product:before{content:"\e98f"}.icon-rocket:before{content:"\e99c"}.icon-project:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-test:before{content:"\e956"}.icon-infinite:before{content:"\e9a3"}.icon-devops:before{content:"\e9a3"}.icon-ops:before{content:"\e903"}.icon-doc:before{content:"\e99b"}.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-menu-backend:before{content:"\e993"}.icon-assets:before{content:"\e9ae"}.icon-diamond:before{content:"\e9ae"}.icon-feedback:before{content:"\e991"}.icon-flow:before{content:"\e994"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before{content:"\e996"}.icon-info:before{content:"\e996"}.icon-cog-outline:before{content:"\e997"}.icon-backend:before{content:"\e997"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before{content:"\f0ac"}.icon-lang:before{content:"\f0ac"}.icon-draft-edit:before{content:"\e9dc"}.icon-sub-review:before{content:"\e9db"}.icon-ztf:before{content:"\e9dd"}.icon-save:before{content:"\e9d8"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-customer:before{content:"\e9d9"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-kanban:before{content:"\e983"}.icon-lane:before{content:"\e9b1"}.icon-back:before{content:"\e9d3"}.icon-back-circle:before{content:"\e9da"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before{content:"\e9c7"}.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-thumbs-up-solid:before{content:"\e9d6"}.icon-thumbs-down-solid:before{content:"\e9d7"}.icon-hash:before{content:"\e9ab"}.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-file-log:before{content:"\e9de"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file:before{content:"\f016"}.icon-file-empty:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-group:before{content:"\e97e"}.icon-menu-users:before{content:"\e97e"}.icon-persons:before{content:"\e97e"}.icon-team:before{content:"\e97e"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-cancel:before{content:"\e951"}.icon-ban-circle:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before{content:"\e950"}.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-start:before{content:"\e90a"}.icon-play:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-change:before{content:"\e970"}.icon-alter:before{content:"\e970"}.icon-glasses:before{content:"\e914"}.icon-review:before{content:"\e914"}.icon-sitemap:before{content:"\e915"}.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-magic:before{content:"\e919"}.icon-active:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-delay:before{content:"\e91d"}.icon-calendar:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.icon-sm:before{font-size:14px;vertical-align:10%}.icon-qc{position:relative}.icon-qc:before{width:1em;color:#7cb938;content:"\e985"}.icon-qc:after{position:absolute;top:0;left:0;width:1em;height:1em;font-family:ZentaoIcon;font-size:14px;font-size:inherit;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#36a742;text-transform:none;content:"\e987";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-message.has-dot{position:relative}.icon-message.has-dot::after{position:absolute;top:-3px;right:-5px;display:block;width:6px;height:6px;content:' ';background-color:#ff5d5d;border-radius:50%}.icon-project{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.icon-product{-webkit-transform:scale(1.15);-ms-transform:scale(1.15);-o-transform:scale(1.15);transform:scale(1.15)}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:18px;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px;-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background,border,outline,opacity,-webkit-box-shadow;-o-transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,outline,opacity,-webkit-box-shadow;transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,box-shadow,outline,opacity,-webkit-box-shadow}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#3c4353;text-decoration:none}.btn:active{text-decoration:none;background-image:none;outline:0;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.1)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:grayscale(1);-webkit-box-shadow:none;box-shadow:none;opacity:.5;-webkit-filter:grayscale(1)}.btn{color:#3c4353;background-color:#fff;border-color:#d6dae3}.btn.active,.btn.hover,.btn:active,.btn:focus,.btn:hover,.open .dropdown-toggle.btn{color:#3c4353;background-color:rgba(255,255,255,.8);border-color:#b8bfce}.btn.active,.btn:active,.open .dropdown-toggle.btn{background-color:#f2f2f2;background-image:none;border-color:#b8bfce}.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn.active,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover{color:rgba(60,67,83,.3);background-color:#fff;border-color:#d6dae3}.btn-gray{color:#82899f;background-color:#f1f1f1;border-color:#f1f1f1}.btn-gray.active,.btn-gray.hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.open .dropdown-toggle.btn-gray{color:#82899f;background-color:rgba(241,241,241,.8);border-color:#d8d8d8}.btn-gray.active,.btn-gray:active,.open .dropdown-toggle.btn-gray{background-color:#e4e4e4;background-image:none;border-color:#d8d8d8}.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,fieldset[disabled] .btn-gray,fieldset[disabled] .btn-gray.active,fieldset[disabled] .btn-gray:active,fieldset[disabled] .btn-gray:focus,fieldset[disabled] .btn-gray:hover{color:rgba(130,137,159,.3);background-color:#f1f1f1;border-color:#f1f1f1}.btn-primary{color:#fff;background-color:#0c64eb;border-color:transparent}.btn-primary.active,.btn-primary.hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:rgba(12,100,235,.8);border-color:rgba(0,0,0,0)}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-color:#0b5ad3;background-image:none;border-color:rgba(0,0,0,0)}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{color:rgba(255,255,255,.3);background-color:#0c64eb;border-color:transparent}.btn-secondary{color:#fff;background-color:#16a8f8;border-color:transparent}.btn-secondary.active,.btn-secondary.hover,.btn-secondary:active,.btn-secondary:focus,.btn-secondary:hover,.open .dropdown-toggle.btn-secondary{color:#fff;background-color:rgba(22,168,248,.8);border-color:rgba(0,0,0,0)}.btn-secondary.active,.btn-secondary:active,.open .dropdown-toggle.btn-secondary{background-color:#079ced;background-image:none;border-color:rgba(0,0,0,0)}.btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:focus,.btn-secondary.disabled:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[disabled]:active,.btn-secondary[disabled]:focus,.btn-secondary[disabled]:hover,fieldset[disabled] .btn-secondary,fieldset[disabled] .btn-secondary.active,fieldset[disabled] .btn-secondary:active,fieldset[disabled] .btn-secondary:focus,fieldset[disabled] .btn-secondary:hover{color:rgba(255,255,255,.3);background-color:#16a8f8;border-color:transparent}.btn-warning{color:#fff;background-color:#ff9800;border-color:transparent}.btn-warning.active,.btn-warning.hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:rgba(255,152,0,.8);border-color:rgba(0,0,0,0)}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-color:#e68900;background-image:none;border-color:rgba(0,0,0,0)}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{color:rgba(255,255,255,.3);background-color:#ff9800;border-color:transparent}.btn-danger{color:#fff;background-color:#ff5d5d;border-color:transparent}.btn-danger.active,.btn-danger.hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:rgba(255,93,93,.8);border-color:rgba(0,0,0,0)}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-color:#ff4343;background-image:none;border-color:rgba(0,0,0,0)}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{color:rgba(255,255,255,.3);background-color:#ff5d5d;border-color:transparent}.btn-success{color:#fff;background-color:#00da88;border-color:transparent}.btn-success.active,.btn-success.hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:rgba(0,218,136,.8);border-color:rgba(0,0,0,0)}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-color:#00c178;background-image:none;border-color:rgba(0,0,0,0)}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{color:rgba(255,255,255,.3);background-color:#00da88;border-color:transparent}.btn-info{color:#0c64eb;background-color:#e9f2fb;border-color:transparent}.btn-info.active,.btn-info.hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#0c64eb;background-color:rgba(233,242,251,.8);border-color:rgba(0,0,0,0)}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-color:#d3e5f7;background-image:none;border-color:rgba(0,0,0,0)}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{color:rgba(12,100,235,.3);background-color:#e9f2fb;border-color:transparent}.btn-link{padding-right:6px;padding-left:6px;font-weight:400;color:#3c495c;text-shadow:none;cursor:pointer;background:0 0;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover,.btn-link[disabled],fieldset[disabled] .btn-link{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{color:#222;background:#f1f1f1;background:rgba(0,0,0,.075)}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#cbd0db;text-decoration:none}.btn-lg{padding:11px 16px;font-size:14px;line-height:18px;border-radius:4px}.btn-mini,.btn-sm{padding:3px 8px;font-size:12px;line-height:18px;border-radius:4px}.btn-mini,.btn-xs{padding:0 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-wide{min-width:120px}.btn-limit{max-width:180px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-limit>.caret{position:absolute;top:14px;right:8px}.btn-circle{border-radius:17px}.btn>.label-icon{top:3px;padding:3px;margin:-2px;background-color:rgba(0,0,0,.2);border-radius:12px}.btn>.label-icon>.icon{font-size:16px;line-height:18px}.btn>.icon+.text{margin-left:5px}.btn.btn-sm.btn-circle{border-radius:12px}.btn.btn-sm>.label-icon{top:2px;width:20px;height:20px;padding:1px;line-height:20px}.btn.btn-sm>.label-icon>.icon{position:relative;top:-1px;display:inline-block;font-size:14px;line-height:18px}.btn-icon-left{position:relative;padding-left:35px;overflow:hidden;text-align:right}.btn-icon-left>.label-icon{position:absolute;left:5px;margin:0}.btn-icon-left>.icon{position:absolute;top:0;bottom:0;left:0;display:block;width:30px;line-height:30px;color:#16a8f8;text-align:center;background:#e9f2fb}.btn-icon-left.btn-sm{padding-left:28px}.btn-icon-left.btn-sm>.label-icon{left:2px}.btn-icon-left.btn-sm>.icon{width:24px;line-height:24px}.btn-icon-right{position:relative;padding-right:35px;text-align:left}.btn-icon-right>.label-icon{position:absolute;right:5px;margin:0}.btn-icon-right.btn-sm{padding-right:28px}.btn-icon-right.btn-sm>.label-icon{right:2px}.btn-icon{min-width:32px;padding-right:0;padding-left:0}.btn-icon.btn-sm{width:24px;min-width:24px;height:24px}.btn-group{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>.btn-group{float:left}.btn-group>.btn{border-radius:0}.btn-group>.btn:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.dropdown{float:left;margin-right:10px}.btn-toolbar>.btn-group:last-child,.btn-toolbar>.btn:last-child,.btn-toolbar>.dropdown:last-child{margin-right:0}.btn-toolbar>.divider{float:left;height:20px;margin:7px 5px 4px 10px;border-left:1px solid rgba(0,0,0,.1)}.btn-toolbar .space{float:left;min-height:1px;margin:0 10px 0 10px}.btn-toolbar .input-control{float:left;width:120px}.btn-toolbar .page-title{float:left;line-height:34px}.btn-toolbar .page-title .text{font-size:14px;font-weight:700}.btn-toolbar .page-title .label{top:-2px;margin-right:10px}.btn-toolbar .divider+.page-title{margin-left:15px}.btn-active-line{position:relative;font-weight:700;color:#0c64eb}.btn-active-line:after{position:absolute;right:5px;bottom:1px;left:5px;display:block;content:' ';border-bottom:2px solid #0c64eb}.btn-active-line:hover{color:#0c64eb}.btn-active-text .text{position:relative;top:-1px;display:inline-block;font-weight:700;color:#0c64eb}.btn-active-text .text:after{position:absolute;bottom:-5px;display:block;width:100%;content:' ';border-bottom:2px solid #0c64eb}.angle-btn{position:relative;padding:1px;background:#fff;border:1px solid #cbd0db;border-right:none}.angle-btn:first-child{border-radius:2px 0 0 2px}.btn-toolbar>.angle-btn{margin-right:8px}.angle-btn:after,.angle-btn:before{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn:after{right:-7px;border-color:transparent transparent transparent #fff;border-radius:2px}.angle-btn .btn{padding:6px;font-weight:700;background:#fff;border:none;border-radius:4px!important}.angle-btn .btn.btn-limit{padding-right:16px}.angle-btn .btn.btn-limit>.caret{right:4px}.angle-btn+.angle-btn{border-left:none}.angle-btn+.angle-btn>.btn-group:first-child{padding-left:8px}.angle-btn+.angle-btn>.btn-group:first-child:after,.angle-btn+.angle-btn>.btn-group:first-child:before{position:absolute;top:-2px;left:0;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn+.angle-btn>.btn-group:first-child:after{left:-1px;border-color:transparent transparent transparent #fff;border-width:17px 0 17px 8px}.btn-toolbar>.angle-btn.active,.btn-toolbar>.angle-btn:last-child{border-color:#0c64eb}.btn-toolbar>.angle-btn.active .btn,.btn-toolbar>.angle-btn:last-child .btn{color:#0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn.active:before,.btn-toolbar>.angle-btn:last-child:after,.btn-toolbar>.angle-btn:last-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn:last-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:before,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn,.btn-toolbar>.angle-btn.normal{border-color:#cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn .btn,.btn-toolbar>.angle-btn.normal .btn{color:#3c4353}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.active+.angle-btn:before,.btn-toolbar>.angle-btn.normal:after,.btn-toolbar>.angle-btn.normal:before{border-color:transparent transparent transparent #cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.normal:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before,.btn-toolbar>.angle-btn.normal>.btn-group:first-child:before{border-color:transparent transparent transparent #cbd0db!important}.nav>li>.btn.btn-primary{color:#fff}.nav>li>.btn.btn-primary:focus,.nav>li>.btn.btn-primary:hover{background:rgba(12,100,235,.8)}.btn.btn-action,.c-actions .btn{display:inline-block;width:26px;padding:2px;overflow:hidden;line-height:20px;color:#16a8f8;background:0 0;border-color:transparent}.btn.btn-action>i,.c-actions .btn>i{position:relative;top:1px;font-size:18px}.btn.btn-action:hover,.c-actions .btn:hover{color:#0c64eb;background-color:#d3e5f7}.c-actions .btn+.btn{margin-left:-4px}.label{position:relative;display:inline-block;padding:3px 5px;font-size:12px;font-weight:400;vertical-align:middle;border-radius:2px}.label+.label{margin-left:4px}.label-pale{background:#bed8f3!important}.label-badge{border-radius:9px}.label-light{color:#3c4353;background-color:#ddd}.label-primary{background:#0c64eb!important}.label-gray{color:#878da0;background:#e8ebef}.label-outline.label-danger{color:#ff5d5d;background:#ffebee;border-color:rgba(255,93,93,.25)}.label-outline.label-light{color:#838a9d;background:#f2f5fb;border-color:#e1e5ee}.label-primary.label-outline{background:#e9f2fb!important;border-color:rgba(12,100,235,.25)}.label-outline.label-success{background:#e8f5e9;border-color:rgba(0,218,136,.25)}.label-outline.label-info{background:#e3f2fd;border-color:rgba(33,150,243,.25)}.label-outline.label-warning{background:#fff3e0;border-color:rgba(255,152,0,.25)}.label-dot{position:relative;top:-1px;padding:0;border-radius:50%}.label-dot+.status-text{display:inline-block;margin-left:5px}.label-icon{min-width:18px;padding:0;line-height:18px;border-radius:10px}.label-id{display:inline-block;min-width:30px;padding:0 5px;font-size:12px;line-height:16px;color:#838a9d;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid #838a9d;border-radius:2px}.pri-1,.todo-pri-1{color:#ff5d5d}[class*=" status-"],[class^=status-]{color:#3c4353}.status-changed,.status-delayed,.status-doing,.status-fail,.status-investigate{color:#ff5d5d}.status-changed>.label-dot,.status-delayed>.label-dot,.status-doing>.label-dot,.status-fail>.label-dot,.status-investigate>.label-dot{background-color:#ff5d5d}.status-wait{color:#838a9d}.status-wait>.label-dot{background-color:#7ec5ff}.status-unclosed{color:#838a9d}.status-unclosed>.label-dot{background-color:#0c64eb}.status-done,.status-normal,.status-pass,.status-resolved{color:#43a047}.status-done>.label-dot,.status-normal>.label-dot,.status-pass>.label-dot,.status-resolved>.label-dot{background-color:#00da88}.status-postpone{color:#838a9d}.status-postpone>.label-dot{background-color:#ff5d5d}.status-blocked{position:relative;left:-5px;display:inline-block;padding:0 5px;line-height:20px;color:#3c4353;background:0 0;border-radius:10px}.status-blocked>.label-dot{background-color:#ff9800}.status-pause,.status-suspended{color:#ff9800}.status-pause>.label-dot,.status-suspended>.label-dot{background-color:#ff9800}.status-active.status-bug,.status-draft{color:#8666b8}.status-active.status-bug>.label-dot,.status-draft>.label-dot{background-color:#8666b8}.status-closed,.status-terminate{color:#838a9d}.status-closed>.label-dot,.status-terminate>.label-dot{background-color:#838a9d}.status-cancel{color:#838a9d}.status-cancel>.label-dot{background-color:#cbd0db}.label-pri{display:inline-block;min-width:18px;max-width:100%;height:18px;padding:0 4px;overflow:hidden;font-size:12px;line-height:16px;color:#838a9d;text-align:center;text-overflow:clip;white-space:normal;vertical-align:middle;border:1px solid #838a9d;border-radius:10px}.label-pri-1,.label-selector>.label-pri[data-value="1"]{color:#d50000;border-color:#d50000}.label-pri-2,.label-selector>.label-pri[data-value="2"]{color:#ff9800;border-color:#ff9800}.label-pri-3,.label-selector>.label-pri[data-value="3"]{color:#2098ee;border-color:#2098ee}.label-pri-4,.label-selector>.label-pri[data-value="4"]{color:#009688;border-color:#009688}.label-pri-5,.label-selector>.label-pri[data-value="5"]{color:#838a9d;border-color:#838a9d}.label-pri-0,.label-selector>.label-pri.active[data-value="0"]{color:#d5d9df;border-color:#d5d9df}.label-severity{position:relative;display:inline-block;width:24px;height:20px;font-weight:bolder;text-align:center;vertical-align:middle}.label-severity:before{position:absolute;top:-3px;left:0;z-index:0;display:block;font-family:ZentaoIcon;font-size:14px;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:inherit;text-transform:none;content:"\e973";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.label-severity:after{position:absolute;top:7px;left:0;z-index:1;display:block;width:24px;font-size:12px;line-height:12px;text-align:center;content:attr(data-severity)}.label-severity[data-severity],.label-severity[data-value]{color:#ccc}.label-severity[data-severity="0"],.label-severity[data-value="0"]{color:#ccc}.label-severity[data-severity="1"],.label-severity[data-value="1"]{color:#c62828}.label-severity[data-severity="2"],.label-severity[data-value="2"]{color:#ff8f00}.label-severity[data-severity="3"],.label-severity[data-value="3"]{color:#fdd835}.label-severity[data-severity="4"],.label-severity[data-value="4"]{color:#cddc39}.label-severity[data-severity="5"],.label-severity[data-value="5"]{color:#8bc34a}.label-severity-custom[data-severity]{color:#d5d9df}.label-severity-custom[data-severity="1"]{color:#c62828}.label-severity-custom[data-severity="2"]{color:#ff8f00}.label-severity-custom[data-severity="3"]{color:#fdd835}.label-severity-custom[data-severity="4"]{color:#cddc39}.label-severity-custom[data-severity="5"]{color:#8bc34a}.label-selector{padding:0 10px}.label-selector>.label{display:inline-block;min-width:24px;height:24px;padding:0 5px;font-size:14px;line-height:20px;text-align:center;cursor:pointer;background:0 0;border:2px solid #d5d9df;border-radius:15px}.label-selector>.label+.label{margin-left:10px}.label-selector>.label.empty{border-color:transparent}.label-selector>.label.label-severity{font-size:12px;line-height:28px;border-color:transparent}.label-selector>.label.label-severity:before{top:-2px;left:-2px}.label-selector>.label.label-severity:after{display:none}.label-selector>.label.label-severity.active{background:0 0;filter:none;-webkit-filter:none}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-top:2px}.ie .checkbox input[type=checkbox],.ie .checkbox-inline input[type=checkbox],.ie .radio input[type=radio],.ie .radio-inline input[type=radio]{margin-top:4px}.is-firefox .checkbox input[type=checkbox],.is-firefox .checkbox-inline input[type=checkbox],.is-firefox .radio input[type=radio],.is-firefox .radio-inline input[type=radio]{margin-top:3px}.checkbox-primary,.radio-primary{position:relative;display:block;vertical-align:middle}.checkbox-primary.inline-block,.radio-primary.inline-block{display:inline-block}.checkbox-primary.inline-block+.inline-block,.radio-primary.inline-block+.inline-block{margin-left:15px}.checkbox-primary>input,.radio-primary>input{position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;margin:0;opacity:0}.checkbox-primary>label,.radio-primary>label{display:block;height:20px;padding-left:20px;margin:0;font-weight:400;line-height:20px;cursor:pointer}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{position:absolute;top:3px;right:0;left:0;display:block;width:14px;height:14px;line-height:14px;text-align:center;content:' ';border-radius:3px}.checkbox-primary>label:after,.radio-primary>label:after{z-index:1;border:1px solid #d9dbe1;border-color:rgba(0,0,0,.15);-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:border,background-color;-o-transition-property:border,background-color;transition-property:border,background-color}.checkbox-primary>label:before,.radio-primary>label:before{top:3px;z-index:2;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-weight:900;font-variant:normal;line-height:1;text-transform:none;content:"\e5ca";opacity:0;-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:opacity,-webkit-transform;-o-transition-property:opacity,-o-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform,-o-transform;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.checkbox-primary.checked>label:after,.checkbox-primary>input:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:#00da88;border-color:#00da88;border-width:4px}.checkbox-primary.checked>label:before,.checkbox-primary>input:checked+label:before,.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{color:#fff;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary input:indeterminate+label:before,.checkbox-primary.indeterminate>label:before,.radio-primary input:indeterminate+label:before,.radio-primary.indeterminate>label:before{top:9px;left:3px;width:8px;height:2px;content:' ';background-color:#a3a2bc;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary.focus>label:after,.checkbox-primary>input:focus+label:after,.radio-primary.focus>label:after,.radio-primary>input:focus+label:after{border-color:#00da88;-webkit-box-shadow:0 0 0 3px rgba(0,218,136,.2);box-shadow:0 0 0 3px rgba(0,218,136,.2)}.checkbox-primary:hover>label:after,.radio-primary:hover>label:after{border-color:#00da88}.checkbox-primary.checkbox-right>label,.radio-primary.checkbox-right>label{padding:0 30px 0 0}.checkbox-primary.checkbox-right>label:after,.checkbox-primary.checkbox-right>label:before,.radio-primary.checkbox-right>label:after,.radio-primary.checkbox-right>label:before{right:0;left:auto}.checkbox-primary input:disabled+label:after,.checkbox-primary.disabled>label:after,.radio-primary input:disabled+label:after,.radio-primary.disabled>label:after{background-color:#e5e5e5!important;border-color:#bbb!important}.checkbox-primary input:disabled:checked+label:after,.checkbox-primary.checked.disabled>label:after,.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:#bbb!important}.radio-primary>label:after{border-radius:50%}.radio-primary>label:before{top:7px;left:6px;width:6px;height:6px;content:' ';border:none;border-radius:50%}.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:transparent;border-color:#00da88;border-width:2px}.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{background-color:#00da88}.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:transparent;border-color:#bbb}.radio-primary input:disabled:checked+label:before,.radio-primary.checked.disabled>label:before{background-color:#bbb}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li>a{position:relative;border:none!important;border-radius:2px!important}.nav-tabs>li.active>a{font-weight:700;color:#3c4353!important}.nav-tabs>li.active>a:before{position:absolute;right:0;bottom:-1px;left:0;display:block;height:2px;content:' ';background:#0c64eb}.nav-tabs-primary>li.active>a{color:#0c64eb!important}.panel{position:relative;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.panel-body{padding:20px}.panel-body.has-table{padding:10px}.panel-body.has-table .table{margin-bottom:0;table-layout:fixed}.panel-heading{padding:12px 48px 12px 20px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading+.panel-body{padding-top:0}.panel-title{font-size:14px;font-weight:700;line-height:20px}.panel-title .label{top:-1px}.panel-actions{position:absolute;top:0;right:0;padding:7px 8px}.panel:hover .panel-actions{z-index:10}.panel-actions>li>a{display:inline-block;min-width:30px;padding:0 5px;line-height:30px;color:#a6aab8;text-align:center;border-radius:4px}.panel-actions>li>a:hover{color:#3c495c;text-decoration:initial;background-color:#f1f1f1}.panel-actions .btn-icon{color:#a6aab8}.panel-actions .btn.text-primary{color:#0c64eb}.panel .empty-tip{padding:30px 10px 50px;font-size:14px;color:#838a9d;text-align:center}.progress-text-left{position:relative;margin:7px 0;margin-left:35px;overflow:visible}.progress-text-left .progress-text{position:absolute;top:-7px;left:-35px;display:block;width:35px;height:20px;padding-right:5px;line-height:20px;color:#838a9d;text-align:right}.chart-color{width:20px}.chart-color-dot{display:inline-block;width:10px;height:10px;border-radius:50%}.chart-row{margin-top:10px}.chart-row+.chart-row{padding-top:10px;border-top:1px solid #eee}.chart-wrapper{padding:10px 5px;background:#eee}.chart-wrapper>h4{margin:5px 0 10px}.table-wrapper{max-height:250px;overflow:auto}.table-wrapper .table{margin:0}.progress-pie{position:relative}.progress-pie canvas{display:block}.progress-pie .progress-info{position:absolute;top:0;left:0;width:100%;height:100%;padding-top:25px;text-align:center}.progress-pie .progress-info>small{display:block;line-height:14px;color:#a6aab8}.progress-pie .progress-info>strong{display:block;font-size:36px;line-height:40px}.progress-pie .progress-info>strong>small{font-size:20px}.progress-pie-120 .progress-info{padding-top:30px}.progress-pie-120 .progress-info>small{line-height:18px}.progress-pie-50 .progress-info{padding-top:4px}.progress-pie-50 .progress-info>strong{font-size:20px;font-weight:400}.progress-pie-50 .progress-info>strong>small{font-size:14px}.progress-pie[data-value="100"] .progress-info>strong{-webkit-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);transform:scale(.7)}.progress-pie-24 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:24px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-24[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.progress-pie-26 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:26px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-26[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.status-bars{display:table;width:100%;height:140px;padding:5px;padding-top:50px;margin:0;overflow:hidden}.status-bars>li{position:relative;display:table-cell;text-align:center;vertical-align:bottom}.status-bars .bar{position:absolute;bottom:20px;left:50%;display:block;width:10px;margin-left:-5px;background:#0c64eb;border-radius:5px 5px 0 0}.status-bars .bar:after{position:absolute;right:-50px;bottom:0;left:-50px;display:block;height:1px;content:' ';background:#eee}.status-bars .title{font-size:12px;font-weight:400;color:#a6a8b6}.status-bars .value{position:relative;top:-20px;left:-20px;display:inline-block;width:50px;font-size:16px;font-weight:700;text-align:center}.status-bars-h{display:block;padding-right:50px;padding-left:60px;list-style:none}.status-bars-h>li{position:relative;height:40px;border-left:1px solid #eee}.status-bars-h .bar{position:relative;top:15px;display:block;height:10px;line-height:20px;background:#0c64eb;border-radius:0 5px 5px 0}.status-bars-h .title{position:absolute;top:-5px;left:-60px;width:60px;padding-right:10px;font-size:12px;color:#a6a8b6;text-align:right}.status-bars-h .value{position:absolute;top:-5px;right:-50px;display:block;width:40px;font-size:14px;font-weight:700;text-align:left;white-space:nowrap}.ring,[class*=" ring-"],[class^=ring-]{width:24px;height:24px;font-size:12px;line-height:24px;text-align:center;background-image:url(data:image/png;base64,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);background-position:0 0;-webkit-background-size:1224px 24px;background-size:1224px 24px}.ring>span,[class*=" ring-"]>span,[class^=ring-]>span{display:inline-block;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.messager{border-radius:4px;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1)}.messager-icon{vertical-align:middle}.messager-icon>.icon{font-size:24px}.messager-content{padding:18px 20px;font-size:18px;line-height:30px}.messager-content>.icon{font-size:28px;line-height:30px}.messager-actions{vertical-align:middle}.messagger-zt{color:#3c4353;background-color:#fff!important}.messagger-zt .messager-icon>.icon{color:#0c64eb}.messagger-zt .messager-actions>.action{color:#838a9d}.messagger-zt.messager-success .messager-icon>.icon{color:#00da88}.messagger-zt.messager-danger .messager-icon>.icon{color:#ff5d5d}.messagger-zt.messager-warning .messager-icon>.icon{color:#ff9800}.messagger-zt.messager-info .messager-icon>.icon{color:#2196f3}.tree{padding-left:0;overflow:hidden}.tree ul{position:relative;display:none;padding-left:0}.tree li{position:relative;padding:2px 0 2px 15px;list-style:none}.tree li.heading{padding-left:5px;color:#3c495c}.tree li>a{display:block;max-width:90%;padding:2px 6px;color:#3c495c;word-break:break-all}.tree li>a:hover{color:#3c4353}.tree li>a.tree-toggle:hover{background:0 0}.tree li.active>a{position:relative;font-weight:700;color:#0c64eb}.tree li>.list-toggle{position:absolute;top:1px;left:1px;z-index:10;width:20px;font-size:14px;line-height:22px;color:#cbd0db;text-align:center;cursor:pointer;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tree li>.list-toggle:before{content:"\f0da"}.tree li>.list-toggle:active,.tree li>.list-toggle:hover{color:#0c64eb}.tree li.has-active-item>.list-toggle{color:#3c4353}.tree li.has-list.open>ul{display:block}.tree li.has-list.open>.list-toggle{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.tree li.has-list.open:before{position:absolute;top:16px;bottom:-5px;left:10px;display:block;content:' ';border-left:1px solid #d8d8d8}.tree-actions{display:inline-block;margin-left:5px;vertical-align:middle}.tree-actions a{display:inline-block;margin-left:5px;font-size:13px;opacity:.6}.tree-actions a:hover{opacity:1}.tree li>.module-name{color:#3c495c;vertical-align:middle}.tree li>.module-name:hover{background-color:#f0f2f5}.tree li>.module-name:hover>a{color:#3c4353}.treemap-node-fold-icon:before{position:relative;left:-4px;min-width:18px}.dropdown-menu{padding:5px 0;border-color:rgba(0,0,0,.1)}.dropdown-menu>li{padding:0 10px}.dropdown-menu>li>a{padding:2px 10px;margin:5px 0;border-radius:3px}.dropdown-menu>li>a>.icon{position:relative;left:-5px;opacity:.5}.dropdown-menu>li>a:hover>.icon{opacity:.8}.dropdown-menu>li.active>a,.dropdown-menu>li.selected>a{position:relative;color:#fff;background-color:#16a8f8}.dropdown-menu>li.selected>a:after{position:absolute;top:2px;right:4px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:20px;text-transform:none;content:"\e5ca";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>li.divider{margin:10px}.dropdown-submenu>a:after{margin-right:-5px}.dropdown-submenu>.dropdown-menu.pull-left{margin-left:-1px}.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#3c4353;background-color:#e9f2fb}.dropdown-submenu:hover>a:after{border-left-color:#0c64eb}.dropdown-submenu>a:hover:after{border-left-color:#fff}.pager .btn{padding:3px 10px}.pager .btn .caret{opacity:.7}.pager>li>.pager-label{padding:2px;line-height:20px}.pager>li>.pager-item{min-width:20px;padding:1px;margin:2px 0;font-size:16px;line-height:20px;text-align:center;background:0 0;border-color:transparent}.pager>li>.pager-item:hover{background-color:rgba(0,0,0,.1)}.pager>li>.pager-item>.icon{position:relative;top:-1px}.pager>li>.btn:hover,.pager>li>a:hover{background:rgba(0,0,0,.1)}.pager>li.disabled>a.pager-item{background:0 0;border-color:transparent;opacity:.5}.pager>li.active>a{background-color:#16a8f8}.pager>li .btn-group .btn{padding:1px;margin:1px 0;border-radius:4px}.pager .dropdown-menu{width:200px}.pager .dropdown-menu>li{float:left;width:33.333333%}.modal-dialog{width:900px;max-width:1360px;border:none;border-radius:0;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,.25);box-shadow:0 0 20px 0 rgba(0,0,0,.25)}.modal-dialog.modal-md{width:700px}.modal-dialog.modal-xs{width:400px}.modal-dialog.modal-sm{width:500px}.modal-dialog.modal-lg{width:1200px}.modal-dialog.modal-fullscreen{position:fixed;max-width:initial}.modal-header{padding:20px 0;margin:0 20px}.modal-header>.close{color:#838a9d;text-shadow:0 1px 0 rgba(255,255,255,.85);opacity:1}.modal-header>.close:hover{color:#222}.modal-footer{padding:20px 0;margin:0 20px}.modal-title{font-size:14px;font-weight:400;line-height:20px}.modal-actions{position:absolute;top:16px;right:16px}.modal-actions .divider{position:relative;top:5px;display:inline-block;width:0;height:20px;margin:0 10px;border-left:#eee 1px solid}.modal-actions>.dropdown{display:inline-block}.modal-body{padding:20px}.modal-iframe .modal-body>iframe{border-radius:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-3%);-ms-transform:translate(0,-3%);-o-transform:translate(0,-3%);transform:translate(0,-3%)}.modal.fade.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-simple .modal-footer{padding-top:0;border-top:none}.modal-iframe .modal-header{position:relative;z-index:10;min-height:0;padding:0;border:none}.modal-iframe .modal-title{display:none}.modal-iframe .modal-header .close{position:absolute;top:12px;right:10px;font-size:32px;font-weight:200}.modal-iframe .modal-dialog{overflow:hidden}.modal-inverse .modal-header>.close{color:rgba(255,255,255,.7);text-shadow:none}.modal-inverse .modal-header>.close:hover{color:#fff}.modal-scroll-inside>.modal-dialog{max-height:100%}.hide-modal-close .modal-iframe .modal-header .close{display:none}.tile{text-align:center}.tile-title{line-height:20px;color:#3c495c}.tile-amount{font-size:32px;font-weight:700;line-height:56px}.timeline>li{position:relative;list-style:none}.timeline>li:before,.timeline>li>a:after,.timeline>li>div:after{position:absolute;left:-20px;display:block;width:15px;height:15px;content:' ';border-radius:50%}.timeline>li:before{top:12px;left:-16px;z-index:3;width:7px;height:7px;background-color:#cbd0db;border:none;border:1px solid #cbd0db}.timeline>li>a:after,.timeline>li>div:after{top:11px;left:-17px;z-index:3;width:9px;height:9px;background-color:#0c64eb;border-radius:50%;opacity:0}.timeline>li+li:after{position:absolute;top:-12px;bottom:20px;left:-13px;z-index:1;display:block;content:' ';border-left:1px solid #eee}.timeline>li.active>a:after,.timeline>li.active>div:after{opacity:1}.timeline>li.active:before{top:8px;left:-20px;width:15px;height:15px;background-color:rgba(12,100,235,.2);border:none}.timeline>li>a,.timeline>li>div{display:block;padding:5px;line-height:20px}.timeline>li.active>a{color:#3c4353}.timeline-tag{position:absolute;top:5px;left:-115px;font-size:12px}.timeline-tag-left{padding-left:115px}.timeline-sm{font-size:12px}.timeline-sm>li:before,.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:10px;left:-20px;width:11px;height:11px}.timeline-sm>li.active:before,.timeline-sm>li:before{top:10px;left:-18px;width:11px;height:11px;background:0 0;border:1px solid #eee}.timeline-sm>li>a,.timeline-sm>li>div{line-height:20px}.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:13px;left:-15px;width:5px;height:5px}.form-control{-webkit-box-shadow:none;box-shadow:none}.form-horizontal .form-group>label{padding-right:0}.form-actions{margin-top:20px;margin-bottom:0}.form-actions .btn{margin-right:10px}form label{font-weight:400;color:#3c495c}.form-group .btn+.btn{margin-left:5px}.table-form{margin-bottom:0;table-layout:fixed}.table-form>thead>tr>th.required:after{position:relative;top:3px;right:auto;left:4px;display:inline-block;vertical-align:middle}.table-form>tbody>tr>td,.table-form>tbody>tr>th,.table-form>tfoot>tr>td,.table-form>thead>tr>th{padding:7px;vertical-align:middle;border-bottom:none}.table-form>tfoot>tr>td{padding:20px 7px 10px}.table-form>tbody>tr>th{width:100px;font-weight:700;text-align:right}.table-form .input-group{width:100%}.chosen-container-single .chosen-single{position:relative}.chosen-container-single .chosen-single>span{height:20px;line-height:20px;word-break:break-all;white-space:normal}.chosen-container-single .chosen-single div b{position:relative;top:1px;color:#cbd0db;opacity:1}.chosen-container-single .chosen-search:before{top:8px;right:15px}.chosen-container-multi .chosen-choices li.search-choice{font-size:13px;background:#eee;border-color:#cbd0db;-webkit-box-shadow:none;box-shadow:none}.chosen-container-single .chosen-search input[type=text]{height:30px;padding:3px 25px 3px 5px}.chosen-container-single .chosen-search{padding:3px 10px 0}.chosen-container-single .chosen-single{overflow:visible}.chosen-container .chosen-results{max-height:245px;padding:10px}.chosen-container .chosen-results>li{border-radius:4px}.chosen-container .chosen-results li.highlighted em{color:#fff}.table-responsive .chosen-container .chosen-results{max-height:200px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{top:-2px;right:-1px;bottom:-1px;left:-1px;display:none;height:auto;padding:0;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:31px;padding:5px 26px 5px 8px;font-size:inherit;line-height:20px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{right:8px}.datetimepicker{padding:10px}.datetimepicker td.day.today{background-color:#f77}.datetimepicker td.day.active{background-color:#16a8f8}.datetimepicker tfoot th,.datetimepicker thead th{color:#838a9d}.input-control .colorpicker{top:0;z-index:auto;opacity:1}.input-control .colorpicker .btn{padding:5px}.input-control .input-control-icon-right.btn{top:0}.colorpicker .dropdown-menu{min-width:232px;padding:5px 10px 10px 10px}.colorpicker .dropdown-menu>li{display:block;float:left;padding:5px}.colorpicker .dropdown-menu>li.heading{width:100%;margin-bottom:5px;font-size:16px;font-weight:700;text-align:left}.colorpicker .dropdown-menu>li.heading>.icon-close{position:relative;top:4px;float:right;cursor:pointer;opacity:.6}.colorpicker .dropdown-menu>li>a{position:relative;display:block;width:100%;height:100%;padding:0;margin:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;border:1px solid transparent;border-radius:50%;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.colorpicker .dropdown-menu>li>a:before{position:absolute;top:0;display:block;width:100%;height:20px;line-height:18px}.colorpicker .dropdown-menu>li>a:hover{-webkit-box-shadow:0 1px 4px rgba(0,0,0,.25);box-shadow:0 1px 4px rgba(0,0,0,.25)}.colorpicker .dropdown-menu>li>a.active:before{font-size:14px;content:"\e5ca"}.colorpicker .dropdown-menu>li>a.empty{color:#666;background:#fff}.colorpicker .dropdown-menu>li>a.empty:before{content:"\e90d"}.colorpicker .btn{position:relative}.colorpicker .btn .color-bar{position:absolute;right:5px;bottom:3px;left:5px;height:3px}.colorpicker .btn .color-bar[style*='background: ']+.ic{position:relative;top:-2px}.colorpicker .btn .ic{color:#cbd0db}.colorpicker .btn:hover .ic{color:#838a9d}.input-group .colorpicker{z-index:3}.input-group .chosen-container{display:table-cell}.input-group-addon{border-right-width:0;border-left-width:0}.input-group-addon:first-child{border-left-width:1px}.input-group-addon:last-child{border-right-width:1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin:0}.input-group-cell{display:table-cell;width:1%;padding:0 12px;white-space:nowrap;vertical-align:middle}.ke-container{border-color:#dcdcdc!important;border-radius:2px!important}.ke-container.focus{border-color:#0c64eb!important}.ke-toolbar{border-color:#dcdcdc!important}.required:after{top:6px;right:-10px;font-size:20px}td.required:after{top:12px;right:-5px}.input-group>.chosen-container.required:after,.input-group>.input-control.required:after{top:1px;right:1px;z-index:2}.input-group.required .required:after{display:none}.file-input{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.file-input .input-group{width:auto}.file-input .input-group>.input-group-cell:first-child{padding-right:0;padding-left:7px}.file-input input[type=file]{position:absolute;width:0;height:0;opacity:0}.file-input .file-title{display:inline-block;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.file-input .file-editbox{min-width:200px;max-width:100%}.file-input .file-size{display:inline-block;vertical-align:middle}.edit .file-input-empty,.file-input-edit,.file-input-normal,.normal .file-input-empty{display:none}.edit .file-input-edit,.normal .file-input-normal{display:block}.edit .file-input-edit.input-group,.normal .file-input-normal.input-group{display:table}.edit .file-input-normal{display:none!important}.file-input-normal>.input-group-btn{width:auto}.input-group .chosen-container-active .chosen-choices{border-color:#0c64eb!important}.input-group .chosen-container{min-width:100px}.input-group .input-group-btn .btn>.icon{line-height:17px}.os-mac select.form-control{-webkit-appearance:none;background-image:url(data:image/gif;base64,R0lGODlhCQAFAIAAAMvQ2////yH5BAEAAAEALAAAAAAJAAUAAAIKhH+BGYoNGWxgFgA7);background-image:url(data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==);background-repeat:no-repeat;background-position:right 5px top 12px;-moz-appearance:none}input::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none!important;pointer-events:none;visibility:hidden}.chosen-choices.has-error,.chosen-single.has-error,.form-control.has-error{border-color:#ff5d5d!important;-webkit-box-shadow:0 0 6px #ffc3c3!important;box-shadow:0 0 6px #ffc3c3!important}.popover-success.popover-form-result{font-weight:700;color:#fff;background:#00da88}.popover-success.popover-form-result.popover.right .arrow:after{border-right-color:#00da88}textarea.kindeditor{padding:0!important}.form-unsaved{outline:2px solid #ff9800;-webkit-box-shadow:0 1px 12px #ff9800;box-shadow:0 1px 12px #ff9800;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s}select[multiple].picker-select,select[multiple][data-toggle=picker]{max-height:32px;visibility:hidden}.picker-selection-remove:before{font-size:18px}.picker-user-option{position:relative;padding-left:40px}.picker-user-option>.avatar{position:absolute;top:5px;left:10px}.picker-user-option>.picker-option-text{display:inline-block;min-width:40px;font-weight:700}.picker-user-option>.dept-name,.picker-user-option>.role-name{display:inline-block;margin-left:10px;font-size:12px;opacity:.6}.picker-user-option>.dept-name{min-width:50px}#mainHeader{height:50px;color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb;border-bottom-color:#e9f2fb}#mainHeader>.container{min-width:1200px;padding:0}#heading{position:absolute;top:10px;left:20px}@media (min-width:1400px){#heading{left:40px}}#heading h1{float:left;max-width:250px;margin:0;overflow:hidden;font-size:20px;font-weight:400;line-height:30px;text-overflow:ellipsis;white-space:nowrap}#heading h1 a{color:inherit;text-decoration:inherit}#heading h1.long-name{position:relative;top:-5px;display:table-cell;font-size:16px;line-height:20px;word-break:break-all;white-space:normal}#heading>.btn{display:block;float:left;height:20px;padding:1px 5px;margin:0;margin:5px 0 0 10px;font-size:12px;font-weight:lighter;line-height:18px;background-color:rgba(255,255,255,.2);border:none}#heading>.btn:hover{background-color:rgba(0,0,0,.1)}#navbar{margin:0 auto;text-align:center}#navbar .nav{display:inline-block}#navbar .nav>li>a{padding:10px;line-height:30px;color:#fff;border-radius:0;opacity:.9}@media (max-width:1400px){#navbar .nav>li>a{padding:10px 8px}}#navbar .nav>li>a:focus,#navbar .nav>li>a:hover{background:rgba(0,0,0,.15);opacity:1}#navbar .nav>li.active>a{font-weight:700;background:rgba(0,0,0,.1);opacity:1}#navbar .nav>li.divider{display:block;width:2px;height:20px;margin:15px 8px;background:rgba(255,255,255,.4)}@media (max-width:1400px){#navbar .nav>li.divider{margin:15px 5px}}@media (max-width:1300px){#navbar .nav>li.divider{margin:15px 3px}}#navbar .nav>li.divider:last-child{display:none}#navbar .nav .dropdown-menu li>a{text-align:left}#toolbar{position:absolute;top:12px;right:20px;font-size:12px;color:#fff}@media (min-width:1400px){#toolbar{right:40px}}#extraNav{text-align:right}#extraNav>li{display:inline-block;float:none;text-align:left}#extraNav>li>a{display:block;padding:0;color:#fff;opacity:.75}#extraNav>li>a:hover{text-decoration:unset;background-color:rgba(0,0,0,.1);opacity:1}#extraNav>li.open>a{background-color:rgba(0,0,0,.1)}#extraNav>li+li{margin-left:10px}#showSearchGo{color:#fff;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.5)}#searchbox{position:relative;float:left;width:150px}#searchbox .input-group-btn .btn{position:relative;padding:1px 4px;font-size:12px;line-height:20px;color:#fff;background-color:rgba(255,255,255,.15);border-right:none;border-radius:2px}#searchbox .input-group-btn .btn:after{position:absolute;top:3px;right:0;bottom:3px;display:block;width:1px;content:' ';background-color:rgba(255,255,255,.15)}#searchbox .input-group-btn .btn:hover{background-color:rgba(255,255,255,.25)}#searchGo{position:absolute;top:0;right:-1px;z-index:9;min-width:24px;height:24px;padding:2px 3px;font-size:12px;line-height:20px;color:#fff;background-color:#16a8f8;border-radius:2px}#searchGo:hover{color:#fff!important;background-color:#0c64eb}#searchInput{height:24px;padding:2px 30px 2px 5px;color:#fff;text-align:left;background:rgba(255,255,255,.15);border-color:transparent;border-radius:0 12px 12px 0;-webkit-transition:background .2s,border .2s;-o-transition:background .2s,border .2s;transition:background .2s,border .2s}#searchInput:hover{background:rgba(255,255,255,.25)}#searchInput:focus{color:#333;background:#fff}#searchInput::-webkit-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::-moz-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:-ms-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:focus::-webkit-input-placeholder{color:#838a9d}#searchInput:focus::-moz-placeholder{color:#838a9d}#searchInput:focus:-ms-input-placeholder{color:#838a9d}#searchInput:focus::placeholder{color:#838a9d}#searchTypeMenu{min-width:220px}#searchTypeMenu>li{float:left;width:50%}#searchTypeMenu>li>a{margin:4px 0}#userNav .avatar{display:inline-block;vertical-align:middle}#userNav>li>a{padding:2px 6px;line-height:20px;color:#fff;opacity:.9}#userNav>li>a .user-name{max-width:100px;overflow:hidden;font-size:15px;text-overflow:ellipsis;white-space:nowrap}#userNav>li>a:hover{background-color:rgba(0,0,0,.1);opacity:1}#userNav>li>a:hover>i{opacity:1}#userNav>li>a span{vertical-align:middle}#userNav>li.open>a{background-color:rgba(0,0,0,.1)}#userNav>li.has-new-items>a{position:relative}#userNav>li.has-new-items>a:before{position:absolute;top:3px;right:-1px;display:block;width:4px;height:4px;content:' ';background-color:#ff5d5d;border-radius:50%}#userNav .dropdown-menu{min-width:150px}#userNav .dropdown-menu>li>a>.icon{position:absolute;top:10px;right:5px;display:block;width:20px;height:20px;line-height:20px;text-align:center}#userNav .user-profile-item>a{position:relative;padding-left:45px}#userNav .user-profile-item .avatar{position:absolute;top:6px;left:5px}#userNav .user-profile-name{font-size:16px}#userNav .user-profile-role{font-size:12px;color:#a9abb8}#userNav .no-role .user-profile-role{display:none}#userNav .no-role .user-profile-name{line-height:40px}#subHeader{min-height:50px;background:#fff}#subHeader>.container{padding:0 20px}@media (min-width:1400px){#subHeader>.container{padding:0 40px}}#pageNav{position:absolute;top:8px;left:0;left:20px}@media (min-width:1400px){#pageNav{left:40px}}#subNavbar{margin-top:5px;font-size:14px;text-align:center}#subNavbar .nav{display:inline-block}#subNavbar .nav>li>a{padding:8px 12px;line-height:24px;color:#3c495c}#subNavbar .nav>li>a:hover{color:#3c495c;background-color:rgba(0,0,0,.075)}#subNavbar .nav>li.active>a{font-weight:700;color:#0c64eb}#subNavbar .nav>li.divider{display:block;width:2px;height:20px;margin:9px 5px;background-color:rgba(0,0,0,.05)}#subNavbar .dropdown-menu{text-align:left}[lang=en] #subNavbar>.nav>li>a{padding-right:8px;padding-left:8px}#pageActions{position:absolute;top:9px;right:20px}@media (min-width:1400px){#pageActions{right:40px}}.cell{padding:10px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.cell+.cell{margin-top:10px}.cell>.panel{margin:0;-webkit-box-shadow:none;box-shadow:none}.cell>.panel>.panel-heading{padding:5px 5px 10px}.cell>.panel>.panel-heading .panel-actions{padding:0}.cell>.panel>.panel-body{padding:5px}.cell>.table{margin:0}#main{min-width:1200px;padding:20px 0}#main>.container{padding:0 20px}@media (min-width:1400px){#main>.container{padding:0 40px}}#header,#header+#main{min-width:1200px}#mainMenu{margin:-10px 0 8px}.main-content{padding:20px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}@media (min-width:1400px){.main-content>.center-block{max-width:1350px;padding:20px;border:1px solid #eee}.main-content>.center-block .main-header{background-color:#f1f1f1}}.main-content>h2{margin:0 0 20px}.main-content .cell{-webkit-box-shadow:none;box-shadow:none}.main-header{padding:5px 20px;border-bottom:1px solid #eee}.main-header:after,.main-header:before{display:table;content:" "}.main-header:after{clear:both}.main-header>h2{display:block;float:left;margin:0 10px 0 0;font-size:14px;line-height:34px}.main-header>h2 .label-id{margin-right:5px}.main-header>h2 small{font-size:14px;font-weight:400}.main-content .main-header{margin:-20px -20px 10px}.main-header .label{top:-1px}.main-row{display:table;width:100%;table-layout:fixed}.main-row>[class*=" col-"],.main-row>[class*="-col"],.main-row>[class^=col-]{display:table-cell;vertical-align:top}@media (max-width:720px){.main-row{display:block}.main-row>*{display:block;width:100%}.main-row .side-col{width:100%;padding:0}.main-row .main-col+.side-col,.main-row .side-col+.main-col{margin-top:10px}}.main-row.hide-side .side-col{display:none}.main-form{margin:0}@media (min-width:720px){.main-content>.center-block .main-form{padding-right:20px}}#main .side-col .tabs{padding:5px}#main .side-col .nav-tabs{margin:0 5px 5px 5px}#main .side-col .nav-tabs>li{margin:0}#main .side-col .nav-tabs>li+li{margin-left:10px}#main .side-col .nav-tabs>li>a{padding:8px 5px}#main .side-col .tab-content .tab-pane table{border:none}.main-actions .btn-toolbar{display:inline-block;padding:4px 15px;color:#fff;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);border-radius:4px}.main-actions .btn-toolbar .divider{margin-right:15px;margin-left:15px;border-color:rgba(255,255,255,.1)}.main-actions .btn-toolbar .btn{height:30px;padding-right:10px;padding-left:10px;margin-right:0;color:#fff;background-color:transparent;border:none}.main-actions .btn-toolbar .btn+.btn{margin-left:10px}.main-actions .btn-toolbar .btn:focus,.main-actions .btn-toolbar .btn:hover{background-color:rgba(255,255,255,.2)}.main-actions .btn-toolbar .btn.btn-icon{min-width:32px;padding-right:0;padding-left:0}.main-actions .btn-toolbar .btn+.btn-group{margin-right:0;margin-left:10px}#mainContent .main-col>.main-actions{padding:30px 0 0 0;text-align:center}#mainContent .main-col>.main-actions>.btn-toolbar{visibility:visible;opacity:1;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}#mainActions{position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;pointer-events:none}#mainActions .btn-toolbar{position:relative;top:-90px}#mainActions .dropdown-menu{text-align:left}#mainActions>.container{height:100%}.main-actions-holder{display:none}.main-actions-fixed .main-actions-holder{display:block}.main-actions-fixed #mainContent .main-col>.main-actions{position:fixed;bottom:10px}.main-actions-fixed.body-modal #mainContent .main-col>.main-actions{bottom:20px}#nextPage,#prevPage{position:absolute;top:50%;left:-10px;width:40px;height:60px;padding:10px 0;margin-top:-30px;line-height:40px;color:#fff;text-align:center;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.05);box-shadow:0 2px 15px 2px rgba(0,0,0,.05)}#nextPage:hover,#prevPage:hover{-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.15);box-shadow:0 2px 15px 2px rgba(0,0,0,.15)}#nextPage>i,#prevPage>i{display:block;font-size:18px;line-height:36px}#nextPage{right:-10px;left:auto}@media (max-width:1800px){#prevPage{left:-3px}#nextPage{right:-3px}}#sidebarHeader{position:relative;float:left;width:180px;height:34px;padding-right:20px;margin-right:20px;background:#fff;border-left:4px solid #0c64eb;border-radius:4px 2px 2px 4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}#sidebarHeader:after{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #fff;border-style:solid;border-width:18px 0 18px 8px}#sidebarHeader .title{padding:0 5px;overflow:hidden;font-size:14px;font-weight:700;line-height:32px;color:#0c64eb;text-align:center;text-overflow:ellipsis;white-space:nowrap}#sidebarHeader .title>a{position:absolute;top:0;right:0;width:20px;opacity:.5}#sidebarHeader .title>a:hover{opacity:1}#sidebar{position:relative;-webkit-transition:width .2s,padding .2s;-o-transition:width .2s,padding .2s;transition:width .2s,padding .2s}#sidebar>.sidebar-toggle{position:absolute;top:0;right:5px;bottom:0;width:10px;cursor:pointer;background:0 0;border-radius:5px;-webkit-transition:background-color .2s,opacity .5s;-o-transition:background-color .2s,opacity .5s;transition:background-color .2s,opacity .5s}#sidebar>.sidebar-toggle>.icon{position:absolute;top:50%;left:-1px;width:12px;height:30px;margin-top:-10px;line-height:30px;color:#fff;text-align:center;background:#79cdfb;border-radius:6px}#sidebar>.sidebar-toggle>.icon:before{position:relative;left:-1px}#sidebar>.sidebar-toggle:before{position:absolute;top:0;right:-5px;bottom:0;left:-5px;display:block;content:' '}#sidebar>.sidebar-toggle:hover{background:rgba(0,0,0,.075)}#sidebar>.cell{position:relative;left:0;width:180px;-webkit-transition:left .2s,opacity .2s;-o-transition:left .2s,opacity .2s;transition:left .2s,opacity .2s}#sidebar.no-animate>.cell{display:none;-webkit-transition:none;-o-transition:none;transition:none}.hide-sidebar #sidebar>.cell{position:absolute;left:-200px;visibility:hidden;opacity:0}.hide-sidebar #sidebar{position:relative;width:0;padding:0}.hide-sidebar #sidebar>.sidebar-toggle>.icon:before{content:"\e315"}@media (max-width:720px){#sidebar>.cell{width:100%}}#queryBox{max-height:0;padding:0;overflow:hidden;-webkit-transition:cubic-bezier(.175,.885,.32,1) .2s;-o-transition:cubic-bezier(.175,.885,.32,1) .2s;transition:cubic-bezier(.175,.885,.32,1) .2s;-webkit-transition-property:padding,max-height,margin;-o-transition-property:padding,max-height,margin;transition-property:padding,max-height,margin}#queryBox>form{visibility:hidden;-webkit-transition:visibility .2s .2s;-o-transition:visibility .2s .2s;transition:visibility .2s .2s}#queryBox.loading{height:50px}#queryBox.show{min-height:110px;max-height:300px;margin-bottom:10px;overflow:visible}#queryBox.show>form{visibility:visible}#queryBox.divider{border-bottom:1px solid #eee}#main .querybox-toggle.querybox-opened{position:relative;color:#0c64eb;background:0 0;border:none}#main .querybox-toggle.querybox-opened:before{position:absolute;bottom:-14px;left:50%;width:0;height:0;content:' ';border-color:transparent transparent #fff transparent;border-style:solid;border-width:0 10px 10px 10px}#contentNav{padding:5px;background:#fff;border-bottom:1px solid #eee}#contentNav .nav>li>a{position:relative;padding:6px 10px;color:#838a9d}#contentNav .nav>li.active>a{font-weight:700;color:#0c64eb}#contentNav .nav>li.active>a:before{position:absolute;right:10px;bottom:3px;left:10px;display:block;height:2px;content:' ';background:#0c64eb}.body-modal{padding-bottom:0}.body-modal #main,.body-modal .container{min-width:0!important}.body-modal #main{padding:0}.body-modal .main-header{position:fixed;top:0;right:20px;left:20px;z-index:100;padding:13px 48px 13px 0;margin:0;background:#fff}.body-modal #mainContent{padding-top:70px}.body-modal .main-header>h2{max-width:100%;overflow:hidden;font-size:14px;text-overflow:ellipsis;white-space:nowrap}.body-modal .cell,.body-modal .main-content{-webkit-box-shadow:none;box-shadow:none}.body-modal #mainMenu{position:fixed;top:0;right:0;left:0;z-index:100;padding:12px 60px 12px 10px;margin:0;background:#fff}.body-modal #mainMenu>.btn-toolbar.pull-left.divider{display:none}.body-modal #mainMenu>.btn-toolbar{width:100%;margin-left:20px}.body-modal #mainMenu>.btn-toolbar>.divider:first-child{display:none}.body-modal #mainMenu>.btn-toolbar .page-title{width:100%;margin-left:0}.body-modal #mainMenu>.btn-toolbar .page-title>.text{position:relative;top:-2px;display:inline-block;max-width:85%;max-width:-webkit-calc(100% - 100px);max-width:calc(100% - 100px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.body-modal #mainMenu+#mainContent.main-row{padding:60px 10px 0}.body-modal #mainMenu+#mainContent.main-row .cell{border:1px solid #efefef;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.body-modal #mainActions{top:auto}.body-modal #mainActions .btn-toolbar{top:auto;bottom:10px}.body-modal.m-bug-view,.body-modal.m-story-view,.body-modal.m-task-view,.body-modal.m-testcase-view,.body-modal.m-testtask-view,.body-modal.m-todo-view{padding-bottom:20px;border-radius:3px}#tabsNav{position:relative}#tabsNav .tab-pane>.actions{position:absolute;top:-8px;right:0}#tabsNav .tab-pane>.cell,#tabsNav .tab-pane>.main-table{padding:0;border:1px solid #cbd0db;border-top:none;border-radius:0 0 4px 4px}#tabsNav .tab-pane>.cell .detail-title{padding-left:5px}#helpContent{position:fixed;top:50px;right:0;bottom:40px;left:0;display:none;background-color:#fff}#helpContent .load-error{display:none;padding:20px}#helpContent .show-error .load-error{display:block}.text-middle td,.text-middle th{vertical-align:middle}.text-center td,.text-center th{text-align:center}.c-sm{width:40px}.c-id{width:90px}.c-id-sm{width:70px}.c-id-xs{width:55px}.c-date{width:100px}.c-num,.c-pri,.c-type{width:80px;overflow:hidden}.c-begin,.c-end,.c-time{width:65px}.c-hours{width:60px}.c-actions-1{width:50px}.c-actions-2{width:75px}.c-actions-3{width:102px}.c-actions,.c-actions-4{width:128px}.c-actions-5{width:155px}.c-actions-6{width:180px}.c-product,.c-project{width:180px}.c-plan{width:130px}.c-datetime{width:120px}.c-stage,.c-status,.c-user{width:80px}.c-side{width:200px;border-right:10px solid #efefef}.c-assign,.c-assignedTo,.c-openedBy{width:130px}.c-progress{width:155px}.c-assign,.c-assignedTo,.c-openedBy,.c-product,.c-project,.c-status,.c-url,.c-user{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:ellipsis;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;white-space:nowrap;vertical-align:middle}td.c-actions .btn-link{color:#3c495c;background:0 0}td.c-actions .btn-link:hover{color:#0c64eb;background:#e9f2fb}td.c-actions .btn.disabled,td.c-actions .btn[disabled]{pointer-events:auto}td.c-actions .more{position:absolute;top:50%;right:100%;display:none;padding-right:4px;padding-left:20px;margin-top:-15px;margin-right:-6px;white-space:nowrap;background-color:#fafafa;-webkit-transition:opacity .3s,margin .3s;-o-transition:opacity .3s,margin .3s;transition:opacity .3s,margin .3s}tr:hover td.c-actions .more{display:block}td:hover+td.c-actions>.more{margin-right:-15px;pointer-events:none;opacity:.15}tr[data-url]{cursor:pointer}.table tbody>tr>td,.table thead>tr>th{vertical-align:middle}.table tbody>tr>td.has-btn,.table thead>tr>th.has-btn{padding-top:1px;padding-bottom:1px;overflow:visible}.table tbody>tr>td .progress,.table thead>tr>th .progress{height:6px}.table .em,.table em{color:#3c4353}.table .divider{border-bottom:10px solid #efefef}.table .divider-top{border-top:10px solid #efefef}.table .btn-icon-left{max-width:100%;padding-left:20px;overflow:hidden;line-height:18px;text-align:left;text-overflow:ellipsis;background:0 0;border-color:#eaf3fc}.table .btn-icon-left>.icon{width:20px;font-size:14px;background:0 0!important;opacity:0}.table .btn-icon-left.btn-sm{height:26px;font-size:13px}.table .btn-icon-left:active,.table .btn-icon-left:focus,.table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.table .btn-icon-left:active>.icon,.table .btn-icon-left:focus>.icon,.table .btn-icon-left:hover>.icon{opacity:1}.table .btn-icon-left>.text{padding-left:25px}.table thead>tr>th.c-assign,.table thead>tr>th.c-assignedTo{padding-left:29px}.table a{vertical-align:middle}.table tbody>tr:last-child{border-bottom:none}.table caption{margin-bottom:5px;background:#f1f1f1;border:none}.is-firefox .table .btn-icon-left>.icon{line-height:22px}.main-table{border-radius:4px}.main-table>.table,.main-table>.table-footer,.main-table>.table-header,.main-table>.table-responsive{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.main-table .table{font-size:13px;table-layout:fixed;background-color:#fff;border-radius:4px 4px 0 0}.main-table .table.table-lg{font-size:14px}.main-table .table .btn-icon-left{border-color:transparent}.main-table .table .btn-icon-left>.icon{background:0 0;border-radius:4px}.main-table .table .btn-icon-left.btn-sm{height:26px}.main-table .table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.main-table .table .btn-icon-left:hover>.icon{background:#e9f2fb;border-radius:4px 0 0 4px}.main-table tbody>tr>td,.main-table thead>tr>th{min-height:36px;padding:2px 8px;line-height:30px}.main-table tbody>tr>td:first-child,.main-table thead>tr>th:first-child{padding-right:4px;padding-left:15px}.main-table thead>tr>th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #ddd}.main-table tbody>tr:nth-child(odd){background-color:#f5f5f5}.main-table tbody>tr:last-child>td{border-bottom:1px solid #ddd}.main-table tbody>tr>td{position:relative;border-bottom:none;border-bottom:1px solid #eee}.main-table tbody>tr>td .label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main-table tbody>tr>td>a{line-height:28px;color:#0c60e1}.main-table tbody>tr>td>a:not(.btn):visited{color:#082999;opacity:.9}.main-table tbody>tr>td>a:hover,.main-table tbody>tr>td>a:visited:hover{color:#0c64eb}.main-table tbody>tr>td.c-actions{padding-right:10px}.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{position:absolute;top:0;bottom:0;left:0;display:block;width:0;content:'';background:#0c64eb;opacity:0;-webkit-transition:.2s linear;-o-transition:.2s linear;transition:.2s linear;-webkit-transition-property:width,opacity,border-radius;-o-transition-property:width,opacity,border-radius;transition-property:width,opacity,border-radius}@-moz-document url-prefix(){.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{bottom:-1px}}.main-table tbody>tr>td.c-side:before{display:none}.main-table tbody>tr{-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background-color,-webkit-box-shadow;-o-transition-property:box-shadow,background-color;transition-property:background-color,-webkit-box-shadow;transition-property:box-shadow,background-color;transition-property:box-shadow,background-color,-webkit-box-shadow}.main-table tbody>tr:hover{background:#e9f2fb}.main-table .table-grouped tbody>tr:hover{background:#f2f7fd;-webkit-box-shadow:none;box-shadow:none}.main-table .table-grouped tbody>tr:hover td.c-actions .more{background:#f2f7fd}.main-table tbody>tr.checked{background:#fff3e0}.main-table tbody>tr.checked:hover{background:#ffebbc}.main-table tbody>tr.checked>td.c-side+td:before,.main-table tbody>tr.checked>td:first-child:before{width:4px;opacity:1}.main-table tbody>tr.checked.row-check-begin{border-top-left-radius:4px;border-top-right-radius:2px}.main-table tbody>tr.checked.row-check-begin>td:first-child:before{border-top-left-radius:4px}.main-table tbody>tr.checked.row-check-end{border-bottom-right-radius:2px;border-bottom-left-radius:4px}.main-table tbody>tr.checked.row-check-end>td:first-child:before{border-bottom-left-radius:4px}.main-table .checkbox-primary{display:inline-block;line-height:20px}.main-table .checkbox-primary label{margin:0}.main-table .table{margin:0}.table-header{padding:4px 0 12px}.table-header .table-statistic{color:#838a9d}.table-header .table-statistic strong{font-size:15px;color:#3c4353}.table-header .btn-toolbar{margin-top:-28px}.table-header.fixed-right{position:relative;z-index:5;padding:0}.table-header.fixed-right>.btn-toolbar{position:absolute;top:0;right:1px;z-index:1;padding:1px;margin:0;background:#fff;border-radius:4px}.table-header.fixed-right>.btn-toolbar .btn{opacity:.65}.table-header.fixed-right>.btn-toolbar .btn:hover{opacity:1}.table-header-fixed .table-header{position:fixed;top:0}.table-header-fixed .table-header>.btn-toolbar{background-color:transparent}.table-header-fixed .table-header>.btn-toolbar .btn{color:#fff}.table-footer{position:relative;min-height:40px;padding:6px 15px;background:#fff;border-radius:0 0 4px 4px}.body-modal .table-footer{margin-bottom:20px}.talbe-lg+.table-footer{padding:11px 15px}.table-footer .btn-toolbar,.table-footer .checkbox-primary{float:left}.table-footer .btn-toolbar+.btn-toolbar{margin-left:8px}.table-footer .checkbox-primary{margin:5px 20px 0 0}.table-footer .checkbox-primary.checked label:after{border-color:#00da88!important}.table-footer .btn{padding:3px 10px;line-height:20px}.table-footer .pager{position:absolute;top:0;right:0;z-index:5;height:40px;padding:6px 5px 6px 10px;margin:0;background:#fff;opacity:1;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.table-footer .pager:before{position:absolute;top:0;bottom:0;left:-50px;display:block;width:50px;content:' ';background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(#fff));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%)}.table-footer .pager .btn,.table-footer .pager>li>.pager-item,.table-footer .pager>li>.pager-label{color:#838a9d;background:0 0;border-color:transparent}.table-footer .pager .btn,.table-footer .pager>li>a{border-radius:3px}.table-footer .pager .btn:hover,.table-footer .pager>li>a:hover{background:rgba(0,0,0,.1)}.table-footer .pager>li.disabled>a.pager-item{opacity:1}.table-footer .form-control{height:28px;padding:3px 8px}.table-footer .table-statistic{position:relative;z-index:2;float:left;padding-right:30px;line-height:28px;color:#838a9d;background:#fff}.table-footer .table-statistic:hover{z-index:4}.table-footer .table-statistic:hover+.pager{z-index:2;opacity:.3}.table-footer .btn-toolbar+.table-statistic,.table-footer .btn-toolbar+.text{margin-left:10px}.table-footer .text{float:left;line-height:28px}.table-footer.fixed-footer{position:fixed;z-index:10;margin:0;background:rgba(75,75,75,.85);border-top-color:transparent}.table-footer.fixed-footer .checkbox-primary label{color:#fff}.table-footer.fixed-footer .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.table-footer.fixed-footer .table-statistic{color:#fff;background:0 0}.table-footer.fixed-footer .pager{background:#666}.table-footer.fixed-footer .pager:before{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0)),to(#666));background:-webkit-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:-o-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:linear-gradient(to right,rgba(0,0,0,0) 0,#666 100%)}.table-footer.fixed-footer .pager .btn,.table-footer.fixed-footer .pager>li>.pager-item,.table-footer.fixed-footer .pager>li>.pager-label{color:#fff}.table-footer.fixed-footer .pager .btn:hover,.table-footer.fixed-footer .pager>li>a:hover{background:rgba(255,255,255,.3)}.table-footer.fixed-footer .pager>li.disabled>a.pager-item{opacity:.5}.table-actions{display:none;height:28px}.table-actions.show-always{display:block;pointer-events:none;cursor:not-allowed}.has-row-checked .table-actions{display:block;pointer-events:auto!important;cursor:default}.table-lg tbody>tr>td{padding:9px 10px}.table-lg tbody>tr>td .btn+.btn{margin-left:5px}.table.has-sort-head thead>tr>th{padding-right:0}.table.has-sort-head thead>tr>th>a{position:relative;display:inline-block;padding-right:16px;color:#3c4353}.table.has-sort-head thead>tr>th>a:after,.table.has-sort-head thead>tr>th>a:before{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:30px;color:#3c495c;text-transform:none;content:"\f0de";opacity:.5;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.table.has-sort-head thead>tr>th>a:after{content:"\f0dd"}.table.has-sort-head thead>tr>th>a.sort-down,.table.has-sort-head thead>tr>th>a.sort-up{color:#000;text-decoration:none}.table.has-sort-head thead>tr>th>a:hover,.table.has-sort-head thead>tr>th>a:hover:after,.table.has-sort-head thead>tr>th>a:hover:before{color:#0c64eb;opacity:1}.table.has-sort-head thead>tr>th>a.sort-down:after,.table.has-sort-head thead>tr>th>a.sort-up:before{color:#000;opacity:1}.head-fixed .datatable-head-span .table,.table.fixed-header-copy{z-index:10;color:#fff;background:rgba(75,75,75,.85)}.head-fixed .datatable-head-span .table thead>tr>th,.table.fixed-header-copy thead>tr>th{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a,.table.fixed-header-copy thead>tr>th>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>a:after,.head-fixed .datatable-head-span .table thead>tr>th>a:before,.table.fixed-header-copy thead>tr>th>a:after,.table.fixed-header-copy thead>tr>th>a:before{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down:after,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up:before,.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:after,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:before,.table.fixed-header-copy thead>tr>th>a.sort-down,.table.fixed-header-copy thead>tr>th>a.sort-down:after,.table.fixed-header-copy thead>tr>th>a.sort-up,.table.fixed-header-copy thead>tr>th>a.sort-up:before,.table.fixed-header-copy thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover:after,.table.fixed-header-copy thead>tr>th>a:hover:before{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a,.table.fixed-header-copy thead>tr>th>.dropdown>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a:hover,.table.fixed-header-copy thead>tr>th>.dropdown>a:hover{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary,.table.fixed-header-copy .checkbox-primary{z-index:1}.head-fixed .datatable-head-span .table .checkbox-primary label,.table.fixed-header-copy .checkbox-primary label{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary label:after,.table.fixed-header-copy .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.head-fixed .datatable-head-span .table .checkbox-primary.checked label:after,.table.fixed-header-copy .checkbox-primary.checked label:after{border-color:#00da88!important}.table-data{margin:0;table-layout:fixed}.table-data tbody>tr>td,.table-data tbody>tr>th{padding:6px 8px;word-break:break-all;border:none}.table-data tbody>tr>th{width:70px;padding-left:0;font-weight:400;color:#838a9d;text-align:right;vertical-align:middle}.table-data tbody>tr>td{padding-right:0}.table-data tbody>tr>td>a{color:#0c60e1}.table-data tbody>tr>td>a:not(.btn):visited{color:#082999}.table-data tbody>tr>td>a:hover,.table-data tbody>tr>td>a:visited:hover{color:#0c64eb}.table-data ol,.table-data ul{margin:0}.fixed-head-table{background:rgba(0,0,0,.7);border-bottom:1px solid #ddd}.fixed-head-table thead>tr>th{color:#fff}.table-empty-tip{padding:80px 10px;text-align:center;background:#fff}.not-firefox .table-grouped>tbody>tr>td.c-side{background:#fff!important}.table-grouped .group-toggle{cursor:pointer}.table-grouped .group-toggle.group-summary{border-top:10px solid #efefef}.table-grouped tbody>tr>td:first-child,.table-grouped thead>tr>th:first-child{padding-left:8px}.group-expand-all,.table-group-collapsed .group-collapse-all{display:none}.table-group-collapsed .group-expand-all{display:inline-block}.table-auto{table-layout:auto}.datatable .table>tbody>tr.checked.hover>td,.datatable .table>tbody>tr.checked>td.col-hover{background:#ffebbc}body.has-fixed-footer{padding-bottom:60px}.table.with-footer-fixed{margin-bottom:20px}.table-nest-hide{display:none!important}th.table-nest-title{position:relative;padding-left:30px!important}.table-nest-icon{position:relative;display:inline-block;width:22px;height:22px;font-size:16px;color:#a6aab8;text-align:center;border-radius:4px}.table-nest-toggle:before{line-height:22px;content:"\e6f2"}.table-nest-toggle:hover{color:#0c64eb;background-color:rgba(0,0,0,.1)}.table-nest-child-hide .table-nest-toggle:before{font-size:16px;content:"\e6f1"}th.table-nest-title .table-nest-toggle{position:absolute!important;top:7px;left:8px}.table-nest-toggle.table-nest-toggle-global{width:22px;height:22px;padding:0!important;line-height:22px;text-align:center;border-radius:4px}.table-nest-toggle.table-nest-toggle-global:before{position:static!important;font-size:16px!important;line-height:22px!important;content:"\e6f2"!important;opacity:1!important}.table-nest-toggle.table-nest-toggle-global:after{display:none!important}.table-nest-collapsed .table-nest-toggle.table-nest-toggle-global:before{font-size:16px!important;content:"\e6f1"!important}.disable-empty-nest-row .is-nest-child .table-nest-icon:before,.disable-empty-nest-row .no-nest .table-nest-icon:before{position:relative;top:-1px;width:6px;min-width:6px;height:6px;content:' ';background-color:#cbd0db;border-radius:1px}.table-nest-child-hover>td:first-child,.table-nest-hover>td:first-child{-webkit-box-shadow:inset 3px 0 0 #cbd0db;box-shadow:inset 3px 0 0 #cbd0db}.article-content{overflow:auto}.article-content img{margin-top:0}.article-content table{margin:10px 0}.article-content table td,.article-content table th{border:1px solid #cbd0db}.article-content table th{background:#eee}.article-content a{color:#0c64eb}.article-content a:focus,.article-content a:hover{color:#16a8f8}.article-content,.article>.content{word-wrap:break-word}.detail{padding:10px 0;margin:0 10px}.detail+.detail{padding-top:25px;border-top:1px solid #eee}.detail-title{font-size:14px;font-weight:700;line-height:20px}.detail-title>.pull-right{position:relative;top:-8px}h2.detail-title{margin:0;font-size:15px;font-weight:700}h2.detail-title .label,h2.detail-title .label-id{position:relative;top:-1px}.detail-content{padding:0;margin-top:10px}.detail-content em{color:#3c4353}.detail-content .list-unstyled>li+li{margin-top:5px}.side-col .detail-content{padding-left:0}details.detail{padding:10px 0}details.detail summary{position:relative;cursor:pointer;outline:0}details.detail summary::-webkit-details-marker{display:none}details.detail summary:after{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e316";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}details.detail[open] summary:after{content:"\e313"}.files-list{padding-left:0;list-style:none}.files-list>li>a{display:block;line-height:24px}.files-list>li>a>.icon{display:inline-block;margin-right:5px;opacity:.7}.files-list>li>a:hover{color:#0c64eb}.files-list>li>.right-icon{opacity:0;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.files-list>li:hover>.right-icon{opacity:1}.histories-list{padding-left:15px;margin-bottom:0}.histories-list>li{position:relative}.histories-list>li+li{margin-top:5px}.histories-list>li strong{color:#3c4353}.histories-list .comment,.histories-list .show-form .comment-edit-form{padding:5px 5px 5px 10px;margin:5px 0 0;background-color:rgba(0,0,0,.025);border:1px solid #eee}.histories-list .btn-edit-comment{position:absolute;top:28px;right:2px}.histories-list .comment-edit-form,.histories-list .show-form .btn-edit-comment,.histories-list .show-form .comment{display:none}.histories-list .show-form .comment-edit-form{display:block;padding:10px;border:1px solid #eee}.histories .btn-mini{width:16px;min-width:16px;height:16px;overflow:hidden;line-height:16px;color:#cbd0db;vertical-align:-8%;border-radius:1px}.histories .btn-mini:focus,.histories .btn-mini:hover{color:#0c64eb;border-color:#0c64eb}.histories .show-changes .btn-expand>.icon:before{content:"\e926"}.histories .btn-strip{display:none}.histories .show-changes .btn-strip{display:inline-block}.history-changes{display:none;padding:5px;margin-bottom:-5px;margin-left:5px;font-size:12px;line-height:20px}.history-changes blockquote{padding:5px 5px 5px 10px;margin:5px 0 0;font-size:12px;background-color:rgba(0,0,0,.05);border-left:3px solid #eee}.history-changes blockquote.original{display:none}.show-changes .history-changes,.show-original .history-changes blockquote.original{display:block}.show-original .history-changes blockquote.textdiff{display:none}.syntaxhighlighter{overflow:auto}.list-group{overflow-y:auto}.list-group>a{display:block;padding:2px 10px 2px 5px;overflow:hidden;line-height:20px;text-overflow:ellipsis;white-space:nowrap;border-radius:4px}.list-group>a+a{margin-top:5px}.list-group>a>.icon{display:inline-block;margin-right:3px;opacity:.5}.list-group>a.selected{color:#e9f2fb;background-color:#0c64eb}.list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.list-group>a.active:hover,.list-group>a:hover{color:#fff;background-color:#0c64eb}.list-group>.heading{padding:2px 5px;line-height:20px;color:#838a9d}.list-group>a+.heading{margin-top:4px}.dropup .search-box-sink{padding-top:5px;padding-bottom:45px}.dropup .search-box-sink .search-box{position:absolute;right:10px;bottom:10px;left:10px;margin:0}.dropup .search-box-sink .search-box+.list-group{height:auto;max-height:171px}.search-list{min-width:200px;max-width:300px;padding:0}.search-list .search-box{float:none;width:auto;margin:10px}.search-list .search-box .icon-search{opacity:.5}.search-list .list-group{max-height:248px;padding:5px 10px;margin:5px 0}.dropup .search-list .search-box+.list-group{height:171px;padding-top:0}.search-list .search-input{height:30px}.search-list .input-control-icon-right{height:28px;line-height:28px}.search-list .list-group>a.active{color:inherit;background-color:inherit}.search-list.searchbox-focus .list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.search-list .list-group>a.active:hover,.search-list.searchbox-focus .list-group>a.active:hover{color:#fff;background-color:#0c64eb}#dropMenu{width:initial;max-width:initial}#dropMenu>.search-box{width:100%;padding:10px 10px 0;margin:0}#dropMenu>.search-box .icon-search{color:#333}#dropMenu>.search-box.has-icon-right>.form-control{padding-left:26px}#dropMenu .input-control-icon-left{top:10px;left:10px}#dropMenu .input-control-icon-right{top:11px;right:11px}#dropMenu .input-control-icon-right .icon{position:relative;top:2px}#dropMenu .list-group{max-height:initial;margin:0}#dropMenu .table-row{margin:0 -10px;table-layout:auto}#dropMenu .table-col{position:relative;width:100%;min-width:250px;max-width:450px}#dropMenu .table-col .list-group{max-height:300px;padding:0 10px 5px}#dropMenu .col-left{padding-bottom:30px}#dropMenu .col-right{display:none}#dropMenu .col-footer{position:absolute;right:0;bottom:-5px;left:0;padding:8px 10px;border-top:1px solid #eee}#dropMenu .col-footer>a{opacity:.8}#dropMenu .col-footer>a:hover{opacity:1}#dropMenu.show-right-col .table-col{width:50%}#dropMenu.show-right-col .col-right{display:table-cell;border-left:1px solid #eee}#dropMenu.show-right-col .col-right>.list-group{max-height:335px;margin:0}#dropMenu.show-right-col .col-right>.list-group>a{opacity:.7}#dropMenu.show-right-col .col-right>.list-group>a:hover{opacity:1}#dropMenu.show-right-col .toggle-right-col>.icon-angle-right:before{content:"\e314"}#dropMenu.has-search-text .list-group{overflow-x:hidden}#dropMenu.has-search-text>.search-box{width:100%!important}#dropMenu.has-search-text>.list-group>.table-row{display:block}#dropMenu.has-search-text>.list-group>.table-row>.table-col{display:block;width:100%}#dropMenu.has-search-text .col-left{padding-bottom:0}#dropMenu.has-search-text .pull-right.toggle-right-col{display:none}#dropMenu.has-search-text .col-left .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group>a{opacity:.7}#dropMenu.has-search-text .col-footer,#dropMenu.has-search-text .hide-in-search{display:none}#swapper{position:relative}#swapper #dropMenu .tree li>.selected{color:#0c64eb!important;background:#e9f2fb!important}#swapper #dropMenu .list-group>a.active:hover,#swapper #dropMenu .search-box .list-group>a.active,#swapper #dropMenu .tree li>.clickable:hover,#swapper #dropMenu.searchbox-focus .list-group>a.active:hover{color:#fff!important;background:#0c64eb!important}#swapper #dropMenu .tree{margin:0}.release-path{overflow:hidden}.release-line{display:table;width:100%;padding:0;table-layout:fixed}.release-line>li{display:table-cell;list-style:none}.release-line>li>a{position:relative;display:block}.release-line>li>a:before{position:absolute;left:0;display:block;width:13px;height:13px;content:' ';background:#fff;border:2px solid #838a9d;border-radius:50%}.release-line>li>a:after{position:absolute;left:5px;display:block;width:2px;height:30px;content:' ';background:#cbe0f6}.release-line>li>a>.icon{position:absolute;left:4px;font-size:24px}.release-line>li>a .title{display:block;font-size:14px;white-space:nowrap}.release-line>li>a .date,.release-line>li>a .info{display:block;max-height:18px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.release-line>li>a:hover:before{background-color:#e9f2fb}.release-line>li>a:hover:after{background-color:#838a9d}.release-line>li>a:hover .title{color:#0c64eb}.release-line>li>a:hover .date,.release-line>li>a:hover .info{color:#838a9d}.release-line>li:nth-child(odd){padding-top:80px;vertical-align:top}.release-line>li:nth-child(odd)>a{height:85px;padding-top:36px;border-top:5px solid #cbe0f6}.release-line>li:nth-child(odd)>a:before{top:-9px}.release-line>li:nth-child(odd)>a:after{top:6px}.release-line>li:nth-child(odd)>a>.icon{top:-26px}.release-line>li:nth-child(even){padding-bottom:80px;vertical-align:bottom}.release-line>li:nth-child(even)>a{height:85px;padding-bottom:36px;border-bottom:5px solid #cbe0f6}.release-line>li:nth-child(even)>a:before{bottom:-9px}.release-line>li:nth-child(even)>a:after{bottom:6px}.release-line>li:nth-child(even)>a>.icon{bottom:-2px}.release-line>li:last-child>a{border-color:transparent}.release-line>li.active>a:before{border-color:#0c64eb}.release-line>li+li>a>.date,.release-line>li+li>a>.info,.release-line>li+li>a>.title{position:relative;left:-36%}#footer{position:fixed;right:0;bottom:0;left:0;z-index:1010;height:40px;background:#fff;border-top:1px solid #eff1f7}#footer .breadcrumb{padding:10px 0;margin:0}#footer .breadcrumb>li{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#footer .breadcrumb>.active,#footer .breadcrumb>li>a{color:#838a9e}#footer .breadcrumb>.active>.icon,#footer .breadcrumb>li>a>.icon{display:none}#footer .breadcrumb>.active:hover,#footer .breadcrumb>li>a:hover{color:#16a8f8}#footer .breadcrumb>li+li:before{content:'>'}#footer>.container{padding:0 20px}@media (min-width:1400px){#footer>.container{padding:0 40px}}#poweredBy{position:absolute;top:4px;right:0;padding:5px 10px}#poweredBy .icon-zentao{color:#0097fd}#poweredBy a{color:#3c4353}#poweredBy a:hover{color:#0c64eb}#poweredBy a:hover .icon-zentao{color:#0c64eb}#poweredBy a.text-important{color:#bd7b46}#poweredBy a.text-important:hover{color:#ff5d5d}#poweredBy a.text-primary{color:#0c64eb}#poweredBy a.text-primary:hover{color:#16a8f8}#poweredBy #aiux{color:#cbd0dc}#noticeBox .alert{-webkit-box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px}#heading{top:0}.header-btn{position:relative;padding:8px 0}.header-btn .btn{position:relative;height:34px;padding:1px 6px;margin:0;overflow:visible;font-size:13px;font-weight:400;line-height:28px;color:#fff;background-color:transparent;border-color:transparent!important;border-right:none;-webkit-transition:none;-o-transition:none;transition:none}.header-btn .btn>.caret{margin-left:0;border-width:4px}.header-btn .btn>.text{display:inline-block;max-width:150px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.header-btn .btn:hover{-webkit-box-shadow:none;box-shadow:none}.header-btn .btn:hover,.header-btn.active .btn{color:#fff;background:rgba(0,0,0,.15)}.header-btn .btn:hover>.caret,.header-btn.active .btn>.caret{opacity:1}.header-btn+.header-btn{margin-left:10px}.header-btn+.header-btn:before{position:absolute;top:16px;left:-13px;display:block;font-family:ZentaoIcon;font-size:14px;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e315";opacity:.6;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.header-btn .dropdown-menu{margin-top:-10px}#toolbar{top:0;height:50px}#userNav>li{margin-right:0}#userNav>li>a{padding:10px 5px}#userNav>li>a>.icon{font-size:30px;filter:brightness(1.2) hue-rotate(30deg);opacity:.9;-webkit-filter:brightness(1.2) hue-rotate(30deg)}#userNav>li:hover>a{background-color:rgba(0,0,0,.1)}#userNav .dropdown-menu>li>a{position:relative;padding-left:24px}#userNav .dropdown-menu>li>a>.icon{top:1px;left:0}#userNav .dropdown-menu>li.user-profile-item>a{padding-left:45px} +*/.chosen-container{position:relative;display:block;font-size:13px;vertical-align:middle;zoom:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;display:none;width:100%;background:#fff;border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-top:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container .chosen-drop.chosen-drop-size-limited{border-top:1px solid rgba(0,0,0,.15)}.chosen-container .chosen-drop.chosen-auto-max-width{min-width:100%;border-top:1px solid rgba(0,0,0,.15);opacity:0}.chosen-container .chosen-drop.chosen-auto-max-width>.chosen-results>li{display:inline-block;white-space:nowrap}.chosen-container .chosen-drop.chosen-auto-max-width.in{opacity:1}.chosen-container .chosen-drop.chosen-auto-max-width.in>.chosen-results>li{display:block;white-space:normal}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap!important}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container.chosen-up .chosen-drop{top:inherit;bottom:100%;margin-top:auto;margin-bottom:-1px;border-radius:2px 2px 0 0;-webkit-box-shadow:0 -3px 5px rgba(0,0,0,.175);box-shadow:0 -3px 5px rgba(0,0,0,.175)}.chosen-container.chosen-highlight-selected .result-selected{color:#0c64eb;background:#e9f2fb}.chosen-container-single .chosen-single{display:block;width:100%;height:32px;padding:5px 8px;overflow:hidden;line-height:1.42857143;color:#222;text-decoration:none;white-space:nowrap;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-single .chosen-default{color:#838a9d}.chosen-container-single .chosen-single>span{display:block;margin-right:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:5px;right:24px;display:block;width:20px;height:20px;font-family:sans-serif;font-size:18px;font-weight:700;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-single .chosen-single abbr:before{display:block;content:'×'}.chosen-container-single .chosen-single abbr:focus,.chosen-container-single .chosen-single abbr:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;height:100%;padding:5px 8px}.chosen-container-single .chosen-single div b{display:inline-block;width:0;height:0;margin-bottom:2px;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent;opacity:.5}.chosen-container-single .chosen-search{position:relative;z-index:1010;padding:3px 4px;margin:0;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{width:100%;height:27px;padding:2px 26px 2px 8px;margin:1px 0;font-size:12px;line-height:1.5;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;outline:0}.chosen-container-single .chosen-search input[type=text]:focus{border-color:#0c64eb}.chosen-container-single .chosen-search:before{position:absolute;top:10px;right:10px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-single .chosen-drop{margin-top:-1px;-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:0 0 4px 4px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;max-height:240px;padding:0;margin:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;padding:5px 10px;margin:0;line-height:15px;list-style:none;-webkit-transition:background-color .2s cubic-bezier(.175,.885,.32,1);-o-transition:background-color .2s cubic-bezier(.175,.885,.32,1);transition:background-color .2s cubic-bezier(.175,.885,.32,1);-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{color:#fff;background-color:#0c64eb}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;width:100%;min-height:32px;min-height:30px\9;padding:0;margin:0;overflow:hidden;cursor:text;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-multi .chosen-choices:after,.chosen-container-multi .chosen-choices:before{display:table;content:" "}.chosen-container-multi .chosen-choices:after{clear:both}.chosen-container-multi .chosen-choices li{display:block;float:left;padding:0 6px;margin:5px 4px;list-style:none}.chosen-container-multi .chosen-choices li.search-field{padding:0;line-height:12px;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:20px;font-size:100%;color:#838a9d;background:0 0!important;border:0!important;border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-field:before{position:absolute;right:8px;bottom:8px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";opacity:0;-webkit-transition:opacity .2s cubic-bezier(.175,.885,.32,1);-o-transition:opacity .2s cubic-bezier(.175,.885,.32,1);transition:opacity .2s cubic-bezier(.175,.885,.32,1);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice{position:relative;padding:3px 20px 3px 5px;line-height:12px;cursor:default;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.chosen-container-multi .chosen-choices li.search-choice:hover{background-color:#fff;border-color:#adb5c6;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 0 rgba(0,0,0,.1)}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:1px;right:0;display:block;width:20px;height:18px;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:focus,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;color:#666;background-color:#e4e4e4;border:1px solid #ccc}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{padding:5px 0;margin:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-bottom-right-radius:0!important;border-bottom-left-radius:0!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active.chosen-with-drop .chosen-single div{background:0 0;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{content:"";border-top:0 dotted;border-bottom:4px solid}.chosen-container-active.chosen-with-drop.chosen-up .chosen-single{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active .chosen-choices{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111!important}.chosen-container-active .chosen-choices li.search-field:before{opacity:1}.chosen-disabled{cursor:default;opacity:.5!important}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{left:0;display:none;padding:3px 4px;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:25px;padding:2px 26px 2px 4px;font-size:inherit}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{top:9px}.chosen-compact.chosen-with-search.chosen-with-drop .chosen-single>.chosen-search{display:block;opacity:1}select.chosen[multiple]{height:32px;overflow:hidden}select.chosen[multiple] option{visibility:hidden}.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.picker-focus .picker-selections{border-color:#0c64eb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6)}.disabled .picker-selections{cursor:not-allowed;background-color:#f5f5f5}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\e928";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\f0d7";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:"\e928"}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:18px;height:18px;text-align:center;cursor:pointer;opacity:.2;-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}.picker-selection-remove:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px;z-index:1}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-multi.picker-sortable .picker-selection-text{cursor:move}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.disabled .picker-search{cursor:not-allowed}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.picker-no-value.picker-focus .picker-placeholder{display:none}.picker-input-empty.picker-focus.picker-no-value .picker-placeholder,.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.42857143;color:#3c4353;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#0c64eb;background:#e9f2fb}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#0c64eb}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option.disabled{cursor:not-allowed!important}.picker-option-text-matched{position:relative;color:#0c64eb}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:2px;content:' ';background-color:#0c64eb;border-radius:2px;opacity:.5}.picker-option-active .picker-option-text-matched,.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option-active .picker-option-text-matched:before,.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ff5d5d}.picker-actions{padding:5px;border-top:1px solid #eee}.picker-no-actions .picker-actions{display:none}.picker-actions .btn{padding:2px 4px}.picker-actions .btn[disabled]{background-color:transparent;filter:grayscale(1);-webkit-filter:grayscale(1)}.picker-actions .btn+.btn{margin-left:4px}.picker-checkable .picker-option{position:relative;padding-left:32px;color:inherit!important;cursor:pointer!important}.picker-checkable .picker-option>.checkbox-primary{position:absolute;top:4px;left:10px}.picker-checkable .picker-option.picker-option-active{background-color:rgba(0,0,0,.05)!important}.picker-checkable .picker-option:hover{background-color:rgba(0,0,0,.075)!important}.picker-checkable .picker-option.picker-option-selected{background-color:#e9f2fb!important}.picker-checkable .picker-option-active .picker-option-text-matched,.picker-checkable .picker-option:hover .picker-option-text-matched{color:#0c64eb!important}.picker-checkable .picker-option-active .picker-option-text-matched:before,.picker-checkable .picker-option:hover .picker-option-text-matched:before{background:#0c64eb!important}:root{--color-primary:#0c64eb;--color-secondary:#16a8f8;--color-pale:#e9f2fb;--color-fore:#3c4353;--color-back:#fff;--color-red:#ff5d5d;--color-yellow:#ff9800;--color-green:#00da88;--color-blue:#2196f3;--color-purple:#8666b8;--color-brown:#bd7b46;--color-danger:#ff5d5d;--color-warning:#ff9800;--color-success:#00da88;--color-info:#2196f3;--color-special:#8666b8;--color-important:#bd7b46;--color-green-pale:#e8f5e9;--color-yellow-pale:#fff3e0;--color-red-pale:#ffebee;--color-blue-pale:#e3f2fd;--color-brown-pale:#efebe9;--color-purple-pale:#f3e5f5;--link-color:#3c4353;--link-hover-color:#0c64eb;--color-gray-darker:#222;--color-gray-dark:#3c495c;--color-gray:#838a9d;--color-gray-light:#cbd0db;--color-gray-lighter:#eee;--color-gray-pale:#f1f1f1;--border-radius:4px;--border-radius-lg:6px;--border-radius-sm:3px;--bg-gradient:linear-gradient(-90deg, #0a48d1 0%, #1183fb 100%)}.container,.container-fixed,.container-fluid{position:relative}.container{max-width:1800px!important}body{background-color:#efefef}body.article-content,body.body-modal{background:0 0}body.body-modal{padding:0}@media screen and (min-width:1920px){body{font-size:14px}}a:active,a:focus,button:active,button:focus{outline:0!important}.strong{font-weight:700}.font-normal{font-weight:400!important}.text-middle{vertical-align:middle!important}.text-bottom{vertical-align:bottom!important}.text-top{vertical-align:top!important}.inline-block{display:inline-block!important}.layer{border-radius:4px;-webkit-box-shadow:0 0 20px 0 #bdc9d8;box-shadow:0 0 20px 0 #bdc9d8}.space{margin-bottom:20px}.space-lg{margin-bottom:30px}.space-sm{margin-bottom:10px}.muted{opacity:.5}.text-muted em{color:#3c4353}.no-animate{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.template{display:none!important}.text-left{text-align:left!important}.text-yellow.icon-folder{color:#ffe066}.table-row{display:table;width:100%;table-layout:fixed}.table-col,.table-row>.col,.table-row>[class*=col-],.table-row>[class*="-col"]{display:table-cell;float:none;vertical-align:top}.side-col{width:200px;padding-right:20px}.side-col.col-4{width:33.3333333%}.col-lg{width:260px}.col-xl{width:320px}.col-sm{width:150px}.col-xs{width:100px}.main-col+.side-col{padding-right:0;padding-left:20px}.row-grid>[class*=col-],.row-grid>[class*="-col"]{padding-top:6px;padding-bottom:6px}hr.space{margin:10px 0;border:none}hr.space-sm{margin:5px 0;border:none}.text-secondary{color:#16a8f8}a.text-primary{color:#0c64eb}.nav-primary>li>a{min-width:100px;padding:5px 8px;color:#838a9d;border-color:#e7f1fc}.nav-primary>li.active>a{color:#0c64eb;background-color:#e7f1fc;border-color:#e7f1fc}.nav-primary>li.active>a:hover{color:#0c64eb;background-color:#c3dcf7;border-color:#c3dcf7}.end-marker{margin-bottom:20px;color:#cbd0db;text-align:center}@-webkit-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@-o-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}.highlight{-webkit-animation:highlight .5s linear 0s 2 alternate;-o-animation:highlight .5s linear 0s 2 alternate;animation:highlight .5s linear 0s 2 alternate}.progress.inline-block{width:100px;margin:0}.w-p5{width:5%!important}.w-p10{width:10%!important}.w-p15{width:15%!important}.w-p20{width:20%!important}.w-p25{width:25%!important}.w-p30{width:30%!important}.w-p35{width:35%!important}.w-p40{width:40%!important}.w-p45{width:45%!important}.w-p50{width:50%!important}.w-p55{width:55%!important}.w-p60{width:60%!important}.w-p65{width:65%!important}.w-p70{width:70%!important}.w-p75{width:75%!important}.w-p80{width:80%!important}.w-p85{width:85%!important}.w-p90{width:90%!important}.w-p94{width:94%!important}.w-p95{width:95%!important}.w-p98{width:98%!important}.w-p99{width:99%!important}.w-p100{width:100%!important}.w-auto{width:auto!important}.w-10px{width:10px!important}.w-20px{width:20px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-60px{width:60px!important}.w-70px{width:70px!important}.w-80px{width:80px!important}.w-90px{width:90px!important}.w-100px{width:100px!important}.w-110px{width:110px!important}.w-120px{width:120px!important}.w-130px{width:130px!important}.w-140px{width:140px!important}.w-150px{width:150px!important}.w-160px{width:160px!important}.w-180px{width:180px!important}.w-200px{width:200px!important}.w-230px{width:230px!important}.w-250px{width:250px!important}.w-300px{width:300px!important}.w-400px{width:400px!important}.w-500px{width:500px!important}.w-600px{width:600px!important}.w-700px{width:700px!important}.w-800px{width:800px!important}.w-900px{width:900px!important}.mw-200px{max-width:200px!important}.mw-300px{max-width:300px!important}.mw-400px{max-width:400px!important}.mw-500px{max-width:500px!important}.mw-600px{max-width:600px!important}.mw-700px{max-width:700px!important}.mw-800px{max-width:800px!important}.mw-900px{max-width:900px!important}.mw-1400px{max-width:1400px!important}.w-id{width:70px!important}.w-pri{width:40px!important}.w-severity{width:50px!important}.w-hour{width:57px!important}.w-date{width:90px!important}.w-status{width:60px!important}.w-resolution,.w-type,.w-user{width:80px!important}.w-p15-f{width:15%!important;min-width:120px!important}.w-p25-f{width:25%!important;min-width:200px!important}.w-p35-f{width:35%!important;min-width:300px!important}.w-p45-f{width:45%!important;min-width:400px!important}.h-5px{height:5px!important}.h-10px{height:10px!important}.h-20px{height:20px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-60px{height:60px!important}.h-70px{height:70px!important}.h-80px{height:80px!important}.h-100px{height:100px!important}.h-120px{height:120px!important}.h-130px{height:130px!important}.h-140px{height:140px!important}.h-150px{height:150px!important}.h-200px{height:200px!important}.pd-0{padding:0!important}.mg-0{margin:0!important}.mgb-20{margin-bottom:20px!important}.mgb-10{margin-bottom:10px!important}.pdb-20{padding-bottom:20px!important}.pdt-20{padding-top:20px!important}.br-0{border-radius:0!important}.bd-0,.bd-none,.borderless{border:none!important}.bg-none{background:0 0!important}.red{color:#ff5d5d!important}.icon-pro-version{font-size:14px!important}.icon-pro-version:before{position:relative;top:-1px;font-size:14px;color:#ff5d5d;content:"\e92b"}.bg-primary{color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb}.bg-primary-pure{color:#fff;background-color:#0c64eb}.bg-primary-pale{color:#0c64eb;background-color:#e9f2fb}.bg-secondary{color:#fff;background:#16a8f8}.hl-tutorial{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 0 0 #000!important;box-shadow:0 0 0 0 #000!important;-webkit-transition:-webkit-box-shadow 1s!important;-o-transition:box-shadow 1s!important;transition:-webkit-box-shadow 1s!important;transition:box-shadow 1s!important;transition:box-shadow 1s,-webkit-box-shadow 1s!important}.hl-tutorial.hl-in{-webkit-box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important;box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important}.btn.tooltip-tutorial,.hl-tutorial.hl-in:hover{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important;box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important}.tooltip-max .tooltip-inner{max-width:1000px;padding:8px 10px}.transition-all *{-webkit-transition:all .2s!important;-o-transition:all .2s!important;transition:all .2s!important}.scroll-x{overflow-x:auto!important}.scroll-y{overflow-y:auto!important}.divider+.divider{display:none}.ie *{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}@font-face{font-family:Oswald;font-weight:400;src:url(../fonts/Oswald-Regular.ttf)}@font-face{font-family:Oswald;font-weight:500;src:url(../fonts/Oswald-Medium.ttf)}@font-face{font-family:Oswald;font-weight:300;src:url(../fonts/Oswald-Light.ttf)}.num{font-family:Oswald;font-weight:400}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(../fonts/ZentaoIcon.eot?v=1.34);src:url(../fonts/ZentaoIcon.eot?#iefix&v=1.34) format('embedded-opentype'),url(../fonts/ZentaoIcon.woff?v=1.34) format('woff'),url(../fonts/ZentaoIcon.ttf?v=1.34) format('truetype'),url(../fonts/ZentaoIcon.svg#regular?v=1.34) format('svg')}.icon,[class*=" icon-"],[class^=icon-]{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}a .icon,a [class*=" icon-"],a [class^=icon-]{display:inline}.icon-lg:before{font-size:1.33333333em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-spin{display:inline-block;-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-spin{display:inline-block;text-decoration:none}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);-o-transform:rotate(359deg);transform:rotate(359deg)}}.icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.icon-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.icon.icon-flip-horizontal,.icon.icon-flip-vertical,.icon.icon-rotate-180,.icon.icon-rotate-270,.icon.icon-rotate-90{display:inline-block}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-help:before{content:"\e968"}.icon-import:before{content:"\e904"}.icon-download:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-plus:before{content:"\e925"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-chart-bar:before{content:"\e95d"}.icon-bar-chart:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before{content:"\e940"}.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-college:before{content:"\e9c8"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-menu-my:before{content:"\e97a"}.icon-home:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before{content:"\e98f"}.icon-product:before{content:"\e98f"}.icon-rocket:before{content:"\e99c"}.icon-project:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-test:before{content:"\e956"}.icon-infinite:before{content:"\e9a3"}.icon-devops:before{content:"\e9a3"}.icon-ops:before{content:"\e903"}.icon-doc:before{content:"\e99b"}.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-menu-backend:before{content:"\e993"}.icon-assets:before{content:"\e9ae"}.icon-diamond:before{content:"\e9ae"}.icon-feedback:before{content:"\e991"}.icon-flow:before{content:"\e994"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before{content:"\e996"}.icon-info:before{content:"\e996"}.icon-cog-outline:before{content:"\e997"}.icon-backend:before{content:"\e997"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before{content:"\f0ac"}.icon-lang:before{content:"\f0ac"}.icon-draft-edit:before{content:"\e9dd"}.icon-sub-review:before{content:"\e9df"}.icon-sub-review-user:before{content:"\e9db"}.icon-ztf:before{content:"\e9dc"}.icon-save:before{content:"\e9d8"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-customer:before{content:"\e9d9"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-kanban:before{content:"\e983"}.icon-lane:before{content:"\e9b1"}.icon-back:before{content:"\e9d3"}.icon-back-circle:before{content:"\e9da"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before{content:"\e9c7"}.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-thumbs-up-solid:before{content:"\e9d6"}.icon-thumbs-down-solid:before{content:"\e9d7"}.icon-hash:before{content:"\e9ab"}.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-file-log:before{content:"\e9de"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file:before{content:"\f016"}.icon-file-empty:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-group:before{content:"\e97e"}.icon-menu-users:before{content:"\e97e"}.icon-persons:before{content:"\e97e"}.icon-team:before{content:"\e97e"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-cancel:before{content:"\e951"}.icon-ban-circle:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before{content:"\e950"}.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-start:before{content:"\e90a"}.icon-play:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-change:before{content:"\e970"}.icon-alter:before{content:"\e970"}.icon-glasses:before{content:"\e914"}.icon-review:before{content:"\e914"}.icon-sitemap:before{content:"\e915"}.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-magic:before{content:"\e919"}.icon-active:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-delay:before{content:"\e91d"}.icon-calendar:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.icon-sm:before{font-size:14px;vertical-align:10%}.icon-qc{position:relative}.icon-qc:before{width:1em;color:#7cb938;content:"\e985"}.icon-qc:after{position:absolute;top:0;left:0;width:1em;height:1em;font-family:ZentaoIcon;font-size:14px;font-size:inherit;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#36a742;text-transform:none;content:"\e987";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-message.has-dot{position:relative}.icon-message.has-dot::after{position:absolute;top:-3px;right:-5px;display:block;width:6px;height:6px;content:' ';background-color:#ff5d5d;border-radius:50%}.icon-project{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.icon-product{-webkit-transform:scale(1.15);-ms-transform:scale(1.15);-o-transform:scale(1.15);transform:scale(1.15)}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:18px;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px;-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background,border,outline,opacity,-webkit-box-shadow;-o-transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,outline,opacity,-webkit-box-shadow;transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,box-shadow,outline,opacity,-webkit-box-shadow}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#3c4353;text-decoration:none}.btn:active{text-decoration:none;background-image:none;outline:0;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.1)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:grayscale(1);-webkit-box-shadow:none;box-shadow:none;opacity:.5;-webkit-filter:grayscale(1)}.btn{color:#3c4353;background-color:#fff;border-color:#d6dae3}.btn.active,.btn.hover,.btn:active,.btn:focus,.btn:hover,.open .dropdown-toggle.btn{color:#3c4353;background-color:rgba(255,255,255,.8);border-color:#b8bfce}.btn.active,.btn:active,.open .dropdown-toggle.btn{background-color:#f2f2f2;background-image:none;border-color:#b8bfce}.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn.active,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover{color:rgba(60,67,83,.3);background-color:#fff;border-color:#d6dae3}.btn-gray{color:#82899f;background-color:#f1f1f1;border-color:#f1f1f1}.btn-gray.active,.btn-gray.hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.open .dropdown-toggle.btn-gray{color:#82899f;background-color:rgba(241,241,241,.8);border-color:#d8d8d8}.btn-gray.active,.btn-gray:active,.open .dropdown-toggle.btn-gray{background-color:#e4e4e4;background-image:none;border-color:#d8d8d8}.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,fieldset[disabled] .btn-gray,fieldset[disabled] .btn-gray.active,fieldset[disabled] .btn-gray:active,fieldset[disabled] .btn-gray:focus,fieldset[disabled] .btn-gray:hover{color:rgba(130,137,159,.3);background-color:#f1f1f1;border-color:#f1f1f1}.btn-primary{color:#fff;background-color:#0c64eb;border-color:transparent}.btn-primary.active,.btn-primary.hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:rgba(12,100,235,.8);border-color:rgba(0,0,0,0)}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-color:#0b5ad3;background-image:none;border-color:rgba(0,0,0,0)}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{color:rgba(255,255,255,.3);background-color:#0c64eb;border-color:transparent}.btn-secondary{color:#fff;background-color:#16a8f8;border-color:transparent}.btn-secondary.active,.btn-secondary.hover,.btn-secondary:active,.btn-secondary:focus,.btn-secondary:hover,.open .dropdown-toggle.btn-secondary{color:#fff;background-color:rgba(22,168,248,.8);border-color:rgba(0,0,0,0)}.btn-secondary.active,.btn-secondary:active,.open .dropdown-toggle.btn-secondary{background-color:#079ced;background-image:none;border-color:rgba(0,0,0,0)}.btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:focus,.btn-secondary.disabled:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[disabled]:active,.btn-secondary[disabled]:focus,.btn-secondary[disabled]:hover,fieldset[disabled] .btn-secondary,fieldset[disabled] .btn-secondary.active,fieldset[disabled] .btn-secondary:active,fieldset[disabled] .btn-secondary:focus,fieldset[disabled] .btn-secondary:hover{color:rgba(255,255,255,.3);background-color:#16a8f8;border-color:transparent}.btn-warning{color:#fff;background-color:#ff9800;border-color:transparent}.btn-warning.active,.btn-warning.hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:rgba(255,152,0,.8);border-color:rgba(0,0,0,0)}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-color:#e68900;background-image:none;border-color:rgba(0,0,0,0)}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{color:rgba(255,255,255,.3);background-color:#ff9800;border-color:transparent}.btn-danger{color:#fff;background-color:#ff5d5d;border-color:transparent}.btn-danger.active,.btn-danger.hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:rgba(255,93,93,.8);border-color:rgba(0,0,0,0)}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-color:#ff4343;background-image:none;border-color:rgba(0,0,0,0)}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{color:rgba(255,255,255,.3);background-color:#ff5d5d;border-color:transparent}.btn-success{color:#fff;background-color:#00da88;border-color:transparent}.btn-success.active,.btn-success.hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:rgba(0,218,136,.8);border-color:rgba(0,0,0,0)}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-color:#00c178;background-image:none;border-color:rgba(0,0,0,0)}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{color:rgba(255,255,255,.3);background-color:#00da88;border-color:transparent}.btn-info{color:#0c64eb;background-color:#e9f2fb;border-color:transparent}.btn-info.active,.btn-info.hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#0c64eb;background-color:rgba(233,242,251,.8);border-color:rgba(0,0,0,0)}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-color:#d3e5f7;background-image:none;border-color:rgba(0,0,0,0)}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{color:rgba(12,100,235,.3);background-color:#e9f2fb;border-color:transparent}.btn-link{padding-right:6px;padding-left:6px;font-weight:400;color:#3c495c;text-shadow:none;cursor:pointer;background:0 0;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover,.btn-link[disabled],fieldset[disabled] .btn-link{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{color:#222;background:#f1f1f1;background:rgba(0,0,0,.075)}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#cbd0db;text-decoration:none}.btn-lg{padding:11px 16px;font-size:14px;line-height:18px;border-radius:4px}.btn-mini,.btn-sm{padding:3px 8px;font-size:12px;line-height:18px;border-radius:4px}.btn-mini,.btn-xs{padding:0 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-wide{min-width:120px}.btn-limit{max-width:180px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-limit>.caret{position:absolute;top:14px;right:8px}.btn-circle{border-radius:17px}.btn>.label-icon{top:3px;padding:3px;margin:-2px;background-color:rgba(0,0,0,.2);border-radius:12px}.btn>.label-icon>.icon{font-size:16px;line-height:18px}.btn>.icon+.text{margin-left:5px}.btn.btn-sm.btn-circle{border-radius:12px}.btn.btn-sm>.label-icon{top:2px;width:20px;height:20px;padding:1px;line-height:20px}.btn.btn-sm>.label-icon>.icon{position:relative;top:-1px;display:inline-block;font-size:14px;line-height:18px}.btn-icon-left{position:relative;padding-left:35px;overflow:hidden;text-align:right}.btn-icon-left>.label-icon{position:absolute;left:5px;margin:0}.btn-icon-left>.icon{position:absolute;top:0;bottom:0;left:0;display:block;width:30px;line-height:30px;color:#16a8f8;text-align:center;background:#e9f2fb}.btn-icon-left.btn-sm{padding-left:28px}.btn-icon-left.btn-sm>.label-icon{left:2px}.btn-icon-left.btn-sm>.icon{width:24px;line-height:24px}.btn-icon-right{position:relative;padding-right:35px;text-align:left}.btn-icon-right>.label-icon{position:absolute;right:5px;margin:0}.btn-icon-right.btn-sm{padding-right:28px}.btn-icon-right.btn-sm>.label-icon{right:2px}.btn-icon{min-width:32px;padding-right:0;padding-left:0}.btn-icon.btn-sm{width:24px;min-width:24px;height:24px}.btn-group{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>.btn-group{float:left}.btn-group>.btn{border-radius:0}.btn-group>.btn:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.dropdown{float:left;margin-right:10px}.btn-toolbar>.btn-group:last-child,.btn-toolbar>.btn:last-child,.btn-toolbar>.dropdown:last-child{margin-right:0}.btn-toolbar>.divider{float:left;height:20px;margin:7px 5px 4px 10px;border-left:1px solid rgba(0,0,0,.1)}.btn-toolbar .space{float:left;min-height:1px;margin:0 10px 0 10px}.btn-toolbar .input-control{float:left;width:120px}.btn-toolbar .page-title{float:left;line-height:34px}.btn-toolbar .page-title .text{font-size:14px;font-weight:700}.btn-toolbar .page-title .label{top:-2px;margin-right:10px}.btn-toolbar .divider+.page-title{margin-left:15px}.btn-active-line{position:relative;font-weight:700;color:#0c64eb}.btn-active-line:after{position:absolute;right:5px;bottom:1px;left:5px;display:block;content:' ';border-bottom:2px solid #0c64eb}.btn-active-line:hover{color:#0c64eb}.btn-active-text .text{position:relative;top:-1px;display:inline-block;font-weight:700;color:#0c64eb}.btn-active-text .text:after{position:absolute;bottom:-5px;display:block;width:100%;content:' ';border-bottom:2px solid #0c64eb}.angle-btn{position:relative;padding:1px;background:#fff;border:1px solid #cbd0db;border-right:none}.angle-btn:first-child{border-radius:2px 0 0 2px}.btn-toolbar>.angle-btn{margin-right:8px}.angle-btn:after,.angle-btn:before{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn:after{right:-7px;border-color:transparent transparent transparent #fff;border-radius:2px}.angle-btn .btn{padding:6px;font-weight:700;background:#fff;border:none;border-radius:4px!important}.angle-btn .btn.btn-limit{padding-right:16px}.angle-btn .btn.btn-limit>.caret{right:4px}.angle-btn+.angle-btn{border-left:none}.angle-btn+.angle-btn>.btn-group:first-child{padding-left:8px}.angle-btn+.angle-btn>.btn-group:first-child:after,.angle-btn+.angle-btn>.btn-group:first-child:before{position:absolute;top:-2px;left:0;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn+.angle-btn>.btn-group:first-child:after{left:-1px;border-color:transparent transparent transparent #fff;border-width:17px 0 17px 8px}.btn-toolbar>.angle-btn.active,.btn-toolbar>.angle-btn:last-child{border-color:#0c64eb}.btn-toolbar>.angle-btn.active .btn,.btn-toolbar>.angle-btn:last-child .btn{color:#0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn.active:before,.btn-toolbar>.angle-btn:last-child:after,.btn-toolbar>.angle-btn:last-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn:last-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:before,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn,.btn-toolbar>.angle-btn.normal{border-color:#cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn .btn,.btn-toolbar>.angle-btn.normal .btn{color:#3c4353}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.active+.angle-btn:before,.btn-toolbar>.angle-btn.normal:after,.btn-toolbar>.angle-btn.normal:before{border-color:transparent transparent transparent #cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.normal:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before,.btn-toolbar>.angle-btn.normal>.btn-group:first-child:before{border-color:transparent transparent transparent #cbd0db!important}.nav>li>.btn.btn-primary{color:#fff}.nav>li>.btn.btn-primary:focus,.nav>li>.btn.btn-primary:hover{background:rgba(12,100,235,.8)}.btn.btn-action,.c-actions .btn{display:inline-block;width:26px;padding:2px;overflow:hidden;line-height:20px;color:#16a8f8;background:0 0;border-color:transparent}.btn.btn-action>i,.c-actions .btn>i{position:relative;top:1px;font-size:18px}.btn.btn-action:hover,.c-actions .btn:hover{color:#0c64eb;background-color:#d3e5f7}.c-actions .btn+.btn{margin-left:-4px}.label{position:relative;display:inline-block;padding:3px 5px;font-size:12px;font-weight:400;vertical-align:middle;border-radius:2px}.label+.label{margin-left:4px}.label-pale{background:#bed8f3!important}.label-badge{border-radius:9px}.label-light{color:#3c4353;background-color:#ddd}.label-primary{background:#0c64eb!important}.label-gray{color:#878da0;background:#e8ebef}.label-outline.label-danger{color:#ff5d5d;background:#ffebee;border-color:rgba(255,93,93,.25)}.label-outline.label-light{color:#838a9d;background:#f2f5fb;border-color:#e1e5ee}.label-primary.label-outline{background:#e9f2fb!important;border-color:rgba(12,100,235,.25)}.label-outline.label-success{background:#e8f5e9;border-color:rgba(0,218,136,.25)}.label-outline.label-info{background:#e3f2fd;border-color:rgba(33,150,243,.25)}.label-outline.label-warning{background:#fff3e0;border-color:rgba(255,152,0,.25)}.label-dot{position:relative;top:-1px;padding:0;border-radius:50%}.label-dot+.status-text{display:inline-block;margin-left:5px}.label-icon{min-width:18px;padding:0;line-height:18px;border-radius:10px}.label-id{display:inline-block;min-width:30px;padding:0 5px;font-size:12px;line-height:16px;color:#838a9d;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid #838a9d;border-radius:2px}.pri-1,.todo-pri-1{color:#ff5d5d}[class*=" status-"],[class^=status-]{color:#3c4353}.status-changed,.status-changing,.status-delayed,.status-doing,.status-fail,.status-investigate{color:#ff5d5d}.status-changed>.label-dot,.status-changing>.label-dot,.status-delayed>.label-dot,.status-doing>.label-dot,.status-fail>.label-dot,.status-investigate>.label-dot{background-color:#ff5d5d}.status-wait{color:#838a9d}.status-wait>.label-dot{background-color:#7ec5ff}.status-unclosed{color:#838a9d}.status-unclosed>.label-dot{background-color:#0c64eb}.status-done,.status-normal,.status-pass,.status-resolved{color:#43a047}.status-done>.label-dot,.status-normal>.label-dot,.status-pass>.label-dot,.status-resolved>.label-dot{background-color:#00da88}.status-postpone{color:#838a9d}.status-postpone>.label-dot{background-color:#ff5d5d}.status-blocked{position:relative;left:-5px;display:inline-block;padding:0 5px;line-height:20px;color:#3c4353;background:0 0;border-radius:10px}.status-blocked>.label-dot{background-color:#ff9800}.status-pause,.status-suspended{color:#ff9800}.status-pause>.label-dot,.status-suspended>.label-dot{background-color:#ff9800}.status-active.status-bug,.status-draft{color:#8666b8}.status-active.status-bug>.label-dot,.status-draft>.label-dot{background-color:#8666b8}.status-closed,.status-terminate{color:#838a9d}.status-closed>.label-dot,.status-terminate>.label-dot{background-color:#838a9d}.status-cancel{color:#838a9d}.status-cancel>.label-dot{background-color:#cbd0db}.label-pri{display:inline-block;min-width:18px;max-width:100%;height:18px;padding:0 4px;overflow:hidden;font-size:12px;line-height:16px;color:#838a9d;text-align:center;text-overflow:clip;white-space:normal;vertical-align:middle;border:1px solid #838a9d;border-radius:10px}.label-pri-1,.label-selector>.label-pri[data-value="1"]{color:#d50000;border-color:#d50000}.label-pri-2,.label-selector>.label-pri[data-value="2"]{color:#ff9800;border-color:#ff9800}.label-pri-3,.label-selector>.label-pri[data-value="3"]{color:#2098ee;border-color:#2098ee}.label-pri-4,.label-selector>.label-pri[data-value="4"]{color:#009688;border-color:#009688}.label-pri-5,.label-selector>.label-pri[data-value="5"]{color:#838a9d;border-color:#838a9d}.label-pri-0,.label-selector>.label-pri.active[data-value="0"]{color:#d5d9df;border-color:#d5d9df}.label-severity{position:relative;display:inline-block;width:24px;height:20px;font-weight:bolder;text-align:center;vertical-align:middle}.label-severity:before{position:absolute;top:-3px;left:0;z-index:0;display:block;font-family:ZentaoIcon;font-size:14px;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:inherit;text-transform:none;content:"\e973";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.label-severity:after{position:absolute;top:7px;left:0;z-index:1;display:block;width:24px;font-size:12px;line-height:12px;text-align:center;content:attr(data-severity)}.label-severity[data-severity],.label-severity[data-value]{color:#ccc}.label-severity[data-severity="0"],.label-severity[data-value="0"]{color:#ccc}.label-severity[data-severity="1"],.label-severity[data-value="1"]{color:#c62828}.label-severity[data-severity="2"],.label-severity[data-value="2"]{color:#ff8f00}.label-severity[data-severity="3"],.label-severity[data-value="3"]{color:#fdd835}.label-severity[data-severity="4"],.label-severity[data-value="4"]{color:#cddc39}.label-severity[data-severity="5"],.label-severity[data-value="5"]{color:#8bc34a}.label-severity-custom[data-severity]{color:#d5d9df}.label-severity-custom[data-severity="1"]{color:#c62828}.label-severity-custom[data-severity="2"]{color:#ff8f00}.label-severity-custom[data-severity="3"]{color:#fdd835}.label-severity-custom[data-severity="4"]{color:#cddc39}.label-severity-custom[data-severity="5"]{color:#8bc34a}.label-selector{padding:0 10px}.label-selector>.label{display:inline-block;min-width:24px;height:24px;padding:0 5px;font-size:14px;line-height:20px;text-align:center;cursor:pointer;background:0 0;border:2px solid #d5d9df;border-radius:15px}.label-selector>.label+.label{margin-left:10px}.label-selector>.label.empty{border-color:transparent}.label-selector>.label.label-severity{font-size:12px;line-height:28px;border-color:transparent}.label-selector>.label.label-severity:before{top:-2px;left:-2px}.label-selector>.label.label-severity:after{display:none}.label-selector>.label.label-severity.active{background:0 0;filter:none;-webkit-filter:none}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-top:2px}.ie .checkbox input[type=checkbox],.ie .checkbox-inline input[type=checkbox],.ie .radio input[type=radio],.ie .radio-inline input[type=radio]{margin-top:4px}.is-firefox .checkbox input[type=checkbox],.is-firefox .checkbox-inline input[type=checkbox],.is-firefox .radio input[type=radio],.is-firefox .radio-inline input[type=radio]{margin-top:3px}.checkbox-primary,.radio-primary{position:relative;display:block;vertical-align:middle}.checkbox-primary.inline-block,.radio-primary.inline-block{display:inline-block}.checkbox-primary.inline-block+.inline-block,.radio-primary.inline-block+.inline-block{margin-left:15px}.checkbox-primary>input,.radio-primary>input{position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;margin:0;opacity:0}.checkbox-primary>label,.radio-primary>label{display:block;height:20px;padding-left:20px;margin:0;font-weight:400;line-height:20px;cursor:pointer}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{position:absolute;top:3px;right:0;left:0;display:block;width:14px;height:14px;line-height:14px;text-align:center;content:' ';border-radius:3px}.checkbox-primary>label:after,.radio-primary>label:after{z-index:1;border:1px solid #d9dbe1;border-color:rgba(0,0,0,.15);-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:border,background-color;-o-transition-property:border,background-color;transition-property:border,background-color}.checkbox-primary>label:before,.radio-primary>label:before{top:3px;z-index:2;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-weight:900;font-variant:normal;line-height:1;text-transform:none;content:"\e5ca";opacity:0;-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:opacity,-webkit-transform;-o-transition-property:opacity,-o-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform,-o-transform;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.checkbox-primary.checked>label:after,.checkbox-primary>input:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:#00da88;border-color:#00da88;border-width:4px}.checkbox-primary.checked>label:before,.checkbox-primary>input:checked+label:before,.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{color:#fff;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary input:indeterminate+label:before,.checkbox-primary.indeterminate>label:before,.radio-primary input:indeterminate+label:before,.radio-primary.indeterminate>label:before{top:9px;left:3px;width:8px;height:2px;content:' ';background-color:#a3a2bc;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary.focus>label:after,.checkbox-primary>input:focus+label:after,.radio-primary.focus>label:after,.radio-primary>input:focus+label:after{border-color:#00da88;-webkit-box-shadow:0 0 0 3px rgba(0,218,136,.2);box-shadow:0 0 0 3px rgba(0,218,136,.2)}.checkbox-primary:hover>label:after,.radio-primary:hover>label:after{border-color:#00da88}.checkbox-primary.checkbox-right>label,.radio-primary.checkbox-right>label{padding:0 30px 0 0}.checkbox-primary.checkbox-right>label:after,.checkbox-primary.checkbox-right>label:before,.radio-primary.checkbox-right>label:after,.radio-primary.checkbox-right>label:before{right:0;left:auto}.checkbox-primary input:disabled+label:after,.checkbox-primary.disabled>label:after,.radio-primary input:disabled+label:after,.radio-primary.disabled>label:after{background-color:#e5e5e5!important;border-color:#bbb!important}.checkbox-primary input:disabled:checked+label:after,.checkbox-primary.checked.disabled>label:after,.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:#bbb!important}.radio-primary>label:after{border-radius:50%}.radio-primary>label:before{top:7px;left:6px;width:6px;height:6px;content:' ';border:none;border-radius:50%}.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:transparent;border-color:#00da88;border-width:2px}.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{background-color:#00da88}.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:transparent;border-color:#bbb}.radio-primary input:disabled:checked+label:before,.radio-primary.checked.disabled>label:before{background-color:#bbb}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li>a{position:relative;border:none!important;border-radius:2px!important}.nav-tabs>li.active>a{font-weight:700;color:#3c4353!important}.nav-tabs>li.active>a:before{position:absolute;right:0;bottom:-1px;left:0;display:block;height:2px;content:' ';background:#0c64eb}.nav-tabs-primary>li.active>a{color:#0c64eb!important}.panel{position:relative;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.panel-body{padding:20px}.panel-body.has-table{padding:10px}.panel-body.has-table .table{margin-bottom:0;table-layout:fixed}.panel-heading{padding:12px 48px 12px 20px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading+.panel-body{padding-top:0}.panel-title{font-size:14px;font-weight:700;line-height:20px}.panel-title .label{top:-1px}.panel-actions{position:absolute;top:0;right:0;padding:7px 8px}.panel:hover .panel-actions{z-index:10}.panel-actions>li>a{display:inline-block;min-width:30px;padding:0 5px;line-height:30px;color:#a6aab8;text-align:center;border-radius:4px}.panel-actions>li>a:hover{color:#3c495c;text-decoration:initial;background-color:#f1f1f1}.panel-actions .btn-icon{color:#a6aab8}.panel-actions .btn.text-primary{color:#0c64eb}.panel .empty-tip{padding:30px 10px 50px;font-size:14px;color:#838a9d;text-align:center}.progress-text-left{position:relative;margin:7px 0;margin-left:35px;overflow:visible}.progress-text-left .progress-text{position:absolute;top:-7px;left:-35px;display:block;width:35px;height:20px;padding-right:5px;line-height:20px;color:#838a9d;text-align:right}.chart-color{width:20px}.chart-color-dot{display:inline-block;width:10px;height:10px;border-radius:50%}.chart-row{margin-top:10px}.chart-row+.chart-row{padding-top:10px;border-top:1px solid #eee}.chart-wrapper{padding:10px 5px;background:#eee}.chart-wrapper>h4{margin:5px 0 10px}.table-wrapper{max-height:250px;overflow:auto}.table-wrapper .table{margin:0}.progress-pie{position:relative}.progress-pie canvas{display:block}.progress-pie .progress-info{position:absolute;top:0;left:0;width:100%;height:100%;padding-top:25px;text-align:center}.progress-pie .progress-info>small{display:block;line-height:14px;color:#a6aab8}.progress-pie .progress-info>strong{display:block;font-size:36px;line-height:40px}.progress-pie .progress-info>strong>small{font-size:20px}.progress-pie-120 .progress-info{padding-top:30px}.progress-pie-120 .progress-info>small{line-height:18px}.progress-pie-50 .progress-info{padding-top:4px}.progress-pie-50 .progress-info>strong{font-size:20px;font-weight:400}.progress-pie-50 .progress-info>strong>small{font-size:14px}.progress-pie[data-value="100"] .progress-info>strong{-webkit-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);transform:scale(.7)}.progress-pie-24 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:24px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-24[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.progress-pie-26 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:26px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-26[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.status-bars{display:table;width:100%;height:140px;padding:5px;padding-top:50px;margin:0;overflow:hidden}.status-bars>li{position:relative;display:table-cell;text-align:center;vertical-align:bottom}.status-bars .bar{position:absolute;bottom:20px;left:50%;display:block;width:10px;margin-left:-5px;background:#0c64eb;border-radius:5px 5px 0 0}.status-bars .bar:after{position:absolute;right:-50px;bottom:0;left:-50px;display:block;height:1px;content:' ';background:#eee}.status-bars .title{font-size:12px;font-weight:400;color:#a6a8b6}.status-bars .value{position:relative;top:-20px;left:-20px;display:inline-block;width:50px;font-size:16px;font-weight:700;text-align:center}.status-bars-h{display:block;padding-right:50px;padding-left:60px;list-style:none}.status-bars-h>li{position:relative;height:40px;border-left:1px solid #eee}.status-bars-h .bar{position:relative;top:15px;display:block;height:10px;line-height:20px;background:#0c64eb;border-radius:0 5px 5px 0}.status-bars-h .title{position:absolute;top:-5px;left:-60px;width:60px;padding-right:10px;font-size:12px;color:#a6a8b6;text-align:right}.status-bars-h .value{position:absolute;top:-5px;right:-50px;display:block;width:40px;font-size:14px;font-weight:700;text-align:left;white-space:nowrap}.ring,[class*=" ring-"],[class^=ring-]{width:24px;height:24px;font-size:12px;line-height:24px;text-align:center;background-image:url(data:image/png;base64,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);background-position:0 0;-webkit-background-size:1224px 24px;background-size:1224px 24px}.ring>span,[class*=" ring-"]>span,[class^=ring-]>span{display:inline-block;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.messager{border-radius:4px;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1)}.messager-icon{vertical-align:middle}.messager-icon>.icon{font-size:24px}.messager-content{padding:18px 20px;font-size:18px;line-height:30px}.messager-content>.icon{font-size:28px;line-height:30px}.messager-actions{vertical-align:middle}.messagger-zt{color:#3c4353;background-color:#fff!important}.messagger-zt .messager-icon>.icon{color:#0c64eb}.messagger-zt .messager-actions>.action{color:#838a9d}.messagger-zt.messager-success .messager-icon>.icon{color:#00da88}.messagger-zt.messager-danger .messager-icon>.icon{color:#ff5d5d}.messagger-zt.messager-warning .messager-icon>.icon{color:#ff9800}.messagger-zt.messager-info .messager-icon>.icon{color:#2196f3}.tree{padding-left:0;overflow:hidden}.tree ul{position:relative;display:none;padding-left:0}.tree li{position:relative;padding:2px 0 2px 15px;list-style:none}.tree li.heading{padding-left:5px;color:#3c495c}.tree li>a{display:block;max-width:90%;padding:2px 6px;color:#3c495c;word-break:break-all}.tree li>a:hover{color:#3c4353}.tree li>a.tree-toggle:hover{background:0 0}.tree li.active>a{position:relative;font-weight:700;color:#0c64eb}.tree li>.list-toggle{position:absolute;top:1px;left:1px;z-index:10;width:20px;font-size:14px;line-height:22px;color:#cbd0db;text-align:center;cursor:pointer;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tree li>.list-toggle:before{content:"\f0da"}.tree li>.list-toggle:active,.tree li>.list-toggle:hover{color:#0c64eb}.tree li.has-active-item>.list-toggle{color:#3c4353}.tree li.has-list.open>ul{display:block}.tree li.has-list.open>.list-toggle{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.tree li.has-list.open:before{position:absolute;top:16px;bottom:-5px;left:10px;display:block;content:' ';border-left:1px solid #d8d8d8}.tree-actions{display:inline-block;margin-left:5px;vertical-align:middle}.tree-actions a{display:inline-block;margin-left:5px;font-size:13px;opacity:.6}.tree-actions a:hover{opacity:1}.tree li>.module-name{color:#3c495c;vertical-align:middle}.tree li>.module-name:hover{background-color:#f0f2f5}.tree li>.module-name:hover>a{color:#3c4353}.treemap-node-fold-icon:before{position:relative;left:-4px;min-width:18px}.dropdown-menu{padding:5px 0;border-color:rgba(0,0,0,.1)}.dropdown-menu>li{padding:0 10px}.dropdown-menu>li>a{padding:2px 10px;margin:5px 0;border-radius:3px}.dropdown-menu>li>a>.icon{position:relative;left:-5px;opacity:.5}.dropdown-menu>li>a:hover>.icon{opacity:.8}.dropdown-menu>li.active>a,.dropdown-menu>li.selected>a{position:relative;color:#fff;background-color:#16a8f8}.dropdown-menu>li.selected>a:after{position:absolute;top:2px;right:4px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:20px;text-transform:none;content:"\e5ca";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>li.divider{margin:10px}.dropdown-submenu>a:after{margin-right:-5px}.dropdown-submenu>.dropdown-menu.pull-left{margin-left:-1px}.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#3c4353;background-color:#e9f2fb}.dropdown-submenu:hover>a:after{border-left-color:#0c64eb}.dropdown-submenu>a:hover:after{border-left-color:#fff}.pager .btn{padding:3px 10px}.pager .btn .caret{opacity:.7}.pager>li>.pager-label{padding:2px;line-height:20px}.pager>li>.pager-item{min-width:20px;padding:1px;margin:2px 0;font-size:16px;line-height:20px;text-align:center;background:0 0;border-color:transparent}.pager>li>.pager-item:hover{background-color:rgba(0,0,0,.1)}.pager>li>.pager-item>.icon{position:relative;top:-1px}.pager>li>.btn:hover,.pager>li>a:hover{background:rgba(0,0,0,.1)}.pager>li.disabled>a.pager-item{background:0 0;border-color:transparent;opacity:.5}.pager>li.active>a{background-color:#16a8f8}.pager>li .btn-group .btn{padding:1px;margin:1px 0;border-radius:4px}.pager .dropdown-menu{width:200px}.pager .dropdown-menu>li{float:left;width:33.333333%}.modal-dialog{width:900px;max-width:1360px;border:none;border-radius:0;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,.25);box-shadow:0 0 20px 0 rgba(0,0,0,.25)}.modal-dialog.modal-md{width:700px}.modal-dialog.modal-xs{width:400px}.modal-dialog.modal-sm{width:500px}.modal-dialog.modal-lg{width:1200px}.modal-dialog.modal-fullscreen{position:fixed;max-width:initial}.modal-header{padding:20px 0;margin:0 20px}.modal-header>.close{color:#838a9d;text-shadow:0 1px 0 rgba(255,255,255,.85);opacity:1}.modal-header>.close:hover{color:#222}.modal-footer{padding:20px 0;margin:0 20px}.modal-title{font-size:14px;font-weight:400;line-height:20px}.modal-actions{position:absolute;top:16px;right:16px}.modal-actions .divider{position:relative;top:5px;display:inline-block;width:0;height:20px;margin:0 10px;border-left:#eee 1px solid}.modal-actions>.dropdown{display:inline-block}.modal-body{padding:20px}.modal-iframe .modal-body>iframe{border-radius:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-3%);-ms-transform:translate(0,-3%);-o-transform:translate(0,-3%);transform:translate(0,-3%)}.modal.fade.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-simple .modal-footer{padding-top:0;border-top:none}.modal-iframe .modal-header{position:relative;z-index:10;min-height:0;padding:0;border:none}.modal-iframe .modal-title{display:none}.modal-iframe .modal-header .close{position:absolute;top:12px;right:10px;font-size:32px;font-weight:200}.modal-iframe .modal-dialog{overflow:hidden}.modal-inverse .modal-header>.close{color:rgba(255,255,255,.7);text-shadow:none}.modal-inverse .modal-header>.close:hover{color:#fff}.modal-scroll-inside>.modal-dialog{max-height:100%}.hide-modal-close .modal-iframe .modal-header .close{display:none}.tile{text-align:center}.tile-title{line-height:20px;color:#3c495c}.tile-amount{font-size:32px;font-weight:700;line-height:56px}.timeline>li{position:relative;list-style:none}.timeline>li:before,.timeline>li>a:after,.timeline>li>div:after{position:absolute;left:-20px;display:block;width:15px;height:15px;content:' ';border-radius:50%}.timeline>li:before{top:12px;left:-16px;z-index:3;width:7px;height:7px;background-color:#cbd0db;border:none;border:1px solid #cbd0db}.timeline>li>a:after,.timeline>li>div:after{top:11px;left:-17px;z-index:3;width:9px;height:9px;background-color:#0c64eb;border-radius:50%;opacity:0}.timeline>li+li:after{position:absolute;top:-12px;bottom:20px;left:-13px;z-index:1;display:block;content:' ';border-left:1px solid #eee}.timeline>li.active>a:after,.timeline>li.active>div:after{opacity:1}.timeline>li.active:before{top:8px;left:-20px;width:15px;height:15px;background-color:rgba(12,100,235,.2);border:none}.timeline>li>a,.timeline>li>div{display:block;padding:5px;line-height:20px}.timeline>li.active>a{color:#3c4353}.timeline-tag{position:absolute;top:5px;left:-115px;font-size:12px}.timeline-tag-left{padding-left:115px}.timeline-sm{font-size:12px}.timeline-sm>li:before,.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:10px;left:-20px;width:11px;height:11px}.timeline-sm>li.active:before,.timeline-sm>li:before{top:10px;left:-18px;width:11px;height:11px;background:0 0;border:1px solid #eee}.timeline-sm>li>a,.timeline-sm>li>div{line-height:20px}.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:13px;left:-15px;width:5px;height:5px}.form-control{-webkit-box-shadow:none;box-shadow:none}.form-horizontal .form-group>label{padding-right:0}.form-actions{margin-top:20px;margin-bottom:0}.form-actions .btn{margin-right:10px}form label{font-weight:400;color:#3c495c}.form-group .btn+.btn{margin-left:5px}.table-form{margin-bottom:0;table-layout:fixed}.table-form>thead>tr>th.required:after{position:relative;top:3px;right:auto;left:4px;display:inline-block;vertical-align:middle}.table-form>tbody>tr>td,.table-form>tbody>tr>th,.table-form>tfoot>tr>td,.table-form>thead>tr>th{padding:7px;vertical-align:middle;border-bottom:none}.table-form>tfoot>tr>td{padding:20px 7px 10px}.table-form>tbody>tr>th{width:100px;font-weight:700;text-align:right}.table-form .input-group{width:100%}.chosen-container-single .chosen-single{position:relative}.chosen-container-single .chosen-single>span{height:20px;line-height:20px;word-break:break-all;white-space:normal}.chosen-container-single .chosen-single div b{position:relative;top:1px;color:#cbd0db;opacity:1}.chosen-container-single .chosen-search:before{top:8px;right:15px}.chosen-container-multi .chosen-choices li.search-choice{font-size:13px;background:#eee;border-color:#cbd0db;-webkit-box-shadow:none;box-shadow:none}.chosen-container-single .chosen-search input[type=text]{height:30px;padding:3px 25px 3px 5px}.chosen-container-single .chosen-search{padding:3px 10px 0}.chosen-container-single .chosen-single{overflow:visible}.chosen-container .chosen-results{max-height:245px;padding:10px}.chosen-container .chosen-results>li{border-radius:4px}.chosen-container .chosen-results li.highlighted em{color:#fff}.table-responsive .chosen-container .chosen-results{max-height:200px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{top:-2px;right:-1px;bottom:-1px;left:-1px;display:none;height:auto;padding:0;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:31px;padding:5px 26px 5px 8px;font-size:inherit;line-height:20px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{right:8px}.datetimepicker{padding:10px}.datetimepicker td.day.today{background-color:#f77}.datetimepicker td.day.active{background-color:#16a8f8}.datetimepicker tfoot th,.datetimepicker thead th{color:#838a9d}.input-control .colorpicker{top:0;z-index:auto;opacity:1}.input-control .colorpicker .btn{padding:5px}.input-control .input-control-icon-right.btn{top:0}.colorpicker .dropdown-menu{min-width:232px;padding:5px 10px 10px 10px}.colorpicker .dropdown-menu>li{display:block;float:left;padding:5px}.colorpicker .dropdown-menu>li.heading{width:100%;margin-bottom:5px;font-size:16px;font-weight:700;text-align:left}.colorpicker .dropdown-menu>li.heading>.icon-close{position:relative;top:4px;float:right;cursor:pointer;opacity:.6}.colorpicker .dropdown-menu>li>a{position:relative;display:block;width:100%;height:100%;padding:0;margin:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;border:1px solid transparent;border-radius:50%;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.colorpicker .dropdown-menu>li>a:before{position:absolute;top:0;display:block;width:100%;height:20px;line-height:18px}.colorpicker .dropdown-menu>li>a:hover{-webkit-box-shadow:0 1px 4px rgba(0,0,0,.25);box-shadow:0 1px 4px rgba(0,0,0,.25)}.colorpicker .dropdown-menu>li>a.active:before{font-size:14px;content:"\e5ca"}.colorpicker .dropdown-menu>li>a.empty{color:#666;background:#fff}.colorpicker .dropdown-menu>li>a.empty:before{content:"\e90d"}.colorpicker .btn{position:relative}.colorpicker .btn .color-bar{position:absolute;right:5px;bottom:3px;left:5px;height:3px}.colorpicker .btn .color-bar[style*='background: ']+.ic{position:relative;top:-2px}.colorpicker .btn .ic{color:#cbd0db}.colorpicker .btn:hover .ic{color:#838a9d}.input-group .colorpicker{z-index:3}.input-group .chosen-container{display:table-cell}.input-group-addon{border-right-width:0;border-left-width:0}.input-group-addon:first-child{border-left-width:1px}.input-group-addon:last-child{border-right-width:1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin:0}.input-group-cell{display:table-cell;width:1%;padding:0 12px;white-space:nowrap;vertical-align:middle}.ke-container{border-color:#dcdcdc!important;border-radius:2px!important}.ke-container.focus{border-color:#0c64eb!important}.ke-toolbar{border-color:#dcdcdc!important}.required:after{top:6px;right:-10px;font-size:20px}td.required:after{top:12px;right:-5px}.input-group>.chosen-container.required:after,.input-group>.input-control.required:after{top:1px;right:1px;z-index:2}.input-group.required .required:after{display:none}.file-input{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.file-input .input-group{width:auto}.file-input .input-group>.input-group-cell:first-child{padding-right:0;padding-left:7px}.file-input input[type=file]{position:absolute;width:0;height:0;opacity:0}.file-input .file-title{display:inline-block;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.file-input .file-editbox{min-width:200px;max-width:100%}.file-input .file-size{display:inline-block;vertical-align:middle}.edit .file-input-empty,.file-input-edit,.file-input-normal,.normal .file-input-empty{display:none}.edit .file-input-edit,.normal .file-input-normal{display:block}.edit .file-input-edit.input-group,.normal .file-input-normal.input-group{display:table}.edit .file-input-normal{display:none!important}.file-input-normal>.input-group-btn{width:auto}.input-group .chosen-container-active .chosen-choices{border-color:#0c64eb!important}.input-group .chosen-container{min-width:100px}.input-group .input-group-btn .btn>.icon{line-height:17px}.os-mac select.form-control{-webkit-appearance:none;background-image:url(data:image/gif;base64,R0lGODlhCQAFAIAAAMvQ2////yH5BAEAAAEALAAAAAAJAAUAAAIKhH+BGYoNGWxgFgA7);background-image:url(data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==);background-repeat:no-repeat;background-position:right 5px top 12px;-moz-appearance:none}input::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none!important;pointer-events:none;visibility:hidden}.chosen-choices.has-error,.chosen-single.has-error,.form-control.has-error{border-color:#ff5d5d!important;-webkit-box-shadow:0 0 6px #ffc3c3!important;box-shadow:0 0 6px #ffc3c3!important}.popover-success.popover-form-result{font-weight:700;color:#fff;background:#00da88}.popover-success.popover-form-result.popover.right .arrow:after{border-right-color:#00da88}textarea.kindeditor{padding:0!important}.form-unsaved{outline:2px solid #ff9800;-webkit-box-shadow:0 1px 12px #ff9800;box-shadow:0 1px 12px #ff9800;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s}select[multiple].picker-select,select[multiple][data-toggle=picker]{max-height:32px;visibility:hidden}.picker-selection-remove:before{font-size:18px}.picker-user-option{position:relative;padding-left:40px}.picker-user-option>.avatar{position:absolute;top:5px;left:10px}.picker-user-option>.picker-option-text{display:inline-block;min-width:40px;font-weight:700}.picker-user-option>.dept-name,.picker-user-option>.role-name{display:inline-block;margin-left:10px;font-size:12px;opacity:.6}.picker-user-option>.dept-name{min-width:50px}#mainHeader{height:50px;color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb;border-bottom-color:#e9f2fb}#mainHeader>.container{min-width:1200px;padding:0}#heading{position:absolute;top:10px;left:20px}@media (min-width:1400px){#heading{left:40px}}#heading h1{float:left;max-width:250px;margin:0;overflow:hidden;font-size:20px;font-weight:400;line-height:30px;text-overflow:ellipsis;white-space:nowrap}#heading h1 a{color:inherit;text-decoration:inherit}#heading h1.long-name{position:relative;top:-5px;display:table-cell;font-size:16px;line-height:20px;word-break:break-all;white-space:normal}#heading>.btn{display:block;float:left;height:20px;padding:1px 5px;margin:0;margin:5px 0 0 10px;font-size:12px;font-weight:lighter;line-height:18px;background-color:rgba(255,255,255,.2);border:none}#heading>.btn:hover{background-color:rgba(0,0,0,.1)}#navbar{margin:0 auto;text-align:center}#navbar .nav{display:inline-block}#navbar .nav>li>a{padding:10px;line-height:30px;color:#fff;border-radius:0;opacity:.9}@media (max-width:1400px){#navbar .nav>li>a{padding:10px 8px}}#navbar .nav>li>a:focus,#navbar .nav>li>a:hover{background:rgba(0,0,0,.15);opacity:1}#navbar .nav>li.active>a{font-weight:700;background:rgba(0,0,0,.1);opacity:1}#navbar .nav>li.divider{display:block;width:2px;height:20px;margin:15px 8px;background:rgba(255,255,255,.4)}@media (max-width:1400px){#navbar .nav>li.divider{margin:15px 5px}}@media (max-width:1300px){#navbar .nav>li.divider{margin:15px 3px}}#navbar .nav>li.divider:last-child{display:none}#navbar .nav .dropdown-menu li>a{text-align:left}#toolbar{position:absolute;top:12px;right:20px;font-size:12px;color:#fff}@media (min-width:1400px){#toolbar{right:40px}}#extraNav{text-align:right}#extraNav>li{display:inline-block;float:none;text-align:left}#extraNav>li>a{display:block;padding:0;color:#fff;opacity:.75}#extraNav>li>a:hover{text-decoration:unset;background-color:rgba(0,0,0,.1);opacity:1}#extraNav>li.open>a{background-color:rgba(0,0,0,.1)}#extraNav>li+li{margin-left:10px}#showSearchGo{color:#fff;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.5)}#searchbox{position:relative;float:left;width:150px}#searchbox .input-group-btn .btn{position:relative;padding:1px 4px;font-size:12px;line-height:20px;color:#fff;background-color:rgba(255,255,255,.15);border-right:none;border-radius:2px}#searchbox .input-group-btn .btn:after{position:absolute;top:3px;right:0;bottom:3px;display:block;width:1px;content:' ';background-color:rgba(255,255,255,.15)}#searchbox .input-group-btn .btn:hover{background-color:rgba(255,255,255,.25)}#searchGo{position:absolute;top:0;right:-1px;z-index:9;min-width:24px;height:24px;padding:2px 3px;font-size:12px;line-height:20px;color:#fff;background-color:#16a8f8;border-radius:2px}#searchGo:hover{color:#fff!important;background-color:#0c64eb}#searchInput{height:24px;padding:2px 30px 2px 5px;color:#fff;text-align:left;background:rgba(255,255,255,.15);border-color:transparent;border-radius:0 12px 12px 0;-webkit-transition:background .2s,border .2s;-o-transition:background .2s,border .2s;transition:background .2s,border .2s}#searchInput:hover{background:rgba(255,255,255,.25)}#searchInput:focus{color:#333;background:#fff}#searchInput::-webkit-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::-moz-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:-ms-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:focus::-webkit-input-placeholder{color:#838a9d}#searchInput:focus::-moz-placeholder{color:#838a9d}#searchInput:focus:-ms-input-placeholder{color:#838a9d}#searchInput:focus::placeholder{color:#838a9d}#searchTypeMenu{min-width:220px}#searchTypeMenu>li{float:left;width:50%}#searchTypeMenu>li>a{margin:4px 0}#userNav .avatar{display:inline-block;vertical-align:middle}#userNav>li>a{padding:2px 6px;line-height:20px;color:#fff;opacity:.9}#userNav>li>a .user-name{max-width:100px;overflow:hidden;font-size:15px;text-overflow:ellipsis;white-space:nowrap}#userNav>li>a:hover{background-color:rgba(0,0,0,.1);opacity:1}#userNav>li>a:hover>i{opacity:1}#userNav>li>a span{vertical-align:middle}#userNav>li.open>a{background-color:rgba(0,0,0,.1)}#userNav>li.has-new-items>a{position:relative}#userNav>li.has-new-items>a:before{position:absolute;top:3px;right:-1px;display:block;width:4px;height:4px;content:' ';background-color:#ff5d5d;border-radius:50%}#userNav .dropdown-menu{min-width:150px}#userNav .dropdown-menu>li>a>.icon{position:absolute;top:10px;right:5px;display:block;width:20px;height:20px;line-height:20px;text-align:center}#userNav .user-profile-item>a{position:relative;padding-left:45px}#userNav .user-profile-item .avatar{position:absolute;top:6px;left:5px}#userNav .user-profile-name{font-size:16px}#userNav .user-profile-role{font-size:12px;color:#a9abb8}#userNav .no-role .user-profile-role{display:none}#userNav .no-role .user-profile-name{line-height:40px}#subHeader{min-height:50px;background:#fff}#subHeader>.container{padding:0 20px}@media (min-width:1400px){#subHeader>.container{padding:0 40px}}#pageNav{position:absolute;top:8px;left:0;left:20px}@media (min-width:1400px){#pageNav{left:40px}}#subNavbar{margin-top:5px;font-size:14px;text-align:center}#subNavbar .nav{display:inline-block}#subNavbar .nav>li>a{padding:8px 12px;line-height:24px;color:#3c495c}#subNavbar .nav>li>a:hover{color:#3c495c;background-color:rgba(0,0,0,.075)}#subNavbar .nav>li.active>a{font-weight:700;color:#0c64eb}#subNavbar .nav>li.divider{display:block;width:2px;height:20px;margin:9px 5px;background-color:rgba(0,0,0,.05)}#subNavbar .dropdown-menu{text-align:left}[lang=en] #subNavbar>.nav>li>a{padding-right:8px;padding-left:8px}#pageActions{position:absolute;top:9px;right:20px}@media (min-width:1400px){#pageActions{right:40px}}.cell{padding:10px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.cell+.cell{margin-top:10px}.cell>.panel{margin:0;-webkit-box-shadow:none;box-shadow:none}.cell>.panel>.panel-heading{padding:5px 5px 10px}.cell>.panel>.panel-heading .panel-actions{padding:0}.cell>.panel>.panel-body{padding:5px}.cell>.table{margin:0}#main{min-width:1200px;padding:20px 0}#main>.container{padding:0 20px}@media (min-width:1400px){#main>.container{padding:0 40px}}#header,#header+#main{min-width:1200px}#mainMenu{margin:-10px 0 8px}.main-content{padding:20px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}@media (min-width:1400px){.main-content>.center-block{max-width:1350px;padding:20px;border:1px solid #eee}.main-content>.center-block .main-header{background-color:#f1f1f1}}.main-content>h2{margin:0 0 20px}.main-content .cell{-webkit-box-shadow:none;box-shadow:none}.main-header{padding:5px 20px;border-bottom:1px solid #eee}.main-header:after,.main-header:before{display:table;content:" "}.main-header:after{clear:both}.main-header>h2{display:block;float:left;margin:0 10px 0 0;font-size:14px;line-height:34px}.main-header>h2 .label-id{margin-right:5px}.main-header>h2 small{font-size:14px;font-weight:400}.main-content .main-header{margin:-20px -20px 10px}.main-header .label{top:-1px}.main-row{display:table;width:100%;table-layout:fixed}.main-row>[class*=" col-"],.main-row>[class*="-col"],.main-row>[class^=col-]{display:table-cell;vertical-align:top}@media (max-width:720px){.main-row{display:block}.main-row>*{display:block;width:100%}.main-row .side-col{width:100%;padding:0}.main-row .main-col+.side-col,.main-row .side-col+.main-col{margin-top:10px}}.main-row.hide-side .side-col{display:none}.main-form{margin:0}@media (min-width:720px){.main-content>.center-block .main-form{padding-right:20px}}#main .side-col .tabs{padding:5px}#main .side-col .nav-tabs{margin:0 5px 5px 5px}#main .side-col .nav-tabs>li{margin:0}#main .side-col .nav-tabs>li+li{margin-left:10px}#main .side-col .nav-tabs>li>a{padding:8px 5px}#main .side-col .tab-content .tab-pane table{border:none}.main-actions .btn-toolbar{display:inline-block;padding:4px 15px;color:#fff;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);border-radius:4px}.main-actions .btn-toolbar .divider{margin-right:15px;margin-left:15px;border-color:rgba(255,255,255,.1)}.main-actions .btn-toolbar .btn{height:30px;padding-right:10px;padding-left:10px;margin-right:0;color:#fff;background-color:transparent;border:none}.main-actions .btn-toolbar .btn+.btn{margin-left:10px}.main-actions .btn-toolbar .btn:focus,.main-actions .btn-toolbar .btn:hover{background-color:rgba(255,255,255,.2)}.main-actions .btn-toolbar .btn.btn-icon{min-width:32px;padding-right:0;padding-left:0}.main-actions .btn-toolbar .btn+.btn-group{margin-right:0;margin-left:10px}#mainContent .main-col>.main-actions{padding:30px 0 0 0;text-align:center}#mainContent .main-col>.main-actions>.btn-toolbar{visibility:visible;opacity:1;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}#mainActions{position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;pointer-events:none}#mainActions .btn-toolbar{position:relative;top:-90px}#mainActions .dropdown-menu{text-align:left}#mainActions>.container{height:100%}.main-actions-holder{display:none}.main-actions-fixed .main-actions-holder{display:block}.main-actions-fixed #mainContent .main-col>.main-actions{position:fixed;bottom:10px}.main-actions-fixed.body-modal #mainContent .main-col>.main-actions{bottom:20px}#nextPage,#prevPage{position:absolute;top:50%;left:-10px;width:40px;height:60px;padding:10px 0;margin-top:-30px;line-height:40px;color:#fff;text-align:center;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.05);box-shadow:0 2px 15px 2px rgba(0,0,0,.05)}#nextPage:hover,#prevPage:hover{-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.15);box-shadow:0 2px 15px 2px rgba(0,0,0,.15)}#nextPage>i,#prevPage>i{display:block;font-size:18px;line-height:36px}#nextPage{right:-10px;left:auto}@media (max-width:1800px){#prevPage{left:-3px}#nextPage{right:-3px}}#sidebarHeader{position:relative;float:left;width:180px;height:34px;padding-right:20px;margin-right:20px;background:#fff;border-left:4px solid #0c64eb;border-radius:4px 2px 2px 4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}#sidebarHeader:after{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #fff;border-style:solid;border-width:18px 0 18px 8px}#sidebarHeader .title{padding:0 5px;overflow:hidden;font-size:14px;font-weight:700;line-height:32px;color:#0c64eb;text-align:center;text-overflow:ellipsis;white-space:nowrap}#sidebarHeader .title>a{position:absolute;top:0;right:0;width:20px;opacity:.5}#sidebarHeader .title>a:hover{opacity:1}#sidebar{position:relative;-webkit-transition:width .2s,padding .2s;-o-transition:width .2s,padding .2s;transition:width .2s,padding .2s}#sidebar>.sidebar-toggle{position:absolute;top:0;right:5px;bottom:0;width:10px;cursor:pointer;background:0 0;border-radius:5px;-webkit-transition:background-color .2s,opacity .5s;-o-transition:background-color .2s,opacity .5s;transition:background-color .2s,opacity .5s}#sidebar>.sidebar-toggle>.icon{position:absolute;top:50%;left:-1px;width:12px;height:30px;margin-top:-10px;line-height:30px;color:#fff;text-align:center;background:#79cdfb;border-radius:6px}#sidebar>.sidebar-toggle>.icon:before{position:relative;left:-1px}#sidebar>.sidebar-toggle:before{position:absolute;top:0;right:-5px;bottom:0;left:-5px;display:block;content:' '}#sidebar>.sidebar-toggle:hover{background:rgba(0,0,0,.075)}#sidebar>.cell{position:relative;left:0;width:180px;-webkit-transition:left .2s,opacity .2s;-o-transition:left .2s,opacity .2s;transition:left .2s,opacity .2s}#sidebar.no-animate>.cell{display:none;-webkit-transition:none;-o-transition:none;transition:none}.hide-sidebar #sidebar>.cell{position:absolute;left:-200px;visibility:hidden;opacity:0}.hide-sidebar #sidebar{position:relative;width:0;padding:0}.hide-sidebar #sidebar>.sidebar-toggle>.icon:before{content:"\e315"}@media (max-width:720px){#sidebar>.cell{width:100%}}#queryBox{max-height:0;padding:0;overflow:hidden;-webkit-transition:cubic-bezier(.175,.885,.32,1) .2s;-o-transition:cubic-bezier(.175,.885,.32,1) .2s;transition:cubic-bezier(.175,.885,.32,1) .2s;-webkit-transition-property:padding,max-height,margin;-o-transition-property:padding,max-height,margin;transition-property:padding,max-height,margin}#queryBox>form{visibility:hidden;-webkit-transition:visibility .2s .2s;-o-transition:visibility .2s .2s;transition:visibility .2s .2s}#queryBox.loading{height:50px}#queryBox.show{min-height:110px;max-height:300px;margin-bottom:10px;overflow:visible}#queryBox.show>form{visibility:visible}#queryBox.divider{border-bottom:1px solid #eee}#main .querybox-toggle.querybox-opened{position:relative;color:#0c64eb;background:0 0;border:none}#main .querybox-toggle.querybox-opened:before{position:absolute;bottom:-14px;left:50%;width:0;height:0;content:' ';border-color:transparent transparent #fff transparent;border-style:solid;border-width:0 10px 10px 10px}#contentNav{padding:5px;background:#fff;border-bottom:1px solid #eee}#contentNav .nav>li>a{position:relative;padding:6px 10px;color:#838a9d}#contentNav .nav>li.active>a{font-weight:700;color:#0c64eb}#contentNav .nav>li.active>a:before{position:absolute;right:10px;bottom:3px;left:10px;display:block;height:2px;content:' ';background:#0c64eb}.body-modal{padding-bottom:0}.body-modal #main,.body-modal .container{min-width:0!important}.body-modal #main{padding:0}.body-modal .main-header{position:fixed;top:0;right:20px;left:20px;z-index:100;padding:13px 48px 13px 0;margin:0;background:#fff}.body-modal #mainContent{padding-top:70px}.body-modal .main-header>h2{max-width:100%;overflow:hidden;font-size:14px;text-overflow:ellipsis;white-space:nowrap}.body-modal .cell,.body-modal .main-content{-webkit-box-shadow:none;box-shadow:none}.body-modal #mainMenu{position:fixed;top:0;right:0;left:0;z-index:100;padding:12px 60px 12px 10px;margin:0;background:#fff}.body-modal #mainMenu>.btn-toolbar.pull-left.divider{display:none}.body-modal #mainMenu>.btn-toolbar{width:100%;margin-left:20px}.body-modal #mainMenu>.btn-toolbar>.divider:first-child{display:none}.body-modal #mainMenu>.btn-toolbar .page-title{width:100%;margin-left:0}.body-modal #mainMenu>.btn-toolbar .page-title>.text{position:relative;top:-2px;display:inline-block;max-width:85%;max-width:-webkit-calc(100% - 100px);max-width:calc(100% - 100px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.body-modal #mainMenu+#mainContent.main-row{padding:60px 10px 0}.body-modal #mainMenu+#mainContent.main-row .cell{border:1px solid #efefef;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.body-modal #mainActions{top:auto}.body-modal #mainActions .btn-toolbar{top:auto;bottom:10px}.body-modal.m-bug-view,.body-modal.m-story-view,.body-modal.m-task-view,.body-modal.m-testcase-view,.body-modal.m-testtask-view,.body-modal.m-todo-view{padding-bottom:20px;border-radius:3px}#tabsNav{position:relative}#tabsNav .tab-pane>.actions{position:absolute;top:-8px;right:0}#tabsNav .tab-pane>.cell,#tabsNav .tab-pane>.main-table{padding:0;border:1px solid #cbd0db;border-top:none;border-radius:0 0 4px 4px}#tabsNav .tab-pane>.cell .detail-title{padding-left:5px}#helpContent{position:fixed;top:50px;right:0;bottom:40px;left:0;display:none;background-color:#fff}#helpContent .load-error{display:none;padding:20px}#helpContent .show-error .load-error{display:block}.text-middle td,.text-middle th{vertical-align:middle}.text-center td,.text-center th{text-align:center}.c-sm{width:40px}.c-id{width:90px}.c-id-sm{width:70px}.c-id-xs{width:55px}.c-date{width:100px}.c-num,.c-pri,.c-type{width:80px;overflow:hidden}.c-begin,.c-end,.c-time{width:65px}.c-hours{width:60px}.c-actions-1{width:50px}.c-actions-2{width:75px}.c-actions-3{width:102px}.c-actions,.c-actions-4{width:128px}.c-actions-5{width:155px}.c-actions-6{width:180px}.c-product,.c-project{width:180px}.c-plan{width:130px}.c-datetime{width:120px}.c-stage,.c-status,.c-user{width:80px}.c-side{width:200px;border-right:10px solid #efefef}.c-assign,.c-assignedTo,.c-openedBy{width:130px}.c-progress{width:155px}.c-assign,.c-assignedTo,.c-openedBy,.c-product,.c-project,.c-status,.c-url,.c-user{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:ellipsis;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;white-space:nowrap;vertical-align:middle}td.c-actions .btn-link{color:#3c495c;background:0 0}td.c-actions .btn-link:hover{color:#0c64eb;background:#e9f2fb}td.c-actions .btn.disabled,td.c-actions .btn[disabled]{pointer-events:auto}td.c-actions .more{position:absolute;top:50%;right:100%;display:none;padding-right:4px;padding-left:20px;margin-top:-15px;margin-right:-6px;white-space:nowrap;background-color:#fafafa;-webkit-transition:opacity .3s,margin .3s;-o-transition:opacity .3s,margin .3s;transition:opacity .3s,margin .3s}tr:hover td.c-actions .more{display:block}td:hover+td.c-actions>.more{margin-right:-15px;pointer-events:none;opacity:.15}tr[data-url]{cursor:pointer}.table tbody>tr>td,.table thead>tr>th{vertical-align:middle}.table tbody>tr>td.has-btn,.table thead>tr>th.has-btn{padding-top:1px;padding-bottom:1px;overflow:visible}.table tbody>tr>td .progress,.table thead>tr>th .progress{height:6px}.table .em,.table em{color:#3c4353}.table .divider{border-bottom:10px solid #efefef}.table .divider-top{border-top:10px solid #efefef}.table .btn-icon-left{max-width:100%;padding-left:20px;overflow:hidden;line-height:18px;text-align:left;text-overflow:ellipsis;background:0 0;border-color:#eaf3fc}.table .btn-icon-left>.icon{width:20px;font-size:14px;background:0 0!important;opacity:0}.table .btn-icon-left.btn-sm{height:26px;font-size:13px}.table .btn-icon-left:active,.table .btn-icon-left:focus,.table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.table .btn-icon-left:active>.icon,.table .btn-icon-left:focus>.icon,.table .btn-icon-left:hover>.icon{opacity:1}.table .btn-icon-left>.text{padding-left:25px}.table thead>tr>th.c-assign,.table thead>tr>th.c-assignedTo{padding-left:29px}.table a{vertical-align:middle}.table tbody>tr:last-child{border-bottom:none}.table caption{margin-bottom:5px;background:#f1f1f1;border:none}.is-firefox .table .btn-icon-left>.icon{line-height:22px}.main-table{border-radius:4px}.main-table>.table,.main-table>.table-footer,.main-table>.table-header,.main-table>.table-responsive{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.main-table .table{font-size:13px;table-layout:fixed;background-color:#fff;border-radius:4px 4px 0 0}.main-table .table.table-lg{font-size:14px}.main-table .table .btn-icon-left{border-color:transparent}.main-table .table .btn-icon-left>.icon{background:0 0;border-radius:4px}.main-table .table .btn-icon-left.btn-sm{height:26px}.main-table .table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.main-table .table .btn-icon-left:hover>.icon{background:#e9f2fb;border-radius:4px 0 0 4px}.main-table tbody>tr>td,.main-table thead>tr>th{min-height:36px;padding:2px 8px;line-height:30px}.main-table tbody>tr>td:first-child,.main-table thead>tr>th:first-child{padding-right:4px;padding-left:15px}.main-table thead>tr>th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #ddd}.main-table tbody>tr:nth-child(odd){background-color:#f5f5f5}.main-table tbody>tr:last-child>td{border-bottom:1px solid #ddd}.main-table tbody>tr>td{position:relative;border-bottom:none;border-bottom:1px solid #eee}.main-table tbody>tr>td .label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main-table tbody>tr>td>a{line-height:28px;color:#0c60e1}.main-table tbody>tr>td>a:not(.btn):visited{color:#082999;opacity:.9}.main-table tbody>tr>td>a:hover,.main-table tbody>tr>td>a:visited:hover{color:#0c64eb}.main-table tbody>tr>td.c-actions{padding-right:10px}.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{position:absolute;top:0;bottom:0;left:0;display:block;width:0;content:'';background:#0c64eb;opacity:0;-webkit-transition:.2s linear;-o-transition:.2s linear;transition:.2s linear;-webkit-transition-property:width,opacity,border-radius;-o-transition-property:width,opacity,border-radius;transition-property:width,opacity,border-radius}@-moz-document url-prefix(){.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{bottom:-1px}}.main-table tbody>tr>td.c-side:before{display:none}.main-table tbody>tr{-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background-color,-webkit-box-shadow;-o-transition-property:box-shadow,background-color;transition-property:background-color,-webkit-box-shadow;transition-property:box-shadow,background-color;transition-property:box-shadow,background-color,-webkit-box-shadow}.main-table tbody>tr:hover{background:#e9f2fb}.main-table .table-grouped tbody>tr:hover{background:#f2f7fd;-webkit-box-shadow:none;box-shadow:none}.main-table .table-grouped tbody>tr:hover td.c-actions .more{background:#f2f7fd}.main-table tbody>tr.checked{background:#fff3e0}.main-table tbody>tr.checked:hover{background:#ffebbc}.main-table tbody>tr.checked>td.c-side+td:before,.main-table tbody>tr.checked>td:first-child:before{width:4px;opacity:1}.main-table tbody>tr.checked.row-check-begin{border-top-left-radius:4px;border-top-right-radius:2px}.main-table tbody>tr.checked.row-check-begin>td:first-child:before{border-top-left-radius:4px}.main-table tbody>tr.checked.row-check-end{border-bottom-right-radius:2px;border-bottom-left-radius:4px}.main-table tbody>tr.checked.row-check-end>td:first-child:before{border-bottom-left-radius:4px}.main-table .checkbox-primary{display:inline-block;line-height:20px}.main-table .checkbox-primary label{margin:0}.main-table .table{margin:0}.table-header{padding:4px 0 12px}.table-header .table-statistic{color:#838a9d}.table-header .table-statistic strong{font-size:15px;color:#3c4353}.table-header .btn-toolbar{margin-top:-28px}.table-header.fixed-right{position:relative;z-index:5;padding:0}.table-header.fixed-right>.btn-toolbar{position:absolute;top:0;right:1px;z-index:1;padding:1px;margin:0;background:#fff;border-radius:4px}.table-header.fixed-right>.btn-toolbar .btn{opacity:.65}.table-header.fixed-right>.btn-toolbar .btn:hover{opacity:1}.table-header-fixed .table-header{position:fixed;top:0}.table-header-fixed .table-header>.btn-toolbar{background-color:transparent}.table-header-fixed .table-header>.btn-toolbar .btn{color:#fff}.table-footer{position:relative;min-height:40px;padding:6px 15px;background:#fff;border-radius:0 0 4px 4px}.body-modal .table-footer{margin-bottom:20px}.talbe-lg+.table-footer{padding:11px 15px}.table-footer .btn-toolbar,.table-footer .checkbox-primary{float:left}.table-footer .btn-toolbar+.btn-toolbar{margin-left:8px}.table-footer .checkbox-primary{margin:5px 20px 0 0}.table-footer .checkbox-primary.checked label:after{border-color:#00da88!important}.table-footer .btn{padding:3px 10px;line-height:20px}.table-footer .pager{position:absolute;top:0;right:0;z-index:5;height:40px;padding:6px 5px 6px 10px;margin:0;background:#fff;opacity:1;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.table-footer .pager:before{position:absolute;top:0;bottom:0;left:-50px;display:block;width:50px;content:' ';background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(#fff));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%)}.table-footer .pager .btn,.table-footer .pager>li>.pager-item,.table-footer .pager>li>.pager-label{color:#838a9d;background:0 0;border-color:transparent}.table-footer .pager .btn,.table-footer .pager>li>a{border-radius:3px}.table-footer .pager .btn:hover,.table-footer .pager>li>a:hover{background:rgba(0,0,0,.1)}.table-footer .pager>li.disabled>a.pager-item{opacity:1}.table-footer .form-control{height:28px;padding:3px 8px}.table-footer .table-statistic{position:relative;z-index:2;float:left;padding-right:30px;line-height:28px;color:#838a9d;background:#fff}.table-footer .table-statistic:hover{z-index:4}.table-footer .table-statistic:hover+.pager{z-index:2;opacity:.3}.table-footer .btn-toolbar+.table-statistic,.table-footer .btn-toolbar+.text{margin-left:10px}.table-footer .text{float:left;line-height:28px}.table-footer.fixed-footer{position:fixed;z-index:10;margin:0;background:rgba(75,75,75,.85);border-top-color:transparent}.table-footer.fixed-footer .checkbox-primary label{color:#fff}.table-footer.fixed-footer .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.table-footer.fixed-footer .table-statistic{color:#fff;background:0 0}.table-footer.fixed-footer .pager{background:#666}.table-footer.fixed-footer .pager:before{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0)),to(#666));background:-webkit-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:-o-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:linear-gradient(to right,rgba(0,0,0,0) 0,#666 100%)}.table-footer.fixed-footer .pager .btn,.table-footer.fixed-footer .pager>li>.pager-item,.table-footer.fixed-footer .pager>li>.pager-label{color:#fff}.table-footer.fixed-footer .pager .btn:hover,.table-footer.fixed-footer .pager>li>a:hover{background:rgba(255,255,255,.3)}.table-footer.fixed-footer .pager>li.disabled>a.pager-item{opacity:.5}.table-actions{display:none;height:28px}.table-actions.show-always{display:block;pointer-events:none;cursor:not-allowed}.has-row-checked .table-actions{display:block;pointer-events:auto!important;cursor:default}.table-lg tbody>tr>td{padding:9px 10px}.table-lg tbody>tr>td .btn+.btn{margin-left:5px}.table.has-sort-head thead>tr>th{padding-right:0}.table.has-sort-head thead>tr>th>a{position:relative;display:inline-block;padding-right:16px;color:#3c4353}.table.has-sort-head thead>tr>th>a:after,.table.has-sort-head thead>tr>th>a:before{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:30px;color:#3c495c;text-transform:none;content:"\f0de";opacity:.5;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.table.has-sort-head thead>tr>th>a:after{content:"\f0dd"}.table.has-sort-head thead>tr>th>a.sort-down,.table.has-sort-head thead>tr>th>a.sort-up{color:#000;text-decoration:none}.table.has-sort-head thead>tr>th>a:hover,.table.has-sort-head thead>tr>th>a:hover:after,.table.has-sort-head thead>tr>th>a:hover:before{color:#0c64eb;opacity:1}.table.has-sort-head thead>tr>th>a.sort-down:after,.table.has-sort-head thead>tr>th>a.sort-up:before{color:#000;opacity:1}.head-fixed .datatable-head-span .table,.table.fixed-header-copy{z-index:10;color:#fff;background:rgba(75,75,75,.85)}.head-fixed .datatable-head-span .table thead>tr>th,.table.fixed-header-copy thead>tr>th{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a,.table.fixed-header-copy thead>tr>th>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>a:after,.head-fixed .datatable-head-span .table thead>tr>th>a:before,.table.fixed-header-copy thead>tr>th>a:after,.table.fixed-header-copy thead>tr>th>a:before{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down:after,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up:before,.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:after,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:before,.table.fixed-header-copy thead>tr>th>a.sort-down,.table.fixed-header-copy thead>tr>th>a.sort-down:after,.table.fixed-header-copy thead>tr>th>a.sort-up,.table.fixed-header-copy thead>tr>th>a.sort-up:before,.table.fixed-header-copy thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover:after,.table.fixed-header-copy thead>tr>th>a:hover:before{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a,.table.fixed-header-copy thead>tr>th>.dropdown>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a:hover,.table.fixed-header-copy thead>tr>th>.dropdown>a:hover{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary,.table.fixed-header-copy .checkbox-primary{z-index:1}.head-fixed .datatable-head-span .table .checkbox-primary label,.table.fixed-header-copy .checkbox-primary label{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary label:after,.table.fixed-header-copy .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.head-fixed .datatable-head-span .table .checkbox-primary.checked label:after,.table.fixed-header-copy .checkbox-primary.checked label:after{border-color:#00da88!important}.table-data{margin:0;table-layout:fixed}.table-data tbody>tr>td,.table-data tbody>tr>th{padding:6px 8px;word-break:break-all;border:none}.table-data tbody>tr>th{width:70px;padding-left:0;font-weight:400;color:#838a9d;text-align:right;vertical-align:middle}.table-data tbody>tr>td{padding-right:0}.table-data tbody>tr>td>a{color:#0c60e1}.table-data tbody>tr>td>a:not(.btn):visited{color:#082999}.table-data tbody>tr>td>a:hover,.table-data tbody>tr>td>a:visited:hover{color:#0c64eb}.table-data ol,.table-data ul{margin:0}.fixed-head-table{background:rgba(0,0,0,.7);border-bottom:1px solid #ddd}.fixed-head-table thead>tr>th{color:#fff}.table-empty-tip{padding:80px 10px;text-align:center;background:#fff}.not-firefox .table-grouped>tbody>tr>td.c-side{background:#fff!important}.table-grouped .group-toggle{cursor:pointer}.table-grouped .group-toggle.group-summary{border-top:10px solid #efefef}.table-grouped tbody>tr>td:first-child,.table-grouped thead>tr>th:first-child{padding-left:8px}.group-expand-all,.table-group-collapsed .group-collapse-all{display:none}.table-group-collapsed .group-expand-all{display:inline-block}.table-auto{table-layout:auto}.datatable .table>tbody>tr.checked.hover>td,.datatable .table>tbody>tr.checked>td.col-hover{background:#ffebbc}body.has-fixed-footer{padding-bottom:60px}.table.with-footer-fixed{margin-bottom:20px}.table-nest-hide{display:none!important}th.table-nest-title{position:relative;padding-left:30px!important}.table-nest-icon{position:relative;display:inline-block;width:22px;height:22px;font-size:16px;color:#a6aab8;text-align:center;border-radius:4px}.table-nest-toggle:before{line-height:22px;content:"\e6f2"}.table-nest-toggle:hover{color:#0c64eb;background-color:rgba(0,0,0,.1)}.table-nest-child-hide .table-nest-toggle:before{font-size:16px;content:"\e6f1"}th.table-nest-title .table-nest-toggle{position:absolute!important;top:7px;left:8px}.table-nest-toggle.table-nest-toggle-global{width:22px;height:22px;padding:0!important;line-height:22px;text-align:center;border-radius:4px}.table-nest-toggle.table-nest-toggle-global:before{position:static!important;font-size:16px!important;line-height:22px!important;content:"\e6f2"!important;opacity:1!important}.table-nest-toggle.table-nest-toggle-global:after{display:none!important}.table-nest-collapsed .table-nest-toggle.table-nest-toggle-global:before{font-size:16px!important;content:"\e6f1"!important}.disable-empty-nest-row .is-nest-child .table-nest-icon:before,.disable-empty-nest-row .no-nest .table-nest-icon:before{position:relative;top:-1px;width:6px;min-width:6px;height:6px;content:' ';background-color:#cbd0db;border-radius:1px}.table-nest-child-hover>td:first-child,.table-nest-hover>td:first-child{-webkit-box-shadow:inset 3px 0 0 #cbd0db;box-shadow:inset 3px 0 0 #cbd0db}.article-content{overflow:auto}.article-content img{margin-top:0}.article-content table{margin:10px 0}.article-content table td,.article-content table th{border:1px solid #cbd0db}.article-content table th{background:#eee}.article-content a{color:#0c64eb}.article-content a:focus,.article-content a:hover{color:#16a8f8}.article-content,.article>.content{word-wrap:break-word}.detail{padding:10px 0;margin:0 10px}.detail+.detail{padding-top:25px;border-top:1px solid #eee}.detail-title{font-size:14px;font-weight:700;line-height:20px}.detail-title>.pull-right{position:relative;top:-8px}h2.detail-title{margin:0;font-size:15px;font-weight:700}h2.detail-title .label,h2.detail-title .label-id{position:relative;top:-1px}.detail-content{padding:0;margin-top:10px}.detail-content em{color:#3c4353}.detail-content .list-unstyled>li+li{margin-top:5px}.side-col .detail-content{padding-left:0}details.detail{padding:10px 0}details.detail summary{position:relative;cursor:pointer;outline:0}details.detail summary::-webkit-details-marker{display:none}details.detail summary:after{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e316";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}details.detail[open] summary:after{content:"\e313"}.files-list{padding-left:0;list-style:none}.files-list>li>a{display:block;line-height:24px}.files-list>li>a>.icon{display:inline-block;margin-right:5px;opacity:.7}.files-list>li>a:hover{color:#0c64eb}.files-list>li>.right-icon{opacity:0;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.files-list>li:hover>.right-icon{opacity:1}.histories-list{padding-left:15px;margin-bottom:0}.histories-list>li{position:relative}.histories-list>li+li{margin-top:5px}.histories-list>li strong{color:#3c4353}.histories-list .comment,.histories-list .show-form .comment-edit-form{padding:5px 5px 5px 10px;margin:5px 0 0;background-color:rgba(0,0,0,.025);border:1px solid #eee}.histories-list .btn-edit-comment{position:absolute;top:28px;right:2px}.histories-list .comment-edit-form,.histories-list .show-form .btn-edit-comment,.histories-list .show-form .comment{display:none}.histories-list .show-form .comment-edit-form{display:block;padding:10px;border:1px solid #eee}.histories .btn-mini{width:16px;min-width:16px;height:16px;overflow:hidden;line-height:16px;color:#cbd0db;vertical-align:-8%;border-radius:1px}.histories .btn-mini:focus,.histories .btn-mini:hover{color:#0c64eb;border-color:#0c64eb}.histories .show-changes .btn-expand>.icon:before{content:"\e926"}.histories .btn-strip{display:none}.histories .show-changes .btn-strip{display:inline-block}.history-changes{display:none;padding:5px;margin-bottom:-5px;margin-left:5px;font-size:12px;line-height:20px}.history-changes blockquote{padding:5px 5px 5px 10px;margin:5px 0 0;font-size:12px;background-color:rgba(0,0,0,.05);border-left:3px solid #eee}.history-changes blockquote.original{display:none}.show-changes .history-changes,.show-original .history-changes blockquote.original{display:block}.show-original .history-changes blockquote.textdiff{display:none}.syntaxhighlighter{overflow:auto}.list-group{overflow-y:auto}.list-group>a{display:block;padding:2px 10px 2px 5px;overflow:hidden;line-height:20px;text-overflow:ellipsis;white-space:nowrap;border-radius:4px}.list-group>a+a{margin-top:5px}.list-group>a>.icon{display:inline-block;margin-right:3px;opacity:.5}.list-group>a.selected{color:#e9f2fb;background-color:#0c64eb}.list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.list-group>a.active:hover,.list-group>a:hover{color:#fff;background-color:#0c64eb}.list-group>.heading{padding:2px 5px;line-height:20px;color:#838a9d}.list-group>a+.heading{margin-top:4px}.dropup .search-box-sink{padding-top:5px;padding-bottom:45px}.dropup .search-box-sink .search-box{position:absolute;right:10px;bottom:10px;left:10px;margin:0}.dropup .search-box-sink .search-box+.list-group{height:auto;max-height:171px}.search-list{min-width:200px;max-width:300px;padding:0}.search-list .search-box{float:none;width:auto;margin:10px}.search-list .search-box .icon-search{opacity:.5}.search-list .list-group{max-height:248px;padding:5px 10px;margin:5px 0}.dropup .search-list .search-box+.list-group{height:171px;padding-top:0}.search-list .search-input{height:30px}.search-list .input-control-icon-right{height:28px;line-height:28px}.search-list .list-group>a.active{color:inherit;background-color:inherit}.search-list.searchbox-focus .list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.search-list .list-group>a.active:hover,.search-list.searchbox-focus .list-group>a.active:hover{color:#fff;background-color:#0c64eb}#dropMenu{width:initial;max-width:initial}#dropMenu>.search-box{width:100%;padding:10px 10px 0;margin:0}#dropMenu>.search-box .icon-search{color:#333}#dropMenu>.search-box.has-icon-right>.form-control{padding-left:26px}#dropMenu .input-control-icon-left{top:10px;left:10px}#dropMenu .input-control-icon-right{top:11px;right:11px}#dropMenu .input-control-icon-right .icon{position:relative;top:2px}#dropMenu .list-group{max-height:initial;margin:0}#dropMenu .table-row{margin:0 -10px;table-layout:auto}#dropMenu .table-col{position:relative;width:100%;min-width:250px;max-width:450px}#dropMenu .table-col .list-group{max-height:300px;padding:0 10px 5px}#dropMenu .col-left{padding-bottom:30px}#dropMenu .col-right{display:none}#dropMenu .col-footer{position:absolute;right:0;bottom:-5px;left:0;padding:8px 10px;border-top:1px solid #eee}#dropMenu .col-footer>a{opacity:.8}#dropMenu .col-footer>a:hover{opacity:1}#dropMenu.show-right-col .table-col{width:50%}#dropMenu.show-right-col .col-right{display:table-cell;border-left:1px solid #eee}#dropMenu.show-right-col .col-right>.list-group{max-height:335px;margin:0}#dropMenu.show-right-col .col-right>.list-group>a{opacity:.7}#dropMenu.show-right-col .col-right>.list-group>a:hover{opacity:1}#dropMenu.show-right-col .toggle-right-col>.icon-angle-right:before{content:"\e314"}#dropMenu.has-search-text .list-group{overflow-x:hidden}#dropMenu.has-search-text>.search-box{width:100%!important}#dropMenu.has-search-text>.list-group>.table-row{display:block}#dropMenu.has-search-text>.list-group>.table-row>.table-col{display:block;width:100%}#dropMenu.has-search-text .col-left{padding-bottom:0}#dropMenu.has-search-text .pull-right.toggle-right-col{display:none}#dropMenu.has-search-text .col-left .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group>a{opacity:.7}#dropMenu.has-search-text .col-footer,#dropMenu.has-search-text .hide-in-search{display:none}#swapper{position:relative}#swapper #dropMenu .tree li>.selected{color:#0c64eb!important;background:#e9f2fb!important}#swapper #dropMenu .list-group>a.active:hover,#swapper #dropMenu .search-box .list-group>a.active,#swapper #dropMenu .tree li>.clickable:hover,#swapper #dropMenu.searchbox-focus .list-group>a.active:hover{color:#fff!important;background:#0c64eb!important}#swapper #dropMenu .tree{margin:0}.release-path{overflow:hidden}.release-line{display:table;width:100%;padding:0;table-layout:fixed}.release-line>li{display:table-cell;list-style:none}.release-line>li>a{position:relative;display:block}.release-line>li>a:before{position:absolute;left:0;display:block;width:13px;height:13px;content:' ';background:#fff;border:2px solid #838a9d;border-radius:50%}.release-line>li>a:after{position:absolute;left:5px;display:block;width:2px;height:30px;content:' ';background:#cbe0f6}.release-line>li>a>.icon{position:absolute;left:4px;font-size:24px}.release-line>li>a .title{display:block;font-size:14px;white-space:nowrap}.release-line>li>a .date,.release-line>li>a .info{display:block;max-height:18px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.release-line>li>a:hover:before{background-color:#e9f2fb}.release-line>li>a:hover:after{background-color:#838a9d}.release-line>li>a:hover .title{color:#0c64eb}.release-line>li>a:hover .date,.release-line>li>a:hover .info{color:#838a9d}.release-line>li:nth-child(odd){padding-top:80px;vertical-align:top}.release-line>li:nth-child(odd)>a{height:85px;padding-top:36px;border-top:5px solid #cbe0f6}.release-line>li:nth-child(odd)>a:before{top:-9px}.release-line>li:nth-child(odd)>a:after{top:6px}.release-line>li:nth-child(odd)>a>.icon{top:-26px}.release-line>li:nth-child(even){padding-bottom:80px;vertical-align:bottom}.release-line>li:nth-child(even)>a{height:85px;padding-bottom:36px;border-bottom:5px solid #cbe0f6}.release-line>li:nth-child(even)>a:before{bottom:-9px}.release-line>li:nth-child(even)>a:after{bottom:6px}.release-line>li:nth-child(even)>a>.icon{bottom:-2px}.release-line>li:last-child>a{border-color:transparent}.release-line>li.active>a:before{border-color:#0c64eb}.release-line>li+li>a>.date,.release-line>li+li>a>.info,.release-line>li+li>a>.title{position:relative;left:-36%}#footer{position:fixed;right:0;bottom:0;left:0;z-index:1010;height:40px;background:#fff;border-top:1px solid #eff1f7}#footer .breadcrumb{padding:10px 0;margin:0}#footer .breadcrumb>li{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#footer .breadcrumb>.active,#footer .breadcrumb>li>a{color:#838a9e}#footer .breadcrumb>.active>.icon,#footer .breadcrumb>li>a>.icon{display:none}#footer .breadcrumb>.active:hover,#footer .breadcrumb>li>a:hover{color:#16a8f8}#footer .breadcrumb>li+li:before{content:'>'}#footer>.container{padding:0 20px}@media (min-width:1400px){#footer>.container{padding:0 40px}}#poweredBy{position:absolute;top:4px;right:0;padding:5px 10px}#poweredBy .icon-zentao{color:#0097fd}#poweredBy a{color:#3c4353}#poweredBy a:hover{color:#0c64eb}#poweredBy a:hover .icon-zentao{color:#0c64eb}#poweredBy a.text-important{color:#bd7b46}#poweredBy a.text-important:hover{color:#ff5d5d}#poweredBy a.text-primary{color:#0c64eb}#poweredBy a.text-primary:hover{color:#16a8f8}#poweredBy #aiux{color:#cbd0dc}#noticeBox .alert{-webkit-box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px}#heading{top:0}.header-btn{position:relative;padding:8px 0}.header-btn .btn{position:relative;height:34px;padding:1px 6px;margin:0;overflow:visible;font-size:13px;font-weight:400;line-height:28px;color:#fff;background-color:transparent;border-color:transparent!important;border-right:none;-webkit-transition:none;-o-transition:none;transition:none}.header-btn .btn>.caret{margin-left:0;border-width:4px}.header-btn .btn>.text{display:inline-block;max-width:150px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.header-btn .btn:hover{-webkit-box-shadow:none;box-shadow:none}.header-btn .btn:hover,.header-btn.active .btn{color:#fff;background:rgba(0,0,0,.15)}.header-btn .btn:hover>.caret,.header-btn.active .btn>.caret{opacity:1}.header-btn+.header-btn{margin-left:10px}.header-btn+.header-btn:before{position:absolute;top:16px;left:-13px;display:block;font-family:ZentaoIcon;font-size:14px;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e315";opacity:.6;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.header-btn .dropdown-menu{margin-top:-10px}#toolbar{top:0;height:50px}#userNav>li{margin-right:0}#userNav>li>a{padding:10px 5px}#userNav>li>a>.icon{font-size:30px;filter:brightness(1.2) hue-rotate(30deg);opacity:.9;-webkit-filter:brightness(1.2) hue-rotate(30deg)}#userNav>li:hover>a{background-color:rgba(0,0,0,.1)}#userNav .dropdown-menu>li>a{position:relative;padding-left:24px}#userNav .dropdown-menu>li>a>.icon{top:1px;left:0}#userNav .dropdown-menu>li.user-profile-item>a{padding-left:45px} \ No newline at end of file diff --git a/www/theme/zui/fonts/ZentaoIcon.eot b/www/theme/zui/fonts/ZentaoIcon.eot index de24c0396a874f916f39458453a861d680cc77ac..a21820526649db47c17f7f44bd7951f261773033 100644 GIT binary patch delta 517 zcmey@%<`;-g*Aov7&%cMvw6o1H=C#Kn)6ciMgqV z)vqc6`A>k3SX+=^T*AN%lwo9?0+MH7X8tj`h;cUK{mFbx>C(3ajtcY(Ol9Oaw~Yo%rvfi%W;AE5qg& z_nRbTdc9{m#q-;IW#DE3dWC`EzOtV_jGo-~)0~lS^S+-4nVI)6C~dC$8_wi=An#xP zwgQ2I9fe7S|B7xDGZbqS2NYKnuPgpiB2(g0a-`I(bVuonvWW7i@<$bM6&EVCDtA@o fRXwV%0h-GQM0|`d7NH@IMBqK_M?O zH}$akRV5(52Iz>j1^LA#49q|oMn)ZwJOeZH&&frMvl;JA=3`2iz9n!(pidx2AV|PV zKtX_$|3Ck2{^k76Kpl*eCo&mrKE(9;I^)#I>u$|tHx?FGG&NSA?037A-B`5d-_r%! zlTY1lW@OmxcV{m1X72~}k}?xNf9;FsxB1Gz4Rj$8+!r|90i!2B`)SU|yIJnnLFUbm z|AsNypUZE{e^Ag-XjFKvXhqS5q94Ty#U90V#Yc+Yl!%l}DP=3|DBV$}QLa_KsY0(} aLB+4it}45#P1QaOj6m=3ZmnT_#RvdM$b;|z diff --git a/www/theme/zui/fonts/ZentaoIcon.svg b/www/theme/zui/fonts/ZentaoIcon.svg index c6d686bdbd..330852886d 100644 --- a/www/theme/zui/fonts/ZentaoIcon.svg +++ b/www/theme/zui/fonts/ZentaoIcon.svg @@ -239,10 +239,11 @@ - - + + + diff --git a/www/theme/zui/fonts/ZentaoIcon.ttf b/www/theme/zui/fonts/ZentaoIcon.ttf index f4a06284f6eae61bf7a55fc19f7d1d83170bd4bf..563822fd631500b5c514ec058ddf173bfc6dd38b 100644 GIT binary patch delta 518 zcmX@p#ImKCrJjM2fq{XWp@D&!!N5OQ--v%M?9atvd-^lgEo0{sHH0>J{_0*V4$ z0u20j_*d||05vd9e#mIBnUCr1b;c=^|J zlcY?q_iU$lew(ih+$=z!FfiO#_S1*aldt?RXXM+=^Yb7x^BxAJ&1e3EGx;9K``}DK#tIQTn1RqCBenQAJ$Eg-Wf;T~&Ei fkE&~c<^p4xk&p2O124!91}0#52yd?cf0hvdC+ekS delta 402 zcmdne%yOoQrJjM2fq{XWp@D&!!N5OQ--v%M?`5FK9w1Ig&P^Mc&ODa@+9ey(~{N!O^U@^(bPj*c7@$6z@VEF3*G(;vhv7&%cn(-9_!~Ynd28F!D z+|&U7$T# z;&wA5!{#}+=Q3}edB0v#X5#0seewJ@Um3W8?gN7R0*5jxvpMt@2G3dKC*Q XepPl=*;Q?-_5p=I(4<%zJPFa zsjz5zVlhyRDF(>rfMS94oXRwySPBEfw;v$fRhS~4k(vnP{{*Qs17S5s&1V@vL7>22cV&HAbiBT%_ujqq5$YR0iZ?& z5N4ENe3h4&n+g;&06KCl2p?9zs#K6)TmtmT1DHAnW+021`Nw1)#@USbC$C^km%c4< zRG?oVS0GrxTR>5OOMrp@4*v>%7obW;px<>SJ20_tj%9jvopH)!k6Sa@g~b(3jn&O3 zzqnP(?ospa=>l!7$tky+8C5sGxILFSmW4s-zdLg)(>?}H27U%%263QEL=^=U1&x82 zRoq;hQC(P6(UcX48Tb5K#kAVx&soL?37-xA-J8hs?>*zae@aaIT>c6&{``BGxqM+F zP~z^ye-~X`I$T{DHaFdGl9cK7p6wLRZ}XLbn+50@28R2}e)=$avcgYuM!wAvKMyi9 z?_p5dEb%v-$@xIuzx-_l0tGt?lM4S8-6&=#)+i1rt|(qt{G~*u#HHj&saffc(ideB i-W+R9yo!7nml1Ca(MciV*;=5~eBu delta 466 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 - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/www/theme/zui/fonts/zentaoicon.ttf b/www/theme/zui/fonts/zentaoicon.ttf deleted file mode 100644 index c069674527e4a611e6026f47bec4e10dc9a7b77d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65868 zcmeFad38+BcY3PmKSGs|w12hbxKo6o0 zpsd|4h%)1-11+s1<3d~*6+zpjaYxj&I0FsnFe=OsM|8Sw-tTj6RXXXW(eeGw`^Wp4 zO6t_P=bn3(=RD^*&vwq0m?TLS=_W~*y3b#o?Qz_1`yo;u#drIz{X4GQbcM$*Ni2lx zSNHC?`bzvdC5huJ8TVfP<~=%PB8}??N&3%wFS&Tf?o=qcMv`88825WGL4ws~YQps| zahllENxH)2SM1ucqVi6iBvs2OBeZ|Vbyu<=`!`9N-HiM#Q#~z8o+nt;KP@6cwb3_(d)luoa)l(F^b@4_pcOjFjkK0$*F5Kc{#(!g z==q<&@E0&d!R`=^2lB z=EMuHh-akQGq;Fmo~}K!>6ORCGi>&`@WY}1Xc}$mZOS%=8ou2S47i*>b3Wm`(|Nh` zLg$3D#c6WPI%XUXI>yo7`TY?U{uu$27+U9;_bivBQoktbba`)_#-#(Zcgi>Ozm?2{ zElf$5dV89g->aBdfW?dQ%@;gyfi-2l#A-eDGW*p7YTyC(8j@_by|$!H9b*6Xfa-sM z#^VL)3b~1Wi^iA*N&ypNtv~t6BJ~CJ1@^6{pI)TC$Qscn##R9b9_Ia&FG-as{NZu+ zITjxO+4wjM(Jys}TUFtUfpX)1To9^`yu*zusipgbuLQMXZT6E&9n7 zi&&%j;-aUud{@rCB;Ul|^usgO<=Uhm6qqx4j-ua3cNH+k|*zq zyO;pUzi-&UTSwI2G0Vtt-dg8%el})ebg0o>2V_vX6SCf zm-8Bw4D*R@r-vB;kuK&6y`@1$0LjT0Hpb(P)y)+0k5)JHkE;J@b+M1(>$J!pb6Xc& z@T17PN#y;9#`sWm6aR-Phm}9%u*wz}d&ug>Gq~V*=pn0%#$rL6K}XKnX05eoEcGUh zwxNZu)41ccmZ=A{7C!$vO;W$DwMT0Rjf-S7{+xG9R>>uGN|Vz0(i-U^X|J?Tx*8Z9 zcgb-XCq#(_1X0;vQKEv@yEjit^=^Pi+1~<>D`Y`C`43?NI;j)XMfmvgB|& z9i?QV9r0c#KD~(d_w-EoeLnw0Pf!2+INMaIB$+||qxj0H-rm&W9Xl33`rFdi_y%na%N=>%4Cle*Ap_E9rwmCCGCVUNCuh`xhRos8<5K80UA+u9dIFoHI#jDGR8& z(B+uH=ZcmBfJdngK5Z6;nP0#!%otEN4{`Em7rSQb)~a`_-QJr{_q0YLtv%^< zuidWxGS&BJUuu{&tiS&H_3AIXw{~@H{bg^idu1?ai-z0U!cki=w6eRq_m}D~dsC@i z(6YU=?~vcm-zx0_&UK5*FmUM<21+r|pFcoN!0@G0;;K89PT>lv_!BwAn5I*x1}VLW zlzLNml5ir|tsz6ND46cbd#o0}L2q+i+LO*?w)FHAI_(Z?Akf@>O}g1pa1VMKo$+-> zr75^Nn~e^6y@^uqhR*)JD|6iuKeO91qo(LYEEXQmMj{DCVJwr+U%aQ51-?J$gtXPcE*kmM<&)?YBXEDcO+p}4_XVVnuku)39NpeUEN`Ea$`UN9Q?b-_?rGyS8q*Y+n47J2TW7k6%$@?Zk3=S8QKO|23~suoJ=0=#>a(M5 ztsQ#3(V6YKdSD>s*Be5ySpRs?w!AqY8yl|*#mr%EBC$4;iMGmeBoMH<68TiRwe0l* zMWwZ~G5M(6Aaw)!1hW!|hK7L=rVyL}ECMhv5OEC+6^#m&xPHgVl~dt})6thobs4;! z&gRHuds~_rjhSSsPc}5m9#4nI%_7ZLty;D7899}_YJ73IJTiJ!Pfyx(uzh@ZXh%zn zC06Rap*+@W+@EQ0Yu#8ZjE|3wY!3o2BqQ)63H(S(F)1Z2l5UaSFFhcAS$YaH-G_CC z=p3y=g@|3%C};0}<*hiM$6CwyK(N$`N)2NI5302fvfloc=f@_u>%rJxPKw7JKT zN2||}N|y*R36Ld`Io(TDDtzW<#cWop%N46tx#>ixvo$1N7i#Scolrl>-0E+5*<(HR zJ*&rKmAkE;14bj}uq)*;d(1|sqPR?EpE(?sW!a?H`y9@oRWUG!-I4G(n(g)$m&IpR zOa{HR!R8EG)kov!c@lP;jdCPCiKwm7VluWgC)97bT%5byu54pNr_ULYJuiD&h z+iy%jyokwSW}I__uFYVQb+XT=w*YlzoyBPI+KhgSD{Qh@7}FbC%_f9;r^#qH7##-O zwO!6)47J8Qo}>+pe$O?`Xfg(Dq0rC##bBf_;Po-)^Z1LQuom}vf5u#n{nu#il#UK8M4ve)(>LO9${9Wdpz4AnO@t z{F8o%3VQ1BYwM!czgPd#{t=%++LjGfOnLw>PUN zn%mia^#n_BsdH?sQ$5sKuJ{~miiT4K)GFmpHloX}5F${c;gj&PU2~UJ3jaod(x}U-TWg2`Z_GQ1p&SWRE}02vmg2+I>dDO5-c; z&S))8IDI~+=zmglpL&rHm?^@lhM#`+ABqwTC`!3Yy~-6B>+Brk3BuQVWjPe6-T*>` zVjMm`RRt`xIH7gz>nD`fzK5w6wbvT5hjR{V(9u~AIQdU$6sF2uon@2T9M0KUiLijM z0Yw29_#7@Qk~UyTdwot>P*?B?)LUTonfx`$ETF?;R>$@D0d=miXkvEv^p+TxcCKIl z)+9b}UB7;(7FP_qCWqar(;J#w_E#oWub!yvZ)w)ztt;a8kilTJw{Og{ADU&0HDXqG zKW>Sb&D{Eo-mVyJI`&zRqSRa0t>3w89m-CnQ1-fA;r^h*sgs)=f$qjN6_kk2{z_%d z>Pls*xy9koTkZCc-sOIWR+bui5T#q1&0o^%(K9err(t4~E(A<8R3HKeOk%x|D`Pd5 z@^vK&aobyCrCt|aC7#6a0Ubb%9=BL55lb}Klr){-QDZc z>8RO^vO>}5L|bcS?d0SY(Uz9z6_b-|Gi_~?(HJSOFn8*7!6`+h(gK>GA%96D2X#Up zk9vUdSgdK3LG&EVPO@ros!qOX;tRU1QG;sYgidEk*uTT|+^n~M2czh2rX_wyHzqeWh&x zIv}+9$7Z*3mw@iAP>`L*os?9pw~Qzb8n$4O6mnLLWV({XZpRb`mIlpZfFFBFjIEER zF9A=R;sj6mVhatnrTRyU#T>D40|AgILmhJLC2E%H(*W8bx}hrcV`hJ(afSw{#uqk7 zVQC1m^+v*Su|U@;n}8!x_F^DkjQjN9(LCVpKub#=v7RY1#v1fK4Jo#yudVbo5~wVg zF)migL{3C9Oc2CV6Vx%5sGK;Vs*V6_VL%q6!-q(~;qbB+d9^Ax9{3Y$sMj3y_KjeSP=d+4|us-$FQxr3sty=O^Ws61qK22T=>%t9nE7GmNr)IO3 zm&k+F=XwFqA-{7o$v*3UqOp zc@|!l0)UhT1AqjO#iKRArfaw+7Eqv!#s`8u)K+FZ=zt~@(A8i~U=+aSzth`{icLQ& z0hOE0FC2M6z<^0+^9l8WMy`RJk6_;0XoqbbTm>@@5Wq&k5`%+@>WM%&9C#@cnFi}LJvB9OL{1)2Gdy_2(vdth zlgyZpDCq|FR6|->8_86s!B3EoF= zOho-pCkuh#^d-2Zn$#&&n~LD0=AO+k;+f|-i!{(~UOj_AM4<=OgjKN7#8LzCG@%>H zIdF_L@cUM**hhc`_c#MKilSIn1ch|?%Uua=+&RS4+Pwj1Fu1I}y{oIeeOWN*9MHI_ za#xyhE$@WOHPqVL+1c7UW+?x+GTY+qXiCb(PiWa;G3Jg4NSvo#iQF+$v_b z36BtRAa`plnzPyMHptYiC_|)n5pO1#yQx{JtF?8|<#xLUTU)yzZ7K8CWS`U|wPIaf zBCW>CQe)P&1rH+u%3X{?b?1ueHRiNN!j+m}R$GG7n&4j(PSV8N*ZE_^lq~r0Q{cnf zo8`o*6ZB>KnMO8efV#wK%w0_jjHdv7tH)(26FDWAb7IUZhYp>nPV>qm7zku?_=QwQ zQR09EK^MzEQZ!tf0=~~cSDuzefooV+pmi|B0j*R~sLFGCT1SN{LMS4Tn2IYkW?bXK zv)V)eNMs@SRi^|$aY&o$8oMDxutR=_9b&I0j?F;C+%Hz!!$Rt)?x*H)Fx7`>6xC^m z-(%A=F-&4!Bxh$J1K%yAC)idP*dGqS11}vcPm0G8ESFi}ZJj^z^f4cF7`1gX%i_TI zxfQgCRTV3YKOhJ4r98fDA9&vb7qgPlt|!LyB8B1CZe*p457?~+L&$!UVwP{>3^o^^ zUHv+GV%=k{N1GVqH_2w@Ch*XIaKGk0i7&qa7unYoy}@BzvIKeoz4BTX<=8FyBDW~& zF{U%=W+l7FV?S_!LM9=Bv3|wEi+YP)-S!ARwZ2cG?=z5(^N=4UAq}|*v1kNntU!}M zkD{-WhGBt7=8EDUvLpBLYi~ZJN{3Egfp0jZiGw1XArTRx;~^6G*c5RTXI?kA z17WAsL-Zy3DOKb{;OJ%G(;!AlDi!m-yesd6st!Yi5h7VGPV5hjL zHLf-wazSH3VnC%*nJ|aVwwTS)8OZbl`vW!v4b};EcxAD%(;-(Xvc0RZxN@c=9PUU( zn>+9bOEx-<%+Sza=*~UyrG{|0@t+YkH#~Z1WUa;Xuv*D@8rF>POf->7CXzA0S~qY0 zd%;nzt@D)gU`+-JOch}}5^E{~L5OKRpn*V;PuBa0=_3UC+OkcZA?X-W`03d%@29yB zNzpH6Cnk!+C&bIcnE#jp4!@9VE0jJ#^8{p(2BkjnPt9=2=RoE&3cw@+r4Uq6i-Bz= zo_S(+LWV2{+g~TJN$%;+=`n*wS<(WD0;(e7Ir9Th7uLiKO~H~*cE@sTF<2}m2O09x z>T4@6mKz-or~C!(wL-?=`%Dg5)+z58)#((2$6Wma;}5GpyW$?R$9Uxx>LE3OymFIW zp0YXF+qunb@)+;>0s@GEFsCbmFFJvC*}xfffJYpa&XYEyg*8}esE`yAAu*1`yw~`6 z!RiQ(k?gr?C`aaL#pId{BAB88_(Eh_BG{Nm!4;?-X7dM$JNTi+ z@&R=z`_Luo_Dke#eup+T4*zFy(`>#3A(%?y{IzEi(hRS%WA?NT3~2?y3H9*23wAA@#B+j;d(L7>6FZ0BS}I^+5U}_?@TCjd z_EpkW=`!g}3+JmKjSFPKdHj(^IoW*W3A8E<`V=BZSX*dbgSz?_T&2Zirzx&w5Obd5 zq=ds-Mw1XKxVhzw=B&2X$=@ZN%J1Hc&?H;lZ4H}Q+{`W2945KoV@c;WKc1wSTUSES zFF!;}t9pWPg=tzX!5wH^uqMWC!otEN(GL!1 zl!zc!;=0whoyFxmU{(Y<KnFkuq&lmdj!^PfJfj~!l&#Pe6O*5T~GVv1AV#Ngx}Bn{__fj zf&RU%xogKhyk?F32n&X`jEpQj@0NV_y78vQo{@9d>D{Es#_YtTslLE5{2L+x-$ogGgJ|pkSeSbSmscwdqOT$4v4dqZx@l#U~)s;W@L+^H2U_E-3q_%693v^RH@?$xx#pFuh z(ra48+L|#%w5z`Q63@-QC&)~7TKt^BQlEm#`&L24aGz)~;R~Ci!!7mo39^7#>+{i? z>awN@k4Iga{;{Sxq}AQ8alz_TU8hL18~15m3;vfKny)uXK~FFW?h1B;8bK!wAaQ?l zs~jo^8#sq{dS5=RUpRQg84Gi1~>k(3fBugDdM z3&SUPNg>H9aYeBHN-~fZ5t$)9%S!rmKtw!OI}(XKWsz6$$hk__3st|h9Y8-N1t z657_ZTv4BrL7LrWgz8gPEBNMT8$6zdXALd||5hs-WEoix+bhR?+_l-BRb8Gyz{7s~ ztU*x>ND}oPL%j#6UZJZa;g682rg8@k=CwL8Dx|2FD{~bgf?6`DU$%&UMP?bK44@|V zTTerSM|C}GvsvR-G}Rz8ChK5S%-|aJ)_u5WZbj>ro?~{&o7EqO{Qi*o<3KPNVC@uV z?IOOCW&EL#UwsN1{h<03#aSlk4+K#xY*jDGce0h>HBm=x;tJke-dtTykMqwVWGm@e z?HMkekOt%go0S?#3!a2>mLwSn%P@}n135j|OemIf=@OOKPl`H{naNI*6eAYM1=vqn zm(}I6R{uo?zs&W_$n~;L$6_nhA5c1P(bCn|YUxK@@Gb*WZRYnt_B83Y{c3&!H|n>6 zpYNaDF8?$9isDiky*b0C)C<+1rh`Ad95c;PYi>O!bb<^+P6W^oeqq(prI$wVxpe8$ zRZ9={%vi!^vw5Z+Za0*oeyy=#UH`z?*g*ffhQ|4EezIBQIDhG~OCrtP?K7aKVe?GS zK@@`$o7IDh`uo>4;s09q1neNyV64Gy7@zcK!u{ZvjQH9vRsBh$!UY zAO%>W3sAcWvH&p4tA=`9Nv|&(c&pB4%QmUsYRcMdy0-?hK5x?1GsHi{zwocN=!nau zuRiNZm`%ETUS~2VJUpUzxkjS4f2DfCK+eMDmwys`PYK#sN$&zU#6OW&0t)^G*~Eww zI%@brL@0uZB$`DnE6uHn+A1keo4l6cw+ywM-@!Z1Zy9>au*GY#DDng(eCMf06iZiX z;6Q(1d4xxn2l@{Tg!su0l1*4f-vN0=H}2hG`y5Udx4_p zQ_dylYW_>Pg$Bp|I;QZh%Pn41{;t4?|DB3n)`uLI1wEc%*VfgmZ-^%n@f%jJ-a0?d zZi?&lMoWw3o&LaWMxWVX*T>Yy+`*ummD%n@;)V-XZ$tj;6Zl+@XSc1s@P-5k4aukd z@ROTsds6tJ^`N<+FgXkbH9r@iG02H2maMlqx6mUCd?*c(-^X{wWxZl;MpMvsG{vEh ztB-k_nmo_}?LNEdS~q^X-|SP+VgIQAHlyh9zM#h)>^!^CT4&B`xA5ljqN$jEIid_` zdQKty$x+)~o_c$83uhxJhc+MC5B{4l|NI=t{qNL39%rMTV9=vJrhaffnCF9kLAw_L zSBPK*Hi zHZ}&WamuFtV!PJ3v#{i2t3`&Zke$J0nI1^OKS_N?{rEW{O|+(t+d;_gy`VL3(5AGu zz-Wt;3qLepH4?<7b2MvfLp0hzUmA9NkDjYB_eL86u~?uX%KL#I{~~5Xiw8?1^e}Po zWu8D(#n~fF|exHu{h#mU!>yHCBBHiUH}zyx?~4iQO|xd;-}31$aD1+z$Z3) z8+g};0iP)Rc!$B4ZgAqtCYyrCd`=t&H^=5Z;yWA(|;O3Ykx~E z69NAy!HO>9)Q^mSP)5L}7FL&^&V4#2ucK#9Jw)LggxC=PXE7DX9wiXXE9Z34j$hT` zagv}zmCu0+I3!DlW~XF`H}Jx5hAxk63xb%CE#V9U17wkSQ6DJfl|VeL#7pTsKcd(S ze-C$4hh{`zGirrT99FAWUA6tgAK!lc_1lmB{dPX1*MArm%Ib|IxX7>sRjNr|IW+Tu z5B%u4haP(FM`(t`S#tJ%KEpqV{Ugn2MXsjc%4zy8PY#1Y_Rbv4pHK?&nLt3D_Ll>J z0ISeX*{@FHq6~2;z&{u$2h`660{$^v`cJ(iGL8B1$marOs;h1Gqx@<9Zq(I6b=8z; zIZOl03OR>$fTlzaGlY0|)&{M`qQEH3IqH|_XEeYT;bJtPe#!6W@5aJ|^Z(n2R zc^q-dj4aeQ>2tGB$;O}AYy^4vqsRM32w>f0eu1=Btsk+ z5iG_4!!_dCe>#T}8XLjxkKJ@Qy*`^dzjet5&U6fF0=L!XGQc%3fAS@#&-X0u0O zF+qP+^;NznlT7x}R)M}`GE=>8{?+&Pi(K~@6~)M+;(3*?z@~y!vc3BL_GGH$bh*S8 z-z%=1X!Ft8WAa+aT`qw~L>A|BmO0XK%rhinH_u}tHtHASX~b}tyU*}kJ1&T(l}l>`*-rK{5Fgt6n06?sTo+O zIZS{*C*g(=vaWYbA*G~^F&Kfm6Es#JML%y@m2VnZZ&X6%xWAlCmi_T^NHMM-(cyEh zboHjCJ9jR{_iOUTQFqJ{NLYg{EkSD{;E1_LH_Dz?uea6nM)x*|$58~vfqa9sJq1bF zJBFnRY27(^f`EpWiUC^+X!k{&CR@EHH77v2K{8T}Nsh2m3D=r~puvCUhJnp++Q;62 z_Ec)9a5&Mec%q4+-}JS%_R&{0x|Wd)am=oi zU*bQOmI4k;2raY)f|!b$!b411BB5#W2ogk(h@8j;cOcvrzAUsw1x6mq_I37&X4*E? z+?-BdkWM$NUFmdcD#dO^T8BfuzmM(0Wjd{17tt~_J7LvoWmq4OAqWwgx&BXlraXq0=!y*J5B61u7qCQ!?OWq4EiM zJ%MKtA&m~*r~Q}Pu`W;Z9|}57E`)WmH%IlzhKWf|BpdUd8U}$E)Dkpa^RR-|oOPO* z<<0Cf%Z5ibH3frBn?{D0sdtb|7`wVe>Ui3WmCKdX6>qjMlR0F*KM=SdKm2>Q=Ij~ zD?kA-5zscxNrg5`Xd<^pC`l10=u}-;*LG8A<}sGjIM6p`lFm znf9UG_bCco>0Lbe+eGsr=Q6nI$ZTWbYyq8JC9Ft{ui#{pEarocZw+a2ka@%IjU)l`X1=irKEE zUN83QPLW3t@ooF~^tz$pb?b(Q)*aH^d9=sL**h`zC(-L>%$0VmRR!!#Tq|vocECUCBhtf=OCXl!bFOG0>dTWxE{eVh9gWc0 z6r--9X2?qi@_LN4uLw}V4*I%TsgNX;J^_J0*e-*`w;0#^y=2e<8sR?{hczok7qEw; zydhTXE?_%qNi04Z7Y`TqfLy1}1auOW&@^qF);g^r7G1@jUmI;uJIcmJyZTv@+1PIN zb51LpRIECaosZKh7kJV%SRu_NhKxTO$w$WmX1*)MyY#o0nY;`Gm>j9TFjM$ks4`lAg zP28)lLy+Y%w|P7^FkWoQzDD0@a&+TH1ir@07IU{&ox8DmtkF$Xy0Ix5Tcl<;V=PZV zI#4jO9%!>=myIR$*hO8^Cq<~kwh7v%z}Be`sSokr?xoAU?EUQhbFmXln#CVGiqGu@ zM5Mx#w%RYv4~BZ)hI$^sE_jI%H5GV(0TARM&F)i=&!5G6_#;Eai(yK0DKoT(${@b+ zlY&k*KmyiwYHCvhM!tC^dgd`^8hIfuN}g&7s8fNKmcTRx9ARa$SgjN%CyUd?Np@3l zGRqFptpo*d7(~bpsZ*4JCn$7J7O5SYZgL#DNk4owu=j`jO3)>8{jSYr+VFy1AOf4k zYb(%lruzajxO{#jR-icCS#r{aarq`Xc8XH~T(_0k$y1%EhC|fqsgGqlBWi))I zIlaXbcYHU}imoLKD^?UdlSOQ^GD!)x8!2A zqph#6jYW5`3tRh69p5YWO&JT(J^ihGytRKve_9Q*o7FunZGczZcA TRZH5^_|8= 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 diff --git a/www/theme/zui/fonts/zentaoicon.woff b/www/theme/zui/fonts/zentaoicon.woff deleted file mode 100644 index 1f5f6bd7c65956af1eb4f827c2fee624a66c84c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65944 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

  • 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 M=L>+R{!YLD4<7s0rvLx| From 408e6fafba01ad416081b17958eb38cb1d2bbe6d Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 18 Aug 2022 11:28:10 +0800 Subject: [PATCH 018/223] * Modify story view recall icon title. --- module/story/model.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 3e53d97509..1602419131 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -1432,7 +1432,6 @@ class storyModel extends model ->stripTags($this->config->story->editor->review['id'], $this->config->allowedTags) ->setIF(!$this->post->assignedTo, 'assignedTo', '') ->setIF($this->post->result == 'revert', 'version', $oldStory->version - 1) - ->setIF($this->post->result == 'clarify', 'status', 'draft') ->removeIF($this->post->result != 'reject', 'closedReason, duplicateStory, childStories') ->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'duplicate', 'duplicateStory') ->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'subdivided', 'childStories') @@ -4237,7 +4236,13 @@ class storyModel extends model if($type == 'view') { $menu .= $this->buildMenu('story', 'change', $params, $story, $type, 'alter', '', 'showinonlybody'); - $menu .= $this->buildMenu('story', 'recall', $params . '&from=view', $story, $type, 'undo', '', 'showinonlybody'); + + $title = $this->lang->story->recallAction; + $iframe = ($story->status == 'reviewing' and !empty($story->changedBy)) ? 'iframe' : 'showinonlybody'; + if($story->status == 'changing') $title = $this->lang->story->recallChange; + if($story->status == 'reviewing' and empty($story->changedBy)) $title = $this->lang->story->recall; + $menu .= $this->buildMenu('story', 'recall', $params . '&from=view', $story, $type, 'undo', 'hiddenwin', $iframe, true, 'data-width="40%"', $title); + $menu .= $this->buildMenu('story', 'review', $params, $story, $type, 'search', '', 'showinonlybody'); if(!isonlybody()) $menu .= $this->buildMenu('story', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=$story->module&$params", $story, $type, 'split', '', 'divideStory', true, "data-toggle='modal' data-type='iframe' data-width='95%'", $this->lang->story->subdivide); From bacc10ccc0a408f8c336939eb32ad6d5bd4b3e89 Mon Sep 17 00:00:00 2001 From: dongli Date: Thu, 18 Aug 2022 06:41:41 +0000 Subject: [PATCH 019/223] * Finish task #64969. --- framework/base/helper.class.php | 4 ++-- lib/dao/dao.class.php | 12 ++++++------ module/action/control.php | 12 +++++++++++- module/action/view/trash.html.php | 9 +++++++++ module/project/model.php | 9 +++++++++ 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/framework/base/helper.class.php b/framework/base/helper.class.php index c787cc08fe..8c98c97628 100644 --- a/framework/base/helper.class.php +++ b/framework/base/helper.class.php @@ -885,8 +885,8 @@ function getWebRoot($full = false) * * @param array|object $var * @param string|int $key - * @param mixed $valueWhenNone value when the key not exits. - * @param mixed $valueWhenExists value when the key exits. + * @param mixed $valueWhenNone value when the key not exists. + * @param mixed $valueWhenExists value when the key exists. * @access public * @return mixed */ diff --git a/lib/dao/dao.class.php b/lib/dao/dao.class.php index 0695c65d0d..f3d50e89e6 100644 --- a/lib/dao/dao.class.php +++ b/lib/dao/dao.class.php @@ -29,7 +29,7 @@ class dao extends baseDAO /** * 设置需要更新或插入的数据。 * Set the data to update or insert. - * + * * @param object $data the data object or array * @access public * @return object the dao object self. @@ -182,7 +182,7 @@ class dao extends baseDAO /** * Check workFlow field rule. - * + * * @access public * @return object the dao object self. */ @@ -232,10 +232,10 @@ class dao extends baseDAO } /** - * 检查工作流扩展字段 - * check workflow extend field - * - * @param array $fields + * 检查工作流扩展字段 + * check workflow extend field + * + * @param array $fields * @access public * @return object the dao object self */ diff --git a/module/action/control.php b/module/action/control.php index 6edd4aed0d..b4c280f25d 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -52,6 +52,8 @@ class action extends control public function trash($browseType = 'all', $type = 'all', $byQuery = false, $queryID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->loadModel('backup'); + $this->app->loadLang('execution'); + $this->app->loadLang('project'); /* Save session. */ $uri = $this->app->getURI(true); @@ -115,6 +117,15 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } + /* Get the project name of executions. */ + if($browseType == 'execution') + { + $executionIdList = array(); + foreach($trashes as $trash) $executionIdList[] = $trash->objectID; + $projectPairs = $this->loadModel('project')->getProjectName($executionIdList); + $this->view->projectPairs = $projectPairs; + } + /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; @@ -130,7 +141,6 @@ class action extends control $this->view->preferredTypeConfig = $preferredTypeConfig; $this->view->byQuery = $byQuery; $this->view->queryID = $queryID; - $this->display(); } diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 03352675bb..efeaae5ae7 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -82,6 +82,7 @@
  • + @@ -135,6 +136,14 @@ } ?> + - @@ -136,14 +135,6 @@ } ?> - +<<<<<<< Updated upstream +======= + systemMode == 'new' and $currentObjectType == 'execution'):?> + + +>>>>>>> Stashed changes @@ -135,6 +141,17 @@ } ?> +<<<<<<< Updated upstream +======= + systemMode == 'new' and $currentObjectType == 'execution'):?> + + +>>>>>>> Stashed changes + @@ -135,6 +136,14 @@ } ?> + - @@ -136,14 +135,6 @@ } ?> - +<<<<<<< Updated upstream +======= + systemMode == 'new' and $currentObjectType == 'execution'):?> + + +>>>>>>> Stashed changes @@ -135,6 +141,17 @@ } ?> +<<<<<<< Updated upstream +======= + systemMode == 'new' and $currentObjectType == 'execution'):?> + + +>>>>>>> Stashed changes -<<<<<<< Updated upstream -======= systemMode == 'new' and $currentObjectType == 'execution'):?> ->>>>>>> Stashed changes @@ -141,8 +138,6 @@ } ?> -<<<<<<< Updated upstream -======= systemMode == 'new' and $currentObjectType == 'execution'):?> ->>>>>>> Stashed changes - systemMode == 'new' and $currentObjectType == 'execution'):?> - - objectType == 'case' ? 'testcase' : $action->objectType;?> objectType == 'case' ? 'testcase' : $action->objectType;?> - @@ -48,7 +42,7 @@ printExtendFields($story, 'table');?> - - + - + - + - - + - - objectType == 'case' ? 'testcase' : $action->objectType;?> + + + + + + + objectType == 'case' ? 'testcase' : $action->objectType;?> + + + + - - - - objectType == 'case' ? 'testcase' : $action->objectType;?> - - - - + + objectType == 'case' ? 'testcase' : $action->objectType;?> + + + + "; } else if(programEnd < childEnd) { - dateTip = "

    " + endLetterChild + childInfo.maxChildEnd + "

    " + ignore + "

    "; + dateTip = "
    "; } - $('#dateBox').after(dateTip); + $('#dateBox').parent().parent().after(dateTip); + $('#dateTip').parent().css('line-height', '0'); }); } } @@ -386,7 +387,7 @@ function outOfDateTip() var end = $('#end').val(); var begin = $('#begin').val(); - if($('#dateTip').length > 0) $('#dateTip').remove(); + if($('#dateTip').length > 0) $('#dateTip').parent().parent().remove(); if(end == longTime) end = LONG_TIME; if(end.length > 0 && begin.length > 0) @@ -417,14 +418,15 @@ function outOfDateTip() if(programBegin < parentBegin) { - dateTip = "

    " + beginLetterParent + data.selectedProgramBegin + "

    " + ignore + "

    "; + dateTip = "
    "; } else if(programEnd > parentEnd) { - dateTip = "

    " + endGreaterParent + data.selectedProgramEnd + "

    " + ignore + "

    "; + dateTip = "
    "; } - $('#dateBox').after(dateTip); + $('#dateBox').parent().parent().after(dateTip); + $('#dateTip').parent().css('line-height', '0'); }); } } @@ -443,7 +445,7 @@ function budgetOverrunTips() var budget = $('#budget').val(); if(selectedProgramID == 0) { - if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').remove(); + if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').parent().parent().remove(); return false; } @@ -453,9 +455,10 @@ function budgetOverrunTips() var data = JSON.parse(data); var tip = ""; - if(budget !=0 && budget !== null && budget > data.availableBudget) var tip = "

    " + budgetOverrun + currencySymbol[data.budgetUnit] + data.availableBudget + "

    " + ignore + "

    " - if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').remove(); - $('#budgetBox').after(tip); + if(budget !=0 && budget !== null && budget > data.availableBudget) var tip = "
    " + if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').parent().parent().remove(); + $('#budgetBox').parent().parent().after(tip); + $('#beyondBudgetTip').parent().css('line-height', '0'); }); } diff --git a/module/project/js/common.js b/module/project/js/common.js index 7ce2365ef8..58b6b3252f 100644 --- a/module/project/js/common.js +++ b/module/project/js/common.js @@ -295,7 +295,7 @@ $(function() if($(this).prop('checked')) { $('#budget').val('').attr('disabled', 'disabled'); - if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').remove(); + if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').parent().parent().remove(); } else { @@ -340,7 +340,7 @@ function budgetOverrunTips() if(selectedProgramID == 0) { - if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').remove(); + if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').parent().parent().remove(); return false; } @@ -351,9 +351,10 @@ function budgetOverrunTips() if(typeof(data.availableBudget) == 'undefined') return; var tip = ""; - if(budget != 0 && budget !== null && budget > data.availableBudget) tip = "

    " + budgetOverrun + currencySymbol[data.budgetUnit] + data.availableBudget.toFixed(2) + "

    " + ignore + "

    " - if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').remove(); - $('#budgetBox').after(tip); + if(budget != 0 && budget !== null && budget > data.availableBudget) tip = "
    " + if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').parent().parent().remove(); + $('#budgetBox').parent().parent().after(tip); + $('#beyondBudgetTip').parent().css('line-height', '0'); var placeholder = ''; if(selectedProgramID) placeholder = parentBudget + currencySymbol[data.budgetUnit] + data.availableBudget.toFixed(2); @@ -374,7 +375,7 @@ function outOfDateTip(currentID = 0) if(window.ignoreTips['dateTip']) return; var end = currentID ? $('#ends\\[' + currentID + '\\]').val() : $('#end').val(); var begin = currentID ? $('#begins\\[' + currentID + '\\]').val() : $('#begin').val(); - if($('#dateTip.text-remind').length > 0) $('#dateTip').remove(); + if($('#dateTip.text-remind').length > 0) $('#dateTip').parent().parent().remove(); if(currentID) $('#dateTip\\[' + currentID + '\\]').remove(); if(end == longTime) end = LONG_TIME; @@ -396,7 +397,6 @@ function outOfDateTip(currentID = 0) var beginLetterParentTip = beginLetterParent + data.selectedProgramBegin; var endGreaterParentTip = endGreaterParent + data.selectedProgramEnd; - var dateExceedParentTip = dateExceedParent + data.selectedProgramBegin + "~" + data.selectedProgramEnd; if(projectBegin >= parentBegin && projectEnd <= parentEnd) return; @@ -416,7 +416,8 @@ function outOfDateTip(currentID = 0) } else { - $('#dateBox').after("

    " + dateTip + "

    " + ignore + "

    "); + $('#dateRange').parent().after("
    "); + $('#dateTip').parent().css('line-height', '0') } }); } From 6df526827c1049c9a8788bacdb7dae8705c001d8 Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 07:53:49 +0000 Subject: [PATCH 033/223] * Finish task #64969. --- module/action/view/trash.html.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index d84acf0a2f..33062b95bf 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -97,7 +97,8 @@ - - - - printExtendFields($story, 'table');?> From 41862bf81c7f9440d3be83ffbd6999a47f074801 Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Mon, 22 Aug 2022 02:20:05 +0000 Subject: [PATCH 035/223] * Batch edit append ignore. --- module/project/js/common.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/module/project/js/common.js b/module/project/js/common.js index 58b6b3252f..c3bdce25e0 100644 --- a/module/project/js/common.js +++ b/module/project/js/common.js @@ -403,16 +403,16 @@ function outOfDateTip(currentID = 0) var dateTip = ""; if(projectBegin < parentBegin) { - dateTip = currentID ? beginLetterParentTip + "'>" + beginLetterParentTip : beginLetterParentTip; + dateTip = currentID ? beginLetterParentTip + "'>

    " + beginLetterParentTip : beginLetterParentTip; } else if(projectEnd > parentEnd) { - dateTip = currentID ? endGreaterParentTip + "'>" + endGreaterParentTip : endGreaterParentTip; + dateTip = currentID ? endGreaterParentTip + "'>

    " + endGreaterParentTip : endGreaterParentTip; } if(currentID) { - $("#projects\\[" + currentID + "\\]").after("

    "); } else { @@ -430,11 +430,11 @@ function outOfDateTip(currentID = 0) * @access public * @return void */ -function ignoreTip(obj) +function ignoreTip(obj,currentID = 0) { var parentID = obj.parentNode.id; - $('#' + parentID).addClass('hidden'); + currentID ? $('#dateTip' + currentID).parent().parent().remove() : $('#' + parentID).parent().parent().remove(); - if(parentID == 'dateTip') window.ignoreTips['dateTip'] = true; + if(parentID == 'dateTip' || parentID == 'dateTip' + currentID) window.ignoreTips['dateTip'] = true; if(parentID == 'beyondBudgetTip') window.ignoreTips['beyondBudgetTip'] = true; } From 16ab7ec387caf5f05edc71484a9a4cdf5defd600 Mon Sep 17 00:00:00 2001 From: lanzongjun Date: Mon, 22 Aug 2022 10:29:45 +0800 Subject: [PATCH 036/223] * finish task #65930 --- .../default/images/project/active-line.png | Bin 734 -> 623 bytes .../default/images/project/default-line.png | Bin 316 -> 720 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/www/theme/default/images/project/active-line.png b/www/theme/default/images/project/active-line.png index fff6283c73c1a4aabf7750f16e6495a16540ca8f..1f1f287daf41b18327512cd8ab7ed9e8f1c572ea 100644 GIT binary patch delta 564 zcmV-40?Ym01@8nQiBL{Q4GJ0x0000DNk~Le0000q0000Y2nGNE01)^3ZIK~Je>9*2 z00aO40096103rYY006Qdk0Ag60oh4JK~z`??Nm)GL{S)ij_=4qi7c>C7OW&YSzxV+ z%*tvaB^yeLg)=@DQf4vDQZ`dGv9RC=C?8Q47Is!j+1W7pd_CvrF0NA3z1L!L&h5PK z`FP&vbBa1Q)W2ehSK8BP`$uE+~&W`%Xb8K1d`f0|7YzT4JodgrLLrctL&8UMgsz ztutRKk1UA{LD5@`B;-i`+F~P8IHblz&YR?a1J;JoCC$~z!#*fb@cz3<~RTV3IG5}MNUMnLSTZa CdE=%4 delta 675 zcmV;U0$ly?1l|Q9iBL{Q4GJ0x0000DNk~Le0000O0000!2nGNE05O8w(~%)ae;A+x z00aO40096106qW!006ACuL%GE0!T?jK~z`??N~ueRY4T~=Bf*oLJ{Y$HU0i_$k&P%tCVR<4RDf^ri@MARY|ne-DxXcJ0-K@pl!$M4+x?7geS zdH1z+4$Rz{d%o{GbH8_H^ME{2e-MF=91-QfRs{_OOxuD*!6MTE6A-#6SY$e20zwxB zi%bVhKf2ZNF%0w?> zj8=+KyyM$S)(*+=Xg*BA8l_SjiK5#Ft^bRUW96d2%-elbJz65%@@ zFn5fYMdtd**~nmuo4*&(~HkwdyA zYn+~6OV-9zSpgOCa+vcwj+ZFtt#`Tp!&V79ymaE0)Z4%kViUO@lU>_CFeLy0002ov JPDHLkV1jw-FLeL_ diff --git a/www/theme/default/images/project/default-line.png b/www/theme/default/images/project/default-line.png index 8b57e83b146ed6764899bbe411d4494bd161c75d..bf40185d0a052907c384f0dd4950bddd54c74c8a 100644 GIT binary patch delta 661 zcmV;G0&4xd0?-8^iBL{Q4GJ0x0000DNk~Le0000q0000Y2nGNE01)^3ZIK~Je>9*2 z00aO40096103rYY006Qdk0Ag60y;@VK~z`??Uc)F6Hye#&zY&Q+NxBF1)*u@#0G?QsJ-htu1&g1)ja}xmle`o@lfF_^`XabsmCZGxYmjqn5mMtwW?@G&jycnF)zDP1>QTWOAZ%KliDxV9^O&+kWu(;NG z_3T=0SO&iz0KplK3k@)COyEz06ZJq=Yz5eP0N{V-|ga1+Q>}8NPxKec$hIhEOD+nN`6C z6br(-&N1y?46Myf-H>X)zpISx`b9Q%@oz(%<*Rj)4~_t0fQE6oYaqt%uN9NVdQ%KV z!fdBx`#=zGr-TCmrII^fq{Y7)59eQNV5R35(gWQtYE1Kov7$h&$56SEXoLy0b+*k zw<^nk)G|*O#}EzCtrs`)F)8ve1VlMKdQfI8UDx#A{x|C!#+^rQTHGsoel;koNuI&m zTk$Dl+PTw$!HSESEl;&{WaUkmyg1rq>#y(&M-MV4MaAXJKBsP8`Tjmfo6D}K+e>sN zG{pwKys)H$A*8u7wz^}d$}|@CcS23)MU@T0I+|Z9`0qHltmK!c^xkZ9qq)I5uioEp wKks@K-=s#hqy2}za3;2gJ>Wjk7yJGb>$_E!&#&I#QUE#K)78&qol`;+0Dq5QhyVZp From d36e4d56a8164f7558e0f7f1ca2f5bd522919f12 Mon Sep 17 00:00:00 2001 From: liuhong Date: Mon, 22 Aug 2022 03:55:52 +0000 Subject: [PATCH 037/223] * Fix bug#26203. --- module/projectrelease/control.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index 43118269bc..cd1f0ef28c 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -237,13 +237,11 @@ class projectrelease extends control ->beginIF($type == 'story')->orderBy($orderBy)->fi() ->page($storyPager) ->fetchAll('id'); + $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story'); $stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($release->stories)->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage'); foreach($stages as $storyID => $stage) $stories[$storyID]->stage = $stage; - - $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story'); - $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->bugs)->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($orderBy)->fi() From a4bb6e0c3e8128e956bc99959e1759cdeb5aac65 Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Mon, 22 Aug 2022 04:06:20 +0000 Subject: [PATCH 038/223] * Batch edit append ignore prompt. --- module/project/js/common.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/module/project/js/common.js b/module/project/js/common.js index c3bdce25e0..11c6b4e011 100644 --- a/module/project/js/common.js +++ b/module/project/js/common.js @@ -1,7 +1,8 @@ window.ignoreTips = { - 'beyondBudgetTip' : false, - 'dateTip' : false + 'beyondBudgetTip' : false, + 'dateTip' : false, }; +var batchEditDateTips = new Array(); /** * Access rights are equal to private, and the white list settings are displayed. @@ -366,13 +367,15 @@ function budgetOverrunTips() /** *The date is out of the range of the parent project set, and a prompt is given. * - * @param int $currentID + * @param string $currentID * @access public * @return void */ -function outOfDateTip(currentID = 0) +function outOfDateTip(currentID = '') { if(window.ignoreTips['dateTip']) return; + if(batchEditDateTips.includes(Number(currentID))) return; + var end = currentID ? $('#ends\\[' + currentID + '\\]').val() : $('#end').val(); var begin = currentID ? $('#begins\\[' + currentID + '\\]').val() : $('#begin').val(); if($('#dateTip.text-remind').length > 0) $('#dateTip').parent().parent().remove(); @@ -413,6 +416,7 @@ function outOfDateTip(currentID = 0) if(currentID) { $("#projects\\[" + currentID + "\\]").after(""); + $('#dateTip'+ currentID).parent().css('line-height', '0') } else { @@ -427,14 +431,16 @@ function outOfDateTip(currentID = 0) * Make this prompt no longer appear. * * @param string $obj + * @param string $currentID * @access public * @return void */ -function ignoreTip(obj,currentID = 0) +function ignoreTip(obj, currentID) { var parentID = obj.parentNode.id; currentID ? $('#dateTip' + currentID).parent().parent().remove() : $('#' + parentID).parent().parent().remove(); - if(parentID == 'dateTip' || parentID == 'dateTip' + currentID) window.ignoreTips['dateTip'] = true; + if(parentID == 'dateTip') window.ignoreTips['dateTip'] = true; + if(parentID == 'dateTip' + currentID) batchEditDateTips.push(currentID); if(parentID == 'beyondBudgetTip') window.ignoreTips['beyondBudgetTip'] = true; } From a49c03134c9c92cdf786e8f12256dd85e86afd76 Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Mon, 22 Aug 2022 05:04:47 +0000 Subject: [PATCH 039/223] * Batch edit append ignore prompt. --- module/project/js/common.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/project/js/common.js b/module/project/js/common.js index 11c6b4e011..548fa6587c 100644 --- a/module/project/js/common.js +++ b/module/project/js/common.js @@ -1,6 +1,6 @@ window.ignoreTips = { - 'beyondBudgetTip' : false, - 'dateTip' : false, + 'beyondBudgetTip' : false, + 'dateTip' : false, }; var batchEditDateTips = new Array(); From fad466d71107c5d384b7b634ecb55e0430ff4ecc Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Mon, 22 Aug 2022 05:05:49 +0000 Subject: [PATCH 040/223] * Batch edit append ignore prompt. --- module/project/js/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/project/js/common.js b/module/project/js/common.js index 548fa6587c..9767ec4c42 100644 --- a/module/project/js/common.js +++ b/module/project/js/common.js @@ -1,6 +1,6 @@ window.ignoreTips = { 'beyondBudgetTip' : false, - 'dateTip' : false, + 'dateTip' : false }; var batchEditDateTips = new Array(); From ef4cd6562afc516a158f29719e9678320fa06fba Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 22 Aug 2022 13:34:10 +0800 Subject: [PATCH 041/223] * Finish task #65781. --- module/testcase/control.php | 28 +++++++++++++++++++++---- module/testcase/css/linkbugs.css | 1 + module/testcase/css/linkcases.css | 2 +- module/testcase/view/linkbugs.html.php | 5 +++-- module/testcase/view/linkcases.html.php | 5 +++-- 5 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 module/testcase/css/linkbugs.css diff --git a/module/testcase/control.php b/module/testcase/control.php index 39a48f21b8..591f82c8cd 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -1370,10 +1370,13 @@ class testcase extends control * @param int $caseID * @param string $browseType * @param int $param + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ - public function linkCases($caseID, $browseType = '', $param = 0) + public function linkCases($caseID, $browseType = '', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* Get case and queryID. */ $case = $this->testcase->getById($caseID); @@ -1392,14 +1395,21 @@ class testcase extends control /* Get cases to link. */ $cases2Link = $this->testcase->getCases2Link($caseID, $browseType, $queryID); + /* Pager. */ + $this->app->loadClass('pager', true); + $recTotal = count($cases2Link); + $pager = new pager($recTotal, $recPerPage, $pageID); + $cases2Link = array_chunk($cases2Link, $pager->recPerPage); + /* Assign. */ $this->view->title = $case->title . $this->lang->colon . $this->lang->testcase->linkCases; $this->view->position[] = html::a($this->createLink('product', 'view', "productID=$case->product"), $this->products[$case->product]); $this->view->position[] = html::a($this->createLink('testcase', 'view', "caseID=$caseID"), $case->title); $this->view->position[] = $this->lang->testcase->linkCases; $this->view->case = $case; - $this->view->cases2Link = $cases2Link; + $this->view->cases2Link = empty($cases2Link) ? $cases2Link : $cases2Link[$pageID - 1]; $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->pager = $pager; $this->display(); } @@ -1410,10 +1420,13 @@ class testcase extends control * @param int $caseID * @param string $browseType * @param int $param + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ - public function linkBugs($caseID, $browseType = '', $param = 0) + public function linkBugs($caseID, $browseType = '', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->loadModel('bug'); @@ -1431,11 +1444,18 @@ class testcase extends control /* Get cases to link. */ $bugs2Link = $this->testcase->getBugs2Link($caseID, $browseType, $queryID); + /* Pager. */ + $this->app->loadClass('pager', true); + $recTotal = count($bugs2Link); + $pager = new pager($recTotal, $recPerPage, $pageID); + $bugs2Link = array_chunk($bugs2Link, $pager->recPerPage); + /* Assign. */ $this->view->position[] = $this->lang->testcase->linkBugs; $this->view->case = $case; - $this->view->bugs2Link = $bugs2Link; + $this->view->bugs2Link = empty($bugs2Link) ? $bugs2Link : $bugs2Link[$pageID - 1]; $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->pager = $pager; $this->display(); } diff --git a/module/testcase/css/linkbugs.css b/module/testcase/css/linkbugs.css new file mode 100644 index 0000000000..d0b4b319fe --- /dev/null +++ b/module/testcase/css/linkbugs.css @@ -0,0 +1 @@ +#mainContent {min-height: 400px;} diff --git a/module/testcase/css/linkcases.css b/module/testcase/css/linkcases.css index 906bda4878..b5a0ad4517 100644 --- a/module/testcase/css/linkcases.css +++ b/module/testcase/css/linkcases.css @@ -1,2 +1,2 @@ -#mainContent {min-height: 300px;} +#mainContent {min-height: 400px;} .table-actions {padding-left: 0;} diff --git a/module/testcase/view/linkbugs.html.php b/module/testcase/view/linkbugs.html.php index 3194623d1e..97b8057883 100644 --- a/module/testcase/view/linkbugs.html.php +++ b/module/testcase/view/linkbugs.html.php @@ -52,8 +52,8 @@ id);?> - - + + @@ -66,6 +66,7 @@
    id);?> + show('right', 'pagerjs');?> diff --git a/module/testcase/view/linkcases.html.php b/module/testcase/view/linkcases.html.php index e7ae9bd8ab..3fb409d495 100644 --- a/module/testcase/view/linkcases.html.php +++ b/module/testcase/view/linkcases.html.php @@ -52,8 +52,8 @@ id);?>
    - - + + @@ -66,6 +66,7 @@
    id);?> + show('right', 'pagerjs');?> From 005533579daadfb42d03950bcf9cd4d556d295f4 Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Mon, 22 Aug 2022 06:02:02 +0000 Subject: [PATCH 042/223] * Update code. --- module/project/js/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/project/js/common.js b/module/project/js/common.js index 9767ec4c42..a0c7b3c6fc 100644 --- a/module/project/js/common.js +++ b/module/project/js/common.js @@ -371,7 +371,7 @@ function budgetOverrunTips() * @access public * @return void */ -function outOfDateTip(currentID = '') +function outOfDateTip(currentID) { if(window.ignoreTips['dateTip']) return; if(batchEditDateTips.includes(Number(currentID))) return; From 2ae3f2f992523c976087776fe1577ab8a3036dc1 Mon Sep 17 00:00:00 2001 From: zenggang Date: Mon, 22 Aug 2022 06:04:53 +0000 Subject: [PATCH 043/223] * Fix release email bug --- module/release/view/sendmail.html.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/module/release/view/sendmail.html.php b/module/release/view/sendmail.html.php index bab8e63a57..dbd2acf707 100644 --- a/module/release/view/sendmail.html.php +++ b/module/release/view/sendmail.html.php @@ -13,6 +13,7 @@ id . ' ' . $release->name;?> app->tab == 'product' ? 'release' : 'projectrelease';?> app->getWebRoot(); $onlybody = isonlybody() ? true : false; if($onlybody) $_GET['onlybody'] = 'no'; ?> @@ -55,7 +56,7 @@ if($onlybody) $_GET['onlybody'] = 'no';
    @@ -81,7 +82,7 @@ if($onlybody) $_GET['onlybody'] = 'no'; @@ -107,7 +108,7 @@ if($onlybody) $_GET['onlybody'] = 'no'; From ce47faa9cf2c67a3dc333b13931bdc44f21d1f6b Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 22 Aug 2022 14:05:01 +0800 Subject: [PATCH 044/223] * Finish task #65780. --- module/my/css/testtask.css | 3 ++- module/my/view/testtask.html.php | 8 ++++---- module/testtask/model.php | 8 ++++++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/module/my/css/testtask.css b/module/my/css/testtask.css index 124ef6e446..f7129e9329 100644 --- a/module/my/css/testtask.css +++ b/module/my/css/testtask.css @@ -1 +1,2 @@ -.c-execution, .c-build {width: 120px;} +.c-execution {width: 200px} +.c-build {width: 120px;} diff --git a/module/my/view/testtask.html.php b/module/my/view/testtask.html.php index 4c7e9b1a19..9df1becf44 100644 --- a/module/my/view/testtask.html.php +++ b/module/my/view/testtask.html.php @@ -47,12 +47,12 @@ - - - + + + - + - - - - - - - - @@ -158,8 +150,16 @@ - - + + + + + + + + + + systemMode == 'new'):?> diff --git a/module/projectstory/lang/de.php b/module/projectstory/lang/de.php index 712bdfa71a..85d9e04cb9 100644 --- a/module/projectstory/lang/de.php +++ b/module/projectstory/lang/de.php @@ -26,6 +26,8 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; +$lang->projectstory->featureBar['story']['draft'] = $lang->product->draftStory; +$lang->projectstory->featureBar['story']['reviewing'] = $lang->product->reviewingStory; $lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = 'Linked ' . $lang->execution->common; diff --git a/module/projectstory/lang/en.php b/module/projectstory/lang/en.php index 7d4d228632..46d47f3073 100644 --- a/module/projectstory/lang/en.php +++ b/module/projectstory/lang/en.php @@ -26,6 +26,8 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; +$lang->projectstory->featureBar['story']['draft'] = $lang->product->draftStory; +$lang->projectstory->featureBar['story']['reviewing'] = $lang->product->reviewingStory; $lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = 'Linked ' . $lang->execution->common; diff --git a/module/projectstory/lang/fr.php b/module/projectstory/lang/fr.php index 712bdfa71a..85d9e04cb9 100644 --- a/module/projectstory/lang/fr.php +++ b/module/projectstory/lang/fr.php @@ -26,6 +26,8 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; +$lang->projectstory->featureBar['story']['draft'] = $lang->product->draftStory; +$lang->projectstory->featureBar['story']['reviewing'] = $lang->product->reviewingStory; $lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = 'Linked ' . $lang->execution->common; diff --git a/module/projectstory/lang/vi.php b/module/projectstory/lang/vi.php index 94347508b9..e41803b496 100644 --- a/module/projectstory/lang/vi.php +++ b/module/projectstory/lang/vi.php @@ -18,7 +18,11 @@ $lang->projectstory->batchUnlinkTip = 'Other requirements are removed. The follo global $app; $app->loadLang('product'); -$lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; -$lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; -$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; -$lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; +$lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; +$lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; +$lang->projectstory->featureBar['story']['draft'] = $lang->product->draftStory; +$lang->projectstory->featureBar['story']['reviewing'] = $lang->product->reviewingStory; +$lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; +$lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; +$lang->projectstory->featureBar['story']['linkedExecution'] = 'Linked ' . $lang->execution->common; +$lang->projectstory->featureBar['story']['unlinkedExecution'] = 'Unlinked ' . $lang->execution->common; diff --git a/module/projectstory/lang/zh-cn.php b/module/projectstory/lang/zh-cn.php index 00b3a4fa8f..567ac9cbd0 100644 --- a/module/projectstory/lang/zh-cn.php +++ b/module/projectstory/lang/zh-cn.php @@ -26,6 +26,8 @@ global $app; $app->loadLang('product'); $lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory; $lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed; +$lang->projectstory->featureBar['story']['draft'] = $lang->product->draftStory; +$lang->projectstory->featureBar['story']['reviewing'] = $lang->product->reviewingStory; $lang->projectstory->featureBar['story']['changing'] = $lang->product->changingStory; $lang->projectstory->featureBar['story']['closed'] = $lang->product->closedStory; $lang->projectstory->featureBar['story']['linkedExecution'] = '已关联' . $lang->execution->common; diff --git a/module/report/view/productsummary.html.php b/module/report/view/productsummary.html.php index 83633ad364..e4438f2a86 100644 --- a/module/report/view/productsummary.html.php +++ b/module/report/view/productsummary.html.php @@ -48,6 +48,7 @@ + @@ -71,16 +72,18 @@ status['draft']) ? $plan->status['draft'] : 0; - $activeCount = isset($plan->status['active']) ? $plan->status['active'] : 0; - $changedCount = isset($plan->status['changing']) ? $plan->status['changing'] : 0; - $closedCount = isset($plan->status['closed']) ? $plan->status['closed'] : 0; + $draftCount = isset($plan->status['draft']) ? $plan->status['draft'] : 0; + $reviewingCount = isset($plan->status['reviewing']) ? $plan->status['reviewing'] : 0; + $activeCount = isset($plan->status['active']) ? $plan->status['active'] : 0; + $changedCount = isset($plan->status['changing']) ? $plan->status['changing'] : 0; + $closedCount = isset($plan->status['closed']) ? $plan->status['closed'] : 0; ?> + - + "?> @@ -95,6 +98,7 @@ + diff --git a/module/story/control.php b/module/story/control.php index 802ff75c8f..f9087962bc 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1202,7 +1202,7 @@ class story extends control /* Assign. */ $this->view->title = $this->lang->story->activate . "STORY" . $this->lang->colon . $this->view->story->title; - $this->view->users = $this->user->getPairs('pofirst|nodeleted', $this->view->story->closedBy); + $this->view->users = $this->user->getPairs('pofirst|nodeleted|noclosed', $this->view->story->closedBy); $this->view->position[] = $this->lang->story->activate; $this->display(); } @@ -1510,7 +1510,7 @@ class story extends control if($confirm == 'no') { $confirmTips = $story->status == 'changing' ? $this->lang->story->confirmRecallChange : $this->lang->story->confirmRecallReview; - return print(js::confirm($confirmTips, $this->createLink('story', 'recall', "storyID=$storyID&from=lite&confirm=yes"))); + return print(js::confirm($confirmTips, $this->createLink('story', 'recall', "storyID=$storyID&from=$from&confirm=yes"))); } else { @@ -1520,10 +1520,10 @@ class story extends control $action = $story->status == 'changing' ? 'recalledChange' : 'Recalled'; $this->loadModel('action')->create('story', $storyID, $action); - if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID={$storyID}&from=view"))); + if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); - echo js::locate($locateLink, 'parent'); + return print(js::locate($locateLink, 'parent')); } } diff --git a/module/story/lang/de.php b/module/story/lang/de.php index de44ec1319..4d48e2b9cc 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -462,8 +462,10 @@ $lang->story->subDivideTip['planned'] = 'The Story has been planned and cannot $lang->story->subDivideTip['projected'] = 'The Story has been initiated and cannot be subdivided.'; $lang->story->subDivideTip['notActive'] = 'The Story is not active and cannot be subdivided.'; -$lang->story->featureBar['browse']['all'] = $lang->all; -$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['all'] = $lang->all; +$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft']; +$lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing']; $lang->story->recallList = array(); $lang->story->recallList['recallReview'] = $lang->story->recall; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index c129d9f956..47992876b5 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -462,8 +462,10 @@ $lang->story->subDivideTip['planned'] = 'The Story has been planned and cannot $lang->story->subDivideTip['projected'] = 'The Story has been initiated and cannot be subdivided.'; $lang->story->subDivideTip['notActive'] = 'The Story is not active and cannot be subdivided.'; -$lang->story->featureBar['browse']['all'] = $lang->all; -$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['all'] = $lang->all; +$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft']; +$lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing']; $lang->story->recallList = array(); $lang->story->recallList['recallReview'] = $lang->story->recall; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index a8e0d948aa..0609cde540 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -462,8 +462,10 @@ $lang->story->subDivideTip['planned'] = 'Cette Story est planifiée et ne peut $lang->story->subDivideTip['projected'] = 'Cette Story a été créée et ne peut être subdivisée.'; $lang->story->subDivideTip['notActive'] = "Cette Story n'est pas active et ne peut être subdivisée."; -$lang->story->featureBar['browse']['all'] = $lang->all; -$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['all'] = $lang->all; +$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft']; +$lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing']; $lang->story->recallList = array(); $lang->story->recallList['recallReview'] = $lang->story->recall; diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php index c9ac6134ff..3871b12490 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -454,8 +454,10 @@ $lang->story->subDivideTip['planned'] = 'The Story has been planned and cannot $lang->story->subDivideTip['projected'] = 'The Story has been initiated and cannot be subdivided.'; $lang->story->subDivideTip['notActive'] = 'The Story is not active and cannot be subdivided.'; -$lang->story->featureBar['browse']['all'] = $lang->all; -$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['all'] = $lang->all; +$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft']; +$lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing']; $lang->story->recallList = array(); $lang->story->recallList['recallReview'] = $lang->story->recall; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 7439fcf443..3d57497266 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -462,8 +462,10 @@ $lang->story->subDivideTip['planned'] = '该需求已计划,无法进行细 $lang->story->subDivideTip['projected'] = '该需求已立项,无法进行细分操作'; $lang->story->subDivideTip['notActive'] = '需求不是激活状态,无法进行细分操作'; -$lang->story->featureBar['browse']['all'] = $lang->all; -$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['all'] = $lang->all; +$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; +$lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft']; +$lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing']; $lang->story->recallList = array(); $lang->story->recallList['recallReview'] = $lang->story->recall; diff --git a/module/story/model.php b/module/story/model.php index 64909ca66a..4fbfbcb72b 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -709,6 +709,7 @@ class storyModel extends model ->remove('files,labels,reviewer,comment,needNotReview,uid') ->get(); + $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid); $this->dao->update(TABLE_STORY)->data($story, 'spec,verify') ->autoCheck() @@ -757,12 +758,15 @@ class storyModel extends model $reviewData->reviewer = $reviewer; $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); } + + if($reviewerHasChanged) + { + $oldStory->reviewers = implode(',', array_keys($oldStoryReviewers)); + $story->reviewers = implode(',', $_POST['reviewer']); + } } $this->file->updateObjectID($this->post->uid, $storyID, 'story'); - - $oldStory->reviewers = implode(',', array_keys($oldStoryReviewers)); - $story->reviewers = implode(',', $_POST['reviewer']); return common::createChanges($oldStory, $story); } } @@ -1438,6 +1442,8 @@ class storyModel extends model ->add('id', $storyID) ->remove('result,comment') ->get(); + + $story->reviewedBy = implode(',', array_unique(explode(',', $story->reviewedBy))); $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->review['id'], $this->post->uid); /* Fix bug #671. */ @@ -3051,15 +3057,6 @@ class storyModel extends model if(empty($normalProducts) and empty($branchProducts)) $storyQuery .= '1 = 1'; $storyQuery .= ') '; - if($this->app->moduleName == 'release' or $this->app->moduleName == 'build') - { - $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing')"; // Fix bug #990. - } - else - { - $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing', 'closed')"; - } - if($this->app->rawModule == 'build' and $this->app->rawMethod == 'linkstory') $storyQuery .= " AND `parent` != '-1'"; } elseif(strpos($storyQuery, $allBranch) !== false) @@ -3072,6 +3069,15 @@ class storyModel extends model } $storyQuery = preg_replace("/`plan` +LIKE +'%([0-9]+)%'/i", "CONCAT(',', `plan`, ',') LIKE '%,$1,%'", $storyQuery); + if($this->app->moduleName == 'release' or $this->app->moduleName == 'build') + { + $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing')"; // Fix bug #990. + } + else + { + $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing', 'closed')"; + } + return $this->getBySQL($queryProductID, $storyQuery, $orderBy, $pager, $type); } @@ -3225,7 +3231,7 @@ class storyModel extends model ->beginIF($execution->type == 'project') ->beginIF(!empty($productID))->andWhere('t1.product')->eq($productID) ->beginIF($type == 'bybranch' and $branchParam !== '')->andWhere('t2.branch')->in("0,$branchParam")->fi() - ->beginIF(strpos('changing|closed', $type) !== false)->andWhere('t2.status')->eq($type)->fi() + ->beginIF(strpos('draft|reviewing|changing|closed', $type) !== false)->andWhere('t2.status')->eq($type)->fi() ->beginIF($type == 'unclosed')->andWhere('t2.status')->in(array_keys($unclosedStatus))->fi() ->beginIF($type == 'linkedexecution')->andWhere('t2.id')->in($storyIdList)->fi() ->beginIF($type == 'unlinkedexecution')->andWhere('t2.id')->notIn($storyIdList)->fi() @@ -4129,7 +4135,7 @@ class storyModel extends model if($action == 'assignto') return $story->status != 'closed'; if($action == 'createcase') return $story->type != 'requirement'; if($action == 'batchcreate' and $story->parent > 0) return false; - if($action == 'batchcreate' and $story->type == 'requirement' and $story->status != 'closed') return $story->status != 'draft'; + if($action == 'batchcreate' and $story->type == 'requirement' and $story->status != 'closed') return strpos('draft,reviewing,changing', $story->status) === false; if($action == 'batchcreate' and $config->vision == 'lite' and ($story->status == 'active' and ($story->stage == 'wait' or $story->stage == 'projected'))) return true; if($action == 'batchcreate' and ($story->status != 'active' or $story->stage != 'wait' or !empty($story->plan))) return false; @@ -4237,6 +4243,7 @@ class storyModel extends model if($type == 'view') { $menu .= $this->buildMenu('story', 'change', $params, $story, $type, 'alter', '', 'showinonlybody'); + if($story->status == 'draft') $menu .= $this->buildMenu('story', 'submitReview', $params, $story, $type, 'sub-review', '', 'showinonlybody iframe', true, "data-width='50%'"); $title = $story->status == 'changing' ? $this->lang->story->recallChange : $this->lang->story->recall; $menu .= $this->buildMenu('story', 'recall', $params . '&from=view', $story, $type, 'undo', 'hiddenwin', 'showinonlybody', false, '', $title); From 67151d459550d3509e411dbcf61a0f51d78114bd Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 22 Aug 2022 14:43:18 +0800 Subject: [PATCH 047/223] * Fix bug for task #64967. --- framework/base/router.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 224b8a4629..4e514c3bc2 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -2147,6 +2147,7 @@ class baseRouter { try { /* 调用该方法 Call the method. */ + if(empty($this->control)) $this->setParams(); $module = $this->control; call_user_func_array(array($module, $this->methodName), $this->params); From 90068c5a8f0d68fc43aeab549b51aa77fc383287 Mon Sep 17 00:00:00 2001 From: mayue Date: Mon, 22 Aug 2022 14:45:51 +0800 Subject: [PATCH 048/223] * Fix bug #26638. --- module/action/lang/zh-cn.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index dee6daa7ef..40d7ece328 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -221,6 +221,7 @@ $lang->action->desc->updatetolib = '$date, 由 $actor $lang->action->desc->adjusttasktowait = '$date, 系统判断由于消耗工时调整为0,将任务状态置为未开始。' . "\n"; $lang->action->desc->reopen = '$date, 由 $actor 重新打开。' . "\n"; $lang->action->desc->merged = '$date, 由 $actor 合并。' . "\n"; +$lang->action->desc->ganttmove = '$date, 由 $actor 排序。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; From d8a419798de2f355f91f02f74330fd3c8e3b2a3d Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 22 Aug 2022 14:47:40 +0800 Subject: [PATCH 049/223] * Fix bug #26728. --- module/execution/js/common.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/execution/js/common.js b/module/execution/js/common.js index 9d88292f43..70b25619db 100644 --- a/module/execution/js/common.js +++ b/module/execution/js/common.js @@ -141,9 +141,10 @@ function loadBranches(product) if($inputgroup.find('.chosen-container').size() >= 2) $inputgroup.find('.chosen-container:last').remove(); var projectID = (typeof(systemMode) != 'undefined' && systemMode == 'new') ? $('#project').val() : 0; + if(typeof(projectID) == 'undefined') projectID = 0; var index = $inputgroup.find('select:first').attr('id').replace('products' , ''); - $.get(createLink('branch', 'ajaxGetBranches', "productID=" + $(product).val() + "&oldBranch=¶m=active&projectID=" + projectID + "&withMainBranch="), function(data) + $.get(createLink('branch', 'ajaxGetBranches', "productID=" + $(product).val() + "&oldBranch=¶m=active&projectID=" + projectID + "&withMainBranch=true"), function(data) { if(data) { From a54d9168bb28a2f1cae961f069edea0b34a19650 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 22 Aug 2022 14:49:04 +0800 Subject: [PATCH 050/223] * Fix bug for task #64967. --- bin/ztcli | 3 ++- framework/api/router.class.php | 6 +++++- framework/base/router.class.php | 1 - roadrunner/cron-worker.php | 1 + www/api.php | 1 + www/install.php.tmp | 1 + www/upgrade.php.tmp | 6 +++++- 7 files changed, 15 insertions(+), 4 deletions(-) diff --git a/bin/ztcli b/bin/ztcli index 38252d263b..fd696fa825 100755 --- a/bin/ztcli +++ b/bin/ztcli @@ -50,7 +50,7 @@ if($config->requestType == 'PATH_INFO') { $_SERVER['PATH_INFO'] = $path['basename']; } - else + else { /* url like http://pms.zentao.net/zentao/my/, PATH_INFO is 'my'. */ if(is_dir('./module/' . $path['basename'])) @@ -74,4 +74,5 @@ else } $app->parseRequest(); +$app->setParams(); $app->loadModule(); diff --git a/framework/api/router.class.php b/framework/api/router.class.php index ef441d72c8..ffbad8fda1 100644 --- a/framework/api/router.class.php +++ b/framework/api/router.class.php @@ -191,7 +191,11 @@ class api extends router public function loadModule() { /* If the version of api don't exists, call parent method. */ - if(!$this->version) return parent::loadModule(); + if(!$this->version) + { + parent::setParams(); + return parent::loadModule(); + } $entry = strtolower($this->entry); include($this->appRoot . "api/$this->version/entries/$entry.php"); diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 4e514c3bc2..224b8a4629 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -2147,7 +2147,6 @@ class baseRouter { try { /* 调用该方法 Call the method. */ - if(empty($this->control)) $this->setParams(); $module = $this->control; call_user_func_array(array($module, $this->methodName), $this->params); diff --git a/roadrunner/cron-worker.php b/roadrunner/cron-worker.php index 468fde14c0..c8f69799e9 100644 --- a/roadrunner/cron-worker.php +++ b/roadrunner/cron-worker.php @@ -32,4 +32,5 @@ $common = $app->loadCommon(); $app->moduleName = 'cron'; $app->methodName = 'ajaxExec'; $app->setControlFile(); +$app->setParams(); $app->loadModule(); diff --git a/www/api.php b/www/api.php index c49b0b40ee..cb723df37e 100644 --- a/www/api.php +++ b/www/api.php @@ -46,6 +46,7 @@ $app->parseRequest(); /* Old version need check priv here, new version check priv in entry. */ if(!$app->version) $common->checkPriv(); +$app->setParams(); $app->loadModule(); $output = ob_get_clean(); diff --git a/www/install.php.tmp b/www/install.php.tmp index 122755b3fa..ae68c66261 100644 --- a/www/install.php.tmp +++ b/www/install.php.tmp @@ -33,4 +33,5 @@ $app->setDebug(); if(isset($config->installed) and $config->installed) $app->connectDB(); $app->parseRequest(); +$app->setParams(); $app->loadModule(); diff --git a/www/upgrade.php.tmp b/www/upgrade.php.tmp index a2f2165848..1c335ae061 100644 --- a/www/upgrade.php.tmp +++ b/www/upgrade.php.tmp @@ -80,4 +80,8 @@ if($app->isContainer()) /* Run it. */ $app->parseRequest(); -if($common->checkUpgradeStatus()) $app->loadModule(); +if($common->checkUpgradeStatus()) +{ + $app->setParams(); + $app->loadModule(); +} From 93c0360d4257ae85791c6b957ac7003827331fd5 Mon Sep 17 00:00:00 2001 From: mayue Date: Mon, 22 Aug 2022 14:50:33 +0800 Subject: [PATCH 051/223] * Add other language. --- module/action/lang/de.php | 1 + module/action/lang/en.php | 1 + module/action/lang/fr.php | 1 + 3 files changed, 3 insertions(+) diff --git a/module/action/lang/de.php b/module/action/lang/de.php index 86e6b08025..8e031ef002 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -221,6 +221,7 @@ $lang->action->desc->updatetolib = '$date, updated to ' . $lang->testca $lang->action->desc->adjusttasktowait = '$date, System Reminder: The task status will be set to Not Started as the consumed work hour is adjusted to 0. ' . "\n"; $lang->action->desc->reopen = '$date, reopened by $actor .' . "\n"; $lang->action->desc->merged = '$date, merged by $actor .' . "\n"; +$lang->action->desc->ganttmove = '$date, sort by $actor .' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index f6c1e1ad00..de17c51b57 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -221,6 +221,7 @@ $lang->action->desc->updatetolib = '$date, updated to ' . $lang->testca $lang->action->desc->adjusttasktowait = '$date, System Reminder: The task status will be set to Not Started as the consumed work hour is adjusted to 0. ' . "\n"; $lang->action->desc->reopen = '$date, reopened by $actor .' . "\n"; $lang->action->desc->merged = '$date, merged by $actor .' . "\n"; +$lang->action->desc->ganttmove = '$date, sort by $actor .' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php index 3a2db412b6..e68edaa204 100644 --- a/module/action/lang/fr.php +++ b/module/action/lang/fr.php @@ -221,6 +221,7 @@ $lang->action->desc->updatetolib = '$date, MàJ de ' . $lang->testcase- $lang->action->desc->adjusttasktowait = '$date, System Reminder: The task status will be set to Not Started as the consumed work hour is adjusted to 0. ' . "\n"; $lang->action->desc->reopen = '$date, reopened by $actor .' . "\n"; $lang->action->desc->merged = '$date, merged by $actor .' . "\n"; +$lang->action->desc->ganttmove = '$date, sort by $actor .' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor a créé un sous-tâche $extra。' . "\n"; From eac40c40ca1604c5bce7663ed6fa318aab407aba Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 22 Aug 2022 15:33:06 +0800 Subject: [PATCH 052/223] * Finish task #65781. --- module/testcase/css/edit.css | 1 + 1 file changed, 1 insertion(+) diff --git a/module/testcase/css/edit.css b/module/testcase/css/edit.css index 1c5e8bcfc1..dd2a40aaeb 100644 --- a/module/testcase/css/edit.css +++ b/module/testcase/css/edit.css @@ -3,3 +3,4 @@ .table-form > tbody > tr > td .btn.addbutton {display: block; margin: 1px 0px; width: 40px; padding: 1px 6px;} .table-form > tbody > tr > td .btn.delbutton {display: block; margin: 1px 0px; width: 40px; padding: 1px 6px;} #branch {width: 95px!important;} + [lang^=de] .detail > table > tbody th {width: 125px !important;} From 2cbee1b76c4b66b941cfe6ea9fc05873942b2ba2 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 22 Aug 2022 15:38:09 +0800 Subject: [PATCH 053/223] * Finish task #65781. --- module/testcase/css/edit.css | 2 ++ module/testcase/view/edit.html.php | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/module/testcase/css/edit.css b/module/testcase/css/edit.css index dd2a40aaeb..cfd6152a51 100644 --- a/module/testcase/css/edit.css +++ b/module/testcase/css/edit.css @@ -3,4 +3,6 @@ .table-form > tbody > tr > td .btn.addbutton {display: block; margin: 1px 0px; width: 40px; padding: 1px 6px;} .table-form > tbody > tr > td .btn.delbutton {display: block; margin: 1px 0px; width: 40px; padding: 1px 6px;} #branch {width: 95px!important;} + .detail > table > tbody th {width: 80px !important;} + [lang^=en] .detail > table > tbody th, [lang^=fr] .detail > table > tbody th {width: 100px !important;} [lang^=de] .detail > table > tbody th {width: 125px !important;} diff --git a/module/testcase/view/edit.html.php b/module/testcase/view/edit.html.php index 07d9a0a0d6..23c4c67de7 100644 --- a/module/testcase/view/edit.html.php +++ b/module/testcase/view/edit.html.php @@ -173,7 +173,7 @@ - + + - + @@ -68,11 +68,13 @@ + + @@ -114,11 +116,13 @@ + + @@ -159,11 +163,13 @@ + + @@ -179,8 +185,8 @@ $product):?> stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changing']; - $totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changing']; + $totalStories = $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changing'] + $product->stories['reviewing']; + $totalRequirements = $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changing'] + $product->requirements['reviewing']; $trClass = ''; if($product->line) @@ -218,11 +224,13 @@ + + From 6f187e3a23b13fc62daae499762112ec8eab18ea Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 17:16:49 +0800 Subject: [PATCH 096/223] * Correct the translation. --- module/task/lang/de.php | 2 +- module/task/lang/en.php | 2 +- module/task/lang/fr.php | 4 ++-- module/task/lang/vi.php | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/module/task/lang/de.php b/module/task/lang/de.php index 7f3109669d..bf5d6c16dc 100644 --- a/module/task/lang/de.php +++ b/module/task/lang/de.php @@ -261,7 +261,7 @@ $lang->task->error->realStartedEmpty = '"Real Started" should not be empty.'; $lang->task->error->finishedDateEmpty = '"Finished Date" should not be empty.'; $lang->task->error->finishedDateSmall = '"Finished Date" should be > "Real Started"'; $lang->task->error->alreadyConsumed = 'The currently selected parent task has been consumed.'; -$lang->task->error->date = 'The date should be >= today.'; +$lang->task->error->date = 'The date should be <= today.'; $lang->task->error->leftEmptyAB = 'When the task status is %s, "Hours Left" cannot be 0'; $lang->task->error->leftEmpty = 'Task#%sWhen the task status is %s, "Left" cannot be 0'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index 1e1b1e536b..2058e72cad 100755 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -261,7 +261,7 @@ $lang->task->error->realStartedEmpty = '"Real Started" should not be empty.'; $lang->task->error->finishedDateEmpty = '"Finished Date" should not be empty.'; $lang->task->error->finishedDateSmall = '"Finished Date" should be > "Real Started"'; $lang->task->error->alreadyConsumed = 'The currently selected parent task has been consumed.'; -$lang->task->error->date = 'The date should be >= today.'; +$lang->task->error->date = 'The date should be <= today.'; $lang->task->error->leftEmptyAB = 'When the task status is %s, "Hours Left" cannot be 0'; $lang->task->error->leftEmpty = 'Task#%sWhen the task status is %s, "Left" cannot be 0'; diff --git a/module/task/lang/fr.php b/module/task/lang/fr.php index 4d668186e3..d676f327a7 100644 --- a/module/task/lang/fr.php +++ b/module/task/lang/fr.php @@ -261,7 +261,7 @@ $lang->task->error->realStartedEmpty = '"Real Started" should not be empty.'; $lang->task->error->finishedDateEmpty = '"Finished Date" should not be empty.'; $lang->task->error->finishedDateSmall = '"Finished Date" should be > "Real Started"'; $lang->task->error->alreadyConsumed = 'The currently selected parent task has been consumed.'; -$lang->task->error->date = 'The date should be >= today.'; +$lang->task->error->date = 'The date should be <= today.'; $lang->task->error->leftEmptyAB = 'When the task status is %s, "Hours Left" cannot be 0'; $lang->task->error->leftEmpty = 'Task#%sWhen the task status is %s, "Left" cannot be 0'; @@ -354,4 +354,4 @@ $lang->taskestimate = new stdclass(); $lang->taskestimate->consumed = 'Estimés'; $lang->task->overEsStartDate = 'The %s schedule start time has exceeded, please modify the %s schedule start time first'; -$lang->task->overEsEndDate = 'The %s schedule end time has exceeded, please modify the %s schedule end time first'; \ No newline at end of file +$lang->task->overEsEndDate = 'The %s schedule end time has exceeded, please modify the %s schedule end time first'; diff --git a/module/task/lang/vi.php b/module/task/lang/vi.php index 488a1fccea..42cccd53b3 100644 --- a/module/task/lang/vi.php +++ b/module/task/lang/vi.php @@ -223,7 +223,7 @@ $lang->task->error->realStartedEmpty = '"Real Started" should not be empty.'; $lang->task->error->finishedDateEmpty = '"Finished Date" should not be empty.'; $lang->task->error->finishedDateSmall = '"Finished Date" should be > "Real Started"'; $lang->task->error->alreadyConsumed = 'The currently selected parent task has been consumed.'; -$lang->task->error->date = 'The date should be >= today.'; +$lang->task->error->date = 'The date should be <= today.'; /* Report. */ $lang->task->report = new stdclass(); From 329238d8cd4ec060a0af80e01193e609e43f054d Mon Sep 17 00:00:00 2001 From: liuhong Date: Tue, 23 Aug 2022 09:23:09 +0000 Subject: [PATCH 097/223] *Fix bug #26000. --- module/project/model.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 1e054e30c9..ab7141102c 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -758,8 +758,7 @@ class projectModel extends model ->where('type')->eq('project') ->andWhere('deleted')->eq(0) ->andWhere('vision')->eq($this->config->vision) - ->beginIF($programID !== '' and $this->app->tab !== 'product')->andWhere('parent')->eq($programID)->fi() - ->beginIF($programID !== '' and $this->app->tab == 'product')->andWhere('path')->like("%,$programID,%")->fi() + ->beginIF($programID !== '')->andWhere('path')->like("%,$programID,%")->fi() ->beginIF($status != 'all' and $status != 'noclosed')->andWhere('status')->eq($status)->fi() ->beginIF($excludedModel)->andWhere('model')->ne($excludedModel)->fi() ->beginIF($model)->andWhere('model')->eq($model)->fi() From f3b8e6337615c8433657631f2a6f6c818c84bee8 Mon Sep 17 00:00:00 2001 From: dongli Date: Tue, 23 Aug 2022 10:46:03 +0000 Subject: [PATCH 098/223] * Finsh task #64972,64973,64969. --- module/action/control.php | 1 - module/action/css/trash.css | 4 ++++ module/action/view/trash.html.php | 8 ++++---- module/project/lang/de.php | 2 +- module/project/lang/fr.php | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index f962cdbfa1..f18d8fa2c9 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -118,7 +118,6 @@ class action extends control /* Get the projects name of executions. */ if($browseType == 'execution') { - $this->app->loadLang('execution'); $this->loadModel('project'); $projectIdList = array(); foreach($trashes as $trash) $projectIdList[] = $trash->project; diff --git a/module/action/css/trash.css b/module/action/css/trash.css index 94cf000e62..08c1abed46 100755 --- a/module/action/css/trash.css +++ b/module/action/css/trash.css @@ -8,4 +8,8 @@ #querybox #searchform{border-bottom: 1px solid #ddd; margin-bottom: 20px;} td.flex {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center; margin-bottom: 0px;} .flex span.label-danger {margin-left: 5px; min-width: 50px;} +[lang^=en] .flex span.label-danger {min-width: 52px;} +[lang^=de] .flex span.label-danger {min-width: 58px;} +[lang^=fr] .flex span.label-danger {min-width: 69px;} .c-name > .text-ellipsis {text-overflow: clip;} + diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 6167da3e76..15e4935fd5 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -83,7 +83,7 @@ systemMode == 'new' and $currentObjectType == 'execution'):?> - + @@ -145,7 +145,7 @@ ?> systemMode == 'new' and $currentObjectType == 'execution'):?> - - - - - - + @@ -152,7 +152,7 @@ - + resolution != 'duplicate') echo "style='display:none'";?>> - + diff --git a/module/bug/view/resolve.html.php b/module/bug/view/resolve.html.php index e665c4c250..a9d91cffb2 100644 --- a/module/bug/view/resolve.html.php +++ b/module/bug/view/resolve.html.php @@ -38,7 +38,7 @@ js::set('productID' , $bug->product); - + diff --git a/module/execution/model.php b/module/execution/model.php index e7fa35e804..28ef59b345 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -3652,7 +3652,8 @@ class executionModel extends model ->page($pager) ->fetchAll('id'); - $tasks = $this->dao->select('t1.*, t2.id AS storyID, t2.title AS storyTitle, t2.product, t2.branch, t2.version AS latestStoryVersion, t2.status AS storyStatus, t3.realname AS assignedToRealName') + $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + $tasks = $this->dao->select('t1.*, t2.id AS storyID, t2.title AS storyTitle, t2.product, t2.branch, t2.version AS latestStoryVersion, t2.status AS storyStatus, t3.realname AS assignedToRealName, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder') ->from(TABLE_TASK)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') diff --git a/module/story/control.php b/module/story/control.php index 395efa8d69..aadc3735de 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1023,7 +1023,8 @@ class story extends control if($showSuhosinInfo) $this->view->suhosinInfo = extension_loaded('suhosin') ? sprintf($this->lang->suhosinInfo, $countInputVars) : sprintf($this->lang->maxVarsInfo, $countInputVars); /* Append module when change product type. */ - $moduleList = array(0 => '/'); + $moduleList = array(0 => '/'); + $productStoryList = array(); foreach($stories as $story) { if(isset($modules[$story->product][$story->branch])) @@ -1034,6 +1035,13 @@ class story extends control { $moduleList[$story->id] = $modules[$story->product][0] + $this->tree->getModulesName($story->module); } + + if($story->status == 'closed') + { + $storyProduct = $products[$story->product]; + $branch = $storyProduct->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all'; + if(!isset($productStoryList[$story->product][$story->branch])) $productStoryList[$story->product][$story->branch] = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, ''); + } } $this->view->position[] = $this->lang->story->common; @@ -1055,6 +1063,7 @@ class story extends control $this->view->executionID = $executionID; $this->view->branchTagOption = $branchTagOption; $this->view->moduleList = $moduleList; + $this->view->productStoryList = $productStoryList; $this->display(); } @@ -1655,7 +1664,7 @@ class story extends control } /* Get story and product. */ - $product = $this->dao->findById($story->product)->from(TABLE_PRODUCT)->fields('name, id')->fetch(); + $product = $this->dao->findById($story->product)->from(TABLE_PRODUCT)->fields('name, id, type')->fetch(); $this->story->replaceURLang($story->type); @@ -1666,16 +1675,20 @@ class story extends control if($story->status == 'draft') unset($this->lang->story->reasonList['cancel']); unset($this->lang->story->reasonList['subdivided']); + $branch = $product->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all'; + $productStories = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, ''); + $this->view->title = $this->lang->story->close . "STORY" . $this->lang->colon . $story->title; $this->view->position[] = html::a($this->createLink('product', 'browse', "product=$product->id&branch=$story->branch"), $product->name); $this->view->position[] = $this->lang->story->common; $this->view->position[] = $this->lang->story->close; - $this->view->product = $product; - $this->view->story = $story; - $this->view->actions = $this->action->getList('story', $storyID); - $this->view->users = $this->loadModel('user')->getPairs(); - $this->view->reasonList = $this->lang->story->reasonList; + $this->view->product = $product; + $this->view->story = $story; + $this->view->productStories = $productStories; + $this->view->actions = $this->action->getList('story', $storyID); + $this->view->users = $this->loadModel('user')->getPairs(); + $this->view->reasonList = $this->lang->story->reasonList; $this->display(); } @@ -1697,6 +1710,8 @@ class story extends control /* Get edited stories. */ $stories = $this->story->getByList($storyIdList); + $productStoryList = array(); + $productList = array(); foreach($stories as $story) { if($story->parent == -1) @@ -1709,6 +1724,10 @@ class story extends control $closedStory[] = $story->id; unset($stories[$story->id]); } + + $storyProduct = isset($productList[$story->product]) ? $productList[$story->product] : $this->product->getByID($story->product); + $branch = $storyProduct->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all'; + if(!isset($productStoryList[$story->product][$story->branch])) $productStoryList[$story->product][$story->branch] = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, ''); } if($this->post->comments) @@ -1792,6 +1811,7 @@ class story extends control $this->view->storyIdList = $storyIdList; $this->view->storyType = $storyType; $this->view->reasonList = $this->lang->story->reasonList; + $this->view->productStoryList = $productStoryList; $this->display(); } diff --git a/module/story/js/batchclose.js b/module/story/js/batchclose.js index 45150d3088..fcce7e7768 100755 --- a/module/story/js/batchclose.js +++ b/module/story/js/batchclose.js @@ -1,7 +1,7 @@ /** * Set duplicate field. - * - * @param string $resolution + * + * @param string $resolution * @param int $storyID * @access public * @return void @@ -24,3 +24,12 @@ function setDuplicateAndChild(resolution, storyID) $('#childStoryBox' + storyID).hide(); } } + +$(function() +{ + $('select[id^="duplicateStoryIDList"]').picker( + { + disableEmptySearch : true, + dropWidth : 'auto' + }); +}); diff --git a/module/story/js/batchedit.js b/module/story/js/batchedit.js index 63eaea8a5d..5a92791404 100644 --- a/module/story/js/batchedit.js +++ b/module/story/js/batchedit.js @@ -51,6 +51,12 @@ $(function() { hiddenRequireFields(); }); + + $('select[id^="duplicateStoryIDList"]').picker( + { + disableEmptySearch : true, + dropWidth : 'auto' + }); }); $(document).on('click', '.chosen-with-drop', function(){oldValue = $(this).prev('select').val();})//Save old value. diff --git a/module/story/js/close.js b/module/story/js/close.js index 73b0e1988a..4a8e9ffe28 100644 --- a/module/story/js/close.js +++ b/module/story/js/close.js @@ -16,3 +16,12 @@ function setStory(reason) $('#childStoriesBox').hide(); } } + +$(function() +{ + $('#duplicateStory').picker( + { + disableEmptySearch : true, + dropWidth : 'auto' + }); +}); diff --git a/module/story/view/batchclose.html.php b/module/story/view/batchclose.html.php index 9ee2df95ef..11ba36be4c 100755 --- a/module/story/view/batchclose.html.php +++ b/module/story/view/batchclose.html.php @@ -43,8 +43,8 @@ - - + @@ -152,7 +152,7 @@ - + diff --git a/extension/lite/story/ext/view/create.html.php b/extension/lite/story/ext/view/create.html.php index b2a5b6c85c..a918915f17 100644 --- a/extension/lite/story/ext/view/create.html.php +++ b/extension/lite/story/ext/view/create.html.php @@ -24,13 +24,21 @@

    story->create;?>

    + story->checkForceReview()):?> +
    +
    + /> + +
    +
    +
    story->reviewedBy;?> +
    story->checkForceReview() ? ' required' : ''));?> story->checkForceReview()):?> @@ -34,10 +34,10 @@
    story->assignedTo;?>
    - + assignedTo, "class='form-control picker-select'");?>
    -
    -
    -
    -
    story->source;?>
    - story->sourceList, $source, "class='form-control chosen'");?> -
    -
    -
    story->sourceNote;?>
    - - -
    -
    -
    -
    story->reviewedBy;?>' id='reviewerBox'> -
    - story->checkForceReview()):?> -
    - PO : '', "class='form-control picker-select' multiple");?> -
    -
    - -
    - /> - -
    -
    -
    - -
    - PO : '', "class='form-control picker-select' multiple required");?> -
    - -
    -
    ' id='assignedToBox' class='hidden'> + ' id='assignedToBox'>
    story->assignedTo;?>
    +
    story->source;?> + story->sourceList, $source, "class='form-control chosen'");?> +
    -
    -
    story->source;?>
    - story->sourceList, $source, "class='form-control chosen'");?> - story->sourceNote;?> - -
    +
    story->sourceNote;?>
    +
    story->assignedTo;?> + + +
    +
    +
    story->source;?>
    + story->sourceList, $source, "class='form-control chosen'");?> + story->sourceNote;?> + +
    +
    +
    story->reviewedBy;?> +
    + story->checkForceReview()):?> +
    + PO : '', "class='form-control picker-select' multiple");?> +
    + + +
    + PO : '', "class='form-control picker-select' multiple required");?> +
    + +
    +
    story->reviewResult;?> story->resultList, '', 'class="form-control chosen" onchange="switchShow(this.value)"');?>
    story->assignedTo;?>assignedTo, "class='form-control picker-select'");?>
    story->rejectedReason;?>action->objectType);?> idAB);?> action->objectName;?>lang->execution->project;?> action->actor);?> action->date);?> actions;?> + + project]->name;?> + project]->deleted):?> + lang->project->deleted;?> + + + actor);?> date;?> diff --git a/module/project/model.php b/module/project/model.php index 1bd12fd0cb..aacba0b298 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -2613,5 +2613,14 @@ class projectModel extends model } return $menu; + } + public function getProjectName($executionIdList) + { + return $this->dao->select('t1.id, t2.id as projectID, t2.name, t2.deleted')->from(TABLE_EXECUTION)->alias('t1') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') + ->where('t1.id')->in($executionIdList) + ->fetchAll('projectID'); + } + } From a68ba64ad8d549effa29a1b8dbb83d9029d461e7 Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 04:50:57 +0000 Subject: [PATCH 020/223] Revert "* Finish task #64969." This reverts commit bacc10ccc0a408f8c336939eb32ad6d5bd4b3e89. --- framework/base/helper.class.php | 4 ++-- lib/dao/dao.class.php | 12 ++++++------ module/action/control.php | 12 +----------- module/action/view/trash.html.php | 9 --------- module/project/model.php | 9 --------- 5 files changed, 9 insertions(+), 37 deletions(-) diff --git a/framework/base/helper.class.php b/framework/base/helper.class.php index 8c98c97628..c787cc08fe 100644 --- a/framework/base/helper.class.php +++ b/framework/base/helper.class.php @@ -885,8 +885,8 @@ function getWebRoot($full = false) * * @param array|object $var * @param string|int $key - * @param mixed $valueWhenNone value when the key not exists. - * @param mixed $valueWhenExists value when the key exists. + * @param mixed $valueWhenNone value when the key not exits. + * @param mixed $valueWhenExists value when the key exits. * @access public * @return mixed */ diff --git a/lib/dao/dao.class.php b/lib/dao/dao.class.php index f3d50e89e6..0695c65d0d 100644 --- a/lib/dao/dao.class.php +++ b/lib/dao/dao.class.php @@ -29,7 +29,7 @@ class dao extends baseDAO /** * 设置需要更新或插入的数据。 * Set the data to update or insert. - * + * * @param object $data the data object or array * @access public * @return object the dao object self. @@ -182,7 +182,7 @@ class dao extends baseDAO /** * Check workFlow field rule. - * + * * @access public * @return object the dao object self. */ @@ -232,10 +232,10 @@ class dao extends baseDAO } /** - * 检查工作流扩展字段 - * check workflow extend field - * - * @param array $fields + * 检查工作流扩展字段 + * check workflow extend field + * + * @param array $fields * @access public * @return object the dao object self */ diff --git a/module/action/control.php b/module/action/control.php index b4c280f25d..6edd4aed0d 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -52,8 +52,6 @@ class action extends control public function trash($browseType = 'all', $type = 'all', $byQuery = false, $queryID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->loadModel('backup'); - $this->app->loadLang('execution'); - $this->app->loadLang('project'); /* Save session. */ $uri = $this->app->getURI(true); @@ -117,15 +115,6 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } - /* Get the project name of executions. */ - if($browseType == 'execution') - { - $executionIdList = array(); - foreach($trashes as $trash) $executionIdList[] = $trash->objectID; - $projectPairs = $this->loadModel('project')->getProjectName($executionIdList); - $this->view->projectPairs = $projectPairs; - } - /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; @@ -141,6 +130,7 @@ class action extends control $this->view->preferredTypeConfig = $preferredTypeConfig; $this->view->byQuery = $byQuery; $this->view->queryID = $queryID; + $this->display(); } diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index efeaae5ae7..03352675bb 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -82,7 +82,6 @@ action->objectType);?> idAB);?> action->objectName;?>lang->execution->project;?> action->actor);?> action->date);?> actions;?> - - project]->name;?> - project]->deleted):?> - lang->project->deleted;?> - - - actor);?> date;?> diff --git a/module/project/model.php b/module/project/model.php index aacba0b298..1bd12fd0cb 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -2613,14 +2613,5 @@ class projectModel extends model } return $menu; - } - public function getProjectName($executionIdList) - { - return $this->dao->select('t1.id, t2.id as projectID, t2.name, t2.deleted')->from(TABLE_EXECUTION)->alias('t1') - ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') - ->where('t1.id')->in($executionIdList) - ->fetchAll('projectID'); - } - } From 730c63859893f773f598f4b484b2c349bebd23cd Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 04:57:54 +0000 Subject: [PATCH 021/223] * Finish task #64969. --- module/action/control.php | 13 +++++++++++++ module/action/css/trash.css | 3 +++ module/action/view/trash.html.php | 17 +++++++++++++++++ module/project/model.php | 7 ++++--- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index 6edd4aed0d..dcfa277933 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -115,6 +115,19 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } +<<<<<<< Updated upstream +======= + /* Get the project name of executions. */ + if($browseType == 'execution') + { + $this->app->loadLang('execution'); + $projectIdList = array(); + foreach($trashes as $trash) $projectIdList[] = $trash->project; + $projectList = $this->loadModel('project')->getByIdList($projectIdList, 'all'); + $this->view->projectList = $projectList; + } + +>>>>>>> Stashed changes /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; diff --git a/module/action/css/trash.css b/module/action/css/trash.css index e5b7a61042..94cf000e62 100755 --- a/module/action/css/trash.css +++ b/module/action/css/trash.css @@ -6,3 +6,6 @@ .dropdown-menu .btn-active-text:hover .text:after {border-bottom: 0px;} #querybox #searchform{border-bottom: 1px solid #ddd; margin-bottom: 20px;} +td.flex {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center; margin-bottom: 0px;} +.flex span.label-danger {margin-left: 5px; min-width: 50px;} +.c-name > .text-ellipsis {text-overflow: clip;} diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 03352675bb..e2c235b94d 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -82,6 +82,12 @@ action->objectType);?> idAB);?> action->objectName;?>lang->execution->project;?>action->actor);?> action->date);?> actions;?> + project]->name;?> + project]->deleted):?> + lang->project->deleted;?> + + actor);?> date;?> diff --git a/module/project/model.php b/module/project/model.php index 1bd12fd0cb..b85b11c5de 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -797,16 +797,17 @@ class projectModel extends model /** * Get project by id list. * - * @param array $projectIdList + * @param array $projectIdList + * @param string $mode all * @access public * @return object */ - public function getByIdList($projectIdList = array()) + public function getByIdList($projectIdList = array(), $mode = '') { return $this->dao->select('*')->from(TABLE_PROJECT) ->where('type')->eq('project') ->andWhere('id')->in($projectIdList) - ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin and $mode != 'all')->andWhere('id')->in($this->app->user->view->projects)->fi() ->fetchAll('id'); } From 93adfc3971a311e4c49b307d0f290e0df51da906 Mon Sep 17 00:00:00 2001 From: dongli Date: Thu, 18 Aug 2022 06:41:41 +0000 Subject: [PATCH 022/223] * Finish task #64969. --- framework/base/helper.class.php | 4 ++-- module/action/control.php | 12 +++++++++++- module/action/view/trash.html.php | 9 +++++++++ module/project/model.php | 9 +++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/framework/base/helper.class.php b/framework/base/helper.class.php index b39d02977d..72649210d5 100644 --- a/framework/base/helper.class.php +++ b/framework/base/helper.class.php @@ -890,8 +890,8 @@ function getWebRoot($full = false) * * @param array|object $var * @param string|int $key - * @param mixed $valueWhenNone value when the key not exits. - * @param mixed $valueWhenExists value when the key exits. + * @param mixed $valueWhenNone value when the key not exists. + * @param mixed $valueWhenExists value when the key exists. * @access public * @return mixed */ diff --git a/module/action/control.php b/module/action/control.php index 6edd4aed0d..b4c280f25d 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -52,6 +52,8 @@ class action extends control public function trash($browseType = 'all', $type = 'all', $byQuery = false, $queryID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->loadModel('backup'); + $this->app->loadLang('execution'); + $this->app->loadLang('project'); /* Save session. */ $uri = $this->app->getURI(true); @@ -115,6 +117,15 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } + /* Get the project name of executions. */ + if($browseType == 'execution') + { + $executionIdList = array(); + foreach($trashes as $trash) $executionIdList[] = $trash->objectID; + $projectPairs = $this->loadModel('project')->getProjectName($executionIdList); + $this->view->projectPairs = $projectPairs; + } + /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; @@ -130,7 +141,6 @@ class action extends control $this->view->preferredTypeConfig = $preferredTypeConfig; $this->view->byQuery = $byQuery; $this->view->queryID = $queryID; - $this->display(); } diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 03352675bb..efeaae5ae7 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -82,6 +82,7 @@ action->objectType);?> idAB);?> action->objectName;?>lang->execution->project;?> action->actor);?> action->date);?> actions;?> + + project]->name;?> + project]->deleted):?> + lang->project->deleted;?> + + + actor);?> date;?> diff --git a/module/project/model.php b/module/project/model.php index 1bd12fd0cb..aacba0b298 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -2613,5 +2613,14 @@ class projectModel extends model } return $menu; + } + public function getProjectName($executionIdList) + { + return $this->dao->select('t1.id, t2.id as projectID, t2.name, t2.deleted')->from(TABLE_EXECUTION)->alias('t1') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') + ->where('t1.id')->in($executionIdList) + ->fetchAll('projectID'); + } + } From 9fa036cb3429680b067d8d52979a1abfe361d4fc Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 04:50:57 +0000 Subject: [PATCH 023/223] Revert "* Finish task #64969." This reverts commit bacc10ccc0a408f8c336939eb32ad6d5bd4b3e89. --- framework/base/helper.class.php | 4 ++-- lib/dao/dao.class.php | 12 ++++++------ module/action/control.php | 12 +----------- module/action/view/trash.html.php | 9 --------- module/project/model.php | 9 --------- 5 files changed, 9 insertions(+), 37 deletions(-) diff --git a/framework/base/helper.class.php b/framework/base/helper.class.php index 72649210d5..b39d02977d 100644 --- a/framework/base/helper.class.php +++ b/framework/base/helper.class.php @@ -890,8 +890,8 @@ function getWebRoot($full = false) * * @param array|object $var * @param string|int $key - * @param mixed $valueWhenNone value when the key not exists. - * @param mixed $valueWhenExists value when the key exists. + * @param mixed $valueWhenNone value when the key not exits. + * @param mixed $valueWhenExists value when the key exits. * @access public * @return mixed */ diff --git a/lib/dao/dao.class.php b/lib/dao/dao.class.php index e18d52847f..c6326f5a46 100644 --- a/lib/dao/dao.class.php +++ b/lib/dao/dao.class.php @@ -29,7 +29,7 @@ class dao extends baseDAO /** * 设置需要更新或插入的数据。 * Set the data to update or insert. - * + * * @param object $data the data object or array * @access public * @return object the dao object self. @@ -182,7 +182,7 @@ class dao extends baseDAO /** * Check workFlow field rule. - * + * * @access public * @return object the dao object self. */ @@ -232,10 +232,10 @@ class dao extends baseDAO } /** - * 检查工作流扩展字段 - * check workflow extend field - * - * @param array $fields + * 检查工作流扩展字段 + * check workflow extend field + * + * @param array $fields * @access public * @return object the dao object self */ diff --git a/module/action/control.php b/module/action/control.php index b4c280f25d..6edd4aed0d 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -52,8 +52,6 @@ class action extends control public function trash($browseType = 'all', $type = 'all', $byQuery = false, $queryID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->loadModel('backup'); - $this->app->loadLang('execution'); - $this->app->loadLang('project'); /* Save session. */ $uri = $this->app->getURI(true); @@ -117,15 +115,6 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } - /* Get the project name of executions. */ - if($browseType == 'execution') - { - $executionIdList = array(); - foreach($trashes as $trash) $executionIdList[] = $trash->objectID; - $projectPairs = $this->loadModel('project')->getProjectName($executionIdList); - $this->view->projectPairs = $projectPairs; - } - /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; @@ -141,6 +130,7 @@ class action extends control $this->view->preferredTypeConfig = $preferredTypeConfig; $this->view->byQuery = $byQuery; $this->view->queryID = $queryID; + $this->display(); } diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index efeaae5ae7..03352675bb 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -82,7 +82,6 @@ action->objectType);?> idAB);?> action->objectName;?>lang->execution->project;?> action->actor);?> action->date);?> actions;?> - - project]->name;?> - project]->deleted):?> - lang->project->deleted;?> - - - actor);?> date;?> diff --git a/module/project/model.php b/module/project/model.php index aacba0b298..1bd12fd0cb 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -2613,14 +2613,5 @@ class projectModel extends model } return $menu; - } - public function getProjectName($executionIdList) - { - return $this->dao->select('t1.id, t2.id as projectID, t2.name, t2.deleted')->from(TABLE_EXECUTION)->alias('t1') - ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') - ->where('t1.id')->in($executionIdList) - ->fetchAll('projectID'); - } - } From e3800e4e49854fb44b16c8d9239f49d90167156d Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 04:57:54 +0000 Subject: [PATCH 024/223] * Finish task #64969. --- module/action/control.php | 13 +++++++++++++ module/action/css/trash.css | 3 +++ module/action/view/trash.html.php | 17 +++++++++++++++++ module/project/model.php | 7 ++++--- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index 6edd4aed0d..dcfa277933 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -115,6 +115,19 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } +<<<<<<< Updated upstream +======= + /* Get the project name of executions. */ + if($browseType == 'execution') + { + $this->app->loadLang('execution'); + $projectIdList = array(); + foreach($trashes as $trash) $projectIdList[] = $trash->project; + $projectList = $this->loadModel('project')->getByIdList($projectIdList, 'all'); + $this->view->projectList = $projectList; + } + +>>>>>>> Stashed changes /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; diff --git a/module/action/css/trash.css b/module/action/css/trash.css index e5b7a61042..94cf000e62 100755 --- a/module/action/css/trash.css +++ b/module/action/css/trash.css @@ -6,3 +6,6 @@ .dropdown-menu .btn-active-text:hover .text:after {border-bottom: 0px;} #querybox #searchform{border-bottom: 1px solid #ddd; margin-bottom: 20px;} +td.flex {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center; margin-bottom: 0px;} +.flex span.label-danger {margin-left: 5px; min-width: 50px;} +.c-name > .text-ellipsis {text-overflow: clip;} diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 03352675bb..e2c235b94d 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -82,6 +82,12 @@ action->objectType);?> idAB);?> action->objectName;?>lang->execution->project;?>action->actor);?> action->date);?> actions;?> + project]->name;?> + project]->deleted):?> + lang->project->deleted;?> + + actor);?> date;?> diff --git a/module/project/model.php b/module/project/model.php index 1bd12fd0cb..b85b11c5de 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -797,16 +797,17 @@ class projectModel extends model /** * Get project by id list. * - * @param array $projectIdList + * @param array $projectIdList + * @param string $mode all * @access public * @return object */ - public function getByIdList($projectIdList = array()) + public function getByIdList($projectIdList = array(), $mode = '') { return $this->dao->select('*')->from(TABLE_PROJECT) ->where('type')->eq('project') ->andWhere('id')->in($projectIdList) - ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->beginIF(!$this->app->user->admin and $mode != 'all')->andWhere('id')->in($this->app->user->view->projects)->fi() ->fetchAll('id'); } From 71c48926fdee60c36ac74fe38035d3fc2353f469 Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 05:18:52 +0000 Subject: [PATCH 025/223] * Finish task #64969. --- module/action/control.php | 4 ---- module/action/view/trash.html.php | 6 ------ 2 files changed, 10 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index dcfa277933..c7926adfc5 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -115,8 +115,6 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } -<<<<<<< Updated upstream -======= /* Get the project name of executions. */ if($browseType == 'execution') { @@ -127,7 +125,6 @@ class action extends control $this->view->projectList = $projectList; } ->>>>>>> Stashed changes /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; @@ -143,7 +140,6 @@ class action extends control $this->view->preferredTypeConfig = $preferredTypeConfig; $this->view->byQuery = $byQuery; $this->view->queryID = $queryID; - $this->display(); } diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index e2c235b94d..33062b95bf 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -82,12 +82,9 @@ action->objectType);?> idAB);?> action->objectName;?>lang->execution->project;?> action->actor);?> action->date);?> actions;?> project]->name;?> @@ -151,7 +146,6 @@ actor);?> date;?> From 7d89582ab71a0dbeaf1e0624c21f4d6a9422035b Mon Sep 17 00:00:00 2001 From: liuhong Date: Fri, 19 Aug 2022 07:10:02 +0000 Subject: [PATCH 026/223] *Fix bug #26000. --- module/project/model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/project/model.php b/module/project/model.php index 89b3187662..1e054e30c9 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -758,7 +758,8 @@ class projectModel extends model ->where('type')->eq('project') ->andWhere('deleted')->eq(0) ->andWhere('vision')->eq($this->config->vision) - ->beginIF($programID !== '')->andWhere('parent')->eq($programID)->fi() + ->beginIF($programID !== '' and $this->app->tab !== 'product')->andWhere('parent')->eq($programID)->fi() + ->beginIF($programID !== '' and $this->app->tab == 'product')->andWhere('path')->like("%,$programID,%")->fi() ->beginIF($status != 'all' and $status != 'noclosed')->andWhere('status')->eq($status)->fi() ->beginIF($excludedModel)->andWhere('model')->ne($excludedModel)->fi() ->beginIF($model)->andWhere('model')->eq($model)->fi() From 475cb7bf60a504181ef1c0f93d285a229df90a17 Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 07:13:21 +0000 Subject: [PATCH 027/223] Remove the unused code. --- module/action/control.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index 48253b46d5..c7926adfc5 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -115,11 +115,6 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } -<<<<<<< HEAD -======= -<<<<<<< Updated upstream -======= ->>>>>>> 730c63859893f773f598f4b484b2c349bebd23cd /* Get the project name of executions. */ if($browseType == 'execution') { @@ -130,10 +125,6 @@ class action extends control $this->view->projectList = $projectList; } -<<<<<<< HEAD -======= ->>>>>>> Stashed changes ->>>>>>> 730c63859893f773f598f4b484b2c349bebd23cd /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; From 27881df4317a28404a624f83eb14cbc623681d3b Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 07:23:57 +0000 Subject: [PATCH 028/223] * Finish #task64969. --- module/action/view/trash.html.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 6be172e54d..153abeda21 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -85,9 +85,7 @@ systemMode == 'new' and $currentObjectType == 'execution'):?> lang->execution->project;?> lang->execution->project;?>action->actor);?> action->date);?> actions;?>
    action->objectTypes, $action->objectType, '');?> objectID;?> objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; + action->actor);?> action->date);?> actions;?>
    action->objectTypes, $action->objectType, '');?> objectID;?> objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; $methodName = 'view'; if($module == 'caselib') { From 4cbf16a82dd6e8755d00326487654aeb8a01f3f8 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 19 Aug 2022 15:28:14 +0800 Subject: [PATCH 029/223] * * Modify recall story and delete change assign. --- module/group/lang/resource.php | 42 ++++++++--------- module/story/control.php | 77 +++++++++---------------------- module/story/js/change.js | 18 -------- module/story/lang/de.php | 3 +- module/story/lang/en.php | 3 +- module/story/lang/fr.php | 3 +- module/story/lang/vi.php | 3 +- module/story/lang/zh-cn.php | 3 +- module/story/model.php | 22 ++++----- module/story/view/change.html.php | 20 +++----- module/story/view/edit.html.php | 2 +- module/story/view/recall.html.php | 43 ----------------- 12 files changed, 68 insertions(+), 171 deletions(-) delete mode 100644 module/story/view/recall.html.php diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 675a1f3494..52c30f2741 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -494,8 +494,7 @@ $lang->resource->story->change = 'changeAction'; $lang->resource->story->review = 'reviewAction'; $lang->resource->story->submitReview = 'submitReview'; $lang->resource->story->batchReview = 'batchReview'; -$lang->resource->story->recall = 'recall'; -$lang->resource->story->recallChange = 'recallChange'; +$lang->resource->story->recall = 'recallAction'; $lang->resource->story->assignTo = 'assignAction'; $lang->resource->story->close = 'closeAction'; $lang->resource->story->batchClose = 'batchClose'; @@ -528,26 +527,25 @@ $lang->story->methodOrder[40] = 'review'; $lang->story->methodOrder[45] = 'submitReview'; $lang->story->methodOrder[50] = 'batchReview'; $lang->story->methodOrder[55] = 'recall'; -$lang->story->methodOrder[60] = 'recallChange'; -$lang->story->methodOrder[65] = 'close'; -$lang->story->methodOrder[70] = 'batchClose'; -$lang->story->methodOrder[75] = 'batchChangePlan'; -$lang->story->methodOrder[80] = 'batchChangeStage'; -$lang->story->methodOrder[85] = 'assignTo'; -$lang->story->methodOrder[90] = 'batchAssignTo'; -$lang->story->methodOrder[95] = 'activate'; -$lang->story->methodOrder[100] = 'tasks'; -$lang->story->methodOrder[105] = 'bugs'; -$lang->story->methodOrder[110] = 'cases'; -$lang->story->methodOrder[115] = 'zeroCase'; -$lang->story->methodOrder[120] = 'report'; -$lang->story->methodOrder[125] = 'linkStory'; -$lang->story->methodOrder[130] = 'batchChangeBranch'; -$lang->story->methodOrder[135] = 'batchChangeModule'; -$lang->story->methodOrder[140] = 'batchToTask'; -$lang->story->methodOrder[145] = 'track'; -$lang->story->methodOrder[150] = 'processStoryChange'; -$lang->story->methodOrder[155] = 'linkStories'; +$lang->story->methodOrder[60] = 'close'; +$lang->story->methodOrder[65] = 'batchClose'; +$lang->story->methodOrder[70] = 'batchChangePlan'; +$lang->story->methodOrder[75] = 'batchChangeStage'; +$lang->story->methodOrder[80] = 'assignTo'; +$lang->story->methodOrder[85] = 'batchAssignTo'; +$lang->story->methodOrder[90] = 'activate'; +$lang->story->methodOrder[95] = 'tasks'; +$lang->story->methodOrder[100] = 'bugs'; +$lang->story->methodOrder[105] = 'cases'; +$lang->story->methodOrder[110] = 'zeroCase'; +$lang->story->methodOrder[115] = 'report'; +$lang->story->methodOrder[120] = 'linkStory'; +$lang->story->methodOrder[125] = 'batchChangeBranch'; +$lang->story->methodOrder[130] = 'batchChangeModule'; +$lang->story->methodOrder[135] = 'batchToTask'; +$lang->story->methodOrder[140] = 'track'; +$lang->story->methodOrder[145] = 'processStoryChange'; +$lang->story->methodOrder[150] = 'linkStories'; if($config->URAndSR) $lang->story->methodOrder[160] = 'linkRequirements'; diff --git a/module/story/control.php b/module/story/control.php index dcc6c2a808..1212ac76f0 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1508,60 +1508,20 @@ class story extends control { $story = $this->story->getById($storyID); - if($story->status == 'changing') - { - echo $this->fetch('story', 'recallChange', "storyID=$storyID&confrim=$confirm"); - } - elseif($story->status == 'reviewing' and empty($story->changedBy)) - { - /* When the story are in the status of reviewing but not changed, only recall review.*/ - echo $this->fetch('story', 'recallReview', "storyID=$storyID&from=$from"); - } - elseif($story->status == 'reviewing' and !empty($story->changedBy)) - { - if($_POST) - { - $recallResult = $this->post->recallList; - if($recallResult == 'recallReview') - { - $this->story->recallReview($storyID); - $this->loadModel('action')->create('story', $storyID, 'Recalled'); - } - if($recallResult == 'recallChange') - { - $this->story->recallChange($storyID); - $this->loadModel('action')->create('story', $storyID, 'recalledChange'); - } - - $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); - echo js::locate($locateLink, 'parent.parent'); - } - - $this->view->story = $story; - $this->view->users = $this->user->getPairs('noclosed|noletter'); - $this->view->actions = $this->action->getList('story', $storyID); - $this->display(); - } - } - - /** - * Recall the story change. - * - * @param int $storyID - * @param string $confirm - * @access public - * @return void - */ - public function recallChange($storyID, $confirm = 'no') - { if($confirm == 'no') { - return print(js::confirm($this->lang->story->recallChangeTips, $this->createLink('story', 'recall', "story=$storyID&from=lite&confirm=yes"))); + $confirmTips = $story->status == 'changing' ? $this->lang->story->confirmRecallChange : $this->lang->story->confirmRecallReview; + return print(js::confirm($confirmTips, $this->createLink('story', 'recall', "storyID=$storyID&from=lite&confirm=yes"))); } else { - $this->story->recallChange($storyID); - $this->loadModel('action')->create('story', $storyID, 'recalledChange'); + if($story->status == 'changing') $this->story->recallChange($storyID); + if($story->status == 'reviewing') $this->story->recallReview($storyID); + + $action = $story->status == 'changing' ? 'recalledChange' : 'Recalled'; + $this->loadModel('action')->create('story', $storyID, $action); + + if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID={$storyID}&from=view"))); $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); echo js::locate($locateLink, 'parent'); @@ -1576,15 +1536,22 @@ class story extends control * @access public * @return void */ - public function recallReview($storyID, $from = 'list') + public function recallReview($storyID, $from = 'list', $confirm = 'no') { - $this->story->recallReview($storyID); - $this->loadModel('action')->create('story', $storyID, 'Recalled'); + if($confirm == 'no') + { + return print(js::confirm($this->lang->story->confirmRecallReview, $this->createLink('story', 'recall', "story=$storyID&from=lite&confirm=yes"))); + } + else + { + $this->story->recallReview($storyID); + $this->loadModel('action')->create('story', $storyID, 'Recalled'); - if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID={$storyID}&from=view"))); + if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID={$storyID}&from=view"))); - $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); - echo js::locate($locateLink, 'parent'); + $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); + echo js::locate($locateLink, 'parent'); + } } /** diff --git a/module/story/js/change.js b/module/story/js/change.js index 8cd06f0d1b..48b438264f 100644 --- a/module/story/js/change.js +++ b/module/story/js/change.js @@ -15,21 +15,3 @@ $(function() if($('.tabs .tab-content .tab-pane.active').children().length == 0) $('.tabs .nav-tabs li.active').css('border-bottom', '1px solid #ccc'); }); - -/** - * Load assignedTo. - * - * @access public - * @return void - */ -function loadAssignedTo() -{ - var assignees = $('#reviewer').val(); - var link = createLink('story', 'ajaxGetAssignedTo', 'type=change&storyID=' + storyID + '&assignees=' + assignees); - $.post(link, function(data) - { - $('#assignedTo').replaceWith(data); - $('#assignedToBox .picker').remove(); - $('#assignedTo').picker(); - }); -} diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 4cfb5f7f0b..de44ec1319 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -304,7 +304,8 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; -$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallChange = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallReview = "Are you sure you want to withdraw the review?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Story Bereich'; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index 92cc28d5db..c129d9f956 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -304,7 +304,8 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; -$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallChange = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallReview = "Are you sure you want to withdraw the review?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Scope'; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index 4d5315f7df..a8e0d948aa 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -304,7 +304,8 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; -$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallChange = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallReview = "Are you sure you want to withdraw the review?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Périmètre'; diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php index f33f4c7067..c9ac6134ff 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -296,7 +296,8 @@ $lang->story->estimateMustBePlus = 'Estimated value cannot be negative'; $lang->story->confirmChangeBranch = $lang->SRCommon . ' %s is linked to the plan of its linked branch. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan of its linked branch. Do you want to continue edit ' . $lang->SRCommon . '?'; $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the branch of its plan. If the branch is edited, ' . $lang->SRCommon . ' will be removed from the plan. Do you want to continue edit branch ?'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; -$lang->story->recallChangeTips = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallChange = "After undo the change, the story content will revert to the version before the change. Are you sure you want to undo?"; +$lang->story->confirmRecallReview = "Are you sure you want to withdraw the review?"; $lang->story->form = new stdclass(); $lang->story->form->area = 'Phạm vi'; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index f721078727..7439fcf443 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -304,7 +304,8 @@ $lang->story->estimateMustBePlus = '估算值不能是负数'; $lang->story->confirmChangeBranch = $lang->SRCommon . '%s已关联在之前所属分支的计划中,调整分支后,' . $lang->SRCommon . '将从之前所属分支的计划中移除,请确认是否继续修改上述' . $lang->SRCommon . '的分支。'; $lang->story->confirmChangePlan = $lang->SRCommon . '%s已关联在之前计划的所属分支中,调整分支后,' . $lang->SRCommon . '将会从计划中移除,请确认是否继续修改计划的所属分支。'; $lang->story->errorDuplicateStory = $lang->SRCommon . '%s不存在'; -$lang->story->recallChangeTips = "撤销变更后,需求内容会回退至变更前的版本,您确定要撤销吗?"; +$lang->story->confirmRecallChange = "撤销变更后,需求内容会回退至变更前的版本,您确定要撤销吗?"; +$lang->story->confirmRecallReview = "您确定要撤回评审吗?"; $lang->story->form = new stdclass(); $lang->story->form->area = "该{$lang->SRCommon}所属范围"; diff --git a/module/story/model.php b/module/story/model.php index 1602419131..50cbbd9a64 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -696,7 +696,6 @@ class storyModel extends model ->setDefault('lastEditedBy', $this->app->user->account) ->add('id', $storyID) ->add('lastEditedDate', $now) - ->setIF(!$this->post->assignedTo, 'assignedTo', '') ->setIF($specChanged, 'version', $oldStory->version + 1) ->setIF($specChanged, 'reviewedBy', '') ->setIF($specChanged, 'changedBy', $this->app->user->account) @@ -1567,8 +1566,9 @@ class storyModel extends model */ public function recallReview($storyID) { - $story = $this->getById($storyID); - $status = $story->changedBy ? 'changing' : 'draft'; + $story = $this->getById($storyID); + $isChanged = $story->changedBy ? true : false; + $status = $isChanged ? 'changing' : 'draft'; $this->dao->update(TABLE_STORY)->set('status')->eq($status)->where('id')->eq($storyID)->exec(); $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($story->version)->exec(); } @@ -4158,7 +4158,7 @@ class storyModel extends model if(strpos('draft,changing', $story->status) !== false) { - $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id", $story, $type, 'sub-review', '', 'iframe', true); + $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id", $story, $type, 'sub-review', '', 'iframe', true, "data-width='50%'"); } else { @@ -4186,11 +4186,8 @@ class storyModel extends model $menu .= $this->buildMenu('story', 'review', $params . "&from=$story->from", $story, $type, 'search', '', 'showinonlybody', false, '', $title); } - $title = $this->lang->story->recallAction; - $iframe = ($story->status == 'reviewing' and !empty($story->changedBy)) ? 'iframe' : 'showinonlybody'; - if($story->status == 'changing') $title = $this->lang->story->recallChange; - if($story->status == 'reviewing' and empty($story->changedBy)) $title = $this->lang->story->recall; $isClick = $this->isClickable($story, 'recall'); + $title = $story->status == 'changing' ? $this->lang->story->recallChange : $this->lang->story->recall; if(!$isClick and $story->status != 'closed') { if($story->status == 'draft' and empty($storyReviewer)) $title = $this->lang->story->recallTip['recalled']; @@ -4198,7 +4195,7 @@ class storyModel extends model if(empty($story->reviewedBy) and strpos('draft,changing', $story->status) !== false and !empty($story->reviewer) and $this->app->user->account != $story->openedBy) $title = $this->lang->story->recallTip['notOpenedBy']; if($story->status == 'active' and empty($story->reviewer)) $title = $this->lang->story->recallTip['actived']; } - $menu .= $this->buildMenu('story', 'recall', $params, $story, $type, 'undo', 'hiddenwin', $iframe, true, 'data-width="40%"', $title); + $menu .= $this->buildMenu('story', 'recall', $params, $story, $type, 'undo', 'hiddenwin', 'showinonlybody', false, '', $title); $menu .= $this->buildMenu('story', 'close', $params, $story, $type, '', '', 'iframe', true); $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type, '', '', 'showinonlybody', false); @@ -4237,11 +4234,8 @@ class storyModel extends model { $menu .= $this->buildMenu('story', 'change', $params, $story, $type, 'alter', '', 'showinonlybody'); - $title = $this->lang->story->recallAction; - $iframe = ($story->status == 'reviewing' and !empty($story->changedBy)) ? 'iframe' : 'showinonlybody'; - if($story->status == 'changing') $title = $this->lang->story->recallChange; - if($story->status == 'reviewing' and empty($story->changedBy)) $title = $this->lang->story->recall; - $menu .= $this->buildMenu('story', 'recall', $params . '&from=view', $story, $type, 'undo', 'hiddenwin', $iframe, true, 'data-width="40%"', $title); + $title = $story->status == 'changing' ? $this->lang->story->recallChange : $this->lang->story->recall; + $menu .= $this->buildMenu('story', 'recall', $params . '&from=view', $story, $type, 'undo', 'hiddenwin', 'showinonlybody', false, '', $title); $menu .= $this->buildMenu('story', 'review', $params, $story, $type, 'search', '', 'showinonlybody'); diff --git a/module/story/view/change.html.php b/module/story/view/change.html.php index c39ad7cdcb..d274aceec6 100644 --- a/module/story/view/change.html.php +++ b/module/story/view/change.html.php @@ -34,12 +34,6 @@ -
    -
    story->assignedTo;?>
    - assignedTo, "class='form-control picker-select'");?> -
    -
    story->status;?>
    story->title;?> +
    story->spec;?>spec), 'rows=8 class="form-control"');?>story->specTemplate;?>spec), 'rows=8 class="form-control"');?>story->specTemplate;?>
    story->verify;?>verify), 'rows=6 class="form-control"');?>verify), 'rows=6 class="form-control"');?>
    story->comment;?>
    attatch;?> + fetch('file', 'printFiles', array('files' => $files, 'fieldset' => 'true', 'object' => $story, 'method' => 'change'));?> fetch('file', 'buildform');?>
    story->checkAffection;?>
    + lastEditedDate); echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide'); diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index 476413146f..501c615142 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -98,7 +98,7 @@ if(strpos('draft,changing', $story->status) !== false) { echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide'); - echo html::commonButton($lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide'); + echo html::commonButton($story->status == 'changing' ? $lang->story->doNotSubmit : $lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide'); } else { diff --git a/module/story/view/recall.html.php b/module/story/view/recall.html.php deleted file mode 100644 index 3d3e089421..0000000000 --- a/module/story/view/recall.html.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @package story - * @version $Id: submitreview.html.php 935 2022-07-20 09:49:24Z $ - * @link https://www.zentao.net - */ -?> - - -
    -
    -
    -

    - id;?> - title'>" . $story->title . '') : html::a($this->createLink('story', 'view', 'story=' . $story->id), $story->title);?> - - arrow . $lang->story->recallAction;?> - -

    -
    - - - - - - - - -
    story->recallList, 'recallReview');?>
    - -
    - -
    -
    - - From 08f38590e10a746e7fffa4025af0e85912eb1bfc Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 07:45:42 +0000 Subject: [PATCH 030/223] * Finish task #64969. --- module/action/control.php | 4 ++-- module/action/view/trash.html.php | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index c7926adfc5..29eaf6eeb3 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -121,8 +121,7 @@ class action extends control $this->app->loadLang('execution'); $projectIdList = array(); foreach($trashes as $trash) $projectIdList[] = $trash->project; - $projectList = $this->loadModel('project')->getByIdList($projectIdList, 'all'); - $this->view->projectList = $projectList; + $this->view->projectList = $this->loadModel('project')->getByIdList($projectIdList, 'all'); } /* Title and position. */ @@ -140,6 +139,7 @@ class action extends control $this->view->preferredTypeConfig = $preferredTypeConfig; $this->view->byQuery = $byQuery; $this->view->queryID = $queryID; + $this->display(); } diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 153abeda21..1f0e6dd1d5 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -85,9 +85,21 @@ systemMode == 'new' and $currentObjectType == 'execution'):?>
    lang->execution->project;?> action->actor);?> action->date);?> actions;?>
    action->objectTypes, $action->objectType, '');?> objectID;?> objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; - $methodName = 'view'; - if($module == 'caselib') + action->actor);?>action->date);?>actions;?>
    action->objectTypes, $action->objectType, '');?>objectID;?> + objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; + $methodName = 'view'; + if($module == 'caselib') { $methodName = 'view'; $module = 'caselib'; From b0be7fe54b14c5e26bc87e186bd9c52cd65e89ee Mon Sep 17 00:00:00 2001 From: dongli Date: Fri, 19 Aug 2022 07:50:31 +0000 Subject: [PATCH 031/223] * Finish task #64969. --- module/action/view/trash.html.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 1f0e6dd1d5..d84acf0a2f 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -89,17 +89,17 @@ action->date);?> actions;?>
    action->objectTypes, $action->objectType, '');?>objectID;?> - objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; - $methodName = 'view'; - if($module == 'caselib') + +
    action->objectTypes, $action->objectType, '');?>objectID;?> + objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; + $methodName = 'view'; + if($module == 'caselib') { $methodName = 'view'; $module = 'caselib'; From faf66f2d63f5f36a821682cfe1e69a545d13b205 Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Fri, 19 Aug 2022 07:51:38 +0000 Subject: [PATCH 032/223] * Optimization task #64888. --- module/program/js/common.js | 27 +++++++++++++++------------ module/project/js/common.js | 17 +++++++++-------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/module/program/js/common.js b/module/program/js/common.js index 17b3a4acf1..46541b6234 100644 --- a/module/program/js/common.js +++ b/module/program/js/common.js @@ -283,7 +283,7 @@ $(function() if($(this).prop('checked')) { $('#budget').val('').attr('disabled', 'disabled'); - if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').remove(); + if($('#beyondBudgetTip').length > 0) $('#beyondBudgetTip').parent().parent().remove(); } else { @@ -362,14 +362,15 @@ function compareChildDate() var dateTip = ''; if(programBegin > childBegin) { - dateTip = "

    " + beginGreateChild + childInfo.minChildBegin + "

    " + ignore + "

    "; + dateTip = "

    " + beginGreateChild + childInfo.minChildBegin + "

    " + ignore + "

    " + endLetterChild + childInfo.maxChildEnd + "

    " + ignore + "

    " + beginLetterParent + data.selectedProgramBegin + "

    " + ignore + "

    " + endGreaterParent + data.selectedProgramEnd + "

    " + ignore + "

    " + budgetOverrun + currencySymbol[data.budgetUnit] + data.availableBudget + "

    " + ignore + "

    " + budgetOverrun + currencySymbol[data.budgetUnit] + data.availableBudget.toFixed(2) + "

    " + ignore + "

    " + dateTip + "

    " + ignore + "

    action->objectTypes, $action->objectType, '');?> objectID;?> - objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; + objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"; $methodName = 'view'; if($module == 'caselib') { From 42a5ae7f3cf4b4d66f79a98ca8b5b9dba7e24304 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Sat, 20 Aug 2022 20:11:27 +0800 Subject: [PATCH 034/223] * * Modify activate story. --- module/story/control.php | 7 +++--- module/story/model.php | 35 +++++++++++++---------------- module/story/view/activate.html.php | 8 ------- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 1212ac76f0..802ff75c8f 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1199,7 +1199,6 @@ class story extends control } $this->commonAction($storyID); - $this->story->setActivateStatus($storyID); /* Assign. */ $this->view->title = $this->lang->story->activate . "STORY" . $this->lang->colon . $this->view->story->title; @@ -1623,7 +1622,8 @@ class story extends control if($changes) { $preStatus = $story->status; - if($preStatus == 'reviewing') $preStatus = $story->changedBy ? 'changing' : 'draft'; + $isChanged = $story->changedBy ? true : false; + if($preStatus == 'reviewing') $preStatus = $isChanged ? 'changing' : 'draft'; $actionID = $this->action->create('story', $storyID, 'Closed', $this->post->comment, ucfirst($this->post->closedReason) . ($this->post->duplicateStory ? ':' . (int)$this->post->duplicateStory : '') . "|$preStatus"); $this->action->logHistory($actionID, $changes); @@ -1737,7 +1737,8 @@ class story extends control foreach($allChanges as $storyID => $changes) { $preStatus = $stories[$storyID]->status; - if($preStatus == 'reviewing') $preStatus = $stories[$storyID]->changedBy ? 'changing' : 'draft'; + $isChanged = $stories[$storyID]->changedBy ? true : false; + if($preStatus == 'reviewing') $preStatus = $isChanged ? 'changing' : 'draft'; $actionID = $this->action->create('story', $storyID, 'Closed', htmlSpecialString($this->post->comments[$storyID]), ucfirst($this->post->closedReasons[$storyID]) . ($this->post->duplicateStoryIDList[$storyID] ? ':' . (int)$this->post->duplicateStoryIDList[$storyID] : '') . "|$preStatus"); $this->action->logHistory($actionID, $changes); diff --git a/module/story/model.php b/module/story/model.php index 50cbbd9a64..64909ca66a 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2360,10 +2360,14 @@ class storyModel extends model ->stripTags($this->config->story->editor->activate['id'], $this->config->allowedTags) ->remove('comment') ->get(); + + /* Get status after activation. */ + $story->status = $this->getActivateStatus($storyID); + $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->activate['id'], $this->post->uid); $this->dao->update(TABLE_STORY)->data($story)->autoCheck()->checkFlow()->where('id')->eq($storyID)->exec(); - if($this->post->status == 'active') $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->exec(); + if($story->status == 'active') $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->exec(); $this->setStage($storyID); @@ -5548,7 +5552,8 @@ class storyModel extends model if($result != 'revert') { - if($story->status == 'closed') $this->action->create('story', $story->id, 'ReviewRejected', '', empty($story->changedBy) ? 'draft' : 'changing'); + $isChanged = $story->changedBy ? true : false; + if($story->status == 'closed') $this->action->create('story', $story->id, 'ReviewRejected', '', $isChanged ? 'changing' : 'draft'); if($story->status == 'active') $this->action->create('story', $story->id, 'ReviewPassed'); if(!array_diff(array_keys($reviewers), $reviewedBy) and ($story->status == 'draft' or $story->status == 'changing')) $this->action->create('story', $story->id, 'ReviewClarified'); } @@ -5576,7 +5581,10 @@ class storyModel extends model if(!array_diff(array_keys($reviewerList), $reviewedBy)) { $status = $this->post->result == 'revert' ? 'active' : $this->setStatusByReviewRules($reviewerList); - $status = ($status == 'draft' and $oldStory->changedBy) ? 'changing' : $status; + + /* When the review result of the changed story is clarify, the status should be changing. */ + $isChanged = $oldStory->changedBy ? true : false; + $status = ($isChanged and $status == 'draft') ? 'changing' : $status; $story->status = $status ? $status : $oldStory->status; if($story->status == 'closed') @@ -5854,14 +5862,15 @@ class storyModel extends model } /** - * Set the selectable status when activated. + * Get the story status after activation. * * @param int $storyID * @access public * @return void */ - public function setActivateStatus($storyID) + public function getActivateStatus($storyID) { + $status = 'active'; $lastRecord = $this->dao->select('action,extra')->from(TABLE_ACTION) ->where('objectType')->eq('story') ->andWhere('objectID')->eq($storyID) @@ -5871,20 +5880,8 @@ class storyModel extends model $lastAction = $lastRecord->action; $preStatus = $lastRecord->extra; if(strpos($preStatus, '|') !== false) $preStatus = substr($preStatus, strpos($preStatus, '|') + 1); + if(strpos('closed,reviewrejected', $lastAction) !== false) $status = $preStatus; - if(strpos('closed,reviewrejected', $lastAction) !== false) - { - foreach($this->lang->story->statusList as $status => $lang) - { - if($preStatus == $status or $status == 'active') continue; - unset($this->lang->story->statusList[$status]); - } - - if($this->checkForceReview() and $preStatus != 'active') unset($this->lang->story->statusList['active']); - } - else - { - foreach(array('', 'closed', 'changing', 'reviewing') as $status) unset($this->lang->story->statusList[$status]); - } + return $status; } } diff --git a/module/story/view/activate.html.php b/module/story/view/activate.html.php index 565035f2f2..e1876c9dfa 100644 --- a/module/story/view/activate.html.php +++ b/module/story/view/activate.html.php @@ -28,14 +28,6 @@ story->assignedTo;?> closedBy, 'class="form-control chosen"');?>
    story->status;?> - story->statusList, 'active', 'class="form-control chosen"'); - ?> -
    story->comment;?>
    " + ignore + "

    " + ignore + "

    bug->priList, $bug2Link->pri, $bug2Link->pri)?>'>bug->priList, $bug2Link->pri, $bug2Link->pri)?>createLink('product', 'browse', "productID={$bug2Link->product}&branch={$bug2Link->branch}"), $products[$bug2Link->product], '_blank');?>createLink('bug', 'view', "bugID=$bug2Link->id"), $bug2Link->title, '_blank');?>createLink('product', 'browse', "productID={$bug2Link->product}&branch={$bug2Link->branch}"), $products[$bug2Link->product], '_blank');?>createLink('bug', 'view', "bugID=$bug2Link->id"), $bug2Link->title, '_blank');?> bug->typeList, $bug2Link->type);?> openedBy);?> testcase->priList, $case2Link->pri, $case2Link->pri)?>'>testcase->priList, $case2Link->pri, $case2Link->pri)?>createLink('product', 'browse', "productID={$case2Link->product}&branch={$case2Link->branch}"), $products[$case2Link->product], '_blank');?>createLink('testcase', 'view', "caseID=$case2Link->id"), $case2Link->title, '_blank');?>createLink('product', 'browse', "productID={$case2Link->product}&branch={$case2Link->branch}"), $products[$case2Link->product], '_blank');?>createLink('testcase', 'view', "caseID=$case2Link->id"), $case2Link->title, '_blank');?> testcase->typeList[$case2Link->type];?> openedBy);?>
    - ' class='content-icon' style='width: 16px; height: 16px; vertical-align: middle;'/> + ' class='content-icon' style='width: 16px; height: 16px; vertical-align: middle;'/> lang->release->stories . '(' . count($stories) . ')';?>
    - ' class='content-icon' style='width: 16px; height: 16px; vertical-align: middle;'/> + ' class='content-icon' style='width: 16px; height: 16px; vertical-align: middle;'/> lang->release->bugs . '(' . count($bugs) . ')';?>
    - ' class='content-icon' style='width: 16px; height: 16px; vertical-align: middle;'/> + ' class='content-icon' style='width: 16px; height: 16px; vertical-align: middle;'/> lang->release->leftBugs . '(' . count($leftBugs) . ')';?>
    id);?>createLink('testtask', 'view', "taskID=$task->id"), $task->name);?>executionName?>build == 'trunk' ? print($lang->trunk) : print(html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName));?>createLink('testtask', 'view', "taskID=$task->id"), $task->name);?>executionName;?>trunk : $task->buildName;?>'>build == 'trunk' ? print($lang->trunk) : print(html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName));?> begin?> end?>processStatus('testtask', $task);?>'>processStatus('testtask', $task);?> id", $task, 'list', 'sitemap', '', '', '', "data-app='qa'"); diff --git a/module/testtask/model.php b/module/testtask/model.php index f2aadcbb32..029545908c 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -76,11 +76,13 @@ class testtaskModel extends model $products = $scopeAndStatus[0] == 'all' ? $this->app->user->view->products : array(); $branch = $scopeAndStatus[0] == 'all' ? 'all' : $branch; - return $this->dao->select("t1.*, t2.name AS productName, t3.name AS executionName, t4.name AS buildName, t4.branch AS branch") + $executionNameField = $this->config->systemMode == 'new' ? "IF(t5.id IS NOT NULL, CONCAT(t5.name, ' / ', t3.name), t3.name)" : 't3.name'; + return $this->dao->select("t1.*, t2.name AS productName, $executionNameField 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_PROJECT)->alias('t5')->on('t3.project = t5.id') ->where('t1.deleted')->eq(0) ->andWhere('t1.auto')->ne('unit') @@ -294,11 +296,13 @@ class testtaskModel extends model */ public function getByUser($account, $pager = null, $orderBy = 'id_desc', $type = '') { - return $this->dao->select('t1.*, t2.name AS executionName, t3.name AS buildName') + $executionNameField = $this->config->systemMode == 'new' ? "IF(t5.id IS NOT NULL, CONCAT(t5.name, ' / ', t2.name), t2.name)" : 't2.name'; + return $this->dao->select("t1.*, $executionNameField AS executionName, t3.name AS buildName") ->from(TABLE_TESTTASK)->alias('t1') ->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.execution = t2.id') ->leftJoin(TABLE_BUILD)->alias('t3')->on('t1.build = t3.id') ->leftJoin(TABLE_PRODUCT)->alias('t4')->on('t1.product = t4.id') + ->leftJoin(TABLE_PROJECT)->alias('t5')->on('t2.project = t5.id') ->where('t1.deleted')->eq(0) ->andWhere('t4.deleted')->eq(0) ->andWhere('t1.auto')->ne('unit') From 4d20bd7bf4d2750eecd71a6c2984b5ede5be3577 Mon Sep 17 00:00:00 2001 From: liuhong Date: Mon, 22 Aug 2022 06:31:23 +0000 Subject: [PATCH 045/223] *Fix bug #26725. --- module/task/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/control.php b/module/task/control.php index 1ea48ce614..856b4c8cce 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -613,7 +613,7 @@ class task extends control $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed', "{$this->view->task->openedBy},{$this->view->task->canceledBy},{$this->view->task->closedBy}"); $this->view->showAllModule = isset($this->config->execution->task->allModule) ? $this->config->execution->task->allModule : ''; $this->view->modules = $this->tree->getTaskOptionMenu($this->view->task->execution, 0, 0, $this->view->showAllModule ? 'allModule' : ''); - $this->view->executions = $this->config->systemMode == 'classic' ? $this->execution->getPairs() : $this->execution->getByProject($task->project, 'all', 0, true); + $this->view->executions = $this->config->systemMode == 'classic' ? $this->execution->getPairs() : $this->execution->getByProject($task->project, 'noclosed', 0, true); $this->display(); } From f47daae58967535241f59fc3895042e558b96a2e Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 22 Aug 2022 14:34:37 +0800 Subject: [PATCH 046/223] * Modify story review and other about story. --- module/execution/lang/de.php | 2 +- module/execution/lang/en.php | 2 +- module/execution/lang/fr.php | 2 +- module/execution/lang/zh-cn.php | 2 +- module/product/view/view.html.php | 20 ++++++------- module/projectstory/lang/de.php | 2 ++ module/projectstory/lang/en.php | 2 ++ module/projectstory/lang/fr.php | 2 ++ module/projectstory/lang/vi.php | 12 +++++--- module/projectstory/lang/zh-cn.php | 2 ++ module/report/view/productsummary.html.php | 14 +++++---- module/story/control.php | 8 ++--- module/story/lang/de.php | 6 ++-- module/story/lang/en.php | 6 ++-- module/story/lang/fr.php | 6 ++-- module/story/lang/vi.php | 6 ++-- module/story/lang/zh-cn.php | 6 ++-- module/story/model.php | 35 +++++++++++++--------- 18 files changed, 84 insertions(+), 51 deletions(-) diff --git a/module/execution/lang/de.php b/module/execution/lang/de.php index 7ab7927d18..cd761fa8f0 100644 --- a/module/execution/lang/de.php +++ b/module/execution/lang/de.php @@ -411,7 +411,7 @@ $lang->execution->unresolvedBug = "[%s] unresolved bugs. "; $lang->execution->projectNotEmpty = 'Project cannot be empty.'; $lang->execution->confirmStoryToTask = $lang->SRCommon . '%s are converted to tasks in the current. Do you want to convert them anyways?'; $lang->execution->ge = "『%s』should be >= actual begin『%s』."; -$lang->execution->storyDragError = "The {$lang->SRCommon} is still a draft or has been changed, please drag it after the review"; +$lang->execution->storyDragError = "The {$lang->SRCommon} is not active. Please activate and drag again."; $lang->execution->countTip = ' (%s member)'; $lang->execution->pleaseInput = "Enter"; $lang->execution->week = 'week'; diff --git a/module/execution/lang/en.php b/module/execution/lang/en.php index cf11af6af7..0d4e0e4cb9 100644 --- a/module/execution/lang/en.php +++ b/module/execution/lang/en.php @@ -411,7 +411,7 @@ $lang->execution->unresolvedBug = "[%s] unresolved bugs. "; $lang->execution->projectNotEmpty = 'Project cannot be empty.'; $lang->execution->confirmStoryToTask = $lang->SRCommon . '%s are converted to tasks in the current. Do you want to convert them anyways?'; $lang->execution->ge = "『%s』should be >= actual begin『%s』."; -$lang->execution->storyDragError = "The {$lang->SRCommon} is still a draft or has been changed, please drag it after the review"; +$lang->execution->storyDragError = "The {$lang->SRCommon} is not active. Please activate and drag again."; $lang->execution->countTip = ' (%s member)'; $lang->execution->pleaseInput = "Enter"; $lang->execution->week = 'week'; diff --git a/module/execution/lang/fr.php b/module/execution/lang/fr.php index 6dea9a32aa..bb0ce80a9e 100644 --- a/module/execution/lang/fr.php +++ b/module/execution/lang/fr.php @@ -411,7 +411,7 @@ $lang->execution->unresolvedBug = "[%s] unresolved bugs. "; $lang->execution->projectNotEmpty = 'Project cannot be empty.'; $lang->execution->confirmStoryToTask = $lang->SRCommon . '%s are converted to tasks in the current. Do you want to convert them anyways?'; $lang->execution->ge = "『%s』should be >= actual begin『%s』."; -$lang->execution->storyDragError = "The {$lang->SRCommon} is still a draft or has been changed, please drag it after the review"; +$lang->execution->storyDragError = "The {$lang->SRCommon} is not active. Please activate and drag again."; $lang->execution->countTip = ' (%s member)'; $lang->execution->pleaseInput = "Enter"; $lang->execution->week = 'week'; diff --git a/module/execution/lang/zh-cn.php b/module/execution/lang/zh-cn.php index a064ccd15c..cfe984b4b3 100644 --- a/module/execution/lang/zh-cn.php +++ b/module/execution/lang/zh-cn.php @@ -411,7 +411,7 @@ $lang->execution->unresolvedBug = "[%s]个未解决的bug,"; $lang->execution->projectNotEmpty = '所属项目不能为空。'; $lang->execution->confirmStoryToTask = '%s' . $lang->SRCommon . '已经在当前' . $lang->execution->common . '中转了任务,请确认是否重复转任务。'; $lang->execution->ge = "『%s』应当不小于实际开始时间『%s』。"; -$lang->execution->storyDragError = "该{$lang->SRCommon}还是草稿或已变更状态,请评审通过后再拖动"; +$lang->execution->storyDragError = "该{$lang->SRCommon}不是激活状态,请激活后再拖动"; $lang->execution->countTip = '(%s人)'; $lang->execution->pleaseInput = "请输入"; $lang->execution->week = '周'; diff --git a/module/product/view/view.html.php b/module/product/view/view.html.php index 8bdeddae92..2f516016e5 100644 --- a/module/product/view/view.html.php +++ b/module/product/view/view.html.php @@ -141,14 +141,6 @@ product->bugs?> bugs?>
    story->statusList['changing'] . $space . $lang->story->common;?>stories['changing']?>product->releases?>releases?>product->cases?>cases?>
    story->statusList['draft'] . $space . $lang->story->common;?> stories['draft']?>docs?>
    story->statusList['closed'] . $space . $lang->story->common;?>stories['closed']?>story->statusList['changing'] . $space . $lang->story->common;?>stories['changing']?>product->releases?>releases?>product->cases?>cases?>
    story->statusList['reviewing'] . $space . $lang->story->common;?>stories['reviewing']?> product->projects?> projects?>productplan->begin;?> productplan->end;?> story->statusList['draft'];?>story->statusList['reviewing'];?> story->statusList['active'];?> story->statusList['changing'];?> story->statusList['closed'];?>begin == '2030-01-01' ? $lang->productplan->future : $plan->begin;?> end == '2030-01-01' ? $lang->productplan->future : $plan->end;?> 0 0 00
    testcase->product;?>testcase->product;?>
    @@ -294,7 +294,7 @@
    testcase->legendOpenAndEdit;?>
    - + From eb35e542514f3e94c3e0c8ae228d301a5b85d707 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 22 Aug 2022 15:48:13 +0800 Subject: [PATCH 054/223] * Finish task #65781. --- module/testcase/view/linkbugs.html.php | 2 +- module/testcase/view/linkcases.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/testcase/view/linkbugs.html.php b/module/testcase/view/linkbugs.html.php index 97b8057883..4247b2b457 100644 --- a/module/testcase/view/linkbugs.html.php +++ b/module/testcase/view/linkbugs.html.php @@ -53,7 +53,7 @@ - + diff --git a/module/testcase/view/linkcases.html.php b/module/testcase/view/linkcases.html.php index 3fb409d495..cb4ec347e0 100644 --- a/module/testcase/view/linkcases.html.php +++ b/module/testcase/view/linkcases.html.php @@ -53,7 +53,7 @@ - + From 66532261dd70729f1f047c27df09cc5955c10390 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 22 Aug 2022 15:54:42 +0800 Subject: [PATCH 055/223] * Fix bug for no execution view. --- module/action/model.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/action/model.php b/module/action/model.php index e6bc4c8142..739c107d16 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -996,10 +996,10 @@ class actionModel extends model { $productCondition = ''; foreach(explode(',', $authedProducts) as $product) $productCondition = empty($productCondition) ? "(execution = '0' and project = '0' and (product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'"; - $productCondition .= '))'; + if(!empty($productCondition)) $productCondition .= '))'; $projectCondition = "(execution = '0' and project != '0' and project " . helper::dbIN($authedProjects) . ')'; - $executionCondition = isset($authedExecutions) ? "(execution != 0 and execution " . helper::dbIN($authedExecutions) . ')' : ''; + $executionCondition = isset($authedExecutions) ? "(execution != 0 and execution " . helper::dbIN($authedExecutions) . ')' : "(execution != 0 and execution = '$executionID')"; } elseif($productID == 'all' and is_numeric($projectID)) { @@ -1010,7 +1010,7 @@ class actionModel extends model $productCondition = ''; foreach(array_keys($products) as $product) $productCondition = empty($productCondition) ? "(execution = '0' and project = '0' and (product LIKE '%,$product,%'" : "$productCondition OR product LIKE '%,$product,%'"; - $productCondition .= '))'; + if(!empty($productCondition)) $productCondition .= '))'; $projectCondition = "(execution = '0' and project = '$projectID')"; $executionCondition = "(execution != '0' and execution " . helper::dbIN($authedExecutions) . ')'; From f5395d3cdb4b56ad8cac83fea51019ba21805eb1 Mon Sep 17 00:00:00 2001 From: lanzongjun Date: Mon, 22 Aug 2022 15:58:47 +0800 Subject: [PATCH 056/223] * finish task #65923 --- module/port/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/port/model.php b/module/port/model.php index 55b0e52e16..94ed62a4c7 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -479,7 +479,7 @@ class portModel extends model { $getParams = $this->session->{$model . 'PortParams'}; - if($params and $getParams) + if($params) { $params = explode('&', $params); foreach($params as $param => $value) From 148fa1f91ff43ff8a8eb4b19364f673c8abd41ac Mon Sep 17 00:00:00 2001 From: liuhong Date: Mon, 22 Aug 2022 08:05:25 +0000 Subject: [PATCH 057/223] 0timization task #64879. --- module/task/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/task/model.php b/module/task/model.php index 0201d70d01..23b614e688 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -3464,7 +3464,7 @@ class taskModel extends model $storyChanged = (!empty($task->storyStatus) and $task->storyStatus == 'active' and $task->latestStoryVersion > $task->storyVersion and !in_array($task->status, array('cancel', 'closed'))); $canView = common::hasPriv('task', 'view'); - $taskLink = helper::createLink('task', 'view', "taskID=$task->id", '', true); + $taskLink = helper::createLink('task', 'view', "taskID=$task->id"); $account = $this->app->user->account; $id = $col->id; if($col->show) @@ -3522,7 +3522,7 @@ class taskModel extends model if($task->module and isset($modulePairs[$task->module])) echo "" . $modulePairs[$task->module] . ' '; if($task->parent > 0) echo '' . $this->lang->task->childrenAB . ' '; if(!empty($task->team)) echo '' . $this->lang->task->multipleAB . ' '; - echo $canView ? html::a($taskLink, $task->name, null, "style='color: $task->color' title='$task->name' class='iframe'") : "$task->name"; + echo $canView ? html::a($taskLink, $task->name, null, "style='color: $task->color' title='$task->name'") : "$task->name"; if(!empty($task->children)) echo ''; if($task->fromBug) echo html::a(helper::createLink('bug', 'view', "id=$task->fromBug"), "[BUG#$task->fromBug]", '', "class='bug'"); break; From cc6d27636f63ca59f906db959d618a1c22bd8e6a Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Mon, 22 Aug 2022 08:06:41 +0000 Subject: [PATCH 058/223] * Finish task #66231. --- module/execution/css/story.css | 1 + 1 file changed, 1 insertion(+) diff --git a/module/execution/css/story.css b/module/execution/css/story.css index 82615e05ac..7c12c9a59f 100644 --- a/module/execution/css/story.css +++ b/module/execution/css/story.css @@ -19,3 +19,4 @@ th.c-pri{width:50px;} .panel-actions {position: relative; padding: 0;} .switchBtn {background-color: #fff !important;} .switchBtn > i {padding-left: 7px;} +#main>.container {padding: 23px 20px;} From c34766a68dceca26a49dd03756a61c87f111539b Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 22 Aug 2022 16:09:39 +0800 Subject: [PATCH 059/223] * Fix bug #26743. And modify the unit case of batch edit under the execution module. --- module/execution/model.php | 3 +++ test/config/config.php | 2 +- test/model/execution/batchupdate.php | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/module/execution/model.php b/module/execution/model.php index c2f067fe39..c98202fb50 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -785,6 +785,9 @@ class executionModel extends model return false; } + /* Replace the project language item for message. */ + $this->lang->project->name = $this->lang->execution->name; + $this->lang->project->code = $this->lang->execution->code; $this->dao->update(TABLE_EXECUTION)->data($execution) ->autoCheck($skipFields = 'begin,end') ->batchcheck($this->config->execution->edit->requiredFields, 'notempty') diff --git a/test/config/config.php b/test/config/config.php index df921468b6..e2833b7249 100644 --- a/test/config/config.php +++ b/test/config/config.php @@ -1,5 +1,5 @@ test = new stdclass; $config->test->dbPrefix = "db_"; -$config->test->rawDB = 'zentaounittest'; +$config->test->rawDB = 'zentaounit'; $config->test->dbNum = 10; diff --git a/test/model/execution/batchupdate.php b/test/model/execution/batchupdate.php index b0782fd400..5bd1b37d1d 100755 --- a/test/model/execution/batchupdate.php +++ b/test/model/execution/batchupdate.php @@ -12,7 +12,7 @@ cid=1 pid=1 测试批量修改任务 >> name,迭代1,批量修改执行一 -测试name为空 >> 『name』不能为空。 +测试name为空 >> 『迭代名称』不能为空。 */ @@ -30,5 +30,5 @@ $noName = array('statuses'=> $statuses, 'codes' => $code, 'PMs' => $pms, 'lifet $execution = new executionTest(); r($execution->batchUpdateObject($normal, $executionID)) && p('0:field,old,new') && e('name,迭代1,批量修改执行一'); // 测试批量修改任务 -r($execution->batchUpdateObject($noName, $executionID)) && p() && e('『name』不能为空。'); // 测试name为空 -$db->restoreDB(); \ No newline at end of file +r($execution->batchUpdateObject($noName, $executionID)) && p('name:0') && e('『迭代名称』不能为空。'); // 测试name为空 +$db->restoreDB(); From 1d00010f72e419e7ac0188de0bf8036ff54bb516 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 22 Aug 2022 16:13:51 +0800 Subject: [PATCH 060/223] * Modify css for task #65780. --- module/my/css/testtask.css | 3 +++ module/testtask/css/browse.css | 2 ++ 2 files changed, 5 insertions(+) diff --git a/module/my/css/testtask.css b/module/my/css/testtask.css index f7129e9329..2f13e9acfb 100644 --- a/module/my/css/testtask.css +++ b/module/my/css/testtask.css @@ -1,2 +1,5 @@ .c-execution {width: 200px} .c-build {width: 120px;} +.c-id {width: 60px;} +.c-status {width: 80px;} +.table-fixed td {text-overflow: ellipsis;} diff --git a/module/testtask/css/browse.css b/module/testtask/css/browse.css index c68ac80a50..fb5f060737 100644 --- a/module/testtask/css/browse.css +++ b/module/testtask/css/browse.css @@ -1,3 +1,5 @@ #taskList tbody>tr>td, #taskList thead>tr>th {white-space: nowrap;} td {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} .c-name {width: 200px;} +.c-id {width: 60px;} +.c-user, .c-status {width: 80px;} From 59000f958f39aea872a38b267b59adaa8bba2508 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 22 Aug 2022 16:14:00 +0800 Subject: [PATCH 061/223] * Finish task #65781. --- module/testcase/css/edit.css | 1 + module/testcase/css/view.css | 1 + module/testcase/view/edit.html.php | 8 ++++---- module/testcase/view/linkbugs.html.php | 2 +- module/testcase/view/linkcases.html.php | 2 +- module/testcase/view/view.html.php | 8 ++++---- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/module/testcase/css/edit.css b/module/testcase/css/edit.css index cfd6152a51..afb1e10177 100644 --- a/module/testcase/css/edit.css +++ b/module/testcase/css/edit.css @@ -6,3 +6,4 @@ .detail > table > tbody th {width: 80px !important;} [lang^=en] .detail > table > tbody th, [lang^=fr] .detail > table > tbody th {width: 100px !important;} [lang^=de] .detail > table > tbody th {width: 125px !important;} + .linkCaseTitle, .linkBugTitle {white-space: nowrap; text-overflow: ellipsis;} diff --git a/module/testcase/css/view.css b/module/testcase/css/view.css index 8ca4dd7af3..77d69a3895 100644 --- a/module/testcase/css/view.css +++ b/module/testcase/css/view.css @@ -3,3 +3,4 @@ .case-fullscreen .main-row > .side-col {width: 0; position: relative; overflow: hidden;} .case-fullscreen .fullscreen-btn > .icon-fullscreen:before {content: '\e972';} +.caseBox > a, .bugBox > a {overflow: hidden;} diff --git a/module/testcase/view/edit.html.php b/module/testcase/view/edit.html.php index 23c4c67de7..bd0e86840a 100644 --- a/module/testcase/view/edit.html.php +++ b/module/testcase/view/edit.html.php @@ -248,9 +248,9 @@ { foreach($case->linkCaseTitles as $linkCaseID => $linkCaseTitle) { - echo "
  • "; + echo "
  • "; echo ""; - echo ""; + echo ""; echo '
  • '; } } @@ -275,9 +275,9 @@ { foreach($case->toBugs as $bugID => $bugTitle) { - echo "
  • "; + echo "
  • "; echo ""; - echo ""; + echo ""; echo '
  • '; } } diff --git a/module/testcase/view/linkbugs.html.php b/module/testcase/view/linkbugs.html.php index 4247b2b457..a5fc284ba5 100644 --- a/module/testcase/view/linkbugs.html.php +++ b/module/testcase/view/linkbugs.html.php @@ -84,7 +84,7 @@ $(function() $('#linkBugsForm').find('tr.checked').each(function(){ var bugID = $(this).find('td.c-id').find('div.checkbox-primary input').attr('value'); var bugTitle = "#" + bugID + ' ' + $(this).find('td').eq(3).attr('title'); - var checkbox = "
  • "; + var checkbox = "
  • "; output += checkbox; }); diff --git a/module/testcase/view/linkcases.html.php b/module/testcase/view/linkcases.html.php index cb4ec347e0..e97784fd3b 100644 --- a/module/testcase/view/linkcases.html.php +++ b/module/testcase/view/linkcases.html.php @@ -84,7 +84,7 @@ $(function() $('#linkCasesForm').find('tr.checked').each(function(){ var caseID = $(this).find('td.c-id').find('div.checkbox-primary input').attr('value'); var caseTitle = "#" + caseID + ' ' + $(this).find('td').eq(3).attr('title'); - var checkbox = "
  • "; + var checkbox = "
  • "; output += checkbox; }); diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php index 0b45563774..2ab6245dcd 100644 --- a/module/testcase/view/view.html.php +++ b/module/testcase/view/view.html.php @@ -284,13 +284,13 @@
    - - From 33eb51b9d1c806416374a6f03ce0c442350c3673 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 22 Aug 2022 16:16:54 +0800 Subject: [PATCH 062/223] * Finish task #65781. --- module/testcase/css/view.css | 1 - 1 file changed, 1 deletion(-) diff --git a/module/testcase/css/view.css b/module/testcase/css/view.css index 77d69a3895..8ca4dd7af3 100644 --- a/module/testcase/css/view.css +++ b/module/testcase/css/view.css @@ -3,4 +3,3 @@ .case-fullscreen .main-row > .side-col {width: 0; position: relative; overflow: hidden;} .case-fullscreen .fullscreen-btn > .icon-fullscreen:before {content: '\e972';} -.caseBox > a, .bugBox > a {overflow: hidden;} From b9ac60f75f6bec78843a2d02304a56bcb90ed6ce Mon Sep 17 00:00:00 2001 From: mayue Date: Mon, 22 Aug 2022 16:26:16 +0800 Subject: [PATCH 063/223] * Fix bug #26200. --- module/tree/control.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/module/tree/control.php b/module/tree/control.php index ddc0bf6b97..d37a1ac24d 100644 --- a/module/tree/control.php +++ b/module/tree/control.php @@ -376,7 +376,16 @@ class tree extends control { $this->view->optionMenu = $this->tree->getOptionMenu($module->root, $module->type, 0, $module->branch); } - if($type == 'doc') $this->view->libs = $this->loadModel('doc')->getLibs('all', $extra = 'withObject'); + if($type == 'doc') + { + $libs = $this->loadModel('doc')->getLibs('all', $extra = 'withObject'); + + /* Filter out wiki libraries. */ + $books = $this->doc->getAllLibsByType('book'); + foreach($books as $book) unset($libs[$book->id]); + + $this->view->libs = $libs; + } $this->view->module = $module; $this->view->type = $type; From 33324f758f8ad816a659d4f1b87b88584da51456 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 22 Aug 2022 16:32:48 +0800 Subject: [PATCH 064/223] * Fix bug #26743. --- module/execution/model.php | 15 ++++++++++++--- test/config/config.php | 2 +- test/model/execution/batchupdate.php | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/module/execution/model.php b/module/execution/model.php index c98202fb50..dd81fa2bef 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -785,9 +785,18 @@ class executionModel extends model return false; } - /* Replace the project language item for message. */ - $this->lang->project->name = $this->lang->execution->name; - $this->lang->project->code = $this->lang->execution->code; + /* Replace required language. */ + if($this->app->tab == 'project') + { + $this->lang->project->name = $this->lang->execution->name; + $this->lang->project->code = $this->lang->execution->code; + } + else + { + $this->lang->project->name = $this->lang->execution->execName; + $this->lang->project->code = $this->lang->execution->execCode; + } + $this->dao->update(TABLE_EXECUTION)->data($execution) ->autoCheck($skipFields = 'begin,end') ->batchcheck($this->config->execution->edit->requiredFields, 'notempty') diff --git a/test/config/config.php b/test/config/config.php index e2833b7249..df921468b6 100644 --- a/test/config/config.php +++ b/test/config/config.php @@ -1,5 +1,5 @@ test = new stdclass; $config->test->dbPrefix = "db_"; -$config->test->rawDB = 'zentaounit'; +$config->test->rawDB = 'zentaounittest'; $config->test->dbNum = 10; diff --git a/test/model/execution/batchupdate.php b/test/model/execution/batchupdate.php index 5bd1b37d1d..1a95dd9003 100755 --- a/test/model/execution/batchupdate.php +++ b/test/model/execution/batchupdate.php @@ -12,7 +12,7 @@ cid=1 pid=1 测试批量修改任务 >> name,迭代1,批量修改执行一 -测试name为空 >> 『迭代名称』不能为空。 +测试name为空 >> 『执行名称』不能为空。 */ @@ -30,5 +30,5 @@ $noName = array('statuses'=> $statuses, 'codes' => $code, 'PMs' => $pms, 'lifet $execution = new executionTest(); r($execution->batchUpdateObject($normal, $executionID)) && p('0:field,old,new') && e('name,迭代1,批量修改执行一'); // 测试批量修改任务 -r($execution->batchUpdateObject($noName, $executionID)) && p('name:0') && e('『迭代名称』不能为空。'); // 测试name为空 +r($execution->batchUpdateObject($noName, $executionID)) && p('name:0') && e('『执行名称』不能为空。'); // 测试name为空 $db->restoreDB(); From a1212a5a8b546820e1db257127418f69f68d3c1c Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 22 Aug 2022 16:43:36 +0800 Subject: [PATCH 065/223] * * Add upgrade sql and the function of updateStoryStatus. --- db/update17.5.sql | 3 ++- module/upgrade/model.php | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/db/update17.5.sql b/db/update17.5.sql index ea7b0c6a44..b8f5c08c16 100644 --- a/db/update17.5.sql +++ b/db/update17.5.sql @@ -1 +1,2 @@ -UPDATE `zt_story` SET `status` = 'changing' WHERE `status` = 'changed'; +UPDATE `zt_story` SET `status` = 'reviewing' WHERE `status` = 'changed'; +ALTER TABLE `zt_story` MODIFY `status` enum('','changed','active','draft','closed','reviewing') NOT NULL DEFAULT '' AFTER `estimate`; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index d58fe72362..e5d853ae37 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -533,6 +533,9 @@ class upgradeModel extends model case '17_4': $this->updateSearchIndex(); break; + case '17_5': + $this->updateStoryStatus(); + break; } $this->deletePatch(); @@ -7036,4 +7039,21 @@ class upgradeModel extends model return !dao::isError(); } + + /** + * Update story status. + * + * @access public + * @return void + */ + public function updateStoryStatus() + { + /* After cancel the review of changed story, the story status should be 'changing'. */ + $this->dao->update(TABLE_STORY)->set('status')->eq('changing')->where('status')->eq('draft')->andWhere('version')->gt(1)->exec(); + + /* Other stories in draft status should be 'reviewing'. */ + $this->dao->update(TABLE_STORY)->set('status')->eq('reviewing')->where('status')->eq('draft')->exec(); + + return !dao::isError(); + } } From 1897a831ddd794e700a64a163a289ce543b15456 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 22 Aug 2022 17:00:04 +0800 Subject: [PATCH 066/223] * fix for php8.1 --- framework/base/router.class.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 224b8a4629..8dcfd6ed43 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -3190,6 +3190,7 @@ class ztSessionHandler implements SessionHandlerInterface * @access public * @return bool */ + #[\ReturnTypeWillChange] public function open($savePath, $sessionName) { $this->sessSavePath = $savePath; @@ -3202,6 +3203,7 @@ class ztSessionHandler implements SessionHandlerInterface * @access public * @return bool */ + #[\ReturnTypeWillChange] public function close() { return true; @@ -3214,6 +3216,7 @@ class ztSessionHandler implements SessionHandlerInterface * @access public * @return bool */ + #[\ReturnTypeWillChange] public function read($id) { $sessFile = $this->getSessionFile($id); @@ -3233,6 +3236,7 @@ class ztSessionHandler implements SessionHandlerInterface * @access public * @return bool */ + #[\ReturnTypeWillChange] public function write($id, $sessData) { $sessFile = $this->getSessionFile($id); @@ -3263,6 +3267,7 @@ class ztSessionHandler implements SessionHandlerInterface * @access public * @return bool */ + #[\ReturnTypeWillChange] public function destroy($id) { $sessFile = $this->getSessionFile($id); @@ -3279,6 +3284,7 @@ class ztSessionHandler implements SessionHandlerInterface * @access public * @return bool */ + #[\ReturnTypeWillChange] public function gc($maxlifeTime) { $time = time(); From 64b9c8d35e6f2993f5886f5796dbe168e77d4b17 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 22 Aug 2022 17:41:29 +0800 Subject: [PATCH 067/223] * Delete unused code. --- db/update17.5.sql | 1 - module/story/model.php | 1 - module/story/test.php | 5 ----- 3 files changed, 7 deletions(-) delete mode 100644 module/story/test.php diff --git a/db/update17.5.sql b/db/update17.5.sql index 14995ef961..ce1a79f4fa 100644 --- a/db/update17.5.sql +++ b/db/update17.5.sql @@ -261,4 +261,3 @@ UPDATE `zt_grouppriv` SET `module` = 'product' WHERE `module` = 'story' and `met ALTER TABLE `zt_job` ADD `lastSyncDate` datetime DEFAULT NULL AFTER `lastTag`; INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('*/5', '*', '*', '*', '*', 'moduleName=compile&methodName=syncCompile', '定时同步构建记录', 'zentao', 1, 'normal', '0000-00-00 00:00:00'); ->>>>>>> master diff --git a/module/story/model.php b/module/story/model.php index a8c2714425..4b6bd024e1 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -709,7 +709,6 @@ class storyModel extends model ->remove('files,labels,reviewer,comment,needNotReview,uid') ->get(); - $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid); $this->dao->update(TABLE_STORY)->data($story, 'spec,verify') ->autoCheck() diff --git a/module/story/test.php b/module/story/test.php deleted file mode 100644 index 5e68873ad6..0000000000 --- a/module/story/test.php +++ /dev/null @@ -1,5 +0,0 @@ - Date: Mon, 22 Aug 2022 13:03:04 +0000 Subject: [PATCH 068/223] * Finish task #64972,64973. --- module/action/control.php | 20 +++++++++++++++++++- module/action/view/trash.html.php | 22 ++++++++++++++++++++++ module/execution/model.php | 2 +- module/story/model.php | 3 +-- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index 29eaf6eeb3..e2eba9357b 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -115,7 +115,7 @@ class action extends control $preferredType = $preferredType + $toPreferredType; } - /* Get the project name of executions. */ + /* Get the projects name of executions. */ if($browseType == 'execution') { $this->app->loadLang('execution'); @@ -124,6 +124,24 @@ class action extends control $this->view->projectList = $this->loadModel('project')->getByIdList($projectIdList, 'all'); } + /* Get the products name of story. */ + if($browseType == 'story') + { + $this->app->loadLang('project'); + $storyIdList = array(); + foreach($trashes as $trash) $storyIdList[] = $trash->objectID; + $this->view->productList = $this->loadModel('story')->getByList($storyIdList, 'story'); + } + + /* Get the executions name of task. */ + if($browseType == 'task') + { + $this->app->loadLang('task'); + $this->app->loadLang('project'); + $executionIdList = array(); + foreach($trashes as $trash) $executionIdList[] = $trash->execution; + $this->view->executionList = $this->loadModel('execution')->getByIdList($executionIdList); + } /* Title and position. */ $this->view->title = $this->lang->action->trash; $this->view->position[] = $this->lang->action->trash; diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 33062b95bf..985d5dff6d 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -85,6 +85,12 @@ systemMode == 'new' and $currentObjectType == 'execution'):?> + + + + + + @@ -146,6 +152,22 @@ + + + + + + diff --git a/module/execution/model.php b/module/execution/model.php index b07229429f..62c75cb607 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -1303,12 +1303,16 @@ class executionModel extends model * Get execution by idList. * * @param array $executionIdList + * @param string $mode all * @access public * @return array */ - public function getByIdList($executionIdList = array()) + public function getByIdList($executionIdList = array(), $mode = '') { - return $this->dao->select('*')->from(TABLE_EXECUTION)->where('id')->in($executionIdList)->fetchAll('id'); + return $this->dao->select('*')->from(TABLE_EXECUTION) + ->where('id')->in($executionIdList) + ->beginIF($mode != 'all')->andWhere('deleted')->eq(0)->fi() + ->fetchAll('id'); } /** diff --git a/module/story/model.php b/module/story/model.php index 1a41d03e6c..b709a367e4 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -86,16 +86,18 @@ class storyModel extends model * * @param int|array|string $storyIdList * @param string $type requirement|story + * @param string $mode all * @access public * @return array */ - public function getByList($storyIdList = 0, $type = 'story') + public function getByList($storyIdList = 0, $type = 'story', $mode = '') { - return $this->dao->select('t1.*, t2.spec, t2.verify, t3.name as productTitle, t3.deleted') + return $this->dao->select('t1.*, t2.spec, t2.verify, t3.name as productTitle, t3.deleted as productDeleted') ->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_STORYSPEC)->alias('t2')->on('t1.id=t2.story') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t1.product=t3.id') - ->andWhere('t1.version=t2.version') + ->beginIF($mode != 'all')->andWhere('t1.deleted')->eq(0)->fi() + ->where('t1.version=t2.version') ->beginIF($storyIdList)->andWhere('t1.id')->in($storyIdList)->fi() ->beginIF(!$storyIdList)->andWhere('t1.type')->eq($type)->fi() ->fetchAll('id'); From dca2784559cd80863ea5ee9f6a8b2970864acbac Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 23 Aug 2022 15:02:57 +0800 Subject: [PATCH 084/223] * Finish task #65808. --- module/bug/model.php | 8 ++------ module/my/control.php | 8 +++++--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index ecdc4190ad..bc5ce9a7f1 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -1717,11 +1717,7 @@ class bugModel extends model $moduleName = $this->app->rawMethod == 'work' ? 'workBug' : 'contributeBug'; $queryName = $moduleName . 'Query'; $formName = $moduleName . 'Form'; - - if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); - if(strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); - - $bugIDList = array(); + $bugIDList = array(); if($moduleName == 'contributeBug') { $bugsAssignedByMe = $this->loadModel('my')->getAssignedByMe($account, 0, '', $orderBy, 'bug'); @@ -1933,7 +1929,7 @@ class bugModel extends model } else { - $bugs = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`pri` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module=t2.id') ->where('t1.deleted')->eq(0) ->beginIF(!empty($productID) and $branchID !== 'all')->andWhere('t1.branch')->eq($branchID)->fi() diff --git a/module/my/control.php b/module/my/control.php index 3265de48a9..ead518647f 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -337,7 +337,7 @@ EOF; if($type == 'assignedBy') { - $stories = $this->loadModel('my')->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'story'); + $stories = $this->my->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'story'); } elseif($type == 'bysearch') { @@ -402,7 +402,7 @@ EOF; if($type == 'assignedBy') { - $stories = $this->loadModel('my')->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'requirement'); + $stories = $this->my->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'requirement'); } elseif($type == 'bysearch') { @@ -571,9 +571,11 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'severity_') !== false and strpos($sort, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); if($type == 'assignedBy') { - $bugs = $this->loadModel('my')->getAssignedByMe($this->app->user->account, '', $pager, $orderBy, 'bug'); + $bugs = $this->my->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'bug'); } else { From fb98e38d420be628371d83b23697a1811d981968 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 15:03:41 +0800 Subject: [PATCH 085/223] * Optimize code for task #65807. --- module/story/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index d41caad65f..bf06084fb0 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -3027,7 +3027,7 @@ class storyModel extends model } } - $tmpStories = $this->dao->select('DISTINCT t1.*,IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder')->from(TABLE_STORY)->alias('t1') + $tmpStories = $this->dao->select('DISTINCT t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PROJECTSTORY)->alias('t2')->on('t1.id=t2.story') ->beginIF(strpos($sql, 'result') !== false)->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story and t1.version = t3.version')->fi() ->where($sql) @@ -3127,7 +3127,7 @@ class storyModel extends model } } - $stories = $this->dao->select('distinct t1.*, t2.*,IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') + $stories = $this->dao->select('distinct t1.*, t2.*, IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t2.product = t3.id') ->beginIF(strpos($storyQuery, 'result') !== false)->leftJoin(TABLE_STORYREVIEW)->alias('t4')->on('t2.id = t4.story and t2.version = t4.version')->fi() From a825fa54ae893ae20c88369c42edd707a9cbdeb1 Mon Sep 17 00:00:00 2001 From: dongli Date: Tue, 23 Aug 2022 07:15:16 +0000 Subject: [PATCH 086/223] * Finish task #64972,64973. --- module/action/control.php | 1 - module/action/view/trash.html.php | 2 +- module/story/model.php | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index 0baf2fcad8..f962cdbfa1 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -128,7 +128,6 @@ class action extends control /* Get the products name of story. */ if($browseType == 'story') { - $this->app->loadLang('project'); $this->loadModel('story'); $storyIdList = array(); foreach($trashes as $trash) $storyIdList[] = $trash->objectID; diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 752c2d4ab7..6167da3e76 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -86,7 +86,7 @@ - + diff --git a/module/story/model.php b/module/story/model.php index b709a367e4..663540387f 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -96,8 +96,8 @@ class storyModel extends model ->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_STORYSPEC)->alias('t2')->on('t1.id=t2.story') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t1.product=t3.id') - ->beginIF($mode != 'all')->andWhere('t1.deleted')->eq(0)->fi() ->where('t1.version=t2.version') + ->beginIF($mode != 'all')->andWhere('t1.deleted')->eq(0)->fi() ->beginIF($storyIdList)->andWhere('t1.id')->in($storyIdList)->fi() ->beginIF(!$storyIdList)->andWhere('t1.type')->eq($type)->fi() ->fetchAll('id'); From 1590364db361c99081574ba86014f36993b8a221 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 23 Aug 2022 15:23:17 +0800 Subject: [PATCH 087/223] * Fix bug of link story. --- module/story/model.php | 17 +++++++++-------- module/story/view/edit.html.php | 2 -- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 4b6bd024e1..8bf1f76223 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -3056,6 +3056,15 @@ class storyModel extends model if(empty($normalProducts) and empty($branchProducts)) $storyQuery .= '1 = 1'; $storyQuery .= ') '; + if($this->app->moduleName == 'release' or $this->app->moduleName == 'build') + { + $storyQuery .= " AND `status` NOT IN ('draft')"; // Fix bug #990. + } + else + { + $storyQuery .= " AND `status` NOT IN ('draft', 'closed')"; + } + if($this->app->rawModule == 'build' and $this->app->rawMethod == 'linkstory') $storyQuery .= " AND `parent` != '-1'"; } elseif(strpos($storyQuery, $allBranch) !== false) @@ -3068,14 +3077,6 @@ class storyModel extends model } $storyQuery = preg_replace("/`plan` +LIKE +'%([0-9]+)%'/i", "CONCAT(',', `plan`, ',') LIKE '%,$1,%'", $storyQuery); - if($this->app->moduleName == 'release' or $this->app->moduleName == 'build') - { - $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing')"; // Fix bug #990. - } - else - { - $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing', 'closed')"; - } return $this->getBySQL($queryProductID, $storyQuery, $orderBy, $pager, $type); } diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index 501c615142..7ba57f8114 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -280,7 +280,6 @@ printExtendFields($story, 'div', 'position=right');?> - status == 'closed'):?>
    story->legendMisc;?>
    testcase->openedBy;?>testcase->openedBy;?> openedBy) . $lang->at . $case->openedDate;?>
    bug->priList, $bug2Link->pri, $bug2Link->pri)?>'>bug->priList, $bug2Link->pri, $bug2Link->pri)?> createLink('product', 'browse', "productID={$bug2Link->product}&branch={$bug2Link->branch}"), $products[$bug2Link->product], '_blank');?>createLink('bug', 'view', "bugID=$bug2Link->id"), $bug2Link->title, '_blank');?>createLink('bug', 'view', "bugID=$bug2Link->id"), $bug2Link->title, '_blank');?> bug->typeList, $bug2Link->type);?> openedBy);?> testcase->priList, $case2Link->pri, $case2Link->pri)?>'>testcase->priList, $case2Link->pri, $case2Link->pri)?> createLink('product', 'browse', "productID={$case2Link->product}&branch={$case2Link->branch}"), $products[$case2Link->product], '_blank');?>createLink('testcase', 'view', "caseID=$case2Link->id"), $case2Link->title, '_blank');?>createLink('testcase', 'view', "caseID=$case2Link->id"), $case2Link->title, '_blank');?> testcase->typeList[$case2Link->type];?> openedBy);?>
    testcase->linkCase;?> + linkCaseTitles)) { foreach($case->linkCaseTitles as $linkCaseID => $linkCaseTitle) { - echo html::a($this->createLink('testcase', 'view', "caseID=$linkCaseID", '', true), "#$linkCaseID $linkCaseTitle", '', "class='iframe' data-width='80%'") . '
    '; + echo html::a($this->createLink('testcase', 'view', "caseID=$linkCaseID", '', true), "#$linkCaseID $linkCaseTitle", '', "class='iframe' data-width='80%' title='$linkCaseTitle'") . '
    '; } } ?> @@ -314,11 +314,11 @@ toBugs):?>
    + toBugs as $bugID => $bugTitle) { - echo '

    ' . html::a($this->createLink('bug', 'view', "bugID=$bugID", '', true), "#$bugID " . $bugTitle, '', "class='iframe' data-width='80%'") . '

    '; + echo html::a($this->createLink('bug', 'view', "bugID=$bugID", '', true), "#$bugID " . $bugTitle, '', "class='iframe' data-width='80%' title='$bugTitle'") . '
    '; } ?>
    lang->execution->project;?> lang->project->product;?>lang->task->execution;?> action->actor);?> action->date);?> actions;?> + objectID]->productTitle;?> + objectID]->deleted):?> + lang->project->deleted;?> + + + execution]->name;?> + execution]->deleted):?> + lang->project->deleted;?> + + actor);?> date;?> diff --git a/module/execution/model.php b/module/execution/model.php index 6dba35e462..b07229429f 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -1308,7 +1308,7 @@ class executionModel extends model */ public function getByIdList($executionIdList = array()) { - return $this->dao->select('*')->from(TABLE_EXECUTION)->where('id')->in($executionIdList)->andWhere('deleted')->eq(0)->fetchAll('id'); + return $this->dao->select('*')->from(TABLE_EXECUTION)->where('id')->in($executionIdList)->fetchAll('id'); } /** diff --git a/module/story/model.php b/module/story/model.php index 679afde7a9..1a41d03e6c 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -91,11 +91,10 @@ class storyModel extends model */ public function getByList($storyIdList = 0, $type = 'story') { - return $this->dao->select('t1.*, t2.spec, t2.verify, t3.name as productTitle') + return $this->dao->select('t1.*, t2.spec, t2.verify, t3.name as productTitle, t3.deleted') ->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_STORYSPEC)->alias('t2')->on('t1.id=t2.story') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t1.product=t3.id') - ->where('t1.deleted')->eq(0) ->andWhere('t1.version=t2.version') ->beginIF($storyIdList)->andWhere('t1.id')->in($storyIdList)->fi() ->beginIF(!$storyIdList)->andWhere('t1.type')->eq($type)->fi() From 7fe8456f4f21bde035300fa91d02e2f8ad68d365 Mon Sep 17 00:00:00 2001 From: sunguangming Date: Tue, 23 Aug 2022 08:33:00 +0800 Subject: [PATCH 069/223] * Code for build locate bug. --- module/block/control.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/module/block/control.php b/module/block/control.php index 224ca9b8b4..e88e1bfca3 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -778,8 +778,9 @@ class block extends control */ public function printReleaseBlock() { - $this->session->set('releaseList', $this->app->getURI(true), 'product'); - $this->session->set('buildList', $this->app->getURI(true), 'execution'); + $uri = $this->createLink('my', 'index'); + $this->session->set('releaseList', $uri, 'product'); + $this->session->set('buildList', $uri, 'execution'); $this->app->loadLang('release'); $this->view->releases = $this->dao->select('t1.*,t2.name as productName,t3.name as buildName')->from(TABLE_RELEASE)->alias('t1') @@ -801,7 +802,7 @@ class block extends control */ public function printBuildBlock() { - $this->session->set('buildList', $this->app->getURI(true), 'execution'); + $this->session->set('buildList', $this->createLink('my', 'index'), 'execution'); $this->app->loadLang('build'); $builds = $this->dao->select('t1.*, t2.name as productName')->from(TABLE_BUILD)->alias('t1') From bf9a6e4da83362a246e5b0240c60af16d2f6c2f5 Mon Sep 17 00:00:00 2001 From: mayue Date: Tue, 23 Aug 2022 09:07:45 +0800 Subject: [PATCH 070/223] * Fix bug #26054#26057. --- module/programplan/lang/de.php | 3 +++ module/programplan/lang/en.php | 3 +++ module/programplan/lang/fr.php | 3 +++ module/programplan/lang/zh-cn.php | 1 - 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/module/programplan/lang/de.php b/module/programplan/lang/de.php index baf6b38a65..824e7e0f2b 100644 --- a/module/programplan/lang/de.php +++ b/module/programplan/lang/de.php @@ -99,3 +99,6 @@ $lang->programplan->error->parentWorkload = 'The sum of the workload of the chi $lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.'; $lang->programplan->error->sameName = 'Stage name cannot be the same!'; $lang->programplan->error->taskDrag = 'The %s task cannot be dragged'; + +$lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage'; +$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; diff --git a/module/programplan/lang/en.php b/module/programplan/lang/en.php index b8671eb7c9..8fc3666f00 100644 --- a/module/programplan/lang/en.php +++ b/module/programplan/lang/en.php @@ -99,3 +99,6 @@ $lang->programplan->error->parentWorkload = 'The sum of the workload in the sub $lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.'; $lang->programplan->error->sameName = 'Stage name cannot be the same!'; $lang->programplan->error->taskDrag = 'The %s task cannot be dragged'; + +$lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage'; +$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; diff --git a/module/programplan/lang/fr.php b/module/programplan/lang/fr.php index baf6b38a65..824e7e0f2b 100644 --- a/module/programplan/lang/fr.php +++ b/module/programplan/lang/fr.php @@ -99,3 +99,6 @@ $lang->programplan->error->parentWorkload = 'The sum of the workload of the chi $lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.'; $lang->programplan->error->sameName = 'Stage name cannot be the same!'; $lang->programplan->error->taskDrag = 'The %s task cannot be dragged'; + +$lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage'; +$lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; diff --git a/module/programplan/lang/zh-cn.php b/module/programplan/lang/zh-cn.php index 381220a10e..52b3a1bcef 100644 --- a/module/programplan/lang/zh-cn.php +++ b/module/programplan/lang/zh-cn.php @@ -101,6 +101,5 @@ $lang->programplan->error->sameName = '阶段名称不能相同!'; $lang->programplan->error->taskDrag = '%s的任务不可以拖动'; $lang->programplan->error->planDrag = '%s的阶段不可以拖动'; - $lang->programplan->ganttBrowseType['gantt'] = '按阶段分组'; $lang->programplan->ganttBrowseType['assignedTo'] = '按指派给分组'; From b9d031bda1bae5d9d20c111e3f47e084755de205 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Tue, 23 Aug 2022 09:27:56 +0800 Subject: [PATCH 071/223] * Fix bug #65908. --- module/port/config.php | 2 +- module/port/model.php | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/module/port/config.php b/module/port/config.php index 2b6ead6da0..98b61d8877 100644 --- a/module/port/config.php +++ b/module/port/config.php @@ -17,7 +17,7 @@ $config->port->datetimeFeilds = ''; $config->port->listFields = ''; $config->port->sysLangFields = ',pri,status,type,mode,severity,os,browser,resolution,confirmed,source,reviewResult,stage,change,category'; $config->port->sysDataFields = 'execution,product,user'; -$config->port->userFields = 'assignedTo,openedBy,finishedBy,canceledBy,closedBy,lastEditedBy,lastRunner,resolvedBy,reviewedBy'; +$config->port->userFields = 'assignedTo,openedBy,finishedBy,canceledBy,closedBy,lastEditedBy,lastRunner,resolvedBy,reviewedBy,mailto'; $config->port->defaultZeroField = 'severity,pri'; $config->port->defaultEmptyField = ''; diff --git a/module/port/model.php b/module/port/model.php index 1112e36cba..c791d2ff07 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -269,6 +269,12 @@ class portModel extends model $modelFieldList['values'] = $this->initValues($model, $field, $modelFieldList, $withKey); $fieldList[$field] = $modelFieldList; } + + if(!empty($fieldList['mailto'])) + { + $fieldList['mailto']['control'] = 'multiple'; + $fieldList['mailto']['values'] = $this->portConfig->sysDataList['user']; + } return $fieldList; } @@ -403,7 +409,11 @@ class portModel extends model $sysDataFields = explode(',', $this->portConfig->sysDataFields); - foreach($sysDataFields as $field) $dataList[$field] = $this->loadModel($field)->getPairs(); + foreach($sysDataFields as $field) + { + $dataList[$field] = $this->loadModel($field)->getPairs(); + if($field == 'user') $dataList[$field] = $this->loadModel($field)->getPairs('noclosed|nodeleted|noletter'); + } return $dataList; } @@ -560,9 +570,12 @@ class portModel extends model { if($fieldList[$field]['control'] == 'multiple') { - $multiple = ''; + $multiple = ''; + $separator = $field == 'mailto' ? ',' : "\n"; $multipleLsit = explode(',', $value); - foreach($multipleLsit as $tmpValue) $multiple .= "\n" . zget($exportDatas[$field], $tmpValue); + + foreach($multipleLsit as $key => $tmpValue) $multipleLsit[$key] = zget($exportDatas[$field], $tmpValue); + $multiple = join($separator, $multipleLsit); $rows[$id]->$field = $multiple; } else From 2f2f0e654288b59c9d548de9ac523cdd68675786 Mon Sep 17 00:00:00 2001 From: mayue Date: Tue, 23 Aug 2022 09:33:45 +0800 Subject: [PATCH 072/223] * Optimize code. --- module/doc/model.php | 6 ++++-- module/tree/control.php | 8 +------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/module/doc/model.php b/module/doc/model.php index 4418f24105..7ee02abef2 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -60,18 +60,20 @@ class docModel extends model * @param string $type * @param string $extra * @param string $appendLibs - * @param int $projectID + * @param int $objectID + * @param string $exclude * * @access public * @return array */ - public function getLibs($type = '', $extra = '', $appendLibs = '', $objectID = 0) + public function getLibs($type = '', $extra = '', $appendLibs = '', $objectID = 0, $exclude = '') { if($type == 'all' or $type == 'includeDeleted') { $stmt = $this->dao->select('*')->from(TABLE_DOCLIB) ->where('type')->ne('api') ->beginIF($type == 'all')->andWhere('deleted')->eq(0)->fi() + ->beginIF($exclude)->andWhere('type')->notin($exclude)->fi() ->andWhere('vision')->eq($this->config->vision) ->orderBy('`order` asc, id_desc') ->query(); diff --git a/module/tree/control.php b/module/tree/control.php index d37a1ac24d..bef5d3a982 100644 --- a/module/tree/control.php +++ b/module/tree/control.php @@ -378,13 +378,7 @@ class tree extends control } if($type == 'doc') { - $libs = $this->loadModel('doc')->getLibs('all', $extra = 'withObject'); - - /* Filter out wiki libraries. */ - $books = $this->doc->getAllLibsByType('book'); - foreach($books as $book) unset($libs[$book->id]); - - $this->view->libs = $libs; + $this->view->libs = $this->loadModel('doc')->getLibs('all', $extra = 'withObject', '', 0, 'book'); } $this->view->module = $module; From bd510fe0d41fe9d726a9168075a20b911fa6a7ae Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 23 Aug 2022 10:11:31 +0800 Subject: [PATCH 073/223] * Fix bug of update story datetable. --- db/update17.5.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/update17.5.sql b/db/update17.5.sql index ce1a79f4fa..be88aa2b78 100644 --- a/db/update17.5.sql +++ b/db/update17.5.sql @@ -1,5 +1,5 @@ UPDATE `zt_story` SET `status` = 'reviewing' WHERE `status` = 'changed'; -ALTER TABLE `zt_story` MODIFY `status` enum('','changed','active','draft','closed','reviewing') NOT NULL DEFAULT '' AFTER `estimate`; +ALTER TABLE `zt_story` MODIFY `status` enum('','changing','active','draft','closed','reviewing') NOT NULL DEFAULT '' AFTER `estimate`; ALTER TABLE `zt_feedback` ADD `repeatFeedback` mediumint(8) NOT NULL DEFAULT 0 AFTER `feedbackBy`; From 6336e232fb907e97303d528aa3accfeaf8487b79 Mon Sep 17 00:00:00 2001 From: mayue Date: Tue, 23 Aug 2022 11:01:31 +0800 Subject: [PATCH 074/223] * Optimize code. --- module/doc/model.php | 6 +++--- module/tree/control.php | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/module/doc/model.php b/module/doc/model.php index 7ee02abef2..f25b659ee5 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -61,19 +61,19 @@ class docModel extends model * @param string $extra * @param string $appendLibs * @param int $objectID - * @param string $exclude + * @param string $excludeType * * @access public * @return array */ - public function getLibs($type = '', $extra = '', $appendLibs = '', $objectID = 0, $exclude = '') + public function getLibs($type = '', $extra = '', $appendLibs = '', $objectID = 0, $excludeType = '') { if($type == 'all' or $type == 'includeDeleted') { $stmt = $this->dao->select('*')->from(TABLE_DOCLIB) ->where('type')->ne('api') ->beginIF($type == 'all')->andWhere('deleted')->eq(0)->fi() - ->beginIF($exclude)->andWhere('type')->notin($exclude)->fi() + ->beginIF($excludeType)->andWhere('type')->notin($excludeType)->fi() ->andWhere('vision')->eq($this->config->vision) ->orderBy('`order` asc, id_desc') ->query(); diff --git a/module/tree/control.php b/module/tree/control.php index bef5d3a982..694fb98501 100644 --- a/module/tree/control.php +++ b/module/tree/control.php @@ -376,10 +376,8 @@ class tree extends control { $this->view->optionMenu = $this->tree->getOptionMenu($module->root, $module->type, 0, $module->branch); } - if($type == 'doc') - { - $this->view->libs = $this->loadModel('doc')->getLibs('all', $extra = 'withObject', '', 0, 'book'); - } + + if($type == 'doc') $this->view->libs = $this->loadModel('doc')->getLibs('all', $extra = 'withObject', '', 0, 'book'); $this->view->module = $module; $this->view->type = $type; From 7ed184a915cd704a200c2b38e93f39fab5d3f60f Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Tue, 23 Aug 2022 03:26:11 +0000 Subject: [PATCH 075/223] * Fix bug. --- module/execution/css/story.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/execution/css/story.css b/module/execution/css/story.css index 7c12c9a59f..5d0c443c1b 100644 --- a/module/execution/css/story.css +++ b/module/execution/css/story.css @@ -19,4 +19,4 @@ th.c-pri{width:50px;} .panel-actions {position: relative; padding: 0;} .switchBtn {background-color: #fff !important;} .switchBtn > i {padding-left: 7px;} -#main>.container {padding: 23px 20px;} +#main>.container {padding: 0 20px 20px 23px;} From 4e1ca8bd602e372c01c2b801b8f8bb731aef9fb9 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 23 Aug 2022 13:40:34 +0800 Subject: [PATCH 076/223] * Finish task #65808. --- module/bug/model.php | 67 +++++++++++++++++++++---------- module/build/control.php | 11 +++-- module/common/model.php | 5 ++- module/projectrelease/control.php | 15 ++++--- module/release/control.php | 12 ++++-- 5 files changed, 76 insertions(+), 34 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index 1ea50fc5a5..9e275be1bc 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -384,6 +384,9 @@ class bugModel extends model $browseType = ($browseType == 'bymodule' and $this->session->bugBrowseType and $this->session->bugBrowseType != 'bysearch') ? $this->session->bugBrowseType : $browseType; $browseType = $browseType == 'bybranch' ? 'bymodule' : $browseType; + if(strpos($sort, 'pri') !== false and strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'severity') !== false and strpos($sort, 'severityOrder') === false) $sort = str_replace('severity', 'severityOrder', $sort); + /* Get bugs by browse type. */ $bugs = array(); if($browseType == 'all') $bugs = $this->getAllBugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID); @@ -483,7 +486,7 @@ class bugModel extends model */ public function getModuleBugs($productIDList, $branch = 0, $moduleIdList = 0, $executions = array(), $orderBy = 'id_desc', $pager = null, $projectID = 0) { - return $this->dao->select('*')->from(TABLE_BUG) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) ->where('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->eq($branch)->fi() ->beginIF(!empty($moduleIdList))->andWhere('module')->in($moduleIdList)->fi() @@ -506,7 +509,8 @@ class bugModel extends model */ public function getPlanBugs($planID, $status = 'all', $orderBy = 'id_desc', $pager = null) { - $bugs = $this->dao->select('*')->from(TABLE_BUG) + if(strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); + $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_BUG) ->where('plan')->eq((int)$planID) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() ->beginIF($status != 'all')->andWhere('status')->in($status)->fi() @@ -1714,6 +1718,9 @@ class bugModel extends model $queryName = $moduleName . 'Query'; $formName = $moduleName . 'Form'; + if(strpos($orderBy, 'pri') !== false and strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); + if(strpos($orderBy, 'severity') !== false and strpos($orderBy, 'severityOrder') === false) $orderBy = str_replace('severity', 'severityOrder', $orderBy); + $bugIDList = array(); if($moduleName == 'contributeBug') { @@ -1742,7 +1749,7 @@ class bugModel extends model $query = preg_replace('/`(\w+)`/', 't1.`$1`', $query); if($type != 'bySearch' and !$this->loadModel('common')->checkField(TABLE_BUG, $type)) return array(); - return $this->dao->select('t1.*,t2.name as productName')->from(TABLE_BUG)->alias('t1') + return $this->dao->select('t1.*,t2.name as productName, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->where('t1.deleted')->eq(0) ->andWhere('t2.deleted')->eq('0') @@ -1823,6 +1830,9 @@ class bugModel extends model public function getProjectBugs($projectID, $productID = 0, $branchID = 0, $build = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null) { $type = strtolower($type); + if(strpos($orderBy, 'pri') !== false and strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); + if(strpos($orderBy, 'severity') !== false and strpos($orderBy, 'severityOrder') === false) $orderBy = str_replace('severity', 'severityOrder', $orderBy); + if($type == 'bysearch') { $queryID = (int)$param; @@ -1839,7 +1849,7 @@ class bugModel extends model $bugQuery = $this->getBugQuery($this->session->projectBugQuery); - $bugs = $this->dao->select('*')->from(TABLE_BUG) + $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) ->where($bugQuery) ->andWhere('project')->eq((int)$projectID) ->andWhere('deleted')->eq(0) @@ -1852,7 +1862,7 @@ class bugModel extends model } else { - $bugs = $this->dao->select('t1.*')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module=t2.id') ->where('t1.deleted')->eq(0) ->beginIF(empty($build))->andWhere('t1.project')->eq($projectID)->fi() @@ -1891,6 +1901,9 @@ class bugModel extends model public function getExecutionBugs($executionID, $productID = 0, $branchID = 'all', $build = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null) { $type = strtolower($type); + if(strpos($orderBy, 'pri') !== false and strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); + if(strpos($orderBy, 'severity') !== false and strpos($orderBy, 'severityOrder') === false) $orderBy = str_replace('severity', 'severityOrder', $orderBy); + if($type == 'bysearch') { $queryID = (int)$param; @@ -1907,7 +1920,7 @@ class bugModel extends model $bugQuery = $this->getBugQuery($this->session->executionBugQuery); - $bugs = $this->dao->select('*')->from(TABLE_BUG) + $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) ->where($bugQuery) ->andWhere('execution')->eq((int)$executionID) ->andWhere('deleted')->eq(0) @@ -1920,7 +1933,7 @@ class bugModel extends model } else { - $bugs = $this->dao->select('t1.*')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`pri` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module=t2.id') ->where('t1.deleted')->eq(0) ->beginIF(!empty($productID) and $branchID !== 'all')->andWhere('t1.branch')->eq($branchID)->fi() @@ -2542,7 +2555,7 @@ class bugModel extends model */ public function getAllBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager = null, $projectID = 0) { - $bugs = $this->dao->select('t1.*, t2.title as planTitle')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select('t1.*, t2.title as planTitle, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t2')->on('t1.plan = t2.id') ->where('t1.product')->in($productIDList) ->andWhere('t1.execution')->in(array_keys($executions)) @@ -2573,7 +2586,9 @@ class bugModel extends model */ public function getByAssigntome($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->findByAssignedTo($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->in($productIDList) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + ->where('assignedTo')->eq($this->app->user->account) + ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() @@ -2598,7 +2613,9 @@ class bugModel extends model */ public function getByOpenedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->findByOpenedBy($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->in($productIDList) + return $this->dao->select('*,IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + ->where('openedBy')->eq($this->app->user->account) + ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() @@ -2623,7 +2640,9 @@ class bugModel extends model */ public function getByResolvedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->findByResolvedBy($this->app->user->account)->from(TABLE_BUG)->andWhere('product')->in($productIDList) + return $this->dao->select('*,IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + ->where('resolvedBy')->eq($this->app->user->account) + ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() @@ -2649,7 +2668,9 @@ class bugModel extends model public function getByAssigntonull($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->findByAssignedTo('')->from(TABLE_BUG)->andWhere('product')->in($productIDList) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + ->where('assignedTo')->eq('') + ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() @@ -2674,7 +2695,7 @@ class bugModel extends model */ public function getUnconfirmed($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*')->from(TABLE_BUG) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) ->where('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) ->andWhere('deleted')->eq(0) @@ -2702,7 +2723,7 @@ class bugModel extends model */ public function getOverdueBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*')->from(TABLE_BUG) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) ->where('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2732,7 +2753,7 @@ class bugModel extends model */ public function getByStatus($productIDList, $branch, $modules, $executions, $status, $orderBy, $pager, $projectID) { - return $this->dao->select('*')->from(TABLE_BUG) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) ->where('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2763,7 +2784,9 @@ class bugModel extends model public function getByLonglifebugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { $lastEditedDate = date(DT_DATE1, time() - $this->config->bug->longlife * 24 * 3600); - return $this->dao->findByLastEditedDate("<", $lastEditedDate)->from(TABLE_BUG)->andWhere('product')->in($productIDList) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + ->where('lastEditedDate')->lt($lastEditedDate) + ->andWhere('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() @@ -2789,7 +2812,9 @@ class bugModel extends model */ public function getByPostponedbugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->findByResolution('postponed')->from(TABLE_BUG)->andWhere('product')->in($productIDList) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + ->where('resolution')->eq('postponed') + ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() @@ -2814,7 +2839,7 @@ class bugModel extends model */ public function getByNeedconfirm($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('t1.*, t2.title AS storyTitle')->from(TABLE_BUG)->alias('t1') + return $this->dao->select('t1.*, t2.title AS storyTitle, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->where("t2.status = 'active'") ->andWhere('t1.product')->in($productIDList) @@ -2846,7 +2871,7 @@ class bugModel extends model public function getByAssignedbyme($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID) { $actionIDList = $this->dao->select('objectID')->from(TABLE_ACTION)->where('objectType')->eq('bug')->andWhere('action')->eq('assigned')->andWhere('actor')->eq($this->app->user->account)->fetchPairs('objectID', 'objectID'); - return $this->dao->select('*')->from(TABLE_BUG) + return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) ->where('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() @@ -2918,7 +2943,7 @@ class bugModel extends model if($branch !== 'all' and strpos($bugQuery, '`branch` =') === false) $bugQuery .= " AND `branch` in('0','$branch')"; if(strpos($bugQuery, $allBranch) !== false) $bugQuery = str_replace($allBranch, '1', $bugQuery); - $bugs = $this->dao->select('*')->from(TABLE_BUG)->where($bugQuery) + $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where($bugQuery) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() ->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi() @@ -2950,7 +2975,7 @@ class bugModel extends model */ public function getReviewBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager = null, $projectID = 0) { - $bugs = $this->dao->select('t1.*, t2.title as planTitle')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select('t1.*, t2.title as planTitle, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t2')->on('t1.plan = t2.id') ->where('t1.product')->in($productIDList) ->andWhere('t1.execution')->in(array_keys($executions)) diff --git a/module/build/control.php b/module/build/control.php index 9dc99dcb18..6938820f10 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -233,22 +233,25 @@ class build extends control $this->app->loadClass('pager', $static = true); if($this->app->getViewType() == 'mhtml') $recPerPage = 10; + $sort = common::appendOrder($orderBy); + if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + /* Get product and bugs. */ $product = $this->loadModel('product')->getById($build->product); if($product->type != 'normal') $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$product->type]); $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($build->bugs)->andWhere('deleted')->eq(0) - ->beginIF($type == 'bug')->orderBy($orderBy)->fi() + ->beginIF($type == 'bug')->orderBy($sort)->fi() ->page($bugPager) ->fetchAll(); /* Get stories and stages. */ $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select('*')->from(TABLE_STORY) + $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) ->where('id')->in($build->stories) ->andWhere('deleted')->eq(0) - ->beginIF($type == 'story')->orderBy($orderBy)->fi() + ->beginIF($type == 'story')->orderBy($sort)->fi() ->page($storyPager) ->fetchAll('id'); @@ -273,7 +276,7 @@ class build extends control $this->view->storyPager = $storyPager; $generatedBugPager = new pager($type == 'generatedBug' ? $recTotal : 0, $recPerPage, $type == 'generatedBug' ? $pageID : 1); - $this->view->generatedBugs = $this->bug->getExecutionBugs($build->execution, $build->product, 'all', $build->id, $type, $param, $type == 'generatedBug' ? $orderBy : 'status_desc,id_desc', '', $generatedBugPager); + $this->view->generatedBugs = $this->bug->getExecutionBugs($build->execution, $build->product, 'all', $build->id, $type, $param, $type == 'generatedBug' ? $sort : 'status_desc,id_desc', '', $generatedBugPager); $this->view->generatedBugPager = $generatedBugPager; $this->executeHooks($buildID); diff --git a/module/common/model.php b/module/common/model.php index d86b3d4831..ea0b910982 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2111,9 +2111,12 @@ EOD; $table = $this->config->objectTables[$type]; $orderBy = $type . 'OrderBy'; $orderBy = $this->session->$orderBy; + $select = ''; if($this->session->$typeOnlyCondition) { - $sql = $this->dao->select('*')->from($table) + if(strpos($orderBy, 'priOrder') !== false) $select .= ', IF(`pri` = 0, 999, `pri`) as priOrder'; + if(strpos($orderBy, 'severityOrder') !== false) $select .= ', IF(`severity` = 0, 999, `severity`) as severityOrder'; + $sql = $this->dao->select("*$select")->from($table) ->where($queryCondition) ->beginIF($orderBy != false)->orderBy($orderBy)->fi() ->get(); diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index 572b0b934a..c46e466836 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -230,11 +230,14 @@ class projectrelease extends control return print(js::error($this->lang->notFound) . js::locate('back')); } + $sort = common::appendOrder($orderBy); + if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select('*')->from(TABLE_STORY) + $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) ->where('id')->in($release->stories) ->andWhere('deleted')->eq(0) - ->beginIF($type == 'story')->orderBy($orderBy)->fi() + ->beginIF($type == 'story')->orderBy($sort)->fi() ->page($storyPager) ->fetchAll('id'); @@ -246,14 +249,16 @@ class projectrelease extends control $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->bugs)->andWhere('deleted')->eq(0) - ->beginIF($type == 'bug')->orderBy($orderBy)->fi() + ->beginIF($type == 'bug')->orderBy($sort)->fi() ->page($bugPager) ->fetchAll(); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'linkedBug'); $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); - $leftBugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) - ->beginIF($type == 'leftBug')->orderBy($orderBy)->fi() + if($type == 'leftBug' and strpos($orderBy, 'severity') !== false) $sort = str_replace('severity', 'severityOrder', $orderBy); + + $leftBugs = $this->dao->select('*, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) + ->beginIF($type == 'leftBug')->orderBy($sort)->fi() ->page($leftBugPager) ->fetchAll(); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'leftBugs'); diff --git a/module/release/control.php b/module/release/control.php index 3c4c58a27d..0f8e334fa7 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -190,6 +190,9 @@ class release extends control $this->app->loadClass('pager', $static = true); if($this->app->getViewType() == 'mhtml') $recPerPage = 10; + $sort = common::appendOrder($orderBy); + if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); $stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($orderBy)->fi() @@ -202,16 +205,19 @@ class release extends control $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->bugs)->andWhere('deleted')->eq(0) - ->beginIF($type == 'bug')->orderBy($orderBy)->fi() + ->beginIF($type == 'bug')->orderBy($sort)->fi() ->page($bugPager) ->fetchAll(); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'linkedBug'); $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); - $leftBugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) - ->beginIF($type == 'leftBug')->orderBy($orderBy)->fi() + if($type == 'leftBug' and strpos($orderBy, 'severity') !== false) $sort = str_replace('severity', 'severityOrder', $orderBy); + + $leftBugs = $this->dao->select('*, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) + ->beginIF($type == 'leftBug')->orderBy($sort)->fi() ->page($leftBugPager) ->fetchAll(); + $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'leftBugs'); $this->commonAction($release->product); From 617122882a0f04abc71cde6eb46bca61bb0e94f8 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 13:45:44 +0800 Subject: [PATCH 077/223] * Finish task #65807. --- module/execution/control.php | 1 + module/my/control.php | 6 ++++-- module/my/model.php | 10 ++++++---- module/product/control.php | 2 ++ module/product/model.php | 2 ++ module/release/control.php | 4 ++-- module/story/model.php | 17 +++++++++-------- 7 files changed, 26 insertions(+), 16 deletions(-) diff --git a/module/execution/control.php b/module/execution/control.php index c8b7475689..bf027dd8e7 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -783,6 +783,7 @@ class execution extends control /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); + if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); $queryID = ($type == 'bysearch') ? $param : 0; $execution = $this->commonAction($executionID); diff --git a/module/my/control.php b/module/my/control.php index 967ff2e724..f228126be9 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -332,15 +332,16 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); + if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); $queryID = ($type == 'bysearch') ? (int)$param : 0; if($type == 'assignedBy') { - $stories = $this->loadModel('my')->getAssignedByMe($this->app->user->account, '', $pager, $orderBy, 'story'); + $stories = $this->loadModel('my')->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'story'); } elseif($type == 'bysearch') { - $stories = $this->my->getStoriesBySearch($queryID, $this->app->rawMethod, $orderBy, $pager); + $stories = $this->my->getStoriesBySearch($queryID, $this->app->rawMethod, $sort, $pager); } else { @@ -396,6 +397,7 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); + if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); $queryID = ($type == 'bysearch') ? (int)$param : 0; if($type == 'assignedBy') diff --git a/module/my/model.php b/module/my/model.php index 80a9cf47ce..1b01e01007 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -347,13 +347,15 @@ class myModel extends model } elseif($objectType == 'requirement' or $objectType == 'story' or $objectType == 'bug') { - $objectList = $this->dao->select('t1.*')->from($this->config->objectTables[$module])->alias('t1') + $orderBy = (strpos($orderBy, 'priOrder') !== false or strpos($orderBy, 'severityOrder') !== false) ? $orderBy : "t1.$orderBy"; + $select = strpos($orderBy, 'severity') !== false ? 't1.*,IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder' : 't1.*,IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder'; + $objectList = $this->dao->select($select)->from($this->config->objectTables[$module])->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on("t1.product = t2.id") ->where('t1.deleted')->eq(0) ->andWhere('t2.deleted')->eq(0) ->andWhere('t1.id')->in(array_keys($objectIDList)) ->beginIF($objectType == 'requirement' or $objectType == 'story')->andWhere('t1.type')->eq($objectType)->fi() - ->orderBy('t1.' . $orderBy) + ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); } @@ -827,7 +829,7 @@ class myModel extends model $storyIDList[$storyID] = $storyID; } - $stories = $this->dao->select('distinct t1.*, t2.name as productTitle, t4.title as planTitle')->from(TABLE_STORY)->alias('t1') + $stories = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_PLANSTORY)->alias('t3')->on('t1.id = t3.plan') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t4')->on('t3.plan = t4.id') @@ -846,7 +848,7 @@ class myModel extends model } else { - $stories = $this->dao->select('distinct t1.*, t2.name as productTitle, t4.title as planTitle')->from(TABLE_STORY)->alias('t1') + $stories = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_PLANSTORY)->alias('t3')->on('t1.id = t3.plan') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t4')->on('t3.plan = t4.id') diff --git a/module/product/control.php b/module/product/control.php index 8774ee920f..4117f37706 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -223,6 +223,8 @@ class product extends control /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); + if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + /* Load pager. */ $this->app->loadClass('pager', $static = true); diff --git a/module/product/model.php b/module/product/model.php index 3dbd62f65c..ccab5705b9 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -2421,6 +2421,8 @@ class productModel extends model $this->lang->product->menu->settings['subMenu']->branch['link'] = str_replace('@branch@', $this->lang->product->branchName[$product->type], $branchLink); $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$product->type]); } + + if(strpos($extra, 'requirement') !== false) unset($this->lang->product->moreSelects['willclose']); } /** diff --git a/module/release/control.php b/module/release/control.php index 0f8e334fa7..f1444842e9 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -194,8 +194,8 @@ class release extends control if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0) - ->beginIF($type == 'story')->orderBy($orderBy)->fi() + $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0) + ->beginIF($type == 'story')->orderBy($sort)->fi() ->page($storyPager) ->fetchAll('id'); diff --git a/module/story/model.php b/module/story/model.php index 08b5aee805..2e9db703b7 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2601,7 +2601,7 @@ class storyModel extends model if(empty($normalProducts) and empty($branchProducts)) $productQuery .= '1 = 1'; $productQuery .= ') '; - $stories = $this->dao->select('*')->from(TABLE_STORY) + $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) ->where('product')->in($productID) ->andWhere($productQuery) ->beginIF(!$hasParent)->andWhere("parent")->ge(0)->fi() @@ -2815,7 +2815,7 @@ class storyModel extends model $actionIDList = array(); if($fieldName == 'assignedBy') $actionIDList = $this->dao->select('objectID')->from(TABLE_ACTION)->where('objectType')->eq('story')->andWhere('action')->eq('assigned')->andWhere('actor')->eq($fieldValue)->fetchPairs('objectID', 'objectID'); - $sql = $this->dao->select('t1.*')->from(TABLE_STORY)->alias('t1'); + $sql = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder')->from(TABLE_STORY)->alias('t1'); if($fieldName == 'reviewBy') $sql = $sql->leftJoin(TABLE_STORYREVIEW)->alias('t2')->on('t1.id = t2.story and t1.version = t2.version'); $stories = $sql->where('t1.product')->in($productID) @@ -2851,7 +2851,7 @@ class storyModel extends model */ public function get2BeClosed($productID, $branch, $modules, $type = 'story', $orderBy = '', $pager = null) { - $stories = $this->dao->select('*')->from(TABLE_STORY) + $stories = $this->dao->select('*,IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) ->where('product')->in($productID) ->andWhere('type')->eq($type) ->beginIF($branch)->andWhere("branch")->eq($branch)->fi() @@ -3027,7 +3027,7 @@ class storyModel extends model } } - $tmpStories = $this->dao->select('DISTINCT t1.*')->from(TABLE_STORY)->alias('t1') + $tmpStories = $this->dao->select('DISTINCT t1.*,IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PROJECTSTORY)->alias('t2')->on('t1.id=t2.story') ->beginIF(strpos($sql, 'result') !== false)->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story and t1.version = t3.version')->fi() ->where($sql) @@ -3127,7 +3127,7 @@ class storyModel extends model } } - $stories = $this->dao->select('distinct t1.*, t2.*, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') + $stories = $this->dao->select('distinct t1.*, t2.*,IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t2.product = t3.id') ->beginIF(strpos($storyQuery, 'result') !== false)->leftJoin(TABLE_STORYREVIEW)->alias('t4')->on('t2.id = t4.story and t2.version = t4.version')->fi() @@ -3168,7 +3168,7 @@ class storyModel extends model $type = (strpos('bymodule|byproduct', $type) !== false and $this->session->storyBrowseType) ? $this->session->storyBrowseType : $type; - $stories = $this->dao->select('distinct t1.*, t2.*,t3.type as productType,t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') + $stories = $this->dao->select('distinct t1.*, t2.*, IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t2.product = t3.id') ->where('t1.project')->eq((int)$executionID) @@ -3283,7 +3283,8 @@ class storyModel extends model } else { - $stories = $this->dao->select('distinct t1.story, t1.plan, t1.order, t2.*') + if(strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); + $stories = $this->dao->select('distinct t1.story, t1.plan, t1.order, t2.*, IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder') ->from(TABLE_PLANSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->where('t1.plan')->eq($planID) @@ -3390,7 +3391,7 @@ class storyModel extends model */ public function getUserStories($account, $type = 'assignedTo', $orderBy = 'id_desc', $pager = null, $storyType = 'story', $includeLibStories = true) { - $sql = $this->dao->select('t1.*, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') + $sql = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id'); if($type == 'reviewBy') $sql = $sql->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story and t1.version = t3.version'); From cc92f9d3efe3993c24d8857a0baeac314ff35bf4 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 13:54:29 +0800 Subject: [PATCH 078/223] * Optimize code. --- module/product/control.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/product/control.php b/module/product/control.php index 4117f37706..6bd64993a9 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -225,7 +225,6 @@ class product extends control $sort = common::appendOrder($orderBy); if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); - /* Load pager. */ $this->app->loadClass('pager', $static = true); if($this->app->getViewType() == 'xhtml') $recPerPage = 10; From e98b4939c71d5c77da2237b26eb9d88558ac1456 Mon Sep 17 00:00:00 2001 From: mayue Date: Tue, 23 Aug 2022 14:15:12 +0800 Subject: [PATCH 079/223] * Fix bug #26655. --- module/design/js/browse.js | 4 ++-- module/design/model.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/design/js/browse.js b/module/design/js/browse.js index 472e4d5704..dd0b30a06d 100644 --- a/module/design/js/browse.js +++ b/module/design/js/browse.js @@ -1,6 +1,6 @@ $(function() { - $('#subNavbar .nav li').removeClass('active'); + $('#subNavbar .nav li').removeClass('active'); $('#subNavbar .nav li[data-id=' + type + ']').addClass('active'); $('#subNavbar .nav li > a').each(function() @@ -8,7 +8,7 @@ $(function() var type = $(this).parent().attr('data-id'); if(type == 'bysearch') return; - type = type == 'all' ? type : type.toUpperCase(); + type = type == 'all' ? type : type.toLowerCase(); var href = createLink('design', 'browse', 'projectID=' + projectID + '&productID=' + productID + '&type=' + type); $(this).attr('href', href); }); diff --git a/module/design/model.php b/module/design/model.php index 7fa9c33108..96fe52b191 100644 --- a/module/design/model.php +++ b/module/design/model.php @@ -408,6 +408,7 @@ class designModel extends model $this->lang->waterfall->menu->design['subMenu']->all = array('link' => "{$this->lang->all}|design|browse|projectID=%s&productID=0&browseType=all"); foreach(array_filter($this->lang->design->typeList) as $key => $value) { + $key = strtolower($key); $this->lang->waterfall->menu->design['subMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); } From 976de6e849c436f60b3083dc7acecf1ccb50eab1 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 23 Aug 2022 14:17:43 +0800 Subject: [PATCH 080/223] * Fix the problem of error reporting in the contribution task list. --- module/my/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/my/model.php b/module/my/model.php index 1b01e01007..96127c3ae3 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -336,7 +336,7 @@ class myModel extends model if($objectType == 'task') { - $objectList = $this->dao->select('t1.*, t2.name as executionName')->from($this->config->objectTables[$module])->alias('t1') + $objectList = $this->dao->select('t1.*, t2.name as executionName, t2.type as executionType')->from($this->config->objectTables[$module])->alias('t1') ->leftJoin(TABLE_EXECUTION)->alias('t2')->on("t1.execution = t2.id") ->where('t1.deleted')->eq(0) ->andWhere('t2.deleted')->eq(0) From 545d74f7d0aee411da58e428577be9566e927c74 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 14:50:40 +0800 Subject: [PATCH 081/223] * Optimize code for task #65808, #65807. --- module/bug/model.php | 18 +++++++++--------- module/build/control.php | 2 +- module/execution/control.php | 2 +- module/my/control.php | 8 ++++---- module/product/control.php | 2 +- module/productplan/control.php | 1 + module/projectrelease/control.php | 4 ++-- module/release/control.php | 4 ++-- module/story/model.php | 1 - 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index 9e275be1bc..ecdc4190ad 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -384,8 +384,8 @@ class bugModel extends model $browseType = ($browseType == 'bymodule' and $this->session->bugBrowseType and $this->session->bugBrowseType != 'bysearch') ? $this->session->bugBrowseType : $browseType; $browseType = $browseType == 'bybranch' ? 'bymodule' : $browseType; - if(strpos($sort, 'pri') !== false and strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); - if(strpos($sort, 'severity') !== false and strpos($sort, 'severityOrder') === false) $sort = str_replace('severity', 'severityOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'severity_') !== false and strpos($sort, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); /* Get bugs by browse type. */ $bugs = array(); @@ -509,7 +509,7 @@ class bugModel extends model */ public function getPlanBugs($planID, $status = 'all', $orderBy = 'id_desc', $pager = null) { - if(strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); + if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_BUG) ->where('plan')->eq((int)$planID) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() @@ -1718,8 +1718,8 @@ class bugModel extends model $queryName = $moduleName . 'Query'; $formName = $moduleName . 'Form'; - if(strpos($orderBy, 'pri') !== false and strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); - if(strpos($orderBy, 'severity') !== false and strpos($orderBy, 'severityOrder') === false) $orderBy = str_replace('severity', 'severityOrder', $orderBy); + if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + if(strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); $bugIDList = array(); if($moduleName == 'contributeBug') @@ -1830,8 +1830,8 @@ class bugModel extends model public function getProjectBugs($projectID, $productID = 0, $branchID = 0, $build = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null) { $type = strtolower($type); - if(strpos($orderBy, 'pri') !== false and strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); - if(strpos($orderBy, 'severity') !== false and strpos($orderBy, 'severityOrder') === false) $orderBy = str_replace('severity', 'severityOrder', $orderBy); + if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + if(strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); if($type == 'bysearch') { @@ -1901,8 +1901,8 @@ class bugModel extends model public function getExecutionBugs($executionID, $productID = 0, $branchID = 'all', $build = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null) { $type = strtolower($type); - if(strpos($orderBy, 'pri') !== false and strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); - if(strpos($orderBy, 'severity') !== false and strpos($orderBy, 'severityOrder') === false) $orderBy = str_replace('severity', 'severityOrder', $orderBy); + if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + if(strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); if($type == 'bysearch') { diff --git a/module/build/control.php b/module/build/control.php index 6938820f10..32722bccff 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -234,7 +234,7 @@ class build extends control if($this->app->getViewType() == 'mhtml') $recPerPage = 10; $sort = common::appendOrder($orderBy); - if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); /* Get product and bugs. */ $product = $this->loadModel('product')->getById($build->product); diff --git a/module/execution/control.php b/module/execution/control.php index bf027dd8e7..6fa7112654 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -783,7 +783,7 @@ class execution extends control /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $queryID = ($type == 'bysearch') ? $param : 0; $execution = $this->commonAction($executionID); diff --git a/module/my/control.php b/module/my/control.php index f228126be9..3265de48a9 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -332,7 +332,7 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $queryID = ($type == 'bysearch') ? (int)$param : 0; if($type == 'assignedBy') @@ -397,16 +397,16 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $queryID = ($type == 'bysearch') ? (int)$param : 0; if($type == 'assignedBy') { - $stories = $this->loadModel('my')->getAssignedByMe($this->app->user->account, '', $pager, $orderBy, 'requirement'); + $stories = $this->loadModel('my')->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'requirement'); } elseif($type == 'bysearch') { - $stories = $this->my->getRequirementsBySearch($queryID, $this->app->rawMethod, $orderBy, $pager); + $stories = $this->my->getRequirementsBySearch($queryID, $this->app->rawMethod, $sort, $pager); } else { diff --git a/module/product/control.php b/module/product/control.php index 6bd64993a9..3adc589008 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -223,7 +223,7 @@ class product extends control /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); /* Load pager. */ $this->app->loadClass('pager', $static = true); diff --git a/module/productplan/control.php b/module/productplan/control.php index d2e5ef4203..87af31c5a2 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -421,6 +421,7 @@ class productplan extends control /* Append id for secend sort. */ $orderBy = ($type == 'bug' and $orderBy == 'order_desc') ? 'id_desc' : $orderBy; $sort = common::appendOrder($orderBy); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $this->commonAction($plan->product, $plan->branch); $products = $this->product->getProductPairsByProject($this->session->project); diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index c46e466836..4585a2ca95 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -231,7 +231,7 @@ class projectrelease extends control } $sort = common::appendOrder($orderBy); - if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) @@ -255,7 +255,7 @@ class projectrelease extends control $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'linkedBug'); $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); - if($type == 'leftBug' and strpos($orderBy, 'severity') !== false) $sort = str_replace('severity', 'severityOrder', $orderBy); + if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); $leftBugs = $this->dao->select('*, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() diff --git a/module/release/control.php b/module/release/control.php index f1444842e9..247b506748 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -191,7 +191,7 @@ class release extends control if($this->app->getViewType() == 'mhtml') $recPerPage = 10; $sort = common::appendOrder($orderBy); - if(strpos($sort, 'priOrder') === false) $sort = str_replace('pri', 'priOrder', $sort); + if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0) @@ -211,7 +211,7 @@ class release extends control $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'linkedBug'); $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); - if($type == 'leftBug' and strpos($orderBy, 'severity') !== false) $sort = str_replace('severity', 'severityOrder', $orderBy); + if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); $leftBugs = $this->dao->select('*, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() diff --git a/module/story/model.php b/module/story/model.php index 2e9db703b7..d41caad65f 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -3283,7 +3283,6 @@ class storyModel extends model } else { - if(strpos($orderBy, 'priOrder') === false) $orderBy = str_replace('pri', 'priOrder', $orderBy); $stories = $this->dao->select('distinct t1.story, t1.plan, t1.order, t2.*, IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder') ->from(TABLE_PLANSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') From b016635bd85d6eae4e2a984ebda1a864849aa4b9 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 14:53:24 +0800 Subject: [PATCH 082/223] * Fix bug for task #65807. --- module/my/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/my/model.php b/module/my/model.php index 96127c3ae3..0cf5e5a4a1 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -948,7 +948,7 @@ class myModel extends model $requirementIDList[$requirementID] = $requirementID; } - $requirements = $this->dao->select('distinct t1.*, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') + $requirements = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story') ->where($myRequirementQuery) @@ -965,7 +965,7 @@ class myModel extends model } else { - $requirements = $this->dao->select('distinct t1.*, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') + $requirements = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story') ->where($myRequirementQuery) From 57528ecba515b0273ea9adaa578b9fdb7852c0b7 Mon Sep 17 00:00:00 2001 From: dongli Date: Tue, 23 Aug 2022 06:59:18 +0000 Subject: [PATCH 083/223] * Finish task #64972,64973. --- module/action/control.php | 10 ++++++---- module/action/view/trash.html.php | 16 ++++++++-------- module/execution/model.php | 8 ++++++-- module/story/model.php | 8 +++++--- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index e2eba9357b..0baf2fcad8 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -119,28 +119,30 @@ class action extends control if($browseType == 'execution') { $this->app->loadLang('execution'); + $this->loadModel('project'); $projectIdList = array(); foreach($trashes as $trash) $projectIdList[] = $trash->project; - $this->view->projectList = $this->loadModel('project')->getByIdList($projectIdList, 'all'); + $this->view->projectList = $this->project->getByIdList($projectIdList, 'all'); } /* Get the products name of story. */ if($browseType == 'story') { $this->app->loadLang('project'); + $this->loadModel('story'); $storyIdList = array(); foreach($trashes as $trash) $storyIdList[] = $trash->objectID; - $this->view->productList = $this->loadModel('story')->getByList($storyIdList, 'story'); + $this->view->productList = $this->story->getByList($storyIdList, 'story', 'all'); } /* Get the executions name of task. */ if($browseType == 'task') { $this->app->loadLang('task'); - $this->app->loadLang('project'); + $this->loadModel('execution'); $executionIdList = array(); foreach($trashes as $trash) $executionIdList[] = $trash->execution; - $this->view->executionList = $this->loadModel('execution')->getByIdList($executionIdList); + $this->view->executionList = $this->execution->getByIdList($executionIdList, 'all'); } /* Title and position. */ $this->view->title = $this->lang->action->trash; diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 985d5dff6d..752c2d4ab7 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -154,18 +154,18 @@ - objectID]->productTitle;?> - objectID]->deleted):?> - lang->project->deleted;?> - + objectID]->productTitle;?> + objectID]->productDeleted):?> + lang->story->deleted;?> + - execution]->name;?> - execution]->deleted):?> - lang->project->deleted;?> - + execution]->name;?> + execution]->deleted):?> + lang->execution->deleted;?> + actor);?>lang->execution->project;?> lang->project->product;?>lang->story->product;?> lang->task->execution;?>
    @@ -318,7 +317,6 @@
    - From 15eface39c03cfa8df222f10229986c2b45d9e6e Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 23 Aug 2022 15:40:29 +0800 Subject: [PATCH 088/223] * Finish task #65808. --- config/zentaopms.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/zentaopms.php b/config/zentaopms.php index a59c81cb38..08fed1ce95 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -398,3 +398,4 @@ $config->programPriv->waterfall = array_merge($config->programPriv->scrum, array $config->waterfallModules = array('workestimation', 'durationestimation', 'budget', 'programplan', 'review', 'reviewissue', 'weekly', 'cm', 'milestone', 'design', 'opportunity', 'auditplan', 'trainplan', 'gapanalysis', 'pssp', 'researchplan', 'researchreport'); $config->showMainMenu = true; +$config->maxPriValue = '256'; From 44d270da186703a33196e519b98cda9776f1ec41 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 23 Aug 2022 15:48:20 +0800 Subject: [PATCH 089/223] * Finish task #65808. --- module/bug/model.php | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index bc5ce9a7f1..a4017942dc 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -486,7 +486,7 @@ class bugModel extends model */ public function getModuleBugs($productIDList, $branch = 0, $moduleIdList = 0, $executions = array(), $orderBy = 'id_desc', $pager = null, $projectID = 0) { - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->eq($branch)->fi() ->beginIF(!empty($moduleIdList))->andWhere('module')->in($moduleIdList)->fi() @@ -510,7 +510,7 @@ class bugModel extends model public function getPlanBugs($planID, $status = 'all', $orderBy = 'id_desc', $pager = null) { if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); - $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_BUG) + $bugs = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_BUG) ->where('plan')->eq((int)$planID) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() ->beginIF($status != 'all')->andWhere('status')->in($status)->fi() @@ -1745,7 +1745,7 @@ class bugModel extends model $query = preg_replace('/`(\w+)`/', 't1.`$1`', $query); if($type != 'bySearch' and !$this->loadModel('common')->checkField(TABLE_BUG, $type)) return array(); - return $this->dao->select('t1.*,t2.name as productName, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') + return $this->dao->select("t1.*,t2.name as productName, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) as severityOrder")->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->where('t1.deleted')->eq(0) ->andWhere('t2.deleted')->eq('0') @@ -1845,7 +1845,7 @@ class bugModel extends model $bugQuery = $this->getBugQuery($this->session->projectBugQuery); - $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + $bugs = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where($bugQuery) ->andWhere('project')->eq((int)$projectID) ->andWhere('deleted')->eq(0) @@ -1858,7 +1858,7 @@ class bugModel extends model } else { - $bugs = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select("t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) as severityOrder")->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module=t2.id') ->where('t1.deleted')->eq(0) ->beginIF(empty($build))->andWhere('t1.project')->eq($projectID)->fi() @@ -1916,7 +1916,7 @@ class bugModel extends model $bugQuery = $this->getBugQuery($this->session->executionBugQuery); - $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + $bugs = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where($bugQuery) ->andWhere('execution')->eq((int)$executionID) ->andWhere('deleted')->eq(0) @@ -1929,7 +1929,7 @@ class bugModel extends model } else { - $bugs = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select("t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) as severityOrder")->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module=t2.id') ->where('t1.deleted')->eq(0) ->beginIF(!empty($productID) and $branchID !== 'all')->andWhere('t1.branch')->eq($branchID)->fi() @@ -2551,7 +2551,7 @@ class bugModel extends model */ public function getAllBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager = null, $projectID = 0) { - $bugs = $this->dao->select('t1.*, t2.title as planTitle, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select("t1.*, t2.title as planTitle, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) as severityOrder")->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t2')->on('t1.plan = t2.id') ->where('t1.product')->in($productIDList) ->andWhere('t1.execution')->in(array_keys($executions)) @@ -2582,7 +2582,7 @@ class bugModel extends model */ public function getByAssigntome($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('assignedTo')->eq($this->app->user->account) ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2609,7 +2609,7 @@ class bugModel extends model */ public function getByOpenedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*,IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*,IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('openedBy')->eq($this->app->user->account) ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2636,7 +2636,7 @@ class bugModel extends model */ public function getByResolvedbyme($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*,IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*,IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('resolvedBy')->eq($this->app->user->account) ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2664,7 +2664,7 @@ class bugModel extends model public function getByAssigntonull($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('assignedTo')->eq('') ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2691,7 +2691,7 @@ class bugModel extends model */ public function getUnconfirmed($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) ->andWhere('deleted')->eq(0) @@ -2719,7 +2719,7 @@ class bugModel extends model */ public function getOverdueBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2749,7 +2749,7 @@ class bugModel extends model */ public function getByStatus($productIDList, $branch, $modules, $executions, $status, $orderBy, $pager, $projectID) { - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2780,7 +2780,7 @@ class bugModel extends model public function getByLonglifebugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { $lastEditedDate = date(DT_DATE1, time() - $this->config->bug->longlife * 24 * 3600); - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('lastEditedDate')->lt($lastEditedDate) ->andWhere('product')->in($productIDList) ->andWhere('execution')->in(array_keys($executions)) @@ -2808,7 +2808,7 @@ class bugModel extends model */ public function getByPostponedbugs($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('resolution')->eq('postponed') ->andWhere('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() @@ -2835,7 +2835,7 @@ class bugModel extends model */ public function getByNeedconfirm($productIDList, $branch, $modules, $executions, $orderBy, $pager, $projectID) { - return $this->dao->select('t1.*, t2.title AS storyTitle, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') + return $this->dao->select("t1.*, t2.title AS storyTitle, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) as severityOrder")->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->where("t2.status = 'active'") ->andWhere('t1.product')->in($productIDList) @@ -2867,7 +2867,7 @@ class bugModel extends model public function getByAssignedbyme($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID) { $actionIDList = $this->dao->select('objectID')->from(TABLE_ACTION)->where('objectType')->eq('bug')->andWhere('action')->eq('assigned')->andWhere('actor')->eq($this->app->user->account)->fetchPairs('objectID', 'objectID'); - return $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG) + return $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('product')->in($productIDList) ->beginIF($branch !== 'all')->andWhere('branch')->in($branch)->fi() ->beginIF($modules)->andWhere('module')->in($modules)->fi() @@ -2939,7 +2939,7 @@ class bugModel extends model if($branch !== 'all' and strpos($bugQuery, '`branch` =') === false) $bugQuery .= " AND `branch` in('0','$branch')"; if(strpos($bugQuery, $allBranch) !== false) $bugQuery = str_replace($allBranch, '1', $bugQuery); - $bugs = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where($bugQuery) + $bugs = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG)->where($bugQuery) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() ->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi() @@ -2971,7 +2971,7 @@ class bugModel extends model */ public function getReviewBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager = null, $projectID = 0) { - $bugs = $this->dao->select('t1.*, t2.title as planTitle, IF(`pri` = 0, 999, `pri`) as priOrder, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->alias('t1') + $bugs = $this->dao->select("t1.*, t2.title as planTitle, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG)->alias('t1') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t2')->on('t1.plan = t2.id') ->where('t1.product')->in($productIDList) ->andWhere('t1.execution')->in(array_keys($executions)) From 06c64d7e6f65f838beb51b0f9a5eaa2e0aee5479 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 15:48:47 +0800 Subject: [PATCH 090/223] * Optimize code for task #65808, #65807. --- module/build/control.php | 2 +- module/common/model.php | 4 ++-- module/my/model.php | 10 +++++----- module/projectrelease/control.php | 4 ++-- module/release/control.php | 4 ++-- module/story/model.php | 16 ++++++++-------- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/module/build/control.php b/module/build/control.php index 32722bccff..ac84741c1c 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -248,7 +248,7 @@ class build extends control /* Get stories and stages. */ $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) ->where('id')->in($build->stories) ->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() diff --git a/module/common/model.php b/module/common/model.php index ea0b910982..fea1723b38 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2114,8 +2114,8 @@ EOD; $select = ''; if($this->session->$typeOnlyCondition) { - if(strpos($orderBy, 'priOrder') !== false) $select .= ', IF(`pri` = 0, 999, `pri`) as priOrder'; - if(strpos($orderBy, 'severityOrder') !== false) $select .= ', IF(`severity` = 0, 999, `severity`) as severityOrder'; + if(strpos($orderBy, 'priOrder') !== false) $select .= ", IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder"; + if(strpos($orderBy, 'severityOrder') !== false) $select .= ", IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder"; $sql = $this->dao->select("*$select")->from($table) ->where($queryCondition) ->beginIF($orderBy != false)->orderBy($orderBy)->fi() diff --git a/module/my/model.php b/module/my/model.php index 0cf5e5a4a1..47897980b6 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -348,7 +348,7 @@ class myModel extends model elseif($objectType == 'requirement' or $objectType == 'story' or $objectType == 'bug') { $orderBy = (strpos($orderBy, 'priOrder') !== false or strpos($orderBy, 'severityOrder') !== false) ? $orderBy : "t1.$orderBy"; - $select = strpos($orderBy, 'severity') !== false ? 't1.*,IF(t1.`severity` = 0, 999, t1.`severity`) as severityOrder' : 't1.*,IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder'; + $select = strpos($orderBy, 'severity') !== false ? "t1.*,IF(t1.`severity` = 0, {$this->config->maxPriValue}, t1.`severity`) as severityOrder" : "t1.*,IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder"; $objectList = $this->dao->select($select)->from($this->config->objectTables[$module])->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on("t1.product = t2.id") ->where('t1.deleted')->eq(0) @@ -829,7 +829,7 @@ class myModel extends model $storyIDList[$storyID] = $storyID; } - $stories = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle')->from(TABLE_STORY)->alias('t1') + $stories = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle")->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_PLANSTORY)->alias('t3')->on('t1.id = t3.plan') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t4')->on('t3.plan = t4.id') @@ -848,7 +848,7 @@ class myModel extends model } else { - $stories = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle')->from(TABLE_STORY)->alias('t1') + $stories = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle, t4.title as planTitle")->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_PLANSTORY)->alias('t3')->on('t1.id = t3.plan') ->leftJoin(TABLE_PRODUCTPLAN)->alias('t4')->on('t3.plan = t4.id') @@ -948,7 +948,7 @@ class myModel extends model $requirementIDList[$requirementID] = $requirementID; } - $requirements = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') + $requirements = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle")->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story') ->where($myRequirementQuery) @@ -965,7 +965,7 @@ class myModel extends model } else { - $requirements = $this->dao->select('distinct t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') + $requirements = $this->dao->select("distinct t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle")->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id') ->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story') ->where($myRequirementQuery) diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index 4585a2ca95..a182382349 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -234,7 +234,7 @@ class projectrelease extends control if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) ->where('id')->in($release->stories) ->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() @@ -257,7 +257,7 @@ class projectrelease extends control $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); - $leftBugs = $this->dao->select('*, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) + $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() ->page($leftBugPager) ->fetchAll(); diff --git a/module/release/control.php b/module/release/control.php index 247b506748..1d2121d3a0 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -194,7 +194,7 @@ class release extends control if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() ->page($storyPager) ->fetchAll('id'); @@ -213,7 +213,7 @@ class release extends control $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); - $leftBugs = $this->dao->select('*, IF(`severity` = 0, 999, `severity`) as severityOrder')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) + $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() ->page($leftBugPager) ->fetchAll(); diff --git a/module/story/model.php b/module/story/model.php index bf06084fb0..d10a44be87 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2601,7 +2601,7 @@ class storyModel extends model if(empty($normalProducts) and empty($branchProducts)) $productQuery .= '1 = 1'; $productQuery .= ') '; - $stories = $this->dao->select('*, IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) ->where('product')->in($productID) ->andWhere($productQuery) ->beginIF(!$hasParent)->andWhere("parent")->ge(0)->fi() @@ -2815,7 +2815,7 @@ class storyModel extends model $actionIDList = array(); if($fieldName == 'assignedBy') $actionIDList = $this->dao->select('objectID')->from(TABLE_ACTION)->where('objectType')->eq('story')->andWhere('action')->eq('assigned')->andWhere('actor')->eq($fieldValue)->fetchPairs('objectID', 'objectID'); - $sql = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder')->from(TABLE_STORY)->alias('t1'); + $sql = $this->dao->select("t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder")->from(TABLE_STORY)->alias('t1'); if($fieldName == 'reviewBy') $sql = $sql->leftJoin(TABLE_STORYREVIEW)->alias('t2')->on('t1.id = t2.story and t1.version = t2.version'); $stories = $sql->where('t1.product')->in($productID) @@ -2851,7 +2851,7 @@ class storyModel extends model */ public function get2BeClosed($productID, $branch, $modules, $type = 'story', $orderBy = '', $pager = null) { - $stories = $this->dao->select('*,IF(`pri` = 0, 999, `pri`) as priOrder')->from(TABLE_STORY) + $stories = $this->dao->select("*,IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) ->where('product')->in($productID) ->andWhere('type')->eq($type) ->beginIF($branch)->andWhere("branch")->eq($branch)->fi() @@ -3027,7 +3027,7 @@ class storyModel extends model } } - $tmpStories = $this->dao->select('DISTINCT t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder')->from(TABLE_STORY)->alias('t1') + $tmpStories = $this->dao->select("DISTINCT t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder")->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PROJECTSTORY)->alias('t2')->on('t1.id=t2.story') ->beginIF(strpos($sql, 'result') !== false)->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story and t1.version = t3.version')->fi() ->where($sql) @@ -3127,7 +3127,7 @@ class storyModel extends model } } - $stories = $this->dao->select('distinct t1.*, t2.*, IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') + $stories = $this->dao->select("distinct t1.*, t2.*, IF(t2.`pri` = 0, {$this->config->maxPriValue}, t2.`pri`) as priOrder, t3.type as productType, t2.version as version")->from(TABLE_PROJECTSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t2.product = t3.id') ->beginIF(strpos($storyQuery, 'result') !== false)->leftJoin(TABLE_STORYREVIEW)->alias('t4')->on('t2.id = t4.story and t2.version = t4.version')->fi() @@ -3168,7 +3168,7 @@ class storyModel extends model $type = (strpos('bymodule|byproduct', $type) !== false and $this->session->storyBrowseType) ? $this->session->storyBrowseType : $type; - $stories = $this->dao->select('distinct t1.*, t2.*, IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder, t3.type as productType, t2.version as version')->from(TABLE_PROJECTSTORY)->alias('t1') + $stories = $this->dao->select("distinct t1.*, t2.*, IF(t2.`pri` = 0, {$this->config->maxPriValue}, t2.`pri`) as priOrder, t3.type as productType, t2.version as version")->from(TABLE_PROJECTSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t2.product = t3.id') ->where('t1.project')->eq((int)$executionID) @@ -3283,7 +3283,7 @@ class storyModel extends model } else { - $stories = $this->dao->select('distinct t1.story, t1.plan, t1.order, t2.*, IF(t2.`pri` = 0, 999, t2.`pri`) as priOrder') + $stories = $this->dao->select("distinct t1.story, t1.plan, t1.order, t2.*, IF(t2.`pri` = 0, {$this->config->maxPriValue}, t2.`pri`) as priOrder") ->from(TABLE_PLANSTORY)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->where('t1.plan')->eq($planID) @@ -3390,7 +3390,7 @@ class storyModel extends model */ public function getUserStories($account, $type = 'assignedTo', $orderBy = 'id_desc', $pager = null, $storyType = 'story', $includeLibStories = true) { - $sql = $this->dao->select('t1.*, IF(t1.`pri` = 0, 999, t1.`pri`) as priOrder, t2.name as productTitle')->from(TABLE_STORY)->alias('t1') + $sql = $this->dao->select("t1.*, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder, t2.name as productTitle")->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id'); if($type == 'reviewBy') $sql = $sql->leftJoin(TABLE_STORYREVIEW)->alias('t3')->on('t1.id = t3.story and t1.version = t3.version'); From a6584913955a3d075f8b6c0700fbcec387eee2e0 Mon Sep 17 00:00:00 2001 From: lanzongjun Date: Tue, 23 Aug 2022 15:57:06 +0800 Subject: [PATCH 091/223] * fix bug #65904 --- module/programplan/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/programplan/model.php b/module/programplan/model.php index 2119433318..61d186ffdf 100755 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -205,7 +205,7 @@ class programplanModel extends model $data->textColor = $this->lang->execution->gantt->stage->textColor; $data->bar_height = $this->lang->execution->gantt->bar_height; - if($data->endDate > $data->start_date) $data->duration = helper::diffDate($data->endDate, $data->start_date) + 1; + if($data->endDate > $data->start_date) $data->duration = helper::diffDate(substr($data->endDate, 0, 10), substr($data->start_date, 0, 10)) + 1; if($data->start_date) $data->start_date = date('d-m-Y', strtotime($data->start_date)); if($data->start_date == '' or $data->endDate == '') $data->duration = 1; @@ -294,7 +294,7 @@ class programplanModel extends model $data->owner_id = join(',', $assigneds); } - if($data->endDate > $data->start_date) $data->duration = helper::diffDate($data->endDate, $data->start_date) + 1; + if($data->endDate > $data->start_date) $data->duration = helper::diffDate(substr($data->endDate, 0, 10), substr($data->start_date, 0, 10)) + 1; if($data->start_date) $data->start_date = date('d-m-Y', strtotime($data->start_date)); if($data->start_date == '' or $data->endDate == '') $data->duration = 1; From 3a99afd287018d468b4a95b2d4ed4f7434355a31 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 23 Aug 2022 16:12:52 +0800 Subject: [PATCH 092/223] * Finish task #65808,65807. --- module/bug/model.php | 14 +++++++------- module/my/control.php | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index a4017942dc..8a89385f0b 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -384,8 +384,8 @@ class bugModel extends model $browseType = ($browseType == 'bymodule' and $this->session->bugBrowseType and $this->session->bugBrowseType != 'bysearch') ? $this->session->bugBrowseType : $browseType; $browseType = $browseType == 'bybranch' ? 'bymodule' : $browseType; - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); - if(strpos($sort, 'severity_') !== false and strpos($sort, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'severity_') !== false) $sort = str_replace('severity_', 'severityOrder_', $sort); /* Get bugs by browse type. */ $bugs = array(); @@ -509,7 +509,7 @@ class bugModel extends model */ public function getPlanBugs($planID, $status = 'all', $orderBy = 'id_desc', $pager = null) { - if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + if(strpos($orderBy, 'pri_') !== false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); $bugs = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_BUG) ->where('plan')->eq((int)$planID) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() @@ -1826,8 +1826,8 @@ class bugModel extends model public function getProjectBugs($projectID, $productID = 0, $branchID = 0, $build = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null) { $type = strtolower($type); - if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); - if(strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); + if(strpos($orderBy, 'pri_') !== false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + if(strpos($orderBy, 'severity_') !== false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); if($type == 'bysearch') { @@ -1897,8 +1897,8 @@ class bugModel extends model public function getExecutionBugs($executionID, $productID = 0, $branchID = 'all', $build = 0, $type = '', $param = 0, $orderBy = 'id_desc', $excludeBugs = '', $pager = null) { $type = strtolower($type); - if(strpos($orderBy, 'pri_') !== false and strpos($orderBy, 'priOrder_') === false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); - if(strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); + if(strpos($orderBy, 'pri_') !== false) $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + if(strpos($orderBy, 'severity_') !== false) $orderBy = str_replace('severity_', 'severityOrder_', $orderBy); if($type == 'bysearch') { diff --git a/module/my/control.php b/module/my/control.php index ead518647f..410145f572 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -332,7 +332,7 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $queryID = ($type == 'bysearch') ? (int)$param : 0; if($type == 'assignedBy') @@ -397,7 +397,7 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $queryID = ($type == 'bysearch') ? (int)$param : 0; if($type == 'assignedBy') @@ -571,8 +571,8 @@ EOF; /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); - if(strpos($sort, 'severity_') !== false and strpos($sort, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'severity_') !== false) $sort = str_replace('severity_', 'severityOrder_', $sort); if($type == 'assignedBy') { $bugs = $this->my->getAssignedByMe($this->app->user->account, '', $pager, $sort, 'bug'); From c95ecbd1a64f3a4800c70b7d77e5610369c7b234 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 16:19:20 +0800 Subject: [PATCH 093/223] * Optimize code for task #65808. --- module/build/control.php | 10 +++++++--- module/common/model.php | 4 ++-- module/execution/control.php | 2 +- module/product/control.php | 2 +- module/productplan/control.php | 2 +- module/projectrelease/control.php | 17 ++++++++++++----- module/release/control.php | 24 ++++++++++++++++-------- 7 files changed, 40 insertions(+), 21 deletions(-) diff --git a/module/build/control.php b/module/build/control.php index ac84741c1c..9feda59a49 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -234,21 +234,25 @@ class build extends control if($this->app->getViewType() == 'mhtml') $recPerPage = 10; $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); /* Get product and bugs. */ $product = $this->loadModel('product')->getById($build->product); if($product->type != 'normal') $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$product->type]); $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); - $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($build->bugs)->andWhere('deleted')->eq(0) + $bugs = $this->dao->select('*') + ->from(TABLE_BUG) + ->where('id')->in($build->bugs) + ->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($sort)->fi() ->page($bugPager) ->fetchAll(); /* Get stories and stages. */ $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder") + ->from(TABLE_STORY) ->where('id')->in($build->stories) ->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() diff --git a/module/common/model.php b/module/common/model.php index fea1723b38..c696f149b6 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2114,8 +2114,8 @@ EOD; $select = ''; if($this->session->$typeOnlyCondition) { - if(strpos($orderBy, 'priOrder') !== false) $select .= ", IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder"; - if(strpos($orderBy, 'severityOrder') !== false) $select .= ", IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder"; + if(strpos($orderBy, 'priOrder_') !== false) $select .= ", IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder"; + if(strpos($orderBy, 'severityOrder_') !== false) $select .= ", IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder"; $sql = $this->dao->select("*$select")->from($table) ->where($queryCondition) ->beginIF($orderBy != false)->orderBy($orderBy)->fi() diff --git a/module/execution/control.php b/module/execution/control.php index 6fa7112654..7c2732783c 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -783,7 +783,7 @@ class execution extends control /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $queryID = ($type == 'bysearch') ? $param : 0; $execution = $this->commonAction($executionID); diff --git a/module/product/control.php b/module/product/control.php index 3adc589008..aef0eb97ab 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -223,7 +223,7 @@ class product extends control /* Append id for secend sort. */ $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); /* Load pager. */ $this->app->loadClass('pager', $static = true); diff --git a/module/productplan/control.php b/module/productplan/control.php index 87af31c5a2..7e0ed327bb 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -421,7 +421,7 @@ class productplan extends control /* Append id for secend sort. */ $orderBy = ($type == 'bug' and $orderBy == 'order_desc') ? 'id_desc' : $orderBy; $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $this->commonAction($plan->product, $plan->branch); $products = $this->product->getProductPairsByProject($this->session->project); diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index a182382349..353905ead1 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -231,10 +231,11 @@ class projectrelease extends control } $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder") + ->from(TABLE_STORY) ->where('id')->in($release->stories) ->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() @@ -248,16 +249,22 @@ class projectrelease extends control $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story'); $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); - $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->bugs)->andWhere('deleted')->eq(0) + $bugs = $this->dao->select('*') + ->from(TABLE_BUG) + ->where('id')->in($release->bugs) + ->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($sort)->fi() ->page($bugPager) ->fetchAll(); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'linkedBug'); $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); - if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); + if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false) $sort = str_replace('severity_', 'severityOrder_', $sort); - $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) + $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder") + ->from(TABLE_BUG) + ->where('id')->in($release->leftBugs) + ->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() ->page($leftBugPager) ->fetchAll(); diff --git a/module/release/control.php b/module/release/control.php index 1d2121d3a0..4cd6be803d 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -191,29 +191,37 @@ class release extends control if($this->app->getViewType() == 'mhtml') $recPerPage = 10; $sort = common::appendOrder($orderBy); - if(strpos($sort, 'pri_') !== false and strpos($sort, 'priOrder_') === false) $sort = str_replace('pri_', 'priOrder_', $sort); + if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0) - ->beginIF($type == 'story')->orderBy($sort)->fi() - ->page($storyPager) - ->fetchAll('id'); + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder") + ->from(TABLE_STORY) + ->where('id')->in($release->stories) + ->andWhere('deleted')->eq(0) + ->beginIF($type == 'story')->orderBy($sort)->fi() + ->page($storyPager) + ->fetchAll('id'); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story'); $stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in(array_keys($stories))->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage'); foreach($stages as $storyID => $stage)$stories[$storyID]->stage = $stage; $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); - $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->bugs)->andWhere('deleted')->eq(0) + $bugs = $this->dao->select('*')->from(TABLE_BUG) + ->where('id')->in($release->bugs) + ->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($sort)->fi() ->page($bugPager) ->fetchAll(); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'linkedBug'); $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); - if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false and strpos($orderBy, 'severityOrder_') === false) $sort = str_replace('severity_', 'severityOrder_', $sort); + if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false) $sort = str_replace('severity_', 'severityOrder_', $sort); - $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0) + $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder") + ->from(TABLE_BUG) + ->where('id')->in($release->leftBugs) + ->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() ->page($leftBugPager) ->fetchAll(); From 277ee237d91aa1936300a6a58c0887d2959ceb7a Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 23 Aug 2022 16:25:38 +0800 Subject: [PATCH 094/223] * Optimize code for task #65808, #65807. --- module/build/control.php | 6 ++---- module/projectrelease/control.php | 9 +++------ module/release/control.php | 6 ++---- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/module/build/control.php b/module/build/control.php index 9feda59a49..50cc8a87da 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -241,8 +241,7 @@ class build extends control if($product->type != 'normal') $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$product->type]); $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); - $bugs = $this->dao->select('*') - ->from(TABLE_BUG) + $bugs = $this->dao->select('*')->from(TABLE_BUG) ->where('id')->in($build->bugs) ->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($sort)->fi() @@ -251,8 +250,7 @@ class build extends control /* Get stories and stages. */ $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder") - ->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) ->where('id')->in($build->stories) ->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index 353905ead1..f28fa403f5 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -234,8 +234,7 @@ class projectrelease extends control if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder") - ->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) ->where('id')->in($release->stories) ->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() @@ -249,8 +248,7 @@ class projectrelease extends control $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story'); $bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1); - $bugs = $this->dao->select('*') - ->from(TABLE_BUG) + $bugs = $this->dao->select('*')->from(TABLE_BUG) ->where('id')->in($release->bugs) ->andWhere('deleted')->eq(0) ->beginIF($type == 'bug')->orderBy($sort)->fi() @@ -261,8 +259,7 @@ class projectrelease extends control $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false) $sort = str_replace('severity_', 'severityOrder_', $sort); - $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder") - ->from(TABLE_BUG) + $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('id')->in($release->leftBugs) ->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() diff --git a/module/release/control.php b/module/release/control.php index 4cd6be803d..1ff6c453b6 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -194,8 +194,7 @@ class release extends control if(strpos($sort, 'pri_') !== false) $sort = str_replace('pri_', 'priOrder_', $sort); $storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1); - $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder") - ->from(TABLE_STORY) + $stories = $this->dao->select("*, IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder")->from(TABLE_STORY) ->where('id')->in($release->stories) ->andWhere('deleted')->eq(0) ->beginIF($type == 'story')->orderBy($sort)->fi() @@ -218,8 +217,7 @@ class release extends control $leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1); if($type == 'leftBug' and strpos($orderBy, 'severity_') !== false) $sort = str_replace('severity_', 'severityOrder_', $sort); - $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder") - ->from(TABLE_BUG) + $leftBugs = $this->dao->select("*, IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder")->from(TABLE_BUG) ->where('id')->in($release->leftBugs) ->andWhere('deleted')->eq(0) ->beginIF($type == 'leftBug')->orderBy($sort)->fi() From 6e531700eeb77acf20a721cf5027223226cff2de Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 23 Aug 2022 16:56:58 +0800 Subject: [PATCH 095/223] * Finish task#60722. --- module/product/config.php | 4 ++-- module/product/view/all.html.php | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/module/product/config.php b/module/product/config.php index 84bd9b6334..bb08427abd 100644 --- a/module/product/config.php +++ b/module/product/config.php @@ -149,8 +149,8 @@ $config->product->report->planLabels = array(); $config->product->report->planLabels[] = ''; $config->product->statisticFields = array(); -$config->product->statisticFields['requirements'] = array('draftRequirements', 'activeRequirements', 'changingRequirements', 'closedRequirements'); -$config->product->statisticFields['stories'] = array('draftStories', 'activeStories', 'changingStories', 'closedStories'); +$config->product->statisticFields['requirements'] = array('draftRequirements', 'activeRequirements', 'changingRequirements', 'reviewingRequirements', 'closedRequirements'); +$config->product->statisticFields['stories'] = array('draftStories', 'activeStories', 'changingStories', 'reviewingStories', 'closedStories'); $config->product->statisticFields['bugs'] = array('unResolvedBugs', 'closedBugs', 'fixedBugs'); $config->product->statisticFields['plans'] = array('plans'); $config->product->statisticFields['releases'] = array('releases'); diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index b15495516a..9e5ece751d 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -51,9 +51,9 @@ product->name);?> config->URAndSR):?> -
    story->requirement;?>story->requirement;?> story->story;?>story->story;?> bug->common;?> product->plan;?> product->release;?>story->draft;?> story->activate;?> story->change;?>story->statusList['reviewing'];?>
    story->completeRate;?>
    story->draft;?> story->activate;?> story->change;?>story->statusList['reviewing'];?>
    story->completeRate;?>
    bug->activate;?> close;?> % % % % requirements['draft'];?> requirements['active'];?> requirements['changing'];?>requirements['reviewing'];?> requirements['closed'] / $totalRequirements, 3) * 100;?>% stories['draft'];?> stories['active'];?> stories['changing'];?>stories['reviewing'];?> stories['closed'] / $totalStories, 3) * 100;?>% unResolved;?> closedBugs;?>idAB);?> action->objectName;?> lang->execution->project;?>lang->project->project;?> lang->story->product;?> + project]->name;?> project]->deleted):?> lang->project->deleted;?> @@ -153,7 +153,7 @@ + objectID]->productTitle;?> objectID]->productDeleted):?> lang->story->deleted;?> @@ -161,7 +161,7 @@ + execution]->name;?> execution]->deleted):?> lang->execution->deleted;?> diff --git a/module/project/lang/de.php b/module/project/lang/de.php index 1c678d1312..17b7fd1bc2 100644 --- a/module/project/lang/de.php +++ b/module/project/lang/de.php @@ -48,7 +48,7 @@ $lang->project->errorSamePlans = 'Project cannot be associated with multiple $lang->project->errorNoProducts = 'At least one product is associated'; $lang->project->copyNoProject = 'There are no items available to copy.'; $lang->project->searchByName = 'Enter the project name to search'; -$lang->project->deleted = 'Deleted'; +$lang->project->deleted = 'Gelöscht'; $lang->project->linkedProducts = "Linked {$lang->productCommon}s"; $lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s"; $lang->project->testreport = 'Testreport'; diff --git a/module/project/lang/fr.php b/module/project/lang/fr.php index 1d650086f8..172369bcb4 100644 --- a/module/project/lang/fr.php +++ b/module/project/lang/fr.php @@ -48,7 +48,7 @@ $lang->project->errorSamePlans = 'Project cannot be associated with multiple $lang->project->errorNoProducts = 'At least one product is associated'; $lang->project->copyNoProject = 'There are no items available to copy.'; $lang->project->searchByName = 'Enter the project name to retrieve'; -$lang->project->deleted = 'Deleted'; +$lang->project->deleted = 'Supprimé'; $lang->project->linkedProducts = "Linked {$lang->productCommon}s"; $lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s"; $lang->project->testreport = 'Testreport'; From a1b16e0132bcac70247f82810cd7de5725b43248 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Tue, 23 Aug 2022 21:03:50 +0800 Subject: [PATCH 099/223] * Fix bug #26265. --- module/file/lang/de.php | 6 ++++++ module/file/lang/en.php | 6 ++++++ module/file/lang/fr.php | 6 ++++++ module/file/lang/vi.php | 6 ++++++ module/file/lang/zh-cn.php | 6 ++++++ module/file/model.php | 2 ++ module/port/control.php | 3 +++ 7 files changed, 35 insertions(+) diff --git a/module/file/lang/de.php b/module/file/lang/de.php index d157e6e28d..9fce4814f3 100755 --- a/module/file/lang/de.php +++ b/module/file/lang/de.php @@ -70,3 +70,9 @@ $lang->file->errorSuffix = 'Format ist falsch. Nur .zip Dateien!'; $lang->file->errorExtract = 'Entpacken fehlgeschlagen. Die Datei ist vermutlich defekt.'; $lang->file->fileNotFound = 'The file was not found. The physical file might have been deleted!'; $lang->file->fileContentEmpty = 'The file is empty. Check the file and upload it again.'; + +$lang->file->uploadError[1] = 'The uploaded filesize exceeds the limit. Please change the upload_max_filesize and post_max_size options in php.ini'; +$lang->file->uploadError[2] = 'The size of the uploaded file exceeds the value specified by the MAX_FILE_SIZE option in the HTML form'; +$lang->file->uploadError[3] = 'Only part of the file has been uploaded, please re-upload'; +$lang->file->uploadError[4] = 'No files have been uploaded'; +$lang->file->uploadError[5] = 'The size of the file is 0. Please upload the file again'; diff --git a/module/file/lang/en.php b/module/file/lang/en.php index 78495f78de..ce9e2af939 100755 --- a/module/file/lang/en.php +++ b/module/file/lang/en.php @@ -70,3 +70,9 @@ $lang->file->errorSuffix = 'Format is incorrect. .zip files ONLY!'; $lang->file->errorExtract = 'Extracting files failed. Files might be damaged or there might be invalid files in the zip package.'; $lang->file->fileNotFound = 'The file was not found. The physical file might have been deleted!'; $lang->file->fileContentEmpty = 'The file is empty. Check the file and upload it again.'; + +$lang->file->uploadError[1] = 'The uploaded filesize exceeds the limit. Please change the upload_max_filesize and post_max_size options in php.ini'; +$lang->file->uploadError[2] = 'The size of the uploaded file exceeds the value specified by the MAX_FILE_SIZE option in the HTML form'; +$lang->file->uploadError[3] = 'Only part of the file has been uploaded, please re-upload'; +$lang->file->uploadError[4] = 'No files have been uploaded'; +$lang->file->uploadError[5] = 'The size of the file is 0. Please upload the file again'; diff --git a/module/file/lang/fr.php b/module/file/lang/fr.php index 6b29ba71f9..8740450ca8 100755 --- a/module/file/lang/fr.php +++ b/module/file/lang/fr.php @@ -70,3 +70,9 @@ $lang->file->errorSuffix = 'Format incorrect. Fichiers .zip SEULEMENT !'; $lang->file->errorExtract = "Echec de l'extraction des fichiers. Les fichiers peuvent être endommagé ou il y a un fichier invalide dans le zip."; $lang->file->fileNotFound = 'Fichier non trouvé. Le fichier physique a peut-être été supprimé par innadvertance !'; $lang->file->fileContentEmpty = 'The file is empty. Check the file and upload it again.'; + +$lang->file->uploadError[1] = 'The uploaded filesize exceeds the limit. Please change the upload_max_filesize and post_max_size options in php.ini'; +$lang->file->uploadError[2] = 'The size of the uploaded file exceeds the value specified by the MAX_FILE_SIZE option in the HTML form'; +$lang->file->uploadError[3] = 'Only part of the file has been uploaded, please re-upload'; +$lang->file->uploadError[4] = 'No files have been uploaded'; +$lang->file->uploadError[5] = 'The size of the file is 0. Please upload the file again'; diff --git a/module/file/lang/vi.php b/module/file/lang/vi.php index 3a11441b1b..0c9b409d95 100755 --- a/module/file/lang/vi.php +++ b/module/file/lang/vi.php @@ -65,3 +65,9 @@ $lang->file->errorSuffix = 'Format is incorrect. .zip files ONLY!'; $lang->file->errorExtract = 'Extracting files failed. Files might be damaged or there might be invalid files in the zip package.'; $lang->file->fileNotFound = 'Tập tin was not found. The physical file might have been deleted!'; $lang->file->fileContentEmpty = 'The file is empty. Check the file and upload it again.'; + +$lang->file->uploadError[1] = 'The uploaded filesize exceeds the limit. Please change the upload_max_filesize and post_max_size options in php.ini'; +$lang->file->uploadError[2] = 'The size of the uploaded file exceeds the value specified by the MAX_FILE_SIZE option in the HTML form'; +$lang->file->uploadError[3] = 'Only part of the file has been uploaded, please re-upload'; +$lang->file->uploadError[4] = 'No files have been uploaded'; +$lang->file->uploadError[5] = 'The size of the file is 0. Please upload the file again'; diff --git a/module/file/lang/zh-cn.php b/module/file/lang/zh-cn.php index d44c794fd5..972cfc1a13 100755 --- a/module/file/lang/zh-cn.php +++ b/module/file/lang/zh-cn.php @@ -70,3 +70,9 @@ $lang->file->errorSuffix = '压缩包格式错误,只能上传zip压缩 $lang->file->errorExtract = '解压缩失败!可能文件已经损坏,或压缩包里含有非法上传文件。'; $lang->file->fileNotFound = '未找到该文件,可能物理文件已被删除!'; $lang->file->fileContentEmpty = '上传文件内容为空,请检查后重新上传。'; + +$lang->file->uploadError[1] = "上传的文件大小超过了限制,请修改 php.ini 中 upload_max_filesize 与 post_max_size 选项限制的值"; +$lang->file->uploadError[2] = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值'; +$lang->file->uploadError[3] = '文件只有部分被上传,请重新上传'; +$lang->file->uploadError[4] = '没有文件被上传'; +$lang->file->uploadError[5] = '上传文件大小为0,请重新上传'; diff --git a/module/file/model.php b/module/file/model.php index aaf8813c45..5a6d65185f 100755 --- a/module/file/model.php +++ b/module/file/model.php @@ -167,6 +167,8 @@ class fileModel extends model $files = array(); if(!isset($_FILES[$htmlTagName])) return $files; + if($_FILES[$htmlTagName]['error'] != 0) return $_FILES[$htmlTagName]; + $this->app->loadClass('purifier', true); $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); diff --git a/module/port/control.php b/module/port/control.php index bc8edac653..39257735fb 100644 --- a/module/port/control.php +++ b/module/port/control.php @@ -102,6 +102,9 @@ class port extends control if($_FILES) { $file = $this->loadModel('file')->getUpload('file'); + + if(!empty($file['error'])) return print(js::confirm($this->lang->file->uploadError[$file['error']])); + $file = $file[0]; $shortName = $this->file->getSaveName($file['pathname']); From a36eb814dbedb31dcdc068c2b55c62ff9d4b1a76 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 23 Aug 2022 21:52:11 +0800 Subject: [PATCH 100/223] * Add story type for submit review. --- module/group/lang/resource.php | 2 ++ module/story/control.php | 3 ++- module/story/model.php | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 7f4658ac1c..8fb3f6edba 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -560,6 +560,7 @@ if($config->URAndSR) $lang->resource->requirement->view = 'view'; $lang->resource->requirement->change = 'changeAction'; $lang->resource->requirement->review = 'reviewAction'; + $lang->resource->requirement->submitReview = 'submitReview'; $lang->resource->requirement->batchReview = 'batchReview'; $lang->resource->requirement->recall = 'recall'; $lang->resource->requirement->assignTo = 'assignAction'; @@ -580,6 +581,7 @@ if($config->URAndSR) $lang->requirement->methodOrder[30] = 'view'; $lang->requirement->methodOrder[35] = 'change'; $lang->requirement->methodOrder[40] = 'review'; + $lang->requirement->methodOrder[44] = 'submitReview'; $lang->requirement->methodOrder[45] = 'batchReview'; $lang->requirement->methodOrder[50] = 'recall'; $lang->requirement->methodOrder[55] = 'close'; diff --git a/module/story/control.php b/module/story/control.php index d9c65ca598..395efa8d69 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1539,10 +1539,11 @@ class story extends control * Submit review. * * @param int $storyID + * @param string $storyType story|requirement * @access public * @return void */ - public function submitReview($storyID) + public function submitReview($storyID, $storyType = 'story') { if($_POST) { diff --git a/module/story/model.php b/module/story/model.php index dbef4f420d..859b9608ac 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4222,7 +4222,7 @@ class storyModel extends model if(strpos('draft,changing', $story->status) !== false) { - $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id", $story, $type, 'sub-review', '', 'iframe', true, "data-width='50%'"); + $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id&storyType=$story->type", $story, $type, 'sub-review', '', 'iframe', true, "data-width='50%'"); } else { @@ -4263,7 +4263,7 @@ class storyModel extends model $menu .= $this->buildMenu('story', 'recall', $params . "&from=list&confirm=no&storyType=$story->type", $story, $type, 'undo', 'hiddenwin', 'showinonlybody', false, '', $title); $menu .= $this->buildMenu('story', 'close', $params . "&from=&storyType=$story->type", $story, $type, '', '', 'iframe', true); - $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from&storyType=$story->type", $story, $type, '', '', 'showinonlybody'); + $menu .= $this->buildMenu('story', 'edit', $params . "&kanbanGroup=default&storyType=$story->type", $story, $type, '', '', 'showinonlybody'); $tab = $this->app->tab == 'project' ? 'project' : 'qa'; if($story->type != 'requirement' and $this->config->vision != 'lite') $menu .= $this->buildMenu('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$params", $story, $type, 'sitemap', '', 'showinonlybody', false, "data-app='$tab'"); @@ -4299,7 +4299,7 @@ class storyModel extends model if($type == 'view') { $menu .= $this->buildMenu('story', 'change', $params . "&from=&storyType=$story->type", $story, $type, 'alter', '', 'showinonlybody'); - if($story->status == 'draft') $menu .= $this->buildMenu('story', 'submitReview', $params, $story, $type, 'sub-review', '', 'showinonlybody iframe', true, "data-width='50%'"); + if($story->status == 'draft') $menu .= $this->buildMenu('story', 'submitReview', $params . "&storyType=$story->type", $story, $type, 'sub-review', '', 'showinonlybody iframe', true, "data-width='50%'"); $title = $story->status == 'changing' ? $this->lang->story->recallChange : $this->lang->story->recall; $menu .= $this->buildMenu('story', 'recall', $params . "&from=view&confirm=no&storyType=$story->type", $story, $type, 'undo', 'hiddenwin', 'showinonlybody', false, '', $title); From e81b8552fe84e7896f4f6f63744927aa2f79b28b Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 23 Aug 2022 22:01:22 +0800 Subject: [PATCH 101/223] * Add lang of requirement. --- module/story/lang/de.php | 3 ++- module/story/lang/en.php | 3 ++- module/story/lang/fr.php | 3 ++- module/story/lang/vi.php | 4 ---- module/story/lang/zh-cn.php | 3 ++- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 9315f60c7c..2f1b5f7bc6 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -481,7 +481,7 @@ $lang->requirement->activateAction = "Activate {$lang->URCommon}"; $lang->requirement->deleteAction = "Delete {$lang->URCommon}"; $lang->requirement->exportAction = "Export {$lang->URCommon}"; $lang->requirement->reportAction = "Report"; -$lang->requirement->recall = 'Revoke'; +$lang->requirement->recall = $lang->story->recallAction; $lang->requirement->batchReview = 'Batch Review'; $lang->requirement->batchEdit = "Batch Edit"; $lang->requirement->batchClose = 'Batch Close'; @@ -490,3 +490,4 @@ $lang->requirement->linkRequirementsAB = "Link {$lang->URCommon}"; $lang->requirement->batchChangeBranch = "Batch Change Branches"; $lang->requirement->batchAssignTo = "Batch Assign"; $lang->requirement->batchChangeModule = "Batch Change Modules"; +$lang->requirement->submitReview = $lang->story->submitReview; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index 97a3b32eed..bfdec6be97 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -481,7 +481,7 @@ $lang->requirement->activateAction = "Activate {$lang->URCommon}"; $lang->requirement->deleteAction = "Delete {$lang->URCommon}"; $lang->requirement->exportAction = "Export {$lang->URCommon}"; $lang->requirement->reportAction = "Report"; -$lang->requirement->recall = 'Revoke'; +$lang->requirement->recall = $lang->story->recallAction; $lang->requirement->batchReview = 'Batch Review'; $lang->requirement->batchEdit = "Batch Edit"; $lang->requirement->batchClose = 'Batch Close'; @@ -490,3 +490,4 @@ $lang->requirement->linkRequirementsAB = "Link {$lang->URCommon}"; $lang->requirement->batchChangeBranch = "Batch Change Branches"; $lang->requirement->batchAssignTo = "Batch Assign"; $lang->requirement->batchChangeModule = "Batch Change Modules"; +$lang->requirement->submitReview = $lang->story->submitReview; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index fe5900a239..0f8ecf6267 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -481,7 +481,7 @@ $lang->requirement->activateAction = "Activate {$lang->URCommon}"; $lang->requirement->deleteAction = "Delete {$lang->URCommon}"; $lang->requirement->exportAction = "Export {$lang->URCommon}"; $lang->requirement->reportAction = "Report"; -$lang->requirement->recall = 'Revoke'; +$lang->requirement->recall = $lang->story->recallAction; $lang->requirement->batchReview = 'Batch Review'; $lang->requirement->batchEdit = "Batch Edit"; $lang->requirement->batchClose = 'Batch Close'; @@ -490,3 +490,4 @@ $lang->requirement->linkRequirementsAB = "Link {$lang->URCommon}"; $lang->requirement->batchChangeBranch = "Batch Change Branches"; $lang->requirement->batchAssignTo = "Batch Assign"; $lang->requirement->batchChangeModule = "Batch Change Modules"; +$lang->requirement->submitReview = $lang->story->submitReview; diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php index 9e58f9ebf2..9226a926c0 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -459,7 +459,3 @@ $lang->story->featureBar['browse']['all'] = $lang->all; $lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed; $lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft']; $lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing']; - -$lang->story->recallList = array(); -$lang->story->recallList['recallReview'] = $lang->story->recall; -$lang->story->recallList['recallChange'] = $lang->story->recallChange; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 75b15b54f3..518073bdd7 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -481,7 +481,7 @@ $lang->requirement->activateAction = "激活{$lang->URCommon}"; $lang->requirement->deleteAction = "删除{$lang->URCommon}"; $lang->requirement->exportAction = "导出{$lang->URCommon}"; $lang->requirement->reportAction = "统计报表"; -$lang->requirement->recall = '撤销评审'; +$lang->requirement->recall = $lang->story->recallAction; $lang->requirement->batchReview = '批量评审'; $lang->requirement->batchEdit = "批量编辑"; $lang->requirement->batchClose = '批量关闭'; @@ -490,3 +490,4 @@ $lang->requirement->linkRequirementsAB = "关联相关{$lang->URCommon}"; $lang->requirement->batchChangeBranch = "批量修改分支"; $lang->requirement->batchAssignTo = "批量指派"; $lang->requirement->batchChangeModule = "批量修改模块"; +$lang->requirement->submitReview = $lang->story->submitReview; From 8b12d60a3bc78c7c4b4b354b76506f2fd5330a87 Mon Sep 17 00:00:00 2001 From: liuhong Date: Tue, 23 Aug 2022 20:29:32 +0000 Subject: [PATCH 102/223] *Fix bug #26275. --- module/execution/model.php | 10 +++++++++- module/task/control.php | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/module/execution/model.php b/module/execution/model.php index c2f067fe39..4c26b20bae 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -1561,10 +1561,11 @@ class executionModel extends model * @param string $status * @param int $limit * @param string $pairs + * @param string $projectsToAppended * @access public * @return array */ - public function getByProject($projectID, $status = 'all', $limit = 0, $pairs = false, $devel = false) + public function getByProject($projectID, $status = 'all', $limit = 0, $pairs = false, $devel = false, $projectsToAppended = '') { if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getExecutionPairs(); @@ -1585,6 +1586,13 @@ class executionModel extends model ->beginIF($limit)->limit($limit)->fi() ->fetchAll('id'); + if($projectsToAppended) + { + $task = $this->dao->select('execution')->from(TABLE_TASK)->where('id')->eq($projectsToAppended)->fetch('execution'); + $path = sprintf("%s,%s", $projectID, $task); + $executions += $this->dao->select('*')->from(TABLE_EXECUTION)->where('path')->like("%,$path,%")->fetchAll('id'); + } + if(isset($project->model) and $project->model == 'waterfall') { $executionList = array(); diff --git a/module/task/control.php b/module/task/control.php index 856b4c8cce..903b6c558d 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -613,7 +613,7 @@ class task extends control $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed', "{$this->view->task->openedBy},{$this->view->task->canceledBy},{$this->view->task->closedBy}"); $this->view->showAllModule = isset($this->config->execution->task->allModule) ? $this->config->execution->task->allModule : ''; $this->view->modules = $this->tree->getTaskOptionMenu($this->view->task->execution, 0, 0, $this->view->showAllModule ? 'allModule' : ''); - $this->view->executions = $this->config->systemMode == 'classic' ? $this->execution->getPairs() : $this->execution->getByProject($task->project, 'noclosed', 0, true); + $this->view->executions = $this->config->systemMode == 'classic' ? $this->execution->getPairs() : $this->execution->getByProject($task->project, 'noclosed', 0, true, false, $taskID); $this->display(); } From 91fddc338e34f4d94a881e0685f3d7ebac73f139 Mon Sep 17 00:00:00 2001 From: liuhong Date: Wed, 24 Aug 2022 00:08:16 +0000 Subject: [PATCH 103/223] *Fix bug #66212. --- module/design/view/view.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/design/view/view.html.php b/module/design/view/view.html.php index 777eca48e3..4112fc7fcb 100644 --- a/module/design/view/view.html.php +++ b/module/design/view/view.html.php @@ -16,7 +16,7 @@ project);?>
    testcase->linkCase;?> + linkCaseTitles)) { @@ -314,7 +314,7 @@ toBugs):?>
    + toBugs as $bugID => $bugTitle) { From 4e574b0a67debb4c078291c99b97b63b1d839457 Mon Sep 17 00:00:00 2001 From: liuhong Date: Wed, 24 Aug 2022 00:57:41 +0000 Subject: [PATCH 107/223] *Fix bug #66233. --- module/task/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/model.php b/module/task/model.php index 66b5f2cb4f..dbd50cfa3f 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -1258,7 +1258,7 @@ class taskModel extends model $task->{$extendField->field} = htmlSpecialString($task->{$extendField->field}); } - if(isset($data->consumeds[$taskID]) and !empty($data->consumeds[$taskID])) + if(!empty($data->consumeds[$taskID])) { if($data->consumeds[$taskID] < 0) { From b323432098908ade34f424ee264dde816f504a98 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 24 Aug 2022 09:00:09 +0800 Subject: [PATCH 108/223] * Modify text-overflow style. --- module/my/css/testtask.css | 1 - module/testtask/css/browse.css | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/module/my/css/testtask.css b/module/my/css/testtask.css index 2f13e9acfb..4c9d612635 100644 --- a/module/my/css/testtask.css +++ b/module/my/css/testtask.css @@ -2,4 +2,3 @@ .c-build {width: 120px;} .c-id {width: 60px;} .c-status {width: 80px;} -.table-fixed td {text-overflow: ellipsis;} diff --git a/module/testtask/css/browse.css b/module/testtask/css/browse.css index fb5f060737..a2a2c4134c 100644 --- a/module/testtask/css/browse.css +++ b/module/testtask/css/browse.css @@ -1,5 +1,5 @@ #taskList tbody>tr>td, #taskList thead>tr>th {white-space: nowrap;} -td {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} +#taskList td {overflow: hidden; text-overflow: unset;} .c-name {width: 200px;} .c-id {width: 60px;} .c-user, .c-status {width: 80px;} From d9c174f9211556d7873110fee934db6774641368 Mon Sep 17 00:00:00 2001 From: liuhong Date: Wed, 24 Aug 2022 01:09:11 +0000 Subject: [PATCH 109/223] *Fix bug #26725. --- module/execution/model.php | 3 +-- module/task/control.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/module/execution/model.php b/module/execution/model.php index 4c26b20bae..790f36e543 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -1588,8 +1588,7 @@ class executionModel extends model if($projectsToAppended) { - $task = $this->dao->select('execution')->from(TABLE_TASK)->where('id')->eq($projectsToAppended)->fetch('execution'); - $path = sprintf("%s,%s", $projectID, $task); + $path = sprintf("%s,%s", $projectID, $projectsToAppended); $executions += $this->dao->select('*')->from(TABLE_EXECUTION)->where('path')->like("%,$path,%")->fetchAll('id'); } diff --git a/module/task/control.php b/module/task/control.php index 903b6c558d..a22df924b6 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -613,7 +613,7 @@ class task extends control $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed', "{$this->view->task->openedBy},{$this->view->task->canceledBy},{$this->view->task->closedBy}"); $this->view->showAllModule = isset($this->config->execution->task->allModule) ? $this->config->execution->task->allModule : ''; $this->view->modules = $this->tree->getTaskOptionMenu($this->view->task->execution, 0, 0, $this->view->showAllModule ? 'allModule' : ''); - $this->view->executions = $this->config->systemMode == 'classic' ? $this->execution->getPairs() : $this->execution->getByProject($task->project, 'noclosed', 0, true, false, $taskID); + $this->view->executions = $this->config->systemMode == 'classic' ? $this->execution->getPairs() : $this->execution->getByProject($task->project, 'noclosed', 0, true, false, $task->execution); $this->display(); } From 7dd9fd6e2518a1529f1e17a310c3c9820d3f6578 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 24 Aug 2022 01:10:51 +0000 Subject: [PATCH 110/223] * Finish task#65806 --- module/my/model.php | 8 +++++--- module/task/model.php | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/module/my/model.php b/module/my/model.php index 47897980b6..3f5493fdc5 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -336,12 +336,13 @@ class myModel extends model if($objectType == 'task') { - $objectList = $this->dao->select('t1.*, t2.name as executionName, t2.type as executionType')->from($this->config->objectTables[$module])->alias('t1') + $orderBy = strpos($orderBy, 'pri_') !== false ? str_replace('pri_', 'priOrder_', $orderBy) : 't1.' . $orderBy; + $objectList = $this->dao->select("t1.*, t2.name as executionName, t2.type as executionType, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder")->from($this->config->objectTables[$module])->alias('t1') ->leftJoin(TABLE_EXECUTION)->alias('t2')->on("t1.execution = t2.id") ->where('t1.deleted')->eq(0) ->andWhere('t2.deleted')->eq(0) ->andWhere('t1.id')->in(array_keys($objectIDList)) - ->orderBy('t1.' . $orderBy) + ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); } @@ -582,7 +583,8 @@ class myModel extends model $query = preg_replace('/`(\w+)`/', 't1.`$1`', $query); $query = str_replace('t1.`project`', 't2.`project`', $query); - $tasks = $this->dao->select('t1.*, t2.id as executionID, t2.name as executionName, t2.type as executionType, t3.id as storyID, t3.title as storyTitle, t3.status AS storyStatus, t3.version AS latestStoryVersion') + $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + $tasks = $this->dao->select("t1.*, t2.id as executionID, t2.name as executionName, t2.type as executionType, t3.id as storyID, t3.title as storyTitle, t3.status AS storyStatus, t3.version AS latestStoryVersion, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder") ->from(TABLE_TASK)->alias('t1') ->leftJoin(TABLE_EXECUTION)->alias('t2')->on("t1.execution = t2.id") ->leftJoin(TABLE_STORY)->alias('t3')->on('t1.story = t3.id') diff --git a/module/task/model.php b/module/task/model.php index 23b614e688..ddd6ccf98c 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -2367,7 +2367,8 @@ class taskModel extends model public function getExecutionTasks($executionID, $productID = 0, $type = 'all', $modules = 0, $orderBy = 'status_asc, id_desc', $pager = null) { if(is_string($type)) $type = strtolower($type); - $fields = 'DISTINCT t1.*, t2.id AS storyID, t2.title AS storyTitle, t2.product, t2.branch, t2.version AS latestStoryVersion, t2.status AS storyStatus, t3.realname AS assignedToRealName'; + $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + $fields = "DISTINCT t1.*, t2.id AS storyID, t2.title AS storyTitle, t2.product, t2.branch, t2.version AS latestStoryVersion, t2.status AS storyStatus, t3.realname AS assignedToRealName, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder"; $this->config->edition == 'max' && $fields .= ', t6.name as designName, t6.version as latestDesignVersion'; $actionIDList = array(); @@ -2510,7 +2511,8 @@ class taskModel extends model public function getUserTasks($account, $type = 'assignedTo', $limit = 0, $pager = null, $orderBy = "id_desc", $projectID = 0) { if(!$this->loadModel('common')->checkField(TABLE_TASK, $type)) return array(); - $tasks = $this->dao->select('t1.*, t2.id as executionID, t2.name as executionName, t2.type as executionType, t3.id as storyID, t3.title as storyTitle, t3.status AS storyStatus, t3.version AS latestStoryVersion') + $orderBy = str_replace('pri_', 'priOrder_', $orderBy); + $tasks = $this->dao->select("t1.*, t2.id as executionID, t2.name as executionName, t2.type as executionType, t3.id as storyID, t3.title as storyTitle, t3.status AS storyStatus, t3.version AS latestStoryVersion, IF(t1.`pri` = 0, {$this->config->maxPriValue}, t1.`pri`) as priOrder") ->from(TABLE_TASK)->alias('t1') ->leftJoin(TABLE_EXECUTION)->alias('t2')->on("t1.execution = t2.id") ->leftJoin(TABLE_STORY)->alias('t3')->on('t1.story = t3.id') From 0e393e120b03ef946a8314a597d933759423f2bf Mon Sep 17 00:00:00 2001 From: dongli Date: Wed, 24 Aug 2022 01:10:59 +0000 Subject: [PATCH 111/223] * Remove useless spaces. --- lib/dao/dao.class.php | 12 ++++++------ module/action/css/trash.css | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/dao/dao.class.php b/lib/dao/dao.class.php index c6326f5a46..e18d52847f 100644 --- a/lib/dao/dao.class.php +++ b/lib/dao/dao.class.php @@ -29,7 +29,7 @@ class dao extends baseDAO /** * 设置需要更新或插入的数据。 * Set the data to update or insert. - * + * * @param object $data the data object or array * @access public * @return object the dao object self. @@ -182,7 +182,7 @@ class dao extends baseDAO /** * Check workFlow field rule. - * + * * @access public * @return object the dao object self. */ @@ -232,10 +232,10 @@ class dao extends baseDAO } /** - * 检查工作流扩展字段 - * check workflow extend field - * - * @param array $fields + * 检查工作流扩展字段 + * check workflow extend field + * + * @param array $fields * @access public * @return object the dao object self */ diff --git a/module/action/css/trash.css b/module/action/css/trash.css index b932d4c1b6..2c21a2cced 100755 --- a/module/action/css/trash.css +++ b/module/action/css/trash.css @@ -12,4 +12,3 @@ td.flex {display: flex; flex-flow: row nowrap; justify-content: flex-start; alig [lang^=de] .flex span.label-danger {min-width: 58px;} [lang^=fr] .flex span.label-danger {min-width: 63px;} .c-name > .text-ellipsis {text-overflow: clip;} - From c78a38c55eda0468c83f74fc30e9493a629c2cce Mon Sep 17 00:00:00 2001 From: liuhong Date: Wed, 24 Aug 2022 01:13:14 +0000 Subject: [PATCH 112/223] *Fix bug #66212. --- module/design/view/view.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/design/view/view.html.php b/module/design/view/view.html.php index 4112fc7fcb..38299bb95c 100644 --- a/module/design/view/view.html.php +++ b/module/design/view/view.html.php @@ -16,7 +16,7 @@ project);?> lang->project->project;?> lang->story->product;?> objectID]->productTitle;?> objectID]->productDeleted):?> From 73c8091a82b8327049709b87a5e3b8659ad94268 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 24 Aug 2022 03:24:03 +0000 Subject: [PATCH 120/223] * Finish task#65782,65779 --- module/bug/control.php | 31 +++++++++++++++++------- module/bug/js/batchedit.js | 6 +++++ module/bug/js/edit.js | 6 +++++ module/bug/js/resolve.js | 6 +++++ module/bug/model.php | 3 ++- module/bug/view/batchedit.html.php | 4 ++-- module/bug/view/edit.html.php | 2 +- module/bug/view/resolve.html.php | 2 +- module/execution/model.php | 3 ++- module/story/control.php | 34 +++++++++++++++++++++------ module/story/js/batchclose.js | 13 ++++++++-- module/story/js/batchedit.js | 6 +++++ module/story/js/close.js | 9 +++++++ module/story/view/batchclose.html.php | 4 ++-- module/story/view/batchedit.html.php | 6 ++--- module/story/view/close.html.php | 2 +- 16 files changed, 108 insertions(+), 29 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index bb3f353043..d408e70eab 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -1152,9 +1152,13 @@ class bug extends control } if($bug->status == 'closed') $assignedToList['closed'] = 'Closed'; + $branch = $product->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : ''; + $productBugs = $this->bug->getProductBugPairs($productID, $branch); + $this->view->bug = $bug; $this->view->productID = $productID; $this->view->product = $product; + $this->view->productBugs = $productBugs; $this->view->productName = $this->products[$productID]; $this->view->plans = $this->loadModel('productplan')->getPairs($productID, $bug->branch, '', true); $this->view->projects = array(0 => '') + $this->product->getProjectPairsByProduct($productID, $bug->branch, $bug->project); @@ -1301,6 +1305,7 @@ class bug extends control $branchIdList = array(); $projectIdList = array(); $executionIdList = array(); + $productBugList = array(); foreach($bugs as $bug) { $projectIdList[$bug->project] = $bug->project; @@ -1309,6 +1314,10 @@ class bug extends control $branchIdList[$bug->product][$bug->branch] = $bug->branch; if(!isset($modules[$bug->product][$bug->branch]) and isset($modules[$bug->product])) $modules[$bug->product][$bug->branch] = $modules[$bug->product][0] + $this->tree->getModulesName($bug->module); + + $bugProduct = isset($productList) ? $productList[$bug->product] : $product; + $branch = $bugProduct->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : ''; + if(!isset($productBugList[$bug->product][$bug->branch])) $productBugList[$bug->product][$bug->branch] = $this->bug->getProductBugPairs($bug->product, $branch); } /* Get assigned to member. */ @@ -1388,6 +1397,7 @@ class bug extends control $this->view->users = $users; $this->view->modules = $modules; $this->view->branchTagOption = $branchTagOption; + $this->view->productBugList = $productBugList; $this->display(); } @@ -1797,17 +1807,22 @@ class bug extends control if(!isset($users[$assignedTo])) $assignedTo = $this->bug->getModuleOwner($bug->module, $productID); unset($this->lang->bug->resolutionList['tostory']); + $product = $this->loadModel('product')->getById($productID); + $branch = $product->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : ''; + $productBugs = $this->bug->getProductBugPairs($productID, $branch); + $this->bug->checkBugExecutionPriv($bug); $this->qa->setMenu($this->products, $productID, $bug->branch); - $this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->resolve; - $this->view->bug = $bug; - $this->view->users = $users; - $this->view->assignedTo = $assignedTo; - $this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID); - $this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'withbranch'); - $this->view->actions = $this->action->getList('bug', $bugID); - $this->view->execution = isset($execution) ? $execution : ''; + $this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->resolve; + $this->view->bug = $bug; + $this->view->users = $users; + $this->view->assignedTo = $assignedTo; + $this->view->productBugs = $productBugs; + $this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID); + $this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'withbranch'); + $this->view->actions = $this->action->getList('bug', $bugID); + $this->view->execution = isset($execution) ? $execution : ''; $this->display(); } diff --git a/module/bug/js/batchedit.js b/module/bug/js/batchedit.js index 42770c7cfc..0b15187841 100644 --- a/module/bug/js/batchedit.js +++ b/module/bug/js/batchedit.js @@ -77,4 +77,10 @@ $(function() { hiddenRequireFields(); }); + + $('select[id^="duplicateBugs"]').picker( + { + disableEmptySearch : true, + dropWidth : 'auto' + }); }); diff --git a/module/bug/js/edit.js b/module/bug/js/edit.js index 2669cde048..f9003597c9 100644 --- a/module/bug/js/edit.js +++ b/module/bug/js/edit.js @@ -19,6 +19,12 @@ $(function() } }); } + + $('#duplicateBug').picker( + { + disableEmptySearch : true, + dropWidth : 'auto' + }); }); /** diff --git a/module/bug/js/resolve.js b/module/bug/js/resolve.js index 884490f541..8afea5743c 100644 --- a/module/bug/js/resolve.js +++ b/module/bug/js/resolve.js @@ -45,4 +45,10 @@ $(function() $('#newBuildExecutionBox').addClass('hidden'); } }) + + $('#duplicateBug').picker( + { + disableEmptySearch : true, + dropWidth : 'auto' + }); }) diff --git a/module/bug/model.php b/module/bug/model.php index 8a89385f0b..723f68ff13 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -1998,12 +1998,13 @@ class bugModel extends model * @access public * @return void */ - public function getProductBugPairs($productID) + public function getProductBugPairs($productID, $branch = '') { $bugs = array('' => ''); $data = $this->dao->select('id, title')->from(TABLE_BUG) ->where('product')->eq((int)$productID) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() + ->beginIF($branch !== '')->andWhere('branch')->in($branch)->fi() ->andWhere('deleted')->eq(0) ->orderBy('id desc') ->fetchAll(); diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php index 533edde8db..924c1f8c05 100644 --- a/module/bug/view/batchedit.html.php +++ b/module/bug/view/batchedit.html.php @@ -139,11 +139,11 @@ >keywords, 'class=form-control');?> ' style='overflow:visible'>resolvedBy, "class='form-control picker-select' data-drop-width='auto'");?> > - +
    resolution, "class='form-control' onchange=setDuplicate(this.value,$bugID)");?> ' resolution != 'duplicate') echo "style='display:none'";?>> - bug->duplicateBug}'");?> + product][$bug->branch], $bug->duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateBug}'");?>
    diff --git a/module/bug/view/edit.html.php b/module/bug/view/edit.html.php index 6e41532080..b1d317dad4 100644 --- a/module/bug/view/edit.html.php +++ b/module/bug/view/edit.html.php @@ -265,7 +265,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
    bug->duplicateBug;?>duplicateBug, 'class=form-control');?>duplicateBug, "class='form-control'");?>
    bug->closedBy;?>
    bug->duplicateBug;?>
    bug->resolvedBuild;?> ' closedReason != 'duplicate') echo "style='display:none'";?>> - idAB}'");?> + ' closedReason != 'duplicate') echo "style='display:none'";?>> + product][$story->branch], $story->duplicateStory, "class='form-control' placeholder='{$lang->idAB}'");?> ' closedReason != 'subdivided') echo "style='display:none'";?>> idAB}'");?> diff --git a/module/story/view/batchedit.html.php b/module/story/view/batchedit.html.php index b0050c2928..abca607988 100644 --- a/module/story/view/batchedit.html.php +++ b/module/story/view/batchedit.html.php @@ -123,13 +123,13 @@ foreach(explode(',', $showFields) as $field) status == 'closed'):?> > - +
    - - + From 11c273036102bac3e9e44e63b8c8432f98cfc607 Mon Sep 17 00:00:00 2001 From: liuhong Date: Wed, 24 Aug 2022 03:28:26 +0000 Subject: [PATCH 121/223] *Fix bug #26725. --- module/execution/model.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/module/execution/model.php b/module/execution/model.php index 790f36e543..6e0a5bcf48 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -1561,11 +1561,11 @@ class executionModel extends model * @param string $status * @param int $limit * @param string $pairs - * @param string $projectsToAppended + * @param int $appenedID * @access public * @return array */ - public function getByProject($projectID, $status = 'all', $limit = 0, $pairs = false, $devel = false, $projectsToAppended = '') + public function getByProject($projectID, $status = 'all', $limit = 0, $pairs = false, $devel = false, $appendedID = 0) { if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getExecutionPairs(); @@ -1582,16 +1582,11 @@ class executionModel extends model ->beginIF($status != 'all' and $status != 'undone' and $status != 'noclosed')->andWhere('status')->in($status)->fi() ->beginIF($status == 'noclosed')->andWhere('status')->ne('closed')->fi() ->beginIF($devel === true)->andWhere('attribute')->in('dev,qa,release')->fi() + ->beginIF($appendedID)->orWhere('id')->eq($appendedID)->fi() ->orderBy($orderBy) ->beginIF($limit)->limit($limit)->fi() ->fetchAll('id'); - if($projectsToAppended) - { - $path = sprintf("%s,%s", $projectID, $projectsToAppended); - $executions += $this->dao->select('*')->from(TABLE_EXECUTION)->where('path')->like("%,$path,%")->fetchAll('id'); - } - if(isset($project->model) and $project->model == 'waterfall') { $executionList = array(); From c424e450cb0a1702ea8b88af36367ad8a942a490 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 24 Aug 2022 03:28:59 +0000 Subject: [PATCH 122/223] * Adjust code --- module/bug/model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/bug/model.php b/module/bug/model.php index 723f68ff13..7638aee0ab 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -1994,7 +1994,8 @@ class bugModel extends model /** * get Product Bug Pairs * - * @param int $productID + * @param int $productID + * @param int|string $branch * @access public * @return void */ From 243f2f468a2e4fd3bc0afb7a6a3790d14dcb9294 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Wed, 24 Aug 2022 11:30:59 +0800 Subject: [PATCH 123/223] * Modify the create and edit unit test case of execution module. --- test/model/execution/create.php | 12 +++++------- test/model/execution/update.php | 6 +++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/test/model/execution/create.php b/test/model/execution/create.php index 12e44ada93..1a7f65c824 100755 --- a/test/model/execution/create.php +++ b/test/model/execution/create.php @@ -19,11 +19,10 @@ pid=1 测试创建看板公开执行 >> 新增公开看板执行code,kanban 测试创建迭代团队分配 >> pd58,pd72,dev10,dev10 测试不输入项目 >> 所属项目不能为空。 -测试不输入产品 >> 关联产品不能为空! 测试不输入执行名称 >> 『执行名称』不能为空。 测试不输入执行代号 >> 『执行代号』不能为空。 -测试一样的执行名称 >> 『执行名称』已经有『新增私有敏捷执行』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。 -测试一样的执行代号 >> 『执行代号』已经有『新增私有敏捷执行code』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。 +测试一样的执行名称 >> 『执行名称』已经有『新增私有敏捷执行』这条记录了。 +测试一样的执行代号 >> 『执行代号』已经有『新增私有敏捷执行code』这条记录了。 */ @@ -56,10 +55,9 @@ r($task->createObject($prvExecution_kanban, $projectIDList[3], $dayNum, $days)) r($task->createObject($openExecution_kanban, $projectIDList[3], $dayNum, $days)) && p('code,type') && e('新增公开看板执行code,kanban'); // 测试创建看板公开执行 r($task->createObject($teamExecution, $projectIDList[1], $dayNum, $days)) && p('PO,QD,PM,RD') && e('pd58,pd72,dev10,dev10'); // 测试创建迭代团队分配 r($task->createObject($prvExecution, '', $dayNum, $days)) && p('message:0') && e('所属项目不能为空。'); // 测试不输入项目 -r($task->createObject($noProductID, $projectIDList[1], $dayNum, $days)) && p('message:0') && e('关联产品不能为空!'); // 测试不输入产品 r($task->createObject($noName, $projectIDList[1], $dayNum, $days)) && p('name:0') && e('『执行名称』不能为空。'); // 测试不输入执行名称 r($task->createObject($noCode, $projectIDList[1], $dayNum, $days)) && p('code:0') && e('『执行代号』不能为空。'); // 测试不输入执行代号 -r($task->createObject($equallyName, $projectIDList[1], $dayNum, $days)) && p('name:0') && e('『执行名称』已经有『新增私有敏捷执行』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 测试一样的执行名称 -r($task->createObject($equallyCode, $projectIDList[1], $dayNum, $days)) && p('code:0') && e('『执行代号』已经有『新增私有敏捷执行code』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 测试一样的执行代号 +r($task->createObject($equallyName, $projectIDList[1], $dayNum, $days)) && p('name:0') && e('『执行名称』已经有『新增私有敏捷执行』这条记录了。'); // 测试一样的执行名称 +r($task->createObject($equallyCode, $projectIDList[1], $dayNum, $days)) && p('code:0') && e('『执行代号』已经有『新增私有敏捷执行code』这条记录了。'); // 测试一样的执行代号 -$db->restoreDB(); \ No newline at end of file +$db->restoreDB(); diff --git a/test/model/execution/update.php b/test/model/execution/update.php index 352cb1123e..e329814c5d 100755 --- a/test/model/execution/update.php +++ b/test/model/execution/update.php @@ -11,7 +11,7 @@ title=测试executionModel->update(); cid=1 pid=1 -测试重复迭代code >> 『迭代代号』已经有『project1』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。 +测试重复迭代code >> 『迭代代号』已经有『project1』这条记录了。 测试修改迭代名称 >> name,迭代1,迭代名修改 测试修改迭代项目为瀑布项目 >> project,11,41 测试修改迭代项目为看板项目 >> project,41,71 @@ -44,7 +44,7 @@ $noCode = array('code' => ''); $repeatcode = array('name' => '迭代名修改1'); $execution = new executionTest(); -r($execution->updateObject($executionIDList[0], $repeatcode)) && p('code:0') && e('『迭代代号』已经有『project1』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 测试重复迭代code +r($execution->updateObject($executionIDList[0], $repeatcode)) && p('code:0') && e('『迭代代号』已经有『project1』这条记录了。'); // 测试重复迭代code r($execution->updateObject($executionIDList[0], $changeName)) && p('0:field,old,new') && e('name,迭代1,迭代名修改'); // 测试修改迭代名称 r($execution->updateObject($executionIDList[0], $changeStage)) && p('0:field,old,new') && e('project,11,41'); // 测试修改迭代项目为瀑布项目 r($execution->updateObject($executionIDList[0], $changeKanban)) && p('0:field,old,new') && e('project,41,71'); // 测试修改迭代项目为看板项目 @@ -57,4 +57,4 @@ r($execution->updateObject($executionIDList[1], $noName)) && p('name:0') r($execution->updateObject($executionIDList[1], $noCode)) && p('code:0') && e('『迭代代号』不能为空。'); // 测试修改code为空 r($execution->updateObject($executionIDList[1], $noChange)) && p() && e('没有数据更新'); // 测试无修改 -$db->restoreDB(); \ No newline at end of file +$db->restoreDB(); From 1f522398ded8b4b4f16d6ece30a4a8de21191cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E8=BE=B0=E8=BD=A9?= Date: Wed, 24 Aug 2022 13:51:28 +0800 Subject: [PATCH 124/223] *Fix program api bug. --- api/v1/entries/program.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/entries/program.php b/api/v1/entries/program.php index 22a9469687..e7394f9d45 100644 --- a/api/v1/entries/program.php +++ b/api/v1/entries/program.php @@ -60,7 +60,7 @@ class programEntry extends Entry public function delete($programID) { $control = $this->loadController('program', 'delete'); - $control->delete(0, $programID, 'true'); + $control->delete($programID, 'true'); $data = $this->getData(); if(isset($data->result) and $data->result == 'fail') return $this->sendError(400, $data->message); From 6b9885067d8aa68113e70bd525ed0872fcc95a43 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 13:59:49 +0800 Subject: [PATCH 125/223] * Fix bug#26776. --- module/story/view/batchcreate.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/view/batchcreate.html.php b/module/story/view/batchcreate.html.php index c152e297ae..652ccdcf6a 100755 --- a/module/story/view/batchcreate.html.php +++ b/module/story/view/batchcreate.html.php @@ -131,8 +131,8 @@ From a2c1dd7247098b35e860d42a0ba3f8e04b159b67 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 14:11:26 +0800 Subject: [PATCH 126/223] * Fix bug#26812. --- module/story/model.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 2b2fecab0c..244849e647 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2355,8 +2355,6 @@ class storyModel extends model ->add('closedDate', '0000-00-00') ->add('reviewedBy', '') ->add('reviewedDate', '0000-00-00') - ->add('changedBy', '') - ->add('changedDate', '0000-00-00') ->add('duplicateStory', 0) ->add('childStories', '') ->setDefault('lastEditedBy', $this->app->user->account) From 6f18dfa4cc9b7b5574e57b91a0ab51c5e3af10ec Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 14:22:58 +0800 Subject: [PATCH 127/223] * Fix bug#26764. --- module/product/lang/de.php | 30 +++++++++++++++--------------- module/product/lang/en.php | 30 +++++++++++++++--------------- module/product/lang/fr.php | 30 +++++++++++++++--------------- module/product/lang/vi.php | 26 +++++++++++++------------- module/product/lang/zh-cn.php | 30 +++++++++++++++--------------- 5 files changed, 73 insertions(+), 73 deletions(-) diff --git a/module/product/lang/de.php b/module/product/lang/de.php index 97bf89c9ef..a9adf7e665 100644 --- a/module/product/lang/de.php +++ b/module/product/lang/de.php @@ -207,23 +207,23 @@ $lang->product->noModule = '
    Kein Modul
    Jetzt verwalten
    product->noProduct = 'Kein Produkt. '; $lang->product->noMatched = '"%s" kann nicht gefunden werden.' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/en.php b/module/product/lang/en.php index f0a84f871e..5f07eb8736 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -207,23 +207,23 @@ $lang->product->noModule = '
    You have no modules.
    Manage No $lang->product->noProduct = "No {$lang->productCommon} yet. "; $lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/fr.php b/module/product/lang/fr.php index 899e02eaf4..fc9b29549d 100644 --- a/module/product/lang/fr.php +++ b/module/product/lang/fr.php @@ -207,23 +207,23 @@ $lang->product->noModule = "
    Vous n'avez aucun modules.
    Gé $lang->product->noProduct = "No {$lang->productCommon} à ce jour. "; $lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/vi.php b/module/product/lang/vi.php index a69df13a80..718c9a68a6 100644 --- a/module/product/lang/vi.php +++ b/module/product/lang/vi.php @@ -166,21 +166,21 @@ $lang->product->noModule = '
    Chưa có Module.
    Quản lý n $lang->product->noProduct = "Không có {$lang->productCommon} nào."; $lang->product->noMatched = '"%s" không thể tìm thấy ' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = $lang->product->allProduct; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index be1296f2b1..e5c1184c44 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -207,23 +207,23 @@ $lang->product->noModule = "
    您现在还没有模块信息
    $lang->product->noProduct = "暂时没有{$lang->productCommon}。"; $lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon; -$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; -$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; -$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; -$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; -$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; -$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; -$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; -$lang->product->featureBar['browse']['reviewingstory'] = $lang->product->reviewingStory; -$lang->product->featureBar['browse']['more'] = $lang->more; +$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe; +$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featureBar['browse']['more'] = $lang->more; $lang->product->featureBar['all']['all'] = '所有' . $lang->productCommon; $lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed; $lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed']; -$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; -$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; -$lang->product->moreSelects['activestory'] = $lang->product->activeStory; -$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; -$lang->product->moreSelects['willclose'] = $lang->product->willClose; -$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; +$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe; +$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe; +$lang->product->moreSelects['activestory'] = $lang->product->activeStory; +$lang->product->moreSelects['changingstory'] = $lang->product->changingStory; +$lang->product->moreSelects['reviewingstory'] = $lang->product->reviewingStory; +$lang->product->moreSelects['willclose'] = $lang->product->willClose; +$lang->product->moreSelects['closedstory'] = $lang->product->closedStory; From 1254de5f3ed3ea1ae6abb511590d76b8fbcbbf7b Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 14:50:53 +0800 Subject: [PATCH 128/223] * Fix bug#26769. --- module/story/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/model.php b/module/story/model.php index 244849e647..b5d93f9846 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4180,7 +4180,7 @@ class storyModel extends model $isSuperReviewer = strpos(',' . trim(zget($config->story, 'superReviewers', ''), ',') . ',', ',' . $app->user->account . ','); - if($action == 'change') return ($isSuperReviewer !== false or $story->status == 'active'); + if($action == 'change') return (($isSuperReviewer !== false or count($story->reviewer) == 0 or count($story->notReview) == 0) and $story->status == 'active'); if($action == 'review') return (($isSuperReviewer !== false or in_array($app->user->account, $story->notReview)) and $story->status == 'reviewing'); if($action == 'recall') return strpos('reviewing,changing', $story->status) !== false; if($action == 'close') return $story->status != 'closed'; From e30d4256f8f95848febb08e71d1a363d5d879512 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Wed, 24 Aug 2022 14:54:15 +0800 Subject: [PATCH 129/223] * Fix failed test cases for execution module. --- test/class/execution.class.php | 13 +++++------ test/model/execution/computeburn.php | 4 ++-- test/model/execution/getbranchbyproduct.php | 10 ++++----- test/model/execution/getburndataflot.php | 9 ++++---- test/model/execution/getchildexecutions.php | 4 ++-- .../execution/getproductgrouplisttest.php | 6 ++--- test/model/execution/isclickable.php | 10 ++++----- test/model/execution/linkcases.php | 6 ++--- test/model/execution/linkstory.php | 14 ++++++------ test/model/execution/processburndata.php | 14 ++++++------ test/model/execution/unlinkmember.php | 10 ++++----- test/model/execution/unlinkstory.php | 22 +++++++++---------- 12 files changed, 60 insertions(+), 62 deletions(-) diff --git a/test/class/execution.class.php b/test/class/execution.class.php index 9600ac750a..91d1383fab 100644 --- a/test/class/execution.class.php +++ b/test/class/execution.class.php @@ -1611,26 +1611,25 @@ class executionTest * @access public * @return array */ - public function getBurnDataFlotTest($executionID = 0, $count) + public function getBurnDataFlotTest($executionID = 0) { $date = date("Y-m-d"); $object = $this->objectModel->getBurnDataFlot($executionID, $burnBy = 'left'); $todayData = array(); - foreach ($object[$date] as $key => $value) $todayData[$key] = $value; + if(isset($object[$date])) + { + foreach($object[$date] as $key => $value) $todayData[$key] = $value; + } if(dao::isError()) { $error = dao::getError(); return $error; } - elseif($count == "1") - { - return sizeof($todayData); - } else { - return $object; + return sizeof($todayData); } } diff --git a/test/model/execution/computeburn.php b/test/model/execution/computeburn.php index cf5ffb99f1..16681e385f 100755 --- a/test/model/execution/computeburn.php +++ b/test/model/execution/computeburn.php @@ -11,7 +11,7 @@ cid=1 pid=1 正常初始化 >> project600 -初始化后数据统计 >> 516 +初始化后数据统计 >> 361 */ @@ -19,4 +19,4 @@ $count = array('0','1'); $execution = new executionTest(); r($execution->computeBurnTest($count[0])) && p('700:executionName') && e('project600'); // 正常初始化 -r($execution->computeBurnTest($count[1])) && p() && e('516'); // 初始化后数据统计 \ No newline at end of file +r($execution->computeBurnTest($count[1])) && p() && e('361'); // 初始化后数据统计 diff --git a/test/model/execution/getbranchbyproduct.php b/test/model/execution/getbranchbyproduct.php index d53992c944..7d9595117b 100755 --- a/test/model/execution/getbranchbyproduct.php +++ b/test/model/execution/getbranchbyproduct.php @@ -10,8 +10,8 @@ title=executionModel->getBranchByProduct(); cid=1 pid=1 -正常产品分支统计 >> 0 -分支产品分支查看 >> 分支2 +正常产品分支统计 >> 1 +分支产品分支查看 >> 分支1 分支产品分支统计 >> 1 */ @@ -20,6 +20,6 @@ $productIDList = array('1', '41'); $count = array('0', '1'); $execution = new executionTest(); -r($execution->getBranchByProductTest($productIDList[0],$count[1])) && p() && e('0'); //正常产品分支统计 -r($execution->getBranchByProductTest($productIDList[1],$count[0])) && p('41:2') && e('分支2'); //分支产品分支查看 -r($execution->getBranchByProductTest($productIDList[1],$count[1])) && p() && e('1'); //分支产品分支统计 \ No newline at end of file +r($execution->getBranchByProductTest($productIDList[0], $count[1])) && p() && e('1'); //正常产品分支统计 +r($execution->getBranchByProductTest($productIDList[1], $count[0])) && p('41:1') && e('分支1'); //分支产品分支查看 +r($execution->getBranchByProductTest($productIDList[1], $count[1])) && p() && e('1'); //分支产品分支统计 diff --git a/test/model/execution/getburndataflot.php b/test/model/execution/getburndataflot.php index 61b02ca1b6..efae0ee514 100755 --- a/test/model/execution/getburndataflot.php +++ b/test/model/execution/getburndataflot.php @@ -12,14 +12,13 @@ pid=1 敏捷执行查询统计 >> 3 瀑布执行查询统计 >> 3 -看板执行查询统计 >> 3 +看板执行查询统计 >> 0 */ $executionIDList = array('101', '131', '161'); -$count = array('0','1'); $execution = new executionTest(); -r($execution->getBurnDataFlotTest($executionIDList[0], $count[1])) && p() && e('3'); // 敏捷执行查询统计 -r($execution->getBurnDataFlotTest($executionIDList[1], $count[1])) && p() && e('3'); // 瀑布执行查询统计 -r($execution->getBurnDataFlotTest($executionIDList[2], $count[1])) && p() && e('3'); // 看板执行查询统计 \ No newline at end of file +r($execution->getBurnDataFlotTest($executionIDList[0])) && p() && e('3'); // 敏捷执行查询统计 +r($execution->getBurnDataFlotTest($executionIDList[1])) && p() && e('3'); // 瀑布执行查询统计 +r($execution->getBurnDataFlotTest($executionIDList[2])) && p() && e('0'); // 看板执行查询统计 diff --git a/test/model/execution/getchildexecutions.php b/test/model/execution/getchildexecutions.php index 2d12ee2382..8de2d620ef 100755 --- a/test/model/execution/getchildexecutions.php +++ b/test/model/execution/getchildexecutions.php @@ -19,5 +19,5 @@ $executionID = '131'; $count = array('0','1'); $execution = new executionTest(); -r($execution->getChildExecutionsTest($executionID,$count[0])) && p('701') && e('子阶段1'); // 查询子阶段 -r($execution->getChildExecutionsTest($executionID,$count[1])) && p() && e('1'); // 查询子阶段数量 \ No newline at end of file +r($execution->getChildExecutionsTest($executionID, $count[0])) && p('701:name') && e('子阶段1'); // 查询子阶段 +r($execution->getChildExecutionsTest($executionID, $count[1])) && p() && e('1'); // 查询子阶段数量 diff --git a/test/model/execution/getproductgrouplisttest.php b/test/model/execution/getproductgrouplisttest.php index 69c1d5d4f0..b7adc95881 100755 --- a/test/model/execution/getproductgrouplisttest.php +++ b/test/model/execution/getproductgrouplisttest.php @@ -11,12 +11,12 @@ cid=1 pid=1 查询当前用户访问的产品相关项目集 >> 项目集10 -查询当前用户访问的产品相关数量 >> 101 +查询当前用户访问的产品相关数量 >> 121 */ $count = array('0','1'); $execution = new executionTest(); -r($execution->getProductGroupListTest($count[0])) && p('9:name') && e('项目集10'); // 查询当前用户访问的产品相关项目集 -r($execution->getProductGroupListTest($count[1])) && p() && e('101'); // 查询当前用户访问的产品相关数量 \ No newline at end of file +r($execution->getProductGroupListTest($count[0])) && p('9:name') && e('项目集10'); // 查询当前用户访问的产品相关项目集 +r($execution->getProductGroupListTest($count[1])) && p() && e('121'); // 查询当前用户访问的产品相关数量 diff --git a/test/model/execution/isclickable.php b/test/model/execution/isclickable.php index e5362c804d..8003456c30 100755 --- a/test/model/execution/isclickable.php +++ b/test/model/execution/isclickable.php @@ -27,13 +27,13 @@ suspended状态执行close按钮检查 >> 检查通过 suspended状态执行suspend按钮检查 >> 检查不通过 suspended状态执行putoff按钮检查 >> 检查不通过 suspended状态执行activate按钮检查 >> 检查通过 -suspended状态执行delete按钮检查 >> 检查不通过 +suspended状态执行delete按钮检查 >> 检查通过 closed状态执行start按钮检查 >> 检查不通过 closed状态执行close按钮检查 >> 检查不通过 closed状态执行suspend按钮检查 >> 检查不通过 closed状态执行putoff按钮检查 >> 检查不通过 closed状态执行activate按钮检查 >> 检查通过 -closed状态执行delete按钮检查 >> 检查不通过 +closed状态执行delete按钮检查 >> 检查通过 */ @@ -67,10 +67,10 @@ r($execution->isClickableTest($suspendedExecution, $actionList[1])) && p() && e( r($execution->isClickableTest($suspendedExecution, $actionList[2])) && p() && e('检查不通过'); // suspended状态执行suspend按钮检查 r($execution->isClickableTest($suspendedExecution, $actionList[3])) && p() && e('检查不通过'); // suspended状态执行putoff按钮检查 r($execution->isClickableTest($suspendedExecution, $actionList[4])) && p() && e('检查通过'); // suspended状态执行activate按钮检查 -r($execution->isClickableTest($suspendedExecution, $actionList[5])) && p() && e('检查不通过'); // suspended状态执行delete按钮检查 +r($execution->isClickableTest($suspendedExecution, $actionList[5])) && p() && e('检查通过'); // suspended状态执行delete按钮检查 r($execution->isClickableTest($closedExecution, $actionList[0])) && p() && e('检查不通过'); // closed状态执行start按钮检查 r($execution->isClickableTest($closedExecution, $actionList[1])) && p() && e('检查不通过'); // closed状态执行close按钮检查 r($execution->isClickableTest($closedExecution, $actionList[2])) && p() && e('检查不通过'); // closed状态执行suspend按钮检查 -r($execution->isClickableTest($closedExecution, $actionList[3])) && p() && e('检查不通过'); // closed状态执行putoff按钮检查 +r($execution->isClickableTest($closedExecution, $actionList[3])) && p() && e('检查通过'); // closed状态执行putoff按钮检查 r($execution->isClickableTest($closedExecution, $actionList[4])) && p() && e('检查通过'); // closed状态执行activate按钮检查 -r($execution->isClickableTest($closedExecution, $actionList[5])) && p() && e('检查不通过'); // closed状态执行delete按钮检查 \ No newline at end of file +r($execution->isClickableTest($closedExecution, $actionList[5])) && p() && e('检查不通过'); // closed状态执行delete按钮检查 diff --git a/test/model/execution/linkcases.php b/test/model/execution/linkcases.php index a241abc112..740282cc36 100755 --- a/test/model/execution/linkcases.php +++ b/test/model/execution/linkcases.php @@ -14,7 +14,7 @@ pid=1 敏捷执行关联用例 >> 101,1,1 瀑布执行关联用例 >> 131,43,169 看板执行关联用例 >> 161,68,269 -敏捷执行关联用例统计 >> 4 +敏捷执行关联用例统计 >> 8 瀑布执行关联用例统计 >> 4 看板执行关联用例统计 >> 4 @@ -29,8 +29,8 @@ $execution = new executionTest(); r($execution->linkCasesTest($executionIDList[0], $count[0], $products[0], $stories[0])) && p('0:project,product,case') && e('101,1,1'); // 敏捷执行关联用例 r($execution->linkCasesTest($executionIDList[1], $count[0], $products[1], $stories[1])) && p('0:project,product,case') && e('131,43,169'); // 瀑布执行关联用例 r($execution->linkCasesTest($executionIDList[2], $count[0], $products[2], $stories[2])) && p('0:project,product,case') && e('161,68,269'); // 看板执行关联用例 -r($execution->linkCasesTest($executionIDList[0], $count[1], $products[0], $stories[0])) && p() && e('4'); // 敏捷执行关联用例统计 +r($execution->linkCasesTest($executionIDList[0], $count[1], $products[0], $stories[0])) && p() && e('8'); // 敏捷执行关联用例统计 r($execution->linkCasesTest($executionIDList[1], $count[1], $products[1], $stories[1])) && p() && e('4'); // 瀑布执行关联用例统计 r($execution->linkCasesTest($executionIDList[2], $count[1], $products[2], $stories[2])) && p() && e('4'); // 看板执行关联用例统计 -$db->restoreDB(); \ No newline at end of file +$db->restoreDB(); diff --git a/test/model/execution/linkstory.php b/test/model/execution/linkstory.php index c350b3abbd..e5dba1eb0e 100755 --- a/test/model/execution/linkstory.php +++ b/test/model/execution/linkstory.php @@ -14,9 +14,9 @@ pid=1 敏捷执行关联需求 >> 101,1,4 瀑布执行关联需求 >> 131,1,4 看板执行关联需求 >> 161,1,4 -敏捷执行关联需求统计 >> 3 -瀑布执行关联需求统计 >> 3 -看板执行关联需求统计 >> 3 +敏捷执行关联需求统计 >> 1 +瀑布执行关联需求统计 >> 1 +看板执行关联需求统计 >> 1 */ @@ -31,8 +31,8 @@ $execution = new executionTest(); r($execution->linkStoryTest($executionIDList[0], $count[0], $story)) && p('0:project,product,story') && e('101,1,4'); // 敏捷执行关联需求 r($execution->linkStoryTest($executionIDList[1], $count[0], $story)) && p('0:project,product,story') && e('131,1,4'); // 瀑布执行关联需求 r($execution->linkStoryTest($executionIDList[2], $count[0], $story)) && p('0:project,product,story') && e('161,1,4'); // 看板执行关联需求 -r($execution->linkStoryTest($executionIDList[0], $count[1], $story)) && p() && e('3'); // 敏捷执行关联需求统计 -r($execution->linkStoryTest($executionIDList[1], $count[1], $story)) && p() && e('3'); // 瀑布执行关联需求统计 -r($execution->linkStoryTest($executionIDList[2], $count[1], $story)) && p() && e('3'); // 看板执行关联需求统计 +r($execution->linkStoryTest($executionIDList[0], $count[1], $story)) && p() && e('1'); // 敏捷执行关联需求统计 +r($execution->linkStoryTest($executionIDList[1], $count[1], $story)) && p() && e('1'); // 瀑布执行关联需求统计 +r($execution->linkStoryTest($executionIDList[2], $count[1], $story)) && p() && e('1'); // 看板执行关联需求统计 -$db->restoreDB(); \ No newline at end of file +$db->restoreDB(); diff --git a/test/model/execution/processburndata.php b/test/model/execution/processburndata.php index 7d380b72c0..acc9c4eac0 100755 --- a/test/model/execution/processburndata.php +++ b/test/model/execution/processburndata.php @@ -10,9 +10,9 @@ title=测试executionModel->processBurnDataTest(); cid=1 pid=1 -敏捷执行查询统计 >> 29 -瀑布执行查询统计 >> 59 -看板执行查询统计 >> 62 +敏捷执行查询统计 >> 30 +瀑布执行查询统计 >> 60 +看板执行查询统计 >> 67 错误时间查询统计 >> 0 */ @@ -24,7 +24,7 @@ $end = array('2022-03-22','2022-01-15'); $count = array('0','1'); $execution = new executionTest(); -r($execution->processBurnDataTest($executionIDList[0], $itemCounts[0], $begin[0], $end[0], $count[1])) && p() && e('29'); // 敏捷执行查询统计 -r($execution->processBurnDataTest($executionIDList[1], $itemCounts[1], $begin[0], $end[0], $count[1])) && p() && e('59'); // 瀑布执行查询统计 -r($execution->processBurnDataTest($executionIDList[2], $itemCounts[2], $begin[0], $end[0], $count[1])) && p() && e('62'); // 看板执行查询统计 -r($execution->processBurnDataTest($executionIDList[2], $itemCounts[2], $begin[1], $end[1], $count[1])) && p() && e('0'); // 错误时间查询统计 \ No newline at end of file +r($execution->processBurnDataTest($executionIDList[0], $itemCounts[0], $begin[0], $end[0], $count[1])) && p() && e('30'); // 敏捷执行查询统计 +r($execution->processBurnDataTest($executionIDList[1], $itemCounts[1], $begin[0], $end[0], $count[1])) && p() && e('60'); // 瀑布执行查询统计 +r($execution->processBurnDataTest($executionIDList[2], $itemCounts[2], $begin[0], $end[0], $count[1])) && p() && e('67'); // 看板执行查询统计 +r($execution->processBurnDataTest($executionIDList[2], $itemCounts[2], $begin[1], $end[1], $count[1])) && p() && e('0'); // 错误时间查询统计 diff --git a/test/model/execution/unlinkmember.php b/test/model/execution/unlinkmember.php index 2964434b5e..b53603f8ba 100755 --- a/test/model/execution/unlinkmember.php +++ b/test/model/execution/unlinkmember.php @@ -14,8 +14,8 @@ pid=1 敏捷执行解除团队成员 >> po82,研发 敏捷执行解除团队成员后统计 >> 1 瀑布执行解除团队成员 >> 0 -看板执行解除团队成员 >> test52,测试 -看板执行解除团队成员后统计 >> 1 +看板执行解除团队成员 >> 0 +看板执行解除团队成员后统计 >> 0 */ @@ -27,6 +27,6 @@ $execution = new executionTest(); r($execution->unlinkMemberTest($executionIDList[0], $accountList[0], $count[0])) && p('0:account,role') && e('po82,研发'); // 敏捷执行解除团队成员 r($execution->unlinkMemberTest($executionIDList[0], $accountList[0], $count[1])) && p() && e('1'); // 敏捷执行解除团队成员后统计 r($execution->unlinkMemberTest($executionIDList[1], $accountList[1], $count[0])) && p() && e('0'); // 瀑布执行解除团队成员 -r($execution->unlinkMemberTest($executionIDList[2], $accountList[2], $count[0])) && p('0:account,role') && e('test52,测试'); // 看板执行解除团队成员 -r($execution->unlinkMemberTest($executionIDList[2], $accountList[2], $count[1])) && p() && e('1'); // 看板执行解除团队成员后统计 -$db->restoreDB(); \ No newline at end of file +r($execution->unlinkMemberTest($executionIDList[2], $accountList[2], $count[0])) && p('0:account,role') && e('0'); // 看板执行解除团队成员 +r($execution->unlinkMemberTest($executionIDList[2], $accountList[2], $count[1])) && p() && e('0'); // 看板执行解除团队成员后统计 +$db->restoreDB(); diff --git a/test/model/execution/unlinkstory.php b/test/model/execution/unlinkstory.php index 70de49b8ce..6daa4eec8f 100755 --- a/test/model/execution/unlinkstory.php +++ b/test/model/execution/unlinkstory.php @@ -11,12 +11,12 @@ title=测试executionModel->unlinkStoryTest(); cid=1 pid=1 -敏捷执行解除关联需求 >> 101,81,324 +敏捷执行解除关联需求 >> 0 瀑布执行解除关联需求 >> 131,1,4 看板执行解除关联需求 >> 161,1,4 -敏捷执行关联需求统计 >> 2 -瀑布执行关联需求统计 >> 2 -看板执行关联需求统计 >> 2 +敏捷执行关联需求统计 >> 0 +瀑布执行关联需求统计 >> 1 +看板执行关联需求统计 >> 1 */ @@ -28,11 +28,11 @@ $count = array('0', '1'); $story = array('stories' => $stories, 'products' => $products); $execution = new executionTest(); -r($execution->unlinkStoryTest($executionIDList[0], $count[0], $stories[0], $story)) && p('0:project,product,story') && e('101,81,324'); // 敏捷执行解除关联需求 -r($execution->unlinkStoryTest($executionIDList[1], $count[0], $stories[1], $story)) && p('0:project,product,story') && e('131,1,4'); // 瀑布执行解除关联需求 -r($execution->unlinkStoryTest($executionIDList[2], $count[0], $stories[2], $story)) && p('0:project,product,story') && e('161,1,4'); // 看板执行解除关联需求 -r($execution->unlinkStoryTest($executionIDList[0], $count[1], $stories[0], $story)) && p() && e('2'); // 敏捷执行关联需求统计 -r($execution->unlinkStoryTest($executionIDList[1], $count[1], $stories[1], $story)) && p() && e('2'); // 瀑布执行关联需求统计 -r($execution->unlinkStoryTest($executionIDList[2], $count[1], $stories[2], $story)) && p() && e('2'); // 看板执行关联需求统计 +r($execution->unlinkStoryTest($executionIDList[0], $count[0], $stories[0], $story)) && p('0:project,product,story') && e('0'); // 敏捷执行解除关联需求 +r($execution->unlinkStoryTest($executionIDList[1], $count[0], $stories[1], $story)) && p('0:project,product,story') && e('131,1,4'); // 瀑布执行解除关联需求 +r($execution->unlinkStoryTest($executionIDList[2], $count[0], $stories[2], $story)) && p('0:project,product,story') && e('161,1,4'); // 看板执行解除关联需求 +r($execution->unlinkStoryTest($executionIDList[0], $count[1], $stories[0], $story)) && p() && e('0'); // 敏捷执行关联需求统计 +r($execution->unlinkStoryTest($executionIDList[1], $count[1], $stories[1], $story)) && p() && e('1'); // 瀑布执行关联需求统计 +r($execution->unlinkStoryTest($executionIDList[2], $count[1], $stories[2], $story)) && p() && e('1'); // 看板执行关联需求统计 -$db->restoreDB(); \ No newline at end of file +$db->restoreDB(); From b64081a30e43593d410b22d071469a4ed880683a Mon Sep 17 00:00:00 2001 From: mayue Date: Wed, 24 Aug 2022 14:56:00 +0800 Subject: [PATCH 130/223] * Finish task #65893. --- module/common/model.php | 17 ++++++++++------- module/design/js/browse.js | 13 +++++++++++++ module/design/model.php | 18 +++++++++++++++++- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/module/common/model.php b/module/common/model.php index d86b3d4831..e73c45d9de 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -1335,28 +1335,31 @@ class commonModel extends model $label = $menuItem->text; $dropMenu = ''; + /* Print sub menus. */ if(isset($menuItem->dropMenu)) { - foreach($menuItem->dropMenu as $dropMenuItem) + foreach($menuItem->dropMenu as $dropMenuKey => $dropMenuItem) { - if($dropMenuItem->hidden) continue; + if(isset($dropMenuItem->hidden) and $dropMenuItem->hidden) continue; $subActive = ''; $subModule = ''; $subMethod = ''; $subParams = ''; - $subLabel = $dropMenuItem->text; - if(isset($dropMenuItem->link['module'])) $subModule = $dropMenuItem->link['module']; - if(isset($dropMenuItem->link['method'])) $subMethod = $dropMenuItem->link['method']; - if(isset($dropMenuItem->link['vars'])) $subParams = $dropMenuItem->link['vars']; + $subLabel = ''; + list($dropMenuName, $dropMenuModule, $dropMenuMethod, $dropMenuParams) = explode('|', $dropMenuItem['link']); + if(isset($dropMenuModule)) $subModule = $dropMenuModule; + if(isset($dropMenuMethod)) $subMethod = $dropMenuMethod; + if(isset($dropMenuParams)) $subParams = $dropMenuParams; + if(isset($dropMenuName)) $subLabel = $dropMenuName; $subLink = helper::createLink($subModule, $subMethod, $subParams); if($currentModule == strtolower($subModule) and $currentMethod == strtolower($subMethod)) $subActive = 'active'; $misc = (isset($lang->navGroup->$subModule) and $tab != $lang->navGroup->$subModule) ? "data-app='$tab'" : ''; - $dropMenu .= "
  • " . html::a($subLink, $subLabel, '', $misc) . '
  • '; + $dropMenu .= "
  • " . html::a($subLink, $subLabel, '', $misc) . '
  • '; } if(empty($dropMenu)) continue; diff --git a/module/design/js/browse.js b/module/design/js/browse.js index dd0b30a06d..9abbb03273 100644 --- a/module/design/js/browse.js +++ b/module/design/js/browse.js @@ -7,9 +7,22 @@ $(function() { var type = $(this).parent().attr('data-id'); if(type == 'bysearch') return; + if(type == 'more') + { + $(this).attr('href', '###'); + return; + } type = type == 'all' ? type : type.toLowerCase(); var href = createLink('design', 'browse', 'projectID=' + projectID + '&productID=' + productID + '&type=' + type); $(this).attr('href', href); }); + + if($('#subNavbar .dropdown-menu li[data-id=' + type +']').hasClass('active')) + { + var typeName = $('#subNavbar li[data-id=' + type +'] > a').html(); + + $('#subNavbar').find(".dropdown-hover > a").html(typeName + ""); + $("#subNavbar li[data-id='more']").addClass('active'); + } }) diff --git a/module/design/model.php b/module/design/model.php index 96fe52b191..4d42e601bb 100644 --- a/module/design/model.php +++ b/module/design/model.php @@ -406,10 +406,26 @@ class designModel extends model /* Show custom design types. */ $this->lang->waterfall->menu->design['subMenu'] = new stdclass(); $this->lang->waterfall->menu->design['subMenu']->all = array('link' => "{$this->lang->all}|design|browse|projectID=%s&productID=0&browseType=all"); + $count = 1; foreach(array_filter($this->lang->design->typeList) as $key => $value) { $key = strtolower($key); - $this->lang->waterfall->menu->design['subMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); + + if($count > 4) + { + if($count == 5) + { + $this->lang->waterfall->menu->design['subMenu']->more = array('link' => "更多|design|browse|projectID=%s&productID=0&browseType={$key}", 'class' => 'dropdown dropdown-hover'); + $this->lang->waterfall->menu->design['subMenu']->more['dropMenu'] = new stdclass(); + } + $this->lang->waterfall->menu->design['subMenu']->more['dropMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); + } + else + { + $this->lang->waterfall->menu->design['subMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); + } + + $count ++; } if($this->app->rawMethod == 'browse') $this->lang->waterfall->menu->design['subMenu']->bysearch = array('link' => ' ' . $this->lang->searchAB . ''); From 8d8062122e91b9c266ba5ea84fbbf39ea9a2b065 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 24 Aug 2022 14:56:51 +0800 Subject: [PATCH 131/223] * Code for unit test of bug. --- test/model/bug/assign.php | 4 +--- test/model/bug/getbugquery.php | 6 +++--- test/model/bug/getrelatedobjects.php | 2 +- test/model/bug/getreviewbugs.php | 4 +++- test/model/bug/getstatistic.php | 12 +++++++++++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/test/model/bug/assign.php b/test/model/bug/assign.php index 16806378cc..557caff822 100755 --- a/test/model/bug/assign.php +++ b/test/model/bug/assign.php @@ -16,7 +16,6 @@ pid=1 指派bugID为3的bug >> assignedTo,admin,user94 指派bugID为4的bug >> assignedTo,admin,user95 指派bugID为51的bug >> assignedTo,dev1,user96 -指派bugID为81的bug >> assignedTo,test1,user97 指派人不发生变化的bug >> 0 */ @@ -36,6 +35,5 @@ r($bug->assignTest($bugIDlist[1],$bug2)) && p('0:field,old,new') && e('assigned r($bug->assignTest($bugIDlist[2],$bug3)) && p('0:field,old,new') && e('assignedTo,admin,user94'); // 指派bugID为3的bug r($bug->assignTest($bugIDlist[3],$bug4)) && p('0:field,old,new') && e('assignedTo,admin,user95'); // 指派bugID为4的bug r($bug->assignTest($bugIDlist[4],$bug51)) && p('0:field,old,new') && e('assignedTo,dev1,user96'); // 指派bugID为51的bug -r($bug->assignTest($bugIDlist[5],$bug81)) && p('0:field,old,new') && e('assignedTo,test1,user97'); // 指派bugID为81的bug r($bug->assignTest($bugIDlist[5],$bug81)) && p() && e('0'); // 指派人不发生变化的bug -$db->restoreDB(); \ No newline at end of file +$db->restoreDB(); diff --git a/test/model/bug/getbugquery.php b/test/model/bug/getbugquery.php index 045f15f3df..1c0ee4c052 100755 --- a/test/model/bug/getbugquery.php +++ b/test/model/bug/getbugquery.php @@ -10,7 +10,7 @@ title=bugModel->getBugQuery(); cid=1 pid=1 -查询 `product` = 'all' 的bugQuery >> 1 AND `product` IN ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','101','102','103','104','105','106','107','108','109','110','111','112','113','114','115','116','117','118','119','120','1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110 +查询 `product` = 'all' 的bugQuery >> 1 AND `product` IN ('1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110','11','12','13','14','15','16','17','18','19','20','31','32','33','34','35','36','37','38','39','40','51','52','53','54','55','56','57','58','59','60','71','72','73','74','75','76','77','78','79','80','91','92','93','94','95','96','97','98','99','100','111','112','113','114','115','116','117','118','119','120','1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110') 查询 `project` = 'all' 的bugQuery >> 1 AND `project` in (11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750) 查询 `resolvedDate` = '2022-01-01' 的bugQuery >> `resolvedDate` != '0000-00-00 00:00:00' AND `resolvedDate` > '2022-01-01' 查询 `closedDate` = '2022-01-01' 的bugQuery >> `closedDate` != '0000-00-00 00:00:00' AND `closedDate` <= '2022-01-01' @@ -31,10 +31,10 @@ $bugQuery[] = " `product` = '1' and `project` = '1' and `story` > 'abc'"; $bug=new bugTest(); -r($bug->getBugQueryTest($bugQuery[0])) && p() && e("1 AND `product` IN ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','101','102','103','104','105','106','107','108','109','110','111','112','113','114','115','116','117','118','119','120','1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110')"); // 查询 `product` = 'all' 的bugQuery +r($bug->getBugQueryTest($bugQuery[0])) && p() && e("1 AND `product` IN ('1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110','11','12','13','14','15','16','17','18','19','20','31','32','33','34','35','36','37','38','39','40','51','52','53','54','55','56','57','58','59','60','71','72','73','74','75','76','77','78','79','80','91','92','93','94','95','96','97','98','99','100','111','112','113','114','115','116','117','118','119','120','1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110')"); // 查询 `product` = 'all' 的bugQuery r($bug->getBugQueryTest($bugQuery[1])) && p() && e("1 AND `project` in (11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750)"); // 查询 `project` = 'all' 的bugQuery r($bug->getBugQueryTest($bugQuery[2])) && p() && e(" `resolvedDate` != '0000-00-00 00:00:00' AND `resolvedDate` > '2022-01-01'"); // 查询 `resolvedDate` = '2022-01-01' 的bugQuery r($bug->getBugQueryTest($bugQuery[3])) && p() && e(" `closedDate` != '0000-00-00 00:00:00' AND `closedDate` <= '2022-01-01'"); // 查询 `closedDate` = '2022-01-01' 的bugQuery r($bug->getBugQueryTest($bugQuery[4])) && p() && e(" `story` IN (2,12,20,21,22,23,24,25,26,27,28,29,32,42,52,62,70,71,72,73,74,75,76,77,78,79,82,92,102,112,120,121,122,123,124,125,126,127,128,129,132,142,152,162,172,182,192,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,302,312,320,321,322,323,324,325,326,327,328,329,332,342,352,362,372,382,392,402,412,420,421,422,423,424,425,426,427,428,429,432,442) AND `story` != 0"); // 查询 `story` LIKE '%abc%' 的bugQuery r($bug->getBugQueryTest($bugQuery[5])) && p() && e(" `story` NOT IN (2,12,20,21,22,23,24,25,26,27,28,29,32,42,52,62,70,71,72,73,74,75,76,77,78,79,82,92,102,112,120,121,122,123,124,125,126,127,128,129,132,142,152,162,172,182,192,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,302,312,320,321,322,323,324,325,326,327,328,329,332,342,352,362,372,382,392,402,412,420,421,422,423,424,425,426,427,428,429,432,442) AND `story` != 0"); // 查询 `story` NOT LIKE '%abc%' 的bugQuery -r($bug->getBugQueryTest($bugQuery[6])) && p() && e("`product` = '1' and `project` = '1' and `story` > 'abc' AND `story` != 0"); // 查询 `product` = '1' and `project` = '1' and `story` > 'abc' 的bugQuery \ No newline at end of file +r($bug->getBugQueryTest($bugQuery[6])) && p() && e("`product` = '1' and `project` = '1' and `story` > 'abc' AND `story` != 0"); // 查询 `product` = '1' and `project` = '1' and `story` > 'abc' 的bugQuery diff --git a/test/model/bug/getrelatedobjects.php b/test/model/bug/getrelatedobjects.php index 47b535517c..d2074cd36e 100755 --- a/test/model/bug/getrelatedobjects.php +++ b/test/model/bug/getrelatedobjects.php @@ -30,4 +30,4 @@ r($bug->getRelatedObjectsTest($objects[1], $pairs[0])) && p() && e(':,0:'); // r($bug->getRelatedObjectsTest($objects[2], $pairs[1])) && p() && e(':,0:'); // 获取bug关联的 case 的 id,title r($bug->getRelatedObjectsTest($objects[3], $pairs[0])) && p() && e(':,0:,trunk:主干'); // 获取bug关联的 resolvedBuild 的 id,name r($bug->getRelatedObjectsTest($objects[4], $pairs[0])) && p() && e(':,0:,trunk:主干,1:项目版本版本1'); // 获取bug关联的 openedBuild 的 id,name -r($bug->getRelatedObjectsTest($objects[5], $pairs[1])) && p() && e(':,0:,2:软件需求2,6:软件需求6,10:软件需求10,14:软件需求14,18:软件需求18,22:软件需求22,26:软件需求26,30:软件需求30,34:软件需求34'); // 获取bug关联的 story 的 id,title +r($bug->getRelatedObjectsTest($objects[5], $pairs[1])) && p() && e(':,0:,2:软件需求2,6:软件需求6,10:软件需求10,14:软件需求14,18:软件需求18,22:软件需求22,26:软件需求26,30:软件需求30,34:软件需求34'); // 获取bug关联的 story 的 id,title \ No newline at end of file diff --git a/test/model/bug/getreviewbugs.php b/test/model/bug/getreviewbugs.php index d02b3b45d8..0bba515b5a 100755 --- a/test/model/bug/getreviewbugs.php +++ b/test/model/bug/getreviewbugs.php @@ -10,6 +10,8 @@ title=bugModel->getReviewBugs(); cid=1 pid=1 + + */ $productIDList = array('1,2,3,1000001', '1,3'); @@ -36,4 +38,4 @@ r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[1], $exec r($bug->getReviewBugsTest($productIDList[1], $branch[0], $moduleIDList[0], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支all 模块1821, 1825, 1832 不存在的模块1000001 执行101 111下审批人为当前用户的bug r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[0], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支1 模块1821, 1825, 1832 不存在的模块1000001 执行101 111下审批人为当前用户的bug r($bug->getReviewBugsTest($productIDList[1], $branch[0], $moduleIDList[1], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支all 模块1821, 1825 执行101 111下审批人为当前用户的bug -r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[1], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支1 模块1821, 1825 执行101 111下审批人为当前用户的bug +r($bug->getReviewBugsTest($productIDList[1], $branch[1], $moduleIDList[1], $executions[1], $orderBy)) && p('') && e(''); // 查询产品1 3 与分支1 模块1821, 1825 执行101 111下审批人为当前用户的bug \ No newline at end of file diff --git a/test/model/bug/getstatistic.php b/test/model/bug/getstatistic.php index 0277bfe50b..58f5277a15 100755 --- a/test/model/bug/getstatistic.php +++ b/test/model/bug/getstatistic.php @@ -10,6 +10,16 @@ title=bugModel->getStatistic(); cid=1 pid=1 +查询product id为0创建日期在今天的统计信息 >> 0 +查询product id为1创建日期在今天的统计信息 >> 0 +查询product id为1创建日期在今天的统计信息 >> 0 +查询product id为1创建日期在今天的统计信息 >> 0 +查询product id为11解决日期在今天的统计信息 >> 1 +查询product id为31解决日期在今天的统计信息 >> 0 +查询product id为61解决日期在今天的统计信息 >> 0 +查询product id为91关闭日期在今天的统计信息 >> 0 +查询product id为10001关闭日期在今天的统计信息 >> 0 + */ $productIDList = array('1', '11', '31', '61', '91', '10001'); @@ -24,4 +34,4 @@ r($bug->getStatisticTest($productIDList[1])) && p('openedDate:num') && e('1'); r($bug->getStatisticTest($productIDList[2])) && p('openedDate:num') && e('0'); // 查询product id为31解决日期在今天的统计信息 r($bug->getStatisticTest($productIDList[3])) && p('openedDate:num') && e('0'); // 查询product id为61解决日期在今天的统计信息 r($bug->getStatisticTest($productIDList[4])) && p('openedDate:num') && e('0'); // 查询product id为91关闭日期在今天的统计信息 -r($bug->getStatisticTest($productIDList[5])) && p('openedDate:num') && e('0'); // 查询product id为10001关闭日期在今天的统计信息 +r($bug->getStatisticTest($productIDList[5])) && p('openedDate:num') && e('0'); // 查询product id为10001关闭日期在今天的统计信息 \ No newline at end of file From 99e3ef7a1893723857161f428f770ab63cd1a91c Mon Sep 17 00:00:00 2001 From: tianshujie Date: Wed, 24 Aug 2022 14:59:54 +0800 Subject: [PATCH 132/223] * Fix failed test cases for execution module. --- test/model/execution/buildburndata.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/model/execution/buildburndata.php b/test/model/execution/buildburndata.php index fcd757c70a..b5e94e8654 100755 --- a/test/model/execution/buildburndata.php +++ b/test/model/execution/buildburndata.php @@ -12,7 +12,7 @@ pid=1 敏捷执行燃尽图数据 >> 7/1 瀑布执行燃尽图数据 >> [0,0,0,0,0,0,0,0,0,0,0] -看板执行燃尽图数据 >> [20,18,16,14,12,10,8,6,4,2,0] +看板执行燃尽图数据 >> [0,0,0,0,0,0,0,0,0,0,0] 结果统计 >> 3 */ @@ -23,5 +23,5 @@ $count = array('0', '1'); $execution = new executionTest(); r($execution->buildBurnDataTest($executionIDList[0], $count[0])) && p('labels:0') && e('7/1'); // 敏捷执行燃尽图数据 r($execution->buildBurnDataTest($executionIDList[1], $count[0])) && p('burnLine') && e('[0,0,0,0,0,0,0,0,0,0,0]'); // 瀑布执行燃尽图数据 -r($execution->buildBurnDataTest($executionIDList[2], $count[0])) && p('baseLine') && e('[20,18,16,14,12,10,8,6,4,2,0]'); // 看板执行燃尽图数据 -r($execution->buildBurnDataTest($executionIDList[0], $count[1])) && p() && e('3'); // 结果统计 \ No newline at end of file +r($execution->buildBurnDataTest($executionIDList[2], $count[0])) && p('baseLine') && e('[0,0,0,0,0,0,0,0,0,0,0]'); // 看板执行燃尽图数据 +r($execution->buildBurnDataTest($executionIDList[0], $count[1])) && p() && e('3'); // 结果统计 From 067abe91c335bb696886108ffc916f0e0046596b Mon Sep 17 00:00:00 2001 From: tianshujie Date: Wed, 24 Aug 2022 15:06:09 +0800 Subject: [PATCH 133/223] * * Fix failed test cases for execution module. --- test/class/execution.class.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/class/execution.class.php b/test/class/execution.class.php index 91d1383fab..e958b9a486 100644 --- a/test/class/execution.class.php +++ b/test/class/execution.class.php @@ -1604,12 +1604,11 @@ class executionTest } /** - * function getBurnDataFlot test by execution + * Function getBurnDataFlot test by execution. * - * @param int $executionID - * @param string $count + * @param int $executionID * @access public - * @return array + * @return int */ public function getBurnDataFlotTest($executionID = 0) { From f637523c8fa3cbb1b5365401a9022453a118f201 Mon Sep 17 00:00:00 2001 From: mayue Date: Wed, 24 Aug 2022 15:28:41 +0800 Subject: [PATCH 134/223] * Optimize code. --- module/design/lang/de.php | 1 + module/design/lang/en.php | 1 + module/design/lang/fr.php | 1 + module/design/lang/zh-cn.php | 1 + module/design/model.php | 16 +++++----------- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/module/design/lang/de.php b/module/design/lang/de.php index d78d2bc6ab..8dc1c11869 100644 --- a/module/design/lang/de.php +++ b/module/design/lang/de.php @@ -37,6 +37,7 @@ $lang->design->createdDate = 'CreatedDate'; $lang->design->basicInfo = 'Basic Information'; $lang->design->noAssigned = 'Unassigned'; $lang->design->comment = 'Comment'; +$lang->design->more = 'Mehr'; /* 动作列表. */ $lang->design->common = 'Design'; diff --git a/module/design/lang/en.php b/module/design/lang/en.php index 9a25dfdb79..f006c2c840 100644 --- a/module/design/lang/en.php +++ b/module/design/lang/en.php @@ -37,6 +37,7 @@ $lang->design->createdDate = 'CreatedDate'; $lang->design->basicInfo = 'Basic Information'; $lang->design->noAssigned = 'Unassigned'; $lang->design->comment = 'Comment'; +$lang->design->more = 'More'; /* 动作列表. */ $lang->design->common = 'Design'; diff --git a/module/design/lang/fr.php b/module/design/lang/fr.php index d78d2bc6ab..0e3e8da8a8 100644 --- a/module/design/lang/fr.php +++ b/module/design/lang/fr.php @@ -37,6 +37,7 @@ $lang->design->createdDate = 'CreatedDate'; $lang->design->basicInfo = 'Basic Information'; $lang->design->noAssigned = 'Unassigned'; $lang->design->comment = 'Comment'; +$lang->design->more = 'Suite'; /* 动作列表. */ $lang->design->common = 'Design'; diff --git a/module/design/lang/zh-cn.php b/module/design/lang/zh-cn.php index d96bd18f15..cab82e4748 100644 --- a/module/design/lang/zh-cn.php +++ b/module/design/lang/zh-cn.php @@ -37,6 +37,7 @@ $lang->design->createdDate = '创建时间'; $lang->design->basicInfo = '基本信息'; $lang->design->noAssigned = '未指派'; $lang->design->comment = '注释'; +$lang->design->more = '更多'; /* 动作列表. */ $lang->design->common = '设计'; diff --git a/module/design/model.php b/module/design/model.php index 4d42e601bb..25be18689e 100644 --- a/module/design/model.php +++ b/module/design/model.php @@ -411,19 +411,13 @@ class designModel extends model { $key = strtolower($key); - if($count > 4) + if($count <= 4) $this->lang->waterfall->menu->design['subMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); + if($count == 5) { - if($count == 5) - { - $this->lang->waterfall->menu->design['subMenu']->more = array('link' => "更多|design|browse|projectID=%s&productID=0&browseType={$key}", 'class' => 'dropdown dropdown-hover'); - $this->lang->waterfall->menu->design['subMenu']->more['dropMenu'] = new stdclass(); - } - $this->lang->waterfall->menu->design['subMenu']->more['dropMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); - } - else - { - $this->lang->waterfall->menu->design['subMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); + $this->lang->waterfall->menu->design['subMenu']->more = array('link' => "{$this->lang->design->more}|design|browse|projectID=%s&productID=0&browseType={$key}", 'class' => 'dropdown dropdown-hover'); + $this->lang->waterfall->menu->design['subMenu']->more['dropMenu'] = new stdclass(); } + if($count >= 5) $this->lang->waterfall->menu->design['subMenu']->more['dropMenu']->$key = array('link' => "{$value}|design|browse|projectID=%s&productID=0&browseType={$key}"); $count ++; } From 7ad6759625d3e64b597dea3a88dd7291da2b56a4 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 15:53:51 +0800 Subject: [PATCH 135/223] * Fix bug#26770. --- module/story/model.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index b5d93f9846..af047c8b79 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -608,7 +608,6 @@ class storyModel extends model $this->dao->insert(TABLE_STORYSPEC)->data($specData)->exec(); /* Save the story reviewer to storyreview table. */ - $assignedTo = ''; foreach($_POST['reviewer'][$i] as $reviewer) { if(empty($reviewer)) continue; @@ -618,10 +617,7 @@ class storyModel extends model $reviewData->version = 1; $reviewData->reviewer = $reviewer; $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); - - if(empty($assignedTo)) $assignedTo = $reviewer; } - if($assignedTo) $this->dao->update(TABLE_STORY)->set('assignedTo')->eq($assignedTo)->set('assignedDate')->eq($now)->where('id')->eq($storyID)->exec(); $this->executeHooks($storyID); @@ -1633,7 +1629,6 @@ class storyModel extends model if(isset($_POST['reviewer'])) { - $assignedTo = ''; foreach($this->post->reviewer as $reviewer) { if(empty($reviewer)) continue; @@ -1643,10 +1638,7 @@ class storyModel extends model $reviewData->version = $oldStory->version; $reviewData->reviewer = $reviewer; $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); - - if(empty($assignedTo)) $assignedTo = $reviewer; } - if($assignedTo) $this->dao->update(TABLE_STORY)->set('assignedTo')->eq($assignedTo)->set('assignedDate')->eq(helper::now())->where('id')->eq($storyID)->exec(); $story->status = 'reviewing'; } From 5ab68b8aa261d9520de6a1d2cf2660816083d27f Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 15:58:30 +0800 Subject: [PATCH 136/223] * Fix bug#26823. --- module/story/control.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 395efa8d69..64775c6246 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1663,8 +1663,9 @@ class story extends control $this->product->setMenu($product->id, $story->branch); /* Set the closed reason options and remove subdivided options. */ - if($story->status == 'draft') unset($this->lang->story->reasonList['cancel']); - unset($this->lang->story->reasonList['subdivided']); + $reasonList = $this->lang->story->reasonList; + if($story->status == 'draft') unset($reasonList['cancel']); + unset($reasonList['subdivided']); $this->view->title = $this->lang->story->close . "STORY" . $this->lang->colon . $story->title; $this->view->position[] = html::a($this->createLink('product', 'browse', "product=$product->id&branch=$story->branch"), $product->name); @@ -1675,7 +1676,7 @@ class story extends control $this->view->story = $story; $this->view->actions = $this->action->getList('story', $storyID); $this->view->users = $this->loadModel('user')->getPairs(); - $this->view->reasonList = $this->lang->story->reasonList; + $this->view->reasonList = $reasonList; $this->display(); } From e7bbfe300cb50eb6f2e34aed77b54c721e21c78d Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 24 Aug 2022 16:26:06 +0800 Subject: [PATCH 137/223] * Fix bug #26839. --- module/action/model.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/action/model.php b/module/action/model.php index 66ba694f52..c3e5577349 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -1540,7 +1540,11 @@ class actionModel extends model if($action->objectType == 'story') { $story = $this->loadModel('story')->getByID($action->objectID); - if(!empty($story)) $moduleName = $story->type; + if(!empty($story)) + { + $moduleName = $story->type; + $action->objectLink = helper::createLink('story', 'view', "id=$story->id&version=0¶m=0&storyType=$story->type"); + } } if($action->objectType == 'doclib') From 151ba868382d542dde7c59d5aeb419ae13d4b8e7 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 24 Aug 2022 16:26:31 +0800 Subject: [PATCH 138/223] * Fix bug #26838. --- module/story/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/model.php b/module/story/model.php index 2b2fecab0c..3065c5edbf 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4578,7 +4578,7 @@ class storyModel extends model $executionID = empty($execution) ? $this->session->execution : $execution->id; $account = $this->app->user->account; $storyLink = helper::createLink('story', 'view', "storyID=$story->id&version=0¶m=0&storyType=$story->type"); - $canView = common::hasPriv('story', 'view'); + $canView = common::hasPriv($story->type, 'view', null, "storyType=$story->type"); if($tab == 'project') { From 99878fdc7aeac2897a1e247f6d08ca5a9cbdd6bf Mon Sep 17 00:00:00 2001 From: liuhong Date: Wed, 24 Aug 2022 08:46:15 +0000 Subject: [PATCH 139/223] *Fix bug #66226. --- module/build/control.php | 15 ----------- module/build/view/view.html.php | 2 +- module/productplan/control.php | 36 +++------------------------ module/productplan/view/view.html.php | 8 +++--- 4 files changed, 8 insertions(+), 53 deletions(-) diff --git a/module/build/control.php b/module/build/control.php index 50cc8a87da..182eace820 100644 --- a/module/build/control.php +++ b/module/build/control.php @@ -591,21 +591,6 @@ class build extends control { $this->build->unlinkStory($buildID, $storyID); - /* if ajax request, send result. */ - if($this->server->ajax) - { - if(dao::isError()) - { - $response['result'] = 'fail'; - $response['message'] = dao::getError(); - } - else - { - $response['result'] = 'success'; - $response['message'] = ''; - } - return $this->send($response); - } return print(js::reload('parent')); } diff --git a/module/build/view/view.html.php b/module/build/view/view.html.php index 50726da216..ea39390fb3 100644 --- a/module/build/view/view.html.php +++ b/module/build/view/view.html.php @@ -131,7 +131,7 @@ tbody tr td:first-child input {display: none;} if($canBeChanged and common::hasPriv('build', 'unlinkStory')) { $unlinkURL = inlink('unlinkStory', "buildID=$build->id&story=$story->id"); - echo html::a("###", '', '', "onclick='ajaxDelete(\"$unlinkURL\", \"storyList\", confirmUnlinkStory)' class='btn' title='{$lang->build->unlinkStory}'"); + echo html::a($unlinkURL, '', 'hiddenwin', "class='btn' title='{$lang->build->unlinkStory}'"); } ?> diff --git a/module/productplan/control.php b/module/productplan/control.php index e56dfd8302..224abbbdbb 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -725,29 +725,14 @@ class productplan extends control { if($confirm == 'no') { - return print(js::confirm($this->lang->productplan->confirmUnlinkStory, $this->createLink('productplan', 'unlinkstory', "storyID=$storyID&planID=$planID&confirm=yes"))); + return print(js::confirm($this->lang->productplan->confirmUnlinkStory, inlink('unlinkstory', "storyID=$storyID&planID=$planID&confirm=yes"))); } else { $this->productplan->unlinkStory($storyID, $planID); $this->loadModel('action')->create('productplan', $planID, 'unlinkstory', '', $storyID); - /* if ajax request, send result. */ - if($this->server->ajax) - { - if(dao::isError()) - { - $response['result'] = 'fail'; - $response['message'] = dao::getError(); - } - else - { - $response['result'] = 'success'; - $response['message'] = ''; - } - return $this->send($response); - } - return print(js::reload('parent')); + echo js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story"), 'parent'); } } @@ -867,28 +852,13 @@ class productplan extends control { if($confirm == 'no') { - return print(js::confirm($this->lang->productplan->confirmUnlinkBug, $this->createLink('productplan', 'unlinkbug', "bugID=$bugID&confirm=yes"))); + return print(js::confirm($this->lang->productplan->confirmUnlinkBug, inlink('unlinkbug', "bugID=$bugID&planID=$planID&confirm=yes"))); } else { $this->productplan->unlinkBug($bugID); $this->loadModel('action')->create('productplan', $planID, 'unlinkbug', '', $bugID); - /* if ajax request, send result. */ - if($this->server->ajax) - { - if(dao::isError()) - { - $response['result'] = 'fail'; - $response['message'] = dao::getError(); - } - else - { - $response['result'] = 'success'; - $response['message'] = ''; - } - return $this->send($response); - } return print(js::reload('parent')); } } diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php index 815900cdc4..dfc20fdf79 100644 --- a/module/productplan/view/view.html.php +++ b/module/productplan/view/view.html.php @@ -205,8 +205,8 @@ createLink('productplan', 'unlinkStory', "story=$story->id&plan=$plan->id&confirm=yes"); - echo html::a("javascript:ajaxDelete(\"$unlinkURL\", \"storyList\", confirmUnlinkStory)", '', '', "class='btn' title='{$lang->productplan->unlinkStory}'"); + $unlinkURL = $this->createLink('productplan', 'unlinkStory', "story=$story->id&plan=$plan->id"); + echo html::a($unlinkURL, '', 'hiddenwin', "class='btn' title='{$lang->productplan->unlinkStory}'"); } ?> @@ -473,8 +473,8 @@ createLink('productplan', 'unlinkBug', "bugID=$bug->id&planID=$plan->id&confirm=yes"); - echo html::a("javascript:ajaxDelete(\"$unlinkURL\", \"bugList\", confirmUnlinkBug)", '', '', "class='btn' title='{$lang->productplan->unlinkBug}'"); + $unlinkURL = $this->createLink('productplan', 'unlinkBug', "bugID=$bug->id&planID=$plan->id"); + echo html::a($unlinkURL, '', 'hiddenwin', "class='btn' title='{$lang->productplan->unlinkBug}'"); } ?> From bbd1c4ea5e38985133282c45e62432d99690e5f1 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Wed, 24 Aug 2022 17:05:46 +0800 Subject: [PATCH 140/223] * Fix bug #26617. --- module/upgrade/model.php | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index ed9d9327aa..81fe7b6344 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -547,6 +547,7 @@ class upgradeModel extends model $this->updateOSAndBrowserOfBug(); $this->addURPriv(); $this->updateStoryStatus(); + if(strpos($fromVersion, 'max') !== false) $this->syncCase2Project(); break; } @@ -7157,4 +7158,48 @@ class upgradeModel extends model $this->dbh->exec($sql); return true; } + + /** + * Sync case to project|execution if case create from import. + * + * @access public + * @return void + */ + public function syncCase2Project() + { + $linkStoryCases = $this->dao->select('id, story, version, product')->from(TABLE_CASE)->where('story')->ne('0')->fetchAll('id'); + $linkProjectCases = $this->dao->select('`case`, project')->from(TABLE_PROJECTCASE)->where('`case`')->ne('0')->andWhere('project')->ne('0')->fetchGroup('case', 'project'); + + if(empty($linkStoryCases)) return true; + + $projectList = $this->dao->select('t1.project, t1.story, t1.product')->from(TABLE_PROJECTSTORY)->alias('t1') + ->leftjoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') + ->where('t2.status')->ne('closed') + ->fetchGroup('story', 'project'); + + if(empty($projectList)) return true; + + foreach($linkStoryCases as $caseID => $case) + { + /* If story unlink project continue. */ + if(!isset($projectList[$case->story])) continue; + + $storyProjects = $projectList[$case->story]; + + $lastOrder = 1; + foreach($storyProjects as $projectID => $value) + { + /* If case linked project continue.*/ + if(isset($linkProjectCases[$caseID][$projectID])) continue; + + $data = new stdclass(); + $data->project = $projectID; + $data->product = $case->product; + $data->case = $caseID; + $data->version = $case->version; + $data->order = $lastOrder ++; + $this->dao->insert(TABLE_PROJECTCASE)->data($data)->exec(); + } + } + } } From ce8a347d072bcb448d0bc61f05acafdc2edb9f6b Mon Sep 17 00:00:00 2001 From: tianshujie Date: Wed, 24 Aug 2022 17:06:27 +0800 Subject: [PATCH 141/223] * Fix bug for task #64967. --- module/story/control.php | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 395efa8d69..f14304df0b 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -137,7 +137,7 @@ class story extends control $response['message'] = sprintf($this->lang->duplicate, $this->lang->story->common); if($objectID == 0) { - $response['locate'] = $this->createLink('story', 'view', "storyID={$storyID}"); + $response['locate'] = $this->createLink('story', 'view', "storyID={$storyID}&version=0¶m=0&storyType=$storyType"); } else { @@ -563,7 +563,7 @@ class story extends control if($storyID) { - return print(js::locate(inlink('view', "storyID=$storyID"), 'parent')); + return print(js::locate(inlink('view', "storyID=$storyID&version=0¶m=0&storyType=$storyType"), 'parent')); } elseif($executionID) { @@ -796,7 +796,8 @@ class story extends control } } if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'success', 'data' => $storyID)); - return print(js::locate($this->createLink($this->app->rawModule, 'view', "storyID=$storyID"), 'parent')); + $params = $this->app->rawModule == 'story' ? "storyID=$storyID&version=0¶m=0&storyType=$storyType" : "storyID=$storyID"; + return print(js::locate($this->createLink($this->app->rawModule, 'view', $params), 'parent')); } $this->commonAction($storyID); @@ -1127,7 +1128,8 @@ class story extends control } if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'success')); - return print(js::locate($this->createLink($module, 'view', "storyID=$storyID"), 'parent')); + $params = $module == 'story' ? "storyID=$storyID&version=0¶m=0&storyType=$storyType" : "storyID=$storyID"; + return print(js::locate($this->createLink($module, 'view', $params), 'parent')); } $this->commonAction($storyID); @@ -1198,7 +1200,7 @@ class story extends control return print(js::closeModal('parent.parent', 'this')); } } - return print(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); + return print(js::locate($this->createLink('story', 'view', "storyID=$storyID&version=0¶m=0&storyType=$storyType"), 'parent')); } $this->commonAction($storyID); @@ -1330,7 +1332,7 @@ class story extends control if($confirm == 'no') { - return print(js::confirm($this->lang->story->confirmDelete, $this->createLink('story', 'delete', "story=$storyID&confirm=yes&from=$from"), '')); + return print(js::confirm($this->lang->story->confirmDelete, $this->createLink('story', 'delete', "story=$storyID&confirm=yes&from=$from&storyType=$storyType"), '')); } else { @@ -1425,7 +1427,8 @@ class story extends control $module = $from == 'project' ? 'projectstory' : 'story'; if(defined('RUN_MODE') and RUN_MODE == 'api') return $this->send(array('status' => 'success', 'data' => $storyID)); - return print(js::locate($this->createLink($module, 'view', "storyID=$storyID"), 'parent')); + $params = $module == 'story' ? "storyID=$storyID&version=0¶m=0&storyType=$storyType" : "storyID=$storyID"; + return print(js::locate($this->createLink($module, 'view', $params), 'parent')); } /* Get story and product. */ @@ -1528,7 +1531,7 @@ class story extends control $action = $story->status == 'changing' ? 'recalledChange' : 'Recalled'; $this->loadModel('action')->create('story', $storyID, $action); - if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); + if($from == 'view') return print(js::locate($this->createLink('story', 'view', "storyID=$storyID&version=0¶m=0&storyType=$storyType"), 'parent')); $locateLink = $this->session->storyList ? $this->session->storyList : $this->createLink('product', 'browse', "productID={$story->product}"); return print(js::locate($locateLink, 'parent')); @@ -1557,7 +1560,7 @@ class story extends control } if(isonlybody()) return print(js::closeModal('parent.parent', 'this')); - return print(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); + return print(js::locate($this->createLink('story', 'view', "storyID=$storyID&version=0¶m=0&storyType=$storyType"), 'parent')); } /* Get story and product. */ @@ -1650,7 +1653,7 @@ class story extends control } else { - return print(js::locate(inlink('view', "storyID=$storyID"), 'parent')); + return print(js::locate(inlink('view', "storyID=$storyID&version=0¶m=0&storyType=$storyType"), 'parent')); } } @@ -2030,7 +2033,7 @@ class story extends control return print(js::closeModal('parent.parent', 'this', 'function(){parent.parent.$(\'[data-ride="searchList"]\').searchList();}')); } } - return print(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); + return print(js::locate($this->createLink('story', 'view', "storyID=$storyID&version=0¶m=0&storyType=$storyType"), 'parent')); } /* Get story and product. */ From 6e79a1c3d2863b10f96724d92bdc057a2d492797 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Wed, 24 Aug 2022 09:08:11 +0000 Subject: [PATCH 142/223] * picker: update logic in option disableEmptySearch --- www/js/zui/min.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 468856c075..127ff363b4 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-08-23 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-08-24 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -74,7 +74,7 @@ function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"= * Original idea by: * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ */ -function(t){function e(e){if("string"==typeof e.data){var i=e.handler,n=e.data.toLowerCase().split(" ");e.handler=function(e){if(this===e.target||!/textarea|select/i.test(e.target.nodeName)&&"text"!==e.target.type){var o="keypress"!==e.type&&t.hotkeys.specialKeys[e.which],a=String.fromCharCode(e.which).toLowerCase(),s="",r={};e.altKey&&"alt"!==o&&(s+="alt+"),e.ctrlKey&&"ctrl"!==o&&(s+="ctrl+"),e.metaKey&&!e.ctrlKey&&"meta"!==o&&(s+="meta+"),e.shiftKey&&"shift"!==o&&(s+="shift+"),o?r[s+o]=!0:(r[s+a]=!0,r[s+t.hotkeys.shiftNums[a]]=!0,"shift+"===s&&(r[t.hotkeys.shiftNums[a]]=!0));for(var l=0,c=n.length;l","/":"?","\\":"|"}},t.each(["keydown","keyup","keypress"],function(){t.event.special[this]={add:e}})}(jQuery),function(t,e,i){"use strict";var n="zui.picker",o={},a={lang:null,remote:null,remoteConverter:null,remoteOnly:!1,onRemoteError:null,disableEmptySearch:!1,textKey:"text",valueKey:"value",keysKey:"keys",multi:"auto",formItem:"auto",list:null,allowSingleDeselect:null,autoSelectFirst:!1,maxSelectedCount:0,maxListCount:100,hideEmptyTextOption:!0,searchValueKey:!0,emptyResultHint:null,hideOnScroll:!0,inheritFormItemClasses:!1,emptySearchResultHint:null,accurateSearchHint:null,remoteErrorHint:null,deleteByBackspace:!0,disableScrollOnShow:!0,maxDropHeight:250,dropDirection:"auto",dropWidth:"100%",maxAutoDropWidth:450,minAutoDropWidth:100,multiValueSplitter:",",multiSelectActions:5,searchDelay:200,autoClearDrop:6e4,fixLabelFor:!0,hotkey:!0,onSelect:null,onDeselect:null,onBeforeChange:null,onChange:null,onReady:null,onNoResults:null,onShowingDrop:null,onHidingDrop:null,onShowedDrop:null,onHiddenDrop:null,valueMustInList:!0},s={zh_cn:{emptyResultHint:"没有可选项",emptySearchResultHint:"没有找到 “{0}”",accurateSearchHint:"请提供更多关键词缩小匹配范围",remoteErrorHint:"无法从服务器获取结果 - {0}",selectAll:"全选",deselectAll:"取消选择"},zh_tw:{emptyResultHint:"沒有可選項",emptySearchResultHint:"沒有找到 “{0}”",accurateSearchHint:"請提供更多關鍵詞縮小匹配範圍",remoteErrorHint:"無法從服務器獲取結果 - {0}",selectAll:"全選",deselectAll:"取消選擇"},en:{emptyResultHint:"No options",emptySearchResultHint:'Cannot found "{0}"',accurateSearchHint:"Suggest to provide more keywords",remoteErrorHint:"Unable to get result from server: {0}",selectAll:"Select all",deselectAll:"Deselect all"}},r=function(o,a){var l=this;l.name=n,l.$=t(o),l.id="pk_"+(l.$.attr("id")||t.zui.uuid()),a=l.options=t.extend({},r.DEFAULTS,this.$.data(),a),void 0!==a.hideOnWindowScroll&&(a.hideOnScroll=a.hideOnWindowScroll);var c=t.zui.clientLang?t.zui.clientLang():"en",h=a.lang||c;l.lang=t.zui.getLangData?t.zui.getLangData(n,h,s):s[h]||s[c];var d,u,p=a.formItem,f='.form-item,input[type="hidden"],select,input[type="text"]';if(d="self"===p?l.$:"auto"!==p&&p?l.$.find(p):l.$.is(f)?l.$:l.$.find(f).first(),!d.length)return console.error&&console.error("Cannot found form item for picker.");if(d.is('input[type="hidden"]'))u="hidden";else if(d.is("select"))u="select";else{if(!d.is('input[type="text"]'))return console.error&&console.error("Unknown form type for picker.");u="text"}a.inheritFormItemClasses&&v.addClass(d.attr("class")),l.formType=u,l.$formItem=d.removeClass("picker").hide(),l.selfFormItem=d.is(l.$);var g=a.multi;g&&"auto"!==g||(g="select"===u&&"multiple"===d.attr("multiple")),g=!!g,l.multi=g,g||(l.options.checkable=!1);var m=a.list;m?l.setList("function"==typeof m?m({search:l.search,limit:a.maxListCount}):m,!0):"select"===u?l.updateFromSelect():l.setList([],!0);var v;v=!l.selfFormItem&&l.$.hasClass("picker")?l.$:t('
    ').insertAfter(l.$),v.addClass("picker").toggleClass("picker-multi",g).toggleClass("picker-single",!g);var y=v.children(".picker-selections");y.length?y.empty():y=t('
    ');var b=l.id+"-search",w=t('').appendTo(y);if(!g){var x=t('
    ');a.allowSingleDeselect&&x.append(''),x.appendTo(y),l.$singleSelection=x}v.toggleClass("picker-input-empty",!w.val().length).append(y),l.$container=v,l.$selections=y,l.$search=w,l.search="";var C=a.placeholder;if(void 0===C&&(C=d.attr("placeholder")),"string"==typeof C&&C.length&&y.append(t('
    ').text(C)),a.placeholder=C,a.fixLabelFor){var _=d.attr("id");_&&t('label[for="'+_+'"]').attr("for",b)}var k=void 0!==a.defaultValue?a.defaultValue:d.val();if(null===k&&(k=""),l.setValue(k,!0),l.setDisabled(),w.on("focus",function(){l.disabled||(l._blurTimer&&(clearTimeout(l._blurTimer),l._blurTimer=0),v.addClass("picker-focus"),l.showDropList())}).on("blur",function(){l.disabled||(l._blurTimer&&clearTimeout(l._blurTimer),l._blurTimer=setTimeout(function(){l._blurTimer=0,w.is(":focus")||v.removeClass("picker-focus")},100))}).on("input change",function(){if(!l.disabled){var t=w.val();g&&w.width(14*t.length),v.toggleClass("picker-input-empty",!t.length),l.tryUpdateList(t),a.disableEmptySearch&&!l.dropListShowed&&t&&l.showDropList(),a.disableEmptySearch&&!t&&l.dropListShowed&&l.hideDropList()}}),a.hotkey&&w.on("keydown",function(t){if(!l.disabled){var e=t.key||t.which;if(l.dropListShowed){var i=l.activeValue,n="string"==typeof i;if("Enter"===e||13===e)n&&(l.select(i,g),g?(l.$search.val(""),l.tryUpdateList("")):w.blur(),t.preventDefault(),t.stopPropagation());else if("ArrowDown"===e||40===e){var o,s=l.$activeOption;if(s&&(o=s.next(".picker-option"),g))for(;o.length&&o.hasClass("picker-option-selected");)o=o.next(".picker-option");o&&o.length||(o=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").first()),o.length&&l.activeOption(o),t.preventDefault(),t.stopPropagation()}else if("ArrowUp"===e||30===e){var r,s=l.$activeOption;if(s&&(r=s.prev(".picker-option"),g))for(;r.length&&r.hasClass("picker-option-selected");)r=r.prev(".picker-option");r&&r.length||(r=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").last()),r.length&&l.activeOption(r),t.preventDefault(),t.stopPropagation()}else"Escape"===e||27===e?l.hideDropList(!0):a.deleteByBackspace&&g&&("Backspace"===e||8===e)&&l.value&&l.value.length&&!w.val().length&&l.deselect(l.value[l.value.length-1])}}}),g){y.on("mousedown",function(t){if(!l.disabled)return l.dropListShowed&&!a.checkable?(t.preventDefault(),void t.stopPropagation()):void 0}).on("mouseup",function(e){l.disabled||y.hasClass("sortable-sorting")||t(e.target).closest(".picker-selection-remove").length||l.dropListShowed&&!a.checkable||l.focus()});var T=a.sortValuesByDnd;if(T&&t.fn.sortable){v.addClass("picker-sortable");var S={selector:".picker-selection",stopPropagation:!0,start:function(){l.hideDropList(!0)},finish:function(e){var i=[];t.each(e.list,function(t,e){i.push(e.item.data("value"))}),l.setValue(i.slice(),!1,!0)}};"object"==typeof T&&t.extend(S,T),y.sortable(S)}}if(y.on("click",".picker-selection-remove",function(e){if(!l.disabled){if(l.multi){var i=t(this).closest(".picker-selection");l.deselect(i.data("value"))}else l.deselect();e.stopPropagation()}}),d.on("chosen:updated",function(){l.updateFromSelect(!1),l.setValue(d.val(),!0),l.setDisabled(),l.updateList()}).on("chosen:activate",l.focus).on("chosen:open",l.showDropList).on("chosen:close",l.hideDropList),v.addClass("picker-ready"),t.zui.asap(function(){l.triggerEvent("ready",{picker:l},"","chosen:ready")}),!a.disableScrollOnShow){var D=a.hideOnScroll;D&&![e,i,!0].includes(D)&&t(D).on("scroll",this.handleParentScroll.bind(this))}};r.prototype.destroy=function(){var e=this,i=e.options;e.hideDropList(!0);var o=e.$search;o.off("focus blur input change"),i.hotkey&&o.off("keydown"),o.remove();var a=e.$selections;a.off("click"),e.multi&&a.off("mousedown mouseup"),a.remove();var s=e.$formItem;e.selectOptionsBackup&&(s.empty(),t.each(e.selectOptionsBackup,function(e,n){var o={value:n[i.valueKey]},a=n[i.keysKey];void 0!==a&&(o["data-"+i.keysKey]=a),s.append(t("
    ");i.$.addClass("load-indicator loading"),s.load(window.location.href+" #"+o,function(r){if(a===o)i.$.empty().html(s.children().html()),i.$.find('[data-ride="pager"]').pager();else{i.$.find("#"+o).empty().html(s.children().html());try{var l=t(r),c=l.find("#"+o).closest('[data-ride="table"],#'+a);if(c.length){var h=c.find(".table-statistic");h.length&&(i.defaultStatistic=h.html());var d=i.$.find('[data-ride="pager"]').data("zui.pager"),u=c.find('[data-ride="pager"]');d&&u.length&&d.set(u.data())}}catch(p){console.error(p)}}i.$.removeClass("load-indicator loading").trigger("beforeTableReload"),delete i.defaultStatistic,i.updateStatistic(),i.initModals(),i.$.datepickerAll();var f=i.$.find("tbody>tr"),g=!1;t.each(i.checkItems,function(t,e){e&&(i.checkRow(f.filter('[data-id="'+t+'"]'),!0,!0),g=!0)}),g&&i.updateCheckUI(),n.nested&&i.initNestedList(),i.$.trigger("tableReload");var m=t("#mainMenu>.btn-toolbar>.btn-active-text>.label");if(m.length){var u=i.$.find(".pager[data-rec-total]"),v=u.length?u.attr("data-rec-total"):i.getTable().find("tbody:first>tr:not(.table-children)").length;m.text(v)}e&&e(),n.afterReload&&n.afterReload()})},r.prototype.initModals=function(){var e=this,i=e.options,n=e.$.find(i.iframeModalTrigger);if(n.length){var o={type:"iframe",onHide:i.replaceId?function(){var n=t.cookie("selfClose");(1==n||i.hot)&&(t("#triggerModal").data("cancel-reload",1),e.reload(function(){t.cookie("selfClose",0)}))}:null};n.modalTrigger(o)}},r.prototype.getTable=function(){var t=this.$;if(this.isDataTable)return t.find("div.datatable");var e=t.is("table")?t:t.find("table:not(.fixed-header-copy)").first();return e.is(".datatable")&&(this.isDataTable=!0,e.data("zui.datatable")||window.initDatatable(e),e=t.find("div.datatable")),e},r.prototype.toggleGroups=function(e){var i=this,n={};i.$.find("tbody>tr").each(function(){var o=t(this).closest("tr").data("id");n[o]||i.toggleRowGroup(o,e)})},r.prototype.toggleRowGroup=function(i,n){var o=this.$.find('tbody>tr[data-id="'+i+'"]'),a=o.filter(".group-summary"),s=n===e?!a.hasClass("hidden"):!!n;o.not(".group-summary").toggleClass("hidden",!s),a.toggleClass("hidden",s),t("body").toggleClass("table-group-collapsed",!this.$.find("tbody>tr.group-summary.hidden").length)},r.prototype.updateStatistic=function(){var i=this,n=i.$.find(".table-statistic");if(n.length){if(i.defaultStatistic===e&&(i.defaultStatistic=n.html()),i.options.statisticCreator)return void n.html(i.options.statisticCreator(i)||i.defaultStatistic);var o=i.statisticCols;if(!o&&o!==!1){o={};var a=!1;i.getTable().find("thead th").each(function(e){var i=t(this),n=i.data("statistic");n&&(a=!0,o[e]={format:n,name:i.text()})}),i.statisticCols=!!a&&o}var s=0;o&&t.each(o,function(t){o[t].total=0,o[t].checkedTotal=0}),i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr").each(function(){var e=t(this),i=e.hasClass("checked"),n=e.children("td");i&&s++,o&&t.each(o,function(t){var e=parseFloat(n.eq(t).text());isNaN(e)&&(e=0),o[t].total+=e,i&&(o[t].checkedTotal+=e)})});var r=[];if(s)r.push(i.lang.selectedItems.format(s));else if(i.defaultStatistic)return void n.html(i.defaultStatistic);o&&t.each(o,function(t){var e=o[t],n=e[s?"checkedTotal":"total"];e.format&&(n=e.format.format(n)),r.push(i.lang.attrTotal.format(e.name,n))}),n.html(r.join(", "))}},r.prototype.updateFixUI=function(e){var i=this,n=(new Date).getTime();if(!e&&(i.lastUpdateCall&&clearTimeout(i.lastUpdateCall),!i.lastUpdateTime||n-i.lastUpdateTime
    ').append(t('
    closedReason, "class=form-control onchange=setDuplicateAndChild(this.value,$storyID) style='min-width: 70px'");?> ' closedReason != 'duplicate') echo "style='display: none'";?>> - idAB}'");?> + ' closedReason != 'duplicate') echo "style='display: none'";?>> + product][$story->branch], $story->duplicateStory, "class='form-control' placeholder='{$lang->idAB}'");?> ' closedReason != 'subdivided') echo "style='display: none'";?>> idAB}'");?> diff --git a/module/story/view/close.html.php b/module/story/view/close.html.php index f27d1c9d12..307352a5ba 100644 --- a/module/story/view/close.html.php +++ b/module/story/view/close.html.php @@ -30,7 +30,7 @@
    - story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?> save, "id='saveButton'", 'btn btn-primary btn-wide');?> + story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?>
    ').addClass(i.attr("class")).append(n.clone())).insertAfter(i)),h){var d=c[0].getBoundingClientRect();l.css({left:d.left,width:c.width(),overflow:"hidden"}),l.find(".fixed-header-copy").css({left:o.left-d.left,position:"relative",minWidth:i.width()}),a||c.data("fixHeaderScroll")||(c.data("fixHeaderScroll",1),i.width()>c.width()&&c.on("scroll",function(){e.fixHeader()}))}else l.css({left:o.left,width:o.width});var u=l.find("th");n.find("th").each(function(e){u.eq(e).css("width",t(this).outerWidth())})}else l.remove()},r.prototype.fixFooter=function(){var e,i=this,n=i.getTable(),o=i.$.find(".table-footer");if(i.isDataTable)e=n[0].getBoundingClientRect();else{var a=n.find("tbody");if(!a.length)return;e=a[0].getBoundingClientRect()}var s=i.options.fixFooter;o.toggleClass("fixed-footer",!!r);var r="function"==typeof s?s(e,o):e.bottom>window.innerHeight-50-("number"==typeof s?s:i.pageFooterHeight||5);o.toggleClass("fixed-footer",!!r),n.toggleClass("with-footer-fixed",!!r),n.trigger("fixFooter",r);var l=t("body"),c=l.hasClass("body-modal");if(r){var h=n.parent(),d=h.is(".table-responsive");o.css({bottom:i.pageFooterHeight||0,left:d?h[0].getBoundingClientRect().left:e.left,width:d?h.width():e.width}),c&&l.css("padding-bottom",40)}else o.css({width:"",left:0,bottom:0}),c&&l.css("padding-bottom",0)},r.prototype.checkAll=function(e){var i=this,n=i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr");n.each(function(){i.checkRow(t(this),e,!0)}),i.updateCheckUI()},r.prototype.checkRow=function(i,n,o){var a=this,s=a.getTable();a.isDataTable&&!i.is(".datatable-row-left")&&(i=s.find('.datatable-row-left[data-index="'+i.data("index")+'"]'));var r=i.find('input[type="checkbox"]');if(r.length&&!r.is(":disabled")){n===e&&(n=!r.is(":checked")),a.isDataTable?s.find('.datatable-row[data-index="'+i.data("index")+'"]').toggleClass("checked",n):i.toggleClass("checked",n);var l=i.data("id");this.checkItems[l]=n,r.prop("checked",n).trigger("change"),o||(i.hasClass("table-parent")&&s.find((a.isDataTable?".fixed-left ":"")+"tbody>tr.parent-"+l).each(function(){a.checkRow(t(this),n,!0)}),a.updateCheckUI())}},r.prototype.updateCheckUI=function(){var e=this,i=e.getTable(),n=i.find(e.isDataTable?".fixed-left tbody>tr":"tbody>tr").not(".group-summary"),o=!1,a=null,s=0,r=!1,l=n.length;n.each(function(n){var c=t(this),h=c.find('input[type="checkbox"]');if(!h.length)return void l--;r=h.is(":checked");var d=e.isDataTable?i.find('.datatable-row[data-index="'+c.data("index")+'"]'):c;d.toggleClass("checked",r),d.toggleClass("row-check-begin",r&&!o),a&&a.toggleClass("row-check-end",!r&&o),r&&(s+=1),a=d,o=r,l===n+1&&d.toggleClass("row-check-end",r)}),e.$.toggleClass("has-row-checked",s>0).find(".check-all").toggleClass("checked",!(!l||s!==l)),e.updateStatistic(),e.options.onCheckChange&&e.options.onCheckChange(),i.trigger("checkChange")},r.DEFAULTS={checkable:!0,checkOnClickRow:!0,ajaxForm:!1,selectable:!0,fixHeader:!a,fixFooter:!a,iframeWidth:900,replaceId:"self",nestLevelIndent:18,nested:!1, -preserveNested:!0,hot:!1,iframeModalTrigger:".iframe:not(.disabled,[disabled])"},t.fn.table=function(e){return this.each(function(){var n=t(this),o=n.data(i),a="object"==typeof e&&e;o||n.data(i,o=new r(this,a)),"string"==typeof e&&o[e]()})},r.NAME=i,t.fn.table.Constructor=r,t(function(){t('[data-ride="table"]').table()})}(jQuery,void 0),function(t,e,i){t.fn._ajaxForm=t.fn.ajaxForm;var n={timeout:e.config?e.config.timeout:0,dataType:"json",method:"post"},o="";t.fn.enableForm=function(e,n,o){return e===i&&(e=!0),this.each(function(){var i=t(this);n||i.find('[type="submit"]').attr("disabled",e?null:"disabled"),!o&&i.hasClass("load-indicator")&&i.toggleClass("loading",!e),i.toggleClass("form-disabled",!e)})},t.enableForm=function(e,i,n,o){"string"==typeof e||e instanceof t?e=t(e):(o=n,n=i,i=e,e=t("form")),e.enableForm(i!==!1,n,o)},t.disableForm=function(e,i,n){t.enableForm(e,!1,i,n)};var a=function(e,i,n){i=i||"show",t.zui.messager?(n?n.html=!0:n={html:!0},e=e.toString().replace(/\n/g,"
    "),t.zui.messager[i](e,n)):alert(e)};t.ajaxForm=function(s,r){var l=t(s);if(l.length>1)return l.each(function(){t.ajaxForm(this,r)});"function"==typeof r&&(r={complete:r}),r=t.extend({},n,l.data(),r);var c=r.beforeSubmit,h=r.error,d=r.success,u=r.finish;delete r.finish,delete r.success,delete r.onError,delete r.beforeSubmit,r=t.extend({beforeSubmit:function(n,a,s){if((c&&c(n,a,s))===!1)return!1;l.removeClass("form-watched").enableForm(!1);var r={},h=a.find('[type="file"]');r.fileapi=h.length&&h[0].files!==i,r.formdata=e.FormData!==i;var d=r.fileapi&&a.find('input[type="file"]:enabled').filter(function(){return""!==t(this).val()}),u=d.length,p="multipart/form-data",f=a.attr("enctype")==p||a.attr("encoding")==p,g=r.fileapi&&r.formdata,m=u&&!g||f&&!r.formdata;m&&(""==o&&(o=s.url),s.url!=o&&(s.url=o),s.url=s.url.indexOf("&")>=0?s.url+"&HTTP_X_REQUESTED_WITH=XMLHttpRequest":s.url+"?HTTP_X_REQUESTED_WITH=XMLHttpRequest")},success:function(i,n,o){if((d&&d(i,n,o,l))!==!1){try{"string"==typeof i&&(i=JSON.parse(i))}catch(s){}if(null===i||"object"!=typeof i)return i?alert(i):a("No response.","danger");var c=r.responser?t(r.responser):l.find(".form-responser");c.length||(c=t("#responser"));var h=i.message,p=function(){var n=i.callback;if(n)if("object"==typeof n){var o=n.target?e[n.target]:e,a=o[n.name];a.apply(l,Array.isArray(n.params)?n.params:[n.params])}else{var s=n.indexOf("("),r=(s>0?n.substr(0,s):n).split("."),c=e,h=r[0];r.length>1&&(h=r[1],"top"===r[0]?c=e.top:"parent"===r[0]&&(c=e.parent));var a=c[h];if("function"==typeof a){var d=[];return s>0&&")"==n[n.length-1]&&(d=t.parseJSON("["+n.substring(s+1,n.length-1)+"]")),d.push(i),a.apply(l,d)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,"number"==typeof g?g:r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.apps?t.apps.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
    ').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x&&!o.data("datetimepicker")){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),x=!0}}),C.length&&a(C.join(""),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
    ').append(s)),i.$menu.append(s),i.$menu.removeClass("loading"),i.isLoaded=!0,e&&e(!0)},error:function(){i.$menu.removeClass("loading").append('
    '+(n.errorText||window.lang&&window.lang.timeout)+"
    "),e&&e(!1)}},n.ajax))},n.prototype.scrollTo=function(t){t.length&&t[0].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({behavior:"smooth"})},n.prototype.getItems=function(){return this.$.find(this.options.selector).addClass("search-list-item")},n.prototype.getActiveItem=function(){return this.getItems().filter(".active:first")},n.prototype.search=function(e){var n=this,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[i]()})},n.NAME=e,t.fn.searchList.Constructor=n,t(function(){t('[data-ride="searchList"]').searchList()})}(jQuery),function(t){"use strict";var e="zui.labelSelector",i=function(n,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.update()};i.prototype.select=function(t){t+="",this.$wrapper.find(".label.active").removeClass("active"),this.$wrapper.find('.label[data-value="'+t+'"]').addClass("active"),this.$.val(t).trigger("change")},i.prototype.update=function(){var e=this,i=e.options,n=e.$wrapper;if(!n){if(i.wrapper)n=t(i.wrapper);else{var o=e.$.next();n=o.hasClass(".label-selector")?o:t('
    ')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=(""===o.value||"0"===o.value)&&!o.label,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=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.labelSelector.Constructor=i,t(function(){t('[data-provide="labelSelector"]').labelSelector()})}(jQuery),function(t){"use strict";var e="zui.fileInput",i=t.BYTE_UNITS={B:1,KB:1024,MB:1048576,GB:1073741824,TB:1099511627776},n=t.formatBytes=function(t,e,n){return void 0===e&&(e=2),n||(n=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.find(".file-input").detach(),n.add()};r.prototype.add=function(){var t=this,e=t.options,i=t.$template.clone();"before"===e.appendWay?t.$.prepend(i):t.$.append(i),i.fileInput({fileMaxSize:e.eachFileMaxSize,fileSizeError:e.fileSizeError,onDelete:function(e){e.$.remove(),t.options.onDelete&&t.options.onDelete(e,t)},onSelect:function(e,i){t.add(),t.options.onSelect&&t.options.onSelect(e,i,t)}})},r.DEFAULTS={fileMaxSize:0,eachFileMaxSize:0,appendWay:"after",fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInputList=function(e){return this.each(function(){var i=t(this),n=i.data(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(r.begin).format("hh:mm");l.find('option[value="'+d+'"]').length&&l.val(d),r.onChange&&r.onChange(l,d)}if(r.end){var u=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(null,!0),t(document).on("keydown",function(e){e.ctrlKey&&71===e.keyCode&&(t("#searchInput").val("").focus(),e.stopPropagation(),e.preventDefault())})}),t.removeAnchor=window.removeAnchor=function(t){var e=t.lastIndexOf("#");return e>-1?t.substr(0,e):t},t.refreshPage=function(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.extend(t.zui.Picker.DEFAULTS,{optionRender:function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
    ').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},checkable:!0,maxListCount:500,disableScrollOnShow:!1}),t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!0,drop_direction:function(){var e=t(this.container).closest(".table-responsive:not(.scroll-none)");if(e.length){if(this.drop_directionFixed)return this.drop_directionFixed;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
    {page}/{totalPage}
    ',"next_icon","last_icon"],onPageChange:function(e,i){e.recPerPage!==i.recPerPage&&t.cookie(this.options.pageCookie,e.recPerPage,{expires:config.cookieLife,path:config.webRoot}),e.recPerPage!==i.recPerPage&&(window.location.href=this.createLink())}}),t.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),t.fn.reverseOrder=function(){return this.each(function(){var e=t(this);e.prependTo(e.parent())})};var r=function(e,i){var n=t(e);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).on("click",".btn-expand",function(){t(this).closest("li").toggleClass("show-changes")}).on("click",".btn-strip",function(){var e=t(this),n=e.find(".icon"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.find(".btn-strip").attr("title",i.original);var r=n.find(".modal-comment").modal({show:!1}).on("shown.zui.modal",function(){var t=r.find("#comment");t.length&&(t.focus(),window.editor&&window.editor.comment&&window.editor.comment.focus())}).on("show.zui.modal",function(){var e=r.find("#comment");e.length&&!e.data("keditor")&&t.fn.kindeditor&&e.kindeditor()});n.on("click",".btn-comment",function(t){r.modal("toggle"),t.preventDefault()}).on("click",".btn-edit-comment,.btn-hide-form",function(){t(this).closest("li").toggleClass("show-form")});var l=n.find(".comment-edit-form");l.ajaxForm({success:function(t,e,i,n){setTimeout(function(){l.closest("li").removeClass("show-form")},2e3)}})}};t.fn.histories=function(t){return this.each(function(){r(this,t)})},t(function(){t(".histories").histories()});var l=0,c=0;t.toggleSidebar=function(e){var i=t("#sidebar");if(i.length){var n=t("main");if(void 0===e)e=n.hasClass("hide-sidebar");else if(e&&!n.hasClass("hide-sidebar"))return;n.toggleClass("hide-sidebar",!e),clearTimeout(l),t.zui.store.set(c,e);var o=i.children(".cell"),a={overflow:"visible",maxHeight:"initial"};e?(i.addClass("showing"),l=setTimeout(function(){i.removeClass("showing"),i.trigger("sidebar.toggle",e)},210)):(i.trigger("sidebar.toggle",e),t(window).width()<1900&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr input[type="checkbox"]:checked');i.each(function(){var i=parseInt(t(this).val(),10);NaN!==i&&e.push(i)}),t.cookie("checkedItem",e.join(","),{expires:config.cookieLife,path:config.webRoot})},t.extend(t.fn.modal.bs.Constructor.DEFAULTS,{scrollInside:!0,backdrop:"static",headerHeight:100}),t.extend(t.zui.ModalTrigger.DEFAULTS,{scrollInside:!0,backdrop:"static"}),t.fn.initIframeModal=function(){return this.each(function(){var e=t(this);if(!e.is("[disabled],.disabled")&&!e.parents('[data-ride="table"],.skip-iframe-modal').length){var i={type:"iframe"};e.hasClass("export")&&t.extend(i,{width:800,shown:setCheckedCookie},e.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()}),t.fixedTableHead=window.fixedTableHead=function(e,i){var n=t(e);if(n.is("table")||(n=n.find("table")),n.length){var o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
    ").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var d,u,p,f,g,m=function(){d||(d=t("#subNavbar"),u=t("#pageNav"),p=t("#pageActions"),f=d.children(".nav"),g=f.outerWidth());var e=d.outerWidth(),i=u.outerWidth()||0,n=p.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void f.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,g),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),x()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto"); +function(t){function e(e){if("string"==typeof e.data){var i=e.handler,n=e.data.toLowerCase().split(" ");e.handler=function(e){if(this===e.target||!/textarea|select/i.test(e.target.nodeName)&&"text"!==e.target.type){var o="keypress"!==e.type&&t.hotkeys.specialKeys[e.which],a=String.fromCharCode(e.which).toLowerCase(),s="",r={};e.altKey&&"alt"!==o&&(s+="alt+"),e.ctrlKey&&"ctrl"!==o&&(s+="ctrl+"),e.metaKey&&!e.ctrlKey&&"meta"!==o&&(s+="meta+"),e.shiftKey&&"shift"!==o&&(s+="shift+"),o?r[s+o]=!0:(r[s+a]=!0,r[s+t.hotkeys.shiftNums[a]]=!0,"shift+"===s&&(r[t.hotkeys.shiftNums[a]]=!0));for(var l=0,c=n.length;l","/":"?","\\":"|"}},t.each(["keydown","keyup","keypress"],function(){t.event.special[this]={add:e}})}(jQuery),function(t,e,i){"use strict";var n="zui.picker",o={},a={lang:null,remote:null,remoteConverter:null,remoteOnly:!1,onRemoteError:null,disableEmptySearch:!1,textKey:"text",valueKey:"value",keysKey:"keys",multi:"auto",formItem:"auto",list:null,allowSingleDeselect:null,autoSelectFirst:!1,maxSelectedCount:0,maxListCount:100,hideEmptyTextOption:!0,searchValueKey:!0,emptyResultHint:null,hideOnScroll:!0,inheritFormItemClasses:!1,emptySearchResultHint:null,accurateSearchHint:null,remoteErrorHint:null,deleteByBackspace:!0,disableScrollOnShow:!0,maxDropHeight:250,dropDirection:"auto",dropWidth:"100%",maxAutoDropWidth:450,minAutoDropWidth:100,multiValueSplitter:",",multiSelectActions:5,searchDelay:200,autoClearDrop:6e4,fixLabelFor:!0,hotkey:!0,onSelect:null,onDeselect:null,onBeforeChange:null,onChange:null,onReady:null,onNoResults:null,onShowingDrop:null,onHidingDrop:null,onShowedDrop:null,onHiddenDrop:null,valueMustInList:!0},s={zh_cn:{emptyResultHint:"没有可选项",emptySearchResultHint:"没有找到 “{0}”",accurateSearchHint:"请提供更多关键词缩小匹配范围",remoteErrorHint:"无法从服务器获取结果 - {0}",selectAll:"全选",deselectAll:"取消选择"},zh_tw:{emptyResultHint:"沒有可選項",emptySearchResultHint:"沒有找到 “{0}”",accurateSearchHint:"請提供更多關鍵詞縮小匹配範圍",remoteErrorHint:"無法從服務器獲取結果 - {0}",selectAll:"全選",deselectAll:"取消選擇"},en:{emptyResultHint:"No options",emptySearchResultHint:'Cannot found "{0}"',accurateSearchHint:"Suggest to provide more keywords",remoteErrorHint:"Unable to get result from server: {0}",selectAll:"Select all",deselectAll:"Deselect all"}},r=function(o,a){var l=this;l.name=n,l.$=t(o),l.id="pk_"+(l.$.attr("id")||t.zui.uuid()),a=l.options=t.extend({},r.DEFAULTS,this.$.data(),a),void 0!==a.hideOnWindowScroll&&(a.hideOnScroll=a.hideOnWindowScroll);var c=t.zui.clientLang?t.zui.clientLang():"en",h=a.lang||c;l.lang=t.zui.getLangData?t.zui.getLangData(n,h,s):s[h]||s[c];var d,u,p=a.formItem,f='.form-item,input[type="hidden"],select,input[type="text"]';if(d="self"===p?l.$:"auto"!==p&&p?l.$.find(p):l.$.is(f)?l.$:l.$.find(f).first(),!d.length)return console.error&&console.error("Cannot found form item for picker.");if(d.is('input[type="hidden"]'))u="hidden";else if(d.is("select"))u="select";else{if(!d.is('input[type="text"]'))return console.error&&console.error("Unknown form type for picker.");u="text"}a.inheritFormItemClasses&&v.addClass(d.attr("class")),l.formType=u,l.$formItem=d.removeClass("picker").hide(),l.selfFormItem=d.is(l.$);var g=a.multi;g&&"auto"!==g||(g="select"===u&&"multiple"===d.attr("multiple")),g=!!g,l.multi=g,g||(l.options.checkable=!1);var m=a.list;m?l.setList("function"==typeof m?m({search:l.search,limit:a.maxListCount}):m,!0):"select"===u?l.updateFromSelect():l.setList([],!0);var v;v=!l.selfFormItem&&l.$.hasClass("picker")?l.$:t('
    ').insertAfter(l.$),v.addClass("picker").toggleClass("picker-multi",g).toggleClass("picker-single",!g);var y=v.children(".picker-selections");y.length?y.empty():y=t('
    ');var b=l.id+"-search",w=t('').appendTo(y);if(!g){var x=t('
    ');a.allowSingleDeselect&&x.append(''),x.appendTo(y),l.$singleSelection=x}v.toggleClass("picker-input-empty",!w.val().length).append(y),l.$container=v,l.$selections=y,l.$search=w,l.search="";var C=a.placeholder;if(void 0===C&&(C=d.attr("placeholder")),"string"==typeof C&&C.length&&y.append(t('
    ').text(C)),a.placeholder=C,a.fixLabelFor){var _=d.attr("id");_&&t('label[for="'+_+'"]').attr("for",b)}var k=void 0!==a.defaultValue?a.defaultValue:d.val();if(null===k&&(k=""),l.setValue(k,!0),l.setDisabled(),w.on("focus",function(){l.disabled||(l._blurTimer&&(clearTimeout(l._blurTimer),l._blurTimer=0),v.addClass("picker-focus"),l.options.disableEmptySearch&&"string"==typeof l.search&&!l.search.length||l.showDropList())}).on("blur",function(){l.disabled||(l._blurTimer&&clearTimeout(l._blurTimer),l._blurTimer=setTimeout(function(){l._blurTimer=0,w.is(":focus")||v.removeClass("picker-focus")},100))}).on("input change",function(){if(!l.disabled){var t=w.val();if(g&&w.width(14*t.length),v.toggleClass("picker-input-empty",!t.length),l.tryUpdateList(t),a.disableEmptySearch){const e="string"!=typeof t||t.length;!l.dropListShowed&&e?l.showDropList():l.dropListShowed&&!e&&l.hideDropList()}}}),a.hotkey&&w.on("keydown",function(t){if(!l.disabled){var e=t.key||t.which;if(l.dropListShowed){var i=l.activeValue,n="string"==typeof i;if("Enter"===e||13===e)n&&(l.select(i,g),g?(l.$search.val(""),l.tryUpdateList("")):w.blur(),t.preventDefault(),t.stopPropagation());else if("ArrowDown"===e||40===e){var o,s=l.$activeOption;if(s&&(o=s.next(".picker-option"),g))for(;o.length&&o.hasClass("picker-option-selected");)o=o.next(".picker-option");o&&o.length||(o=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").first()),o.length&&l.activeOption(o),t.preventDefault(),t.stopPropagation()}else if("ArrowUp"===e||30===e){var r,s=l.$activeOption;if(s&&(r=s.prev(".picker-option"),g))for(;r.length&&r.hasClass("picker-option-selected");)r=r.prev(".picker-option");r&&r.length||(r=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").last()),r.length&&l.activeOption(r),t.preventDefault(),t.stopPropagation()}else"Escape"===e||27===e?l.hideDropList(!0):a.deleteByBackspace&&g&&("Backspace"===e||8===e)&&l.value&&l.value.length&&!w.val().length&&l.deselect(l.value[l.value.length-1])}}}),g){y.on("mousedown",function(t){if(!l.disabled)return l.dropListShowed&&!a.checkable?(t.preventDefault(),void t.stopPropagation()):void 0}).on("mouseup",function(e){l.disabled||y.hasClass("sortable-sorting")||t(e.target).closest(".picker-selection-remove").length||l.dropListShowed&&!a.checkable||l.focus()});var T=a.sortValuesByDnd;if(T&&t.fn.sortable){v.addClass("picker-sortable");var S={selector:".picker-selection",stopPropagation:!0,start:function(){l.hideDropList(!0)},finish:function(e){var i=[];t.each(e.list,function(t,e){i.push(e.item.data("value"))}),l.setValue(i.slice(),!1,!0)}};"object"==typeof T&&t.extend(S,T),y.sortable(S)}}if(y.on("click",".picker-selection-remove",function(e){if(!l.disabled){if(l.multi){var i=t(this).closest(".picker-selection");l.deselect(i.data("value"))}else l.deselect();e.stopPropagation()}}),d.on("chosen:updated",function(){l.updateFromSelect(!1),l.setValue(d.val(),!0),l.setDisabled(),l.updateList()}).on("chosen:activate",l.focus).on("chosen:open",l.showDropList).on("chosen:close",l.hideDropList),v.addClass("picker-ready"),t.zui.asap(function(){l.triggerEvent("ready",{picker:l},"","chosen:ready")}),!a.disableScrollOnShow){var D=a.hideOnScroll;D&&![e,i,!0].includes(D)&&t(D).on("scroll",this.handleParentScroll.bind(this))}};r.prototype.destroy=function(){var e=this,i=e.options;e.hideDropList(!0);var o=e.$search;o.off("focus blur input change"),i.hotkey&&o.off("keydown"),o.remove();var a=e.$selections;a.off("click"),e.multi&&a.off("mousedown mouseup"),a.remove();var s=e.$formItem;e.selectOptionsBackup&&(s.empty(),t.each(e.selectOptionsBackup,function(e,n){var o={value:n[i.valueKey]},a=n[i.keysKey];void 0!==a&&(o["data-"+i.keysKey]=a),s.append(t("
    ");i.$.addClass("load-indicator loading"),s.load(window.location.href+" #"+o,function(r){if(a===o)i.$.empty().html(s.children().html()),i.$.find('[data-ride="pager"]').pager();else{i.$.find("#"+o).empty().html(s.children().html());try{var l=t(r),c=l.find("#"+o).closest('[data-ride="table"],#'+a);if(c.length){var h=c.find(".table-statistic");h.length&&(i.defaultStatistic=h.html());var d=i.$.find('[data-ride="pager"]').data("zui.pager"),u=c.find('[data-ride="pager"]');d&&u.length&&d.set(u.data())}}catch(p){console.error(p)}}i.$.removeClass("load-indicator loading").trigger("beforeTableReload"),delete i.defaultStatistic,i.updateStatistic(),i.initModals(),i.$.datepickerAll();var f=i.$.find("tbody>tr"),g=!1;t.each(i.checkItems,function(t,e){e&&(i.checkRow(f.filter('[data-id="'+t+'"]'),!0,!0),g=!0)}),g&&i.updateCheckUI(),n.nested&&i.initNestedList(),i.$.trigger("tableReload");var m=t("#mainMenu>.btn-toolbar>.btn-active-text>.label");if(m.length){var u=i.$.find(".pager[data-rec-total]"),v=u.length?u.attr("data-rec-total"):i.getTable().find("tbody:first>tr:not(.table-children)").length;m.text(v)}e&&e(),n.afterReload&&n.afterReload()})},r.prototype.initModals=function(){var e=this,i=e.options,n=e.$.find(i.iframeModalTrigger);if(n.length){var o={type:"iframe",onHide:i.replaceId?function(){var n=t.cookie("selfClose");(1==n||i.hot)&&(t("#triggerModal").data("cancel-reload",1),e.reload(function(){t.cookie("selfClose",0)}))}:null};n.modalTrigger(o)}},r.prototype.getTable=function(){var t=this.$;if(this.isDataTable)return t.find("div.datatable");var e=t.is("table")?t:t.find("table:not(.fixed-header-copy)").first();return e.is(".datatable")&&(this.isDataTable=!0,e.data("zui.datatable")||window.initDatatable(e),e=t.find("div.datatable")),e},r.prototype.toggleGroups=function(e){var i=this,n={};i.$.find("tbody>tr").each(function(){var o=t(this).closest("tr").data("id");n[o]||i.toggleRowGroup(o,e)})},r.prototype.toggleRowGroup=function(i,n){var o=this.$.find('tbody>tr[data-id="'+i+'"]'),a=o.filter(".group-summary"),s=n===e?!a.hasClass("hidden"):!!n;o.not(".group-summary").toggleClass("hidden",!s),a.toggleClass("hidden",s),t("body").toggleClass("table-group-collapsed",!this.$.find("tbody>tr.group-summary.hidden").length)},r.prototype.updateStatistic=function(){var i=this,n=i.$.find(".table-statistic");if(n.length){if(i.defaultStatistic===e&&(i.defaultStatistic=n.html()),i.options.statisticCreator)return void n.html(i.options.statisticCreator(i)||i.defaultStatistic);var o=i.statisticCols;if(!o&&o!==!1){o={};var a=!1;i.getTable().find("thead th").each(function(e){var i=t(this),n=i.data("statistic");n&&(a=!0,o[e]={format:n,name:i.text()})}),i.statisticCols=!!a&&o}var s=0;o&&t.each(o,function(t){o[t].total=0,o[t].checkedTotal=0}),i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr").each(function(){var e=t(this),i=e.hasClass("checked"),n=e.children("td");i&&s++,o&&t.each(o,function(t){var e=parseFloat(n.eq(t).text());isNaN(e)&&(e=0),o[t].total+=e,i&&(o[t].checkedTotal+=e)})});var r=[];if(s)r.push(i.lang.selectedItems.format(s));else if(i.defaultStatistic)return void n.html(i.defaultStatistic);o&&t.each(o,function(t){var e=o[t],n=e[s?"checkedTotal":"total"];e.format&&(n=e.format.format(n)),r.push(i.lang.attrTotal.format(e.name,n))}),n.html(r.join(", "))}},r.prototype.updateFixUI=function(e){var i=this,n=(new Date).getTime();if(!e&&(i.lastUpdateCall&&clearTimeout(i.lastUpdateCall),!i.lastUpdateTime||n-i.lastUpdateTime
    ').append(t('
    ').addClass(i.attr("class")).append(n.clone())).insertAfter(i)),h){var d=c[0].getBoundingClientRect();l.css({left:d.left,width:c.width(),overflow:"hidden"}),l.find(".fixed-header-copy").css({left:o.left-d.left,position:"relative",minWidth:i.width()}),a||c.data("fixHeaderScroll")||(c.data("fixHeaderScroll",1),i.width()>c.width()&&c.on("scroll",function(){e.fixHeader()}))}else l.css({left:o.left,width:o.width});var u=l.find("th");n.find("th").each(function(e){u.eq(e).css("width",t(this).outerWidth())})}else l.remove()},r.prototype.fixFooter=function(){var e,i=this,n=i.getTable(),o=i.$.find(".table-footer");if(i.isDataTable)e=n[0].getBoundingClientRect();else{var a=n.find("tbody");if(!a.length)return;e=a[0].getBoundingClientRect()}var s=i.options.fixFooter;o.toggleClass("fixed-footer",!!r);var r="function"==typeof s?s(e,o):e.bottom>window.innerHeight-50-("number"==typeof s?s:i.pageFooterHeight||5);o.toggleClass("fixed-footer",!!r),n.toggleClass("with-footer-fixed",!!r),n.trigger("fixFooter",r);var l=t("body"),c=l.hasClass("body-modal");if(r){var h=n.parent(),d=h.is(".table-responsive");o.css({bottom:i.pageFooterHeight||0,left:d?h[0].getBoundingClientRect().left:e.left,width:d?h.width():e.width}),c&&l.css("padding-bottom",40)}else o.css({width:"",left:0,bottom:0}),c&&l.css("padding-bottom",0)},r.prototype.checkAll=function(e){var i=this,n=i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr");n.each(function(){i.checkRow(t(this),e,!0)}),i.updateCheckUI()},r.prototype.checkRow=function(i,n,o){var a=this,s=a.getTable();a.isDataTable&&!i.is(".datatable-row-left")&&(i=s.find('.datatable-row-left[data-index="'+i.data("index")+'"]'));var r=i.find('input[type="checkbox"]');if(r.length&&!r.is(":disabled")){n===e&&(n=!r.is(":checked")),a.isDataTable?s.find('.datatable-row[data-index="'+i.data("index")+'"]').toggleClass("checked",n):i.toggleClass("checked",n);var l=i.data("id");this.checkItems[l]=n,r.prop("checked",n).trigger("change"),o||(i.hasClass("table-parent")&&s.find((a.isDataTable?".fixed-left ":"")+"tbody>tr.parent-"+l).each(function(){a.checkRow(t(this),n,!0)}),a.updateCheckUI())}},r.prototype.updateCheckUI=function(){var e=this,i=e.getTable(),n=i.find(e.isDataTable?".fixed-left tbody>tr":"tbody>tr").not(".group-summary"),o=!1,a=null,s=0,r=!1,l=n.length;n.each(function(n){var c=t(this),h=c.find('input[type="checkbox"]');if(!h.length)return void l--;r=h.is(":checked");var d=e.isDataTable?i.find('.datatable-row[data-index="'+c.data("index")+'"]'):c;d.toggleClass("checked",r),d.toggleClass("row-check-begin",r&&!o),a&&a.toggleClass("row-check-end",!r&&o),r&&(s+=1),a=d,o=r,l===n+1&&d.toggleClass("row-check-end",r)}),e.$.toggleClass("has-row-checked",s>0).find(".check-all").toggleClass("checked",!(!l||s!==l)),e.updateStatistic(),e.options.onCheckChange&&e.options.onCheckChange(),i.trigger("checkChange")},r.DEFAULTS={checkable:!0,checkOnClickRow:!0,ajaxForm:!1,selectable:!0,fixHeader:!a,fixFooter:!a,iframeWidth:900,replaceId:"self", +nestLevelIndent:18,nested:!1,preserveNested:!0,hot:!1,iframeModalTrigger:".iframe:not(.disabled,[disabled])"},t.fn.table=function(e){return this.each(function(){var n=t(this),o=n.data(i),a="object"==typeof e&&e;o||n.data(i,o=new r(this,a)),"string"==typeof e&&o[e]()})},r.NAME=i,t.fn.table.Constructor=r,t(function(){t('[data-ride="table"]').table()})}(jQuery,void 0),function(t,e,i){t.fn._ajaxForm=t.fn.ajaxForm;var n={timeout:e.config?e.config.timeout:0,dataType:"json",method:"post"},o="";t.fn.enableForm=function(e,n,o){return e===i&&(e=!0),this.each(function(){var i=t(this);n||i.find('[type="submit"]').attr("disabled",e?null:"disabled"),!o&&i.hasClass("load-indicator")&&i.toggleClass("loading",!e),i.toggleClass("form-disabled",!e)})},t.enableForm=function(e,i,n,o){"string"==typeof e||e instanceof t?e=t(e):(o=n,n=i,i=e,e=t("form")),e.enableForm(i!==!1,n,o)},t.disableForm=function(e,i,n){t.enableForm(e,!1,i,n)};var a=function(e,i,n){i=i||"show",t.zui.messager?(n?n.html=!0:n={html:!0},e=e.toString().replace(/\n/g,"
    "),t.zui.messager[i](e,n)):alert(e)};t.ajaxForm=function(s,r){var l=t(s);if(l.length>1)return l.each(function(){t.ajaxForm(this,r)});"function"==typeof r&&(r={complete:r}),r=t.extend({},n,l.data(),r);var c=r.beforeSubmit,h=r.error,d=r.success,u=r.finish;delete r.finish,delete r.success,delete r.onError,delete r.beforeSubmit,r=t.extend({beforeSubmit:function(n,a,s){if((c&&c(n,a,s))===!1)return!1;l.removeClass("form-watched").enableForm(!1);var r={},h=a.find('[type="file"]');r.fileapi=h.length&&h[0].files!==i,r.formdata=e.FormData!==i;var d=r.fileapi&&a.find('input[type="file"]:enabled').filter(function(){return""!==t(this).val()}),u=d.length,p="multipart/form-data",f=a.attr("enctype")==p||a.attr("encoding")==p,g=r.fileapi&&r.formdata,m=u&&!g||f&&!r.formdata;m&&(""==o&&(o=s.url),s.url!=o&&(s.url=o),s.url=s.url.indexOf("&")>=0?s.url+"&HTTP_X_REQUESTED_WITH=XMLHttpRequest":s.url+"?HTTP_X_REQUESTED_WITH=XMLHttpRequest")},success:function(i,n,o){if((d&&d(i,n,o,l))!==!1){try{"string"==typeof i&&(i=JSON.parse(i))}catch(s){}if(null===i||"object"!=typeof i)return i?alert(i):a("No response.","danger");var c=r.responser?t(r.responser):l.find(".form-responser");c.length||(c=t("#responser"));var h=i.message,p=function(){var n=i.callback;if(n)if("object"==typeof n){var o=n.target?e[n.target]:e,a=o[n.name];a.apply(l,Array.isArray(n.params)?n.params:[n.params])}else{var s=n.indexOf("("),r=(s>0?n.substr(0,s):n).split("."),c=e,h=r[0];r.length>1&&(h=r[1],"top"===r[0]?c=e.top:"parent"===r[0]&&(c=e.parent));var a=c[h];if("function"==typeof a){var d=[];return s>0&&")"==n[n.length-1]&&(d=t.parseJSON("["+n.substring(s+1,n.length-1)+"]")),d.push(i),a.apply(l,d)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,"number"==typeof g?g:r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.apps?t.apps.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
    ').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x&&!o.data("datetimepicker")){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),x=!0}}),C.length&&a(C.join(""),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
    ').append(s)),i.$menu.append(s),i.$menu.removeClass("loading"),i.isLoaded=!0,e&&e(!0)},error:function(){i.$menu.removeClass("loading").append('
    '+(n.errorText||window.lang&&window.lang.timeout)+"
    "),e&&e(!1)}},n.ajax))},n.prototype.scrollTo=function(t){t.length&&t[0].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({behavior:"smooth"})},n.prototype.getItems=function(){return this.$.find(this.options.selector).addClass("search-list-item")},n.prototype.getActiveItem=function(){return this.getItems().filter(".active:first")},n.prototype.search=function(e){var n=this,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[i]()})},n.NAME=e,t.fn.searchList.Constructor=n,t(function(){t('[data-ride="searchList"]').searchList()})}(jQuery),function(t){"use strict";var e="zui.labelSelector",i=function(n,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.update()};i.prototype.select=function(t){t+="",this.$wrapper.find(".label.active").removeClass("active"),this.$wrapper.find('.label[data-value="'+t+'"]').addClass("active"),this.$.val(t).trigger("change")},i.prototype.update=function(){var e=this,i=e.options,n=e.$wrapper;if(!n){if(i.wrapper)n=t(i.wrapper);else{var o=e.$.next();n=o.hasClass(".label-selector")?o:t('
    ')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=(""===o.value||"0"===o.value)&&!o.label,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=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.labelSelector.Constructor=i,t(function(){t('[data-provide="labelSelector"]').labelSelector()})}(jQuery),function(t){"use strict";var e="zui.fileInput",i=t.BYTE_UNITS={B:1,KB:1024,MB:1048576,GB:1073741824,TB:1099511627776},n=t.formatBytes=function(t,e,n){return void 0===e&&(e=2),n||(n=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.find(".file-input").detach(),n.add()};r.prototype.add=function(){var t=this,e=t.options,i=t.$template.clone();"before"===e.appendWay?t.$.prepend(i):t.$.append(i),i.fileInput({fileMaxSize:e.eachFileMaxSize,fileSizeError:e.fileSizeError,onDelete:function(e){e.$.remove(),t.options.onDelete&&t.options.onDelete(e,t)},onSelect:function(e,i){t.add(),t.options.onSelect&&t.options.onSelect(e,i,t)}})},r.DEFAULTS={fileMaxSize:0,eachFileMaxSize:0,appendWay:"after",fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInputList=function(e){return this.each(function(){var i=t(this),n=i.data(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(r.begin).format("hh:mm");l.find('option[value="'+d+'"]').length&&l.val(d),r.onChange&&r.onChange(l,d)}if(r.end){var u=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(null,!0),t(document).on("keydown",function(e){e.ctrlKey&&71===e.keyCode&&(t("#searchInput").val("").focus(),e.stopPropagation(),e.preventDefault())})}),t.removeAnchor=window.removeAnchor=function(t){var e=t.lastIndexOf("#");return e>-1?t.substr(0,e):t},t.refreshPage=function(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.extend(t.zui.Picker.DEFAULTS,{optionRender:function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
    ').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},checkable:!0,maxListCount:500,disableScrollOnShow:!1}),t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!0,drop_direction:function(){var e=t(this.container).closest(".table-responsive:not(.scroll-none)");if(e.length){if(this.drop_directionFixed)return this.drop_directionFixed;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
    {page}/{totalPage}
    ',"next_icon","last_icon"],onPageChange:function(e,i){e.recPerPage!==i.recPerPage&&t.cookie(this.options.pageCookie,e.recPerPage,{expires:config.cookieLife,path:config.webRoot}),e.recPerPage!==i.recPerPage&&(window.location.href=this.createLink())}}),t.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),t.fn.reverseOrder=function(){return this.each(function(){var e=t(this);e.prependTo(e.parent())})};var r=function(e,i){var n=t(e);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).on("click",".btn-expand",function(){t(this).closest("li").toggleClass("show-changes")}).on("click",".btn-strip",function(){var e=t(this),n=e.find(".icon"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.find(".btn-strip").attr("title",i.original);var r=n.find(".modal-comment").modal({show:!1}).on("shown.zui.modal",function(){var t=r.find("#comment");t.length&&(t.focus(),window.editor&&window.editor.comment&&window.editor.comment.focus())}).on("show.zui.modal",function(){var e=r.find("#comment");e.length&&!e.data("keditor")&&t.fn.kindeditor&&e.kindeditor()});n.on("click",".btn-comment",function(t){r.modal("toggle"),t.preventDefault()}).on("click",".btn-edit-comment,.btn-hide-form",function(){t(this).closest("li").toggleClass("show-form")});var l=n.find(".comment-edit-form");l.ajaxForm({success:function(t,e,i,n){setTimeout(function(){l.closest("li").removeClass("show-form")},2e3)}})}};t.fn.histories=function(t){return this.each(function(){r(this,t)})},t(function(){t(".histories").histories()});var l=0,c=0;t.toggleSidebar=function(e){var i=t("#sidebar");if(i.length){var n=t("main");if(void 0===e)e=n.hasClass("hide-sidebar");else if(e&&!n.hasClass("hide-sidebar"))return;n.toggleClass("hide-sidebar",!e),clearTimeout(l),t.zui.store.set(c,e);var o=i.children(".cell"),a={overflow:"visible",maxHeight:"initial"};e?(i.addClass("showing"),l=setTimeout(function(){i.removeClass("showing"),i.trigger("sidebar.toggle",e)},210)):(i.trigger("sidebar.toggle",e),t(window).width()<1900&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr input[type="checkbox"]:checked');i.each(function(){var i=parseInt(t(this).val(),10);NaN!==i&&e.push(i)}),t.cookie("checkedItem",e.join(","),{expires:config.cookieLife,path:config.webRoot})},t.extend(t.fn.modal.bs.Constructor.DEFAULTS,{scrollInside:!0,backdrop:"static",headerHeight:100}),t.extend(t.zui.ModalTrigger.DEFAULTS,{scrollInside:!0,backdrop:"static"}),t.fn.initIframeModal=function(){return this.each(function(){var e=t(this);if(!e.is("[disabled],.disabled")&&!e.parents('[data-ride="table"],.skip-iframe-modal').length){var i={type:"iframe"};e.hasClass("export")&&t.extend(i,{width:800,shown:setCheckedCookie},e.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()}),t.fixedTableHead=window.fixedTableHead=function(e,i){var n=t(e);if(n.is("table")||(n=n.find("table")),n.length){var o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
    ").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var d,u,p,f,g,m=function(){d||(d=t("#subNavbar"),u=t("#pageNav"),p=t("#pageActions"),f=d.children(".nav"),g=f.outerWidth());var e=d.outerWidth(),i=u.outerWidth()||0,n=p.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void f.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,g),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),x()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto"); })};e.length&&(t(window).on("resize",i),setTimeout(i,100))});var C=function(){var e=this,i=t(e),n=i.closest("tr").find("textarea");if(n.length){var o=32;n.each(function(){var e=t(this).closest("td"),i=e.css("height");e.css("height",this.style.height),this.style.height="auto";var n=this.value?this.scrollHeight+2:32;o=Math.max(o,n),e.css("height",i)}),n.css("height",o)}else{e.style.height="auto";var a=e.value?e.scrollHeight+2:32;e.style.height=a+"px"}};t.autoResizeTextarea=function(e){t(e).each(C)},t(function(){t("textarea.autosize").each(C),t(document).on("input paste change","textarea.autosize",C)}),t(function(){var e=t("#dropMenu,.drop-menu");e.length&&e.on("click",".toggle-right-col",function(e){t(this).closest("#dropMenu,.drop-menu").toggleClass("show-right-col"),e.stopPropagation(),e.preventDefault()})});var _="undefined"!=typeof InstallTrigger;t.zui.browser.firefox=_,t("html").toggleClass("is-firefox",_).toggleClass("not-firefox",!_),t(function(){var e=t("#mainContent>.main-col"),i=e.children(".main-actions");if(i.length){var n=i.prev();if(i.length&&n.length){t('
    ').css("height",i.outerHeight()).insertAfter(i);var o=0,a=function(){var e=n[0].getBoundingClientRect(),s=e.top+e.height+120>t(window).height();if(t("body").toggleClass("main-actions-fixed",s),s){var r=n.width();r?i.width(r):o<10&&setTimeout(a,1e3)}o++};t.resetToolbarPosition=a,a(),t(window).on("resize scroll",a)}}}),t(document).on("show.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&t(e.target).is(".modal")&&window.parent.$("body").addClass("hide-modal-close")}).on("hidden.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&window.parent.$("body").removeClass("hide-modal-close")}).on("loaded.zui.modal",function(e){t("body").removeClass("hide-modal-close")}),t(function(){var e=t(".dropdown-menu.with-search");e.length&&(e.find(".menu-search").on("click",function(t){return t.stopPropagation(),!1}),e.on("keyup change paste","input",function(){var e=t(this),i=e.closest(".dropdown-menu.with-search"),n=e.val().toLowerCase(),o=i.find(".option");""==n?o.removeClass("hide"):o.each(function(){var e=t(this);e.toggleClass("hide",e.text().toString().toLowerCase().indexOf(n)<0&&e.data("key").toString().toLowerCase().indexOf(n)<0)})}),e.parents(".dropdown-submenu").one("mouseenter",function(){var e=t(this).find(".dropdown-list")[0];e&&e.getBoundingClientRect&&setTimeout(function(){var i=270,n=e.getBoundingClientRect();n.top<0&&(i=Math.min(270,n.height)+n.top),e.style.maxHeight=Math.min(270,i,t(window).height()-28)+"px"},50)})),t(".dropdown-menu.with-search .menu-search").on("click",function(t){return t.stopPropagation(),!1})})}(jQuery),function(t){function e(){if(!config.skipRedirect&&!window.skipRedirect){var e=window.parent,i=config.currentModule,n=config.currentMethod;if("file"!==i||"download"!==n){var o="index"===i&&"index"===n,a="#_single"===location.hash||/(\?|\&)_single/.test(location.search)||o||!t("#mainHeader,#editorNav").length||"tutorial"===i||"install"===i||"upgrade"===i||"user"===i&&("login"===n||"deny"===n)||"my"===i&&"changepassword"===n||t("body").hasClass("allow-self-open"),s=location.href;if(e===window&&!a){var r=location.pathname+location.search+location.hash;return void(location.href=t.createLink("index","index","")+"#app="+encodeURIComponent(r))}if(e!==window&&e.$.apps){o&&e.location.reload();var l=window.name;if(0===l.indexOf("app-")){t.apps=window.apps=e.$.apps;var c=l.substring(4);t.appCode=c,t(document).on("click",function(t){var i=e.document.getElementById(window.name);if(i){var n=e.document.getElementById(i.name)||i;if(n){var o;"function"==typeof Event?o=new Event(t.type,{bubbles:!0}):(o=document.createEvent("Event"),o.initEvent(t.type,!0,!0)),n.dispatchEvent(o)}}}).on("click","a,.open-in-app,.show-in-app",function(e){var i=t(this);if(!i.is("[data-modal],[data-toggle],[data-ride],[data-tab],.iframe,.not-in-app,[target]")&&!i.data("zui.modaltrigger")){var n=i.hasClass("show-in-app")?"":i.attr("href")||(i.is("a")?"":i.data("url")),o=i.data("app")||i.data("group");if(n){if(0===n.indexOf("javascript:")||"#"===n[0])return;var a=t.parseLink(n);if(a.external||"file"===a.moduleName&&"download"===a.methodName)return;if("index"===a.moduleName&&"index"===a.methodName)return window.location.reload(),void e.preventDefault()}else if(!o)return;o||(o=t.apps.getAppCode(n)),o&&("help"===o&&(t.apps.appsMap.help.text=i.text(),t.apps.appsMap.help.url||(t.apps.appsMap.help.url=n)),t.apps.open(n,o)&&e.preventDefault())}}),t.apps.updateUrl(c,s,document.title)}}}}}function i(){var e=t("#navbar>.nav");if(e.length){var i=t("#heading"),n=+i.css("left").replace("px",""),o=i.outerWidth(),a=e.width(),s=t("#mainHeader>.container").width()-2*n,r=Math.floor((s-a)/2);e.css("marginLeft",r>>0;if(0===o)return!1;for(var a=0|e,s=Math.max(a>=0?a:o-Math.abs(a),0);s1&&("?"===e[0]&&(e=e.substr(1)),e.split("&").forEach(function(t){var e=t.split("=",2);if(e.length>1)try{i[e[0]]=decodeURIComponent(e[1])}catch(n){i[e[0]]=""}else i[e[0]]=""})),t?i[t]:i},t.parseLink=function(e){if(!e)return{};var i=0===e.indexOf("http:")||0===e.indexOf("https:");if(i){var n=window.location.origin;if(e.indexOf(n)<0)return{external:!0,url:e};e=e.substr((n+config.webRoot).length)}var o=e.split("#"),a=o[0].split("?"),s=a[1],r=s?t.getSearchParam("",s):{},l=a[0],c={url:e,isOnlyBody:"yes"===r.onlybody,vars:[],hash:o[1]||"",params:r,tid:r.tid||""};if("GET"===config.requestType){c.moduleName=r[config.moduleVar]||"index",c.methodName=r[config.methodVar]||"index",c.viewType=r[config.viewVar]||config.defaultView;for(var h in r)h!==config.moduleVar&&h!==config.methodVar&&h!==config.viewVar&&"onlybody"!==h&&"tid"!==h&&c.vars.push([h,r[h]])}else{var d=l.lastIndexOf("/");d===l.length-1&&(l=l.substr(0,d),d=l.lastIndexOf("/")),d>=0&&(l=l.substr(d+1));var u=l.lastIndexOf(".");u>=0?(c.viewType=l.substr(u+1),l=l.substr(0,u)):c.viewType=config.defaultView;var p=l.split(config.requestFix);if(c.moduleName=p[0]||"index",c.methodName=p[1]||"index",p.length>2)for(var f=2;f.nav>li").length>10&&(i(),t(window).on("resize",i)),setTimeout(n,1e3)})}(jQuery),function(t){"use strict";function e(e,i){"object"!=typeof i&&(i={user:i});var n=t(e);i=t.extend({},n.data(),i);var o=i.user;"string"==typeof o&&(o={account:o});var a={},s=i.size;s&&(a.width=s,a.height=s,a.lineHeight=s,Number.isNaN(+s)||n.addClass("size-"+s));var r=!!o.avatar;if(n.toggleClass("has-image",r).toggleClass("has-text",!r),n.empty(),r)n.append(t("").attr("src",o.avatar));else{var l=t.zui.strCode(o.account)*(i.hueDistance||43)%360;a.background="hsl("+l+","+(i.saturation||"40%")+","+(i.lightness||"60%")+")",Number.isNaN(+s)||(a.fontSize=Math.round(s/2)+"px");var c=o.name||o.realname||o.account;c=/^[\u4e00-\u9fa5\s]+$/.test(c)?c.length<=2?c:c.substring(c.length-2):/^[A-Za-z\d\s]+$/.test(c)?c[0].toUpperCase():c.length<=2?c:c.substring(0,2),n.append(t('').text(c))}return n.css(a)}t.fn.avatar=function(t){return this.each(function(){e(this,t)})}}(jQuery),$.zui.lang("de",{"zui.pager":{pageOfText:"Seite {0}",prev:"Zurück",next:"Nächste Seite",first:"Erste Seite",last:"Letzte Seite","goto":"Goto",pageOf:"Seite {page}",totalPage:"{totalPage} Seiten",totalCount:"Total: {recTotal} Artikel",pageSize:"{recPerPage} Artikel pro Seite",itemsRange:"Seiten {start} bis {end}",pageOfTotal:"Seite {page}/{totalPage}"},"zui.boards":{append2end:"Gehen Sie zum Ende"},"zui.browser":{tip:"Online. Sorgenfrei. Aktualisiere deinen Browser noch heute!"},"zui.calendar":{weekNames:["Son","Mon","Die","Mit","Don","Fri","Sam"],monthNames:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",year:"{0}Jahr",month:"{0}Monat",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Kein Icon]",commonIcons:"Gemeinsame Symbole",webIcons:"Web-Symbol",editorIcons:"Editor-Symbol",directionalIcons:"Pfeil Zusammenfluss",otherIcons:"Andere Symbole"},"zui.colorPicker":{errorTip:"Kein gültiger Farbwert"},"zui.datagrid":{errorCannotGetDataFromRemote:"Daten vom Remote-Server ({0}) können nicht abgerufen werden.",errorCannotHandleRemoteData:"Die vom Remote-Server zurückgegebenen Daten können nicht verarbeitet werden."},"zui.guideViewer":{prevStep:"Vorheriger Schritt",nextStep:"Nächster Schritt"},"zui.tabs":{reload:"Neu laden",close:"Schliessen",closeOthers:"Schließen Sie andere Registerkarten",closeRight:"Schließen Sie die rechte Registerkarte",reopenLast:"Letzten geschlossenen Tab wiederherstellen",errorCannotFetchFromRemote:"Inhalt kann nicht vom Remote-Server abgerufen werden ({0})."},"zui.uploader":{},datetimepicker:{days:["Sonntag","Montag","Diensteg","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fri","Sam"],daysMin:["Son","Mon","Die","Mit","Don","Fri","Sam"],months:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",suffix:[],meridiem:[]},chosen:{no_results_text:"Nicht gefunden"},bootbox:{OK:"OK",CANCEL:"Stornieren",CONFIRM:"Bestätigen"}}),$.zui.lang("fr",{"zui.pager":{pageOfText:"Page {0}",prev:"Prev",next:"Suivant",first:"First",last:"Last","goto":"Goto",pageOf:"Page {page}",totalPage:"{totalPage} pages",totalCount:"Total: {recTotal} items",pageSize:"{recPerPage} per page",itemsRange:"De {start} à {end}",pageOfTotal:"Page {page} de {totalPage}"},"zui.boards":{append2end:"Aller jusqu'au bout"},"zui.browser":{tip:"Naviguez sans crainte sur Internet. Mettez votre navigateur à jour dès aujourd'hui!"},"zui.calendar":{weekNames:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],monthNames:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",year:"{0} Année",month:"{0} Mois",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Aucune icône]",commonIcons:"Icônes communes",webIcons:"Icône Web",editorIcons:"Icône de l'éditeur",directionalIcons:"Flèche confluence",otherIcons:"Autres icônes"},"zui.colorPicker":{errorTip:"Pas une valeur de couleur valide"},"zui.datagrid":{errorCannotGetDataFromRemote:"Impossible d'obtenir les données du serveur distant ({0}).",errorCannotHandleRemoteData:"Impossible de traiter les données renvoyées par le serveur distant."},"zui.guideViewer":{prevStep:"Étape précédente",nextStep:"Prochaine étape"},"zui.tabs":{reload:"Recharger",close:"Fermer",closeOthers:"Fermez les autres onglets",closeRight:"Fermer l'onglet de droite",reopenLast:"Restaurer le dernier onglet fermé",errorCannotFetchFromRemote:"Impossible d'obtenir le contenu du serveur distant ({0})."},"zui.uploader":{},datetimepicker:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",suffix:[],meridiem:[]},chosen:{no_results_text:"Pas trouvé"},bootbox:{OK:"D'accord",CANCEL:"Annuler",CONFIRM:"Confirmer"}}); From 98ca0e913d98feef102b952e886142ec04b04065 Mon Sep 17 00:00:00 2001 From: dongli Date: Wed, 24 Aug 2022 09:12:00 +0000 Subject: [PATCH 143/223] * Fix bug #26824. --- module/action/control.php | 2 +- module/action/view/trash.html.php | 4 ++-- module/my/model.php | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/module/action/control.php b/module/action/control.php index 7b32ec3af3..4613347f2f 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -125,7 +125,7 @@ class action extends control } /* Get the products name of story. */ - if($browseType == 'story' or 'requirement') + if(strpos(',story,requirement,', ",$browseType,") !== false) { $this->loadModel('story'); $storyIdList = array(); diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index 582c7c1cf2..bbe2216478 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -85,7 +85,7 @@ systemMode == 'new' and $currentObjectType == 'execution'):?>
    lang->project->project;?> lang->story->product;?> objectID]->productTitle;?> objectID]->productDeleted):?> diff --git a/module/my/model.php b/module/my/model.php index 6f359b99f1..4ff59e8679 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -504,7 +504,6 @@ class myModel extends model { $rawMethod = $this->app->rawMethod; $this->loadModel('execution'); - $this->app->loadConfig('execution'); $this->config->execution->search['module'] = $rawMethod . 'Task'; $this->config->execution->search['actionURL'] = $actionURL; From c033a87009587459b8ad67dec2e01a3ce6bda00b Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 24 Aug 2022 17:19:59 +0800 Subject: [PATCH 144/223] * Fix bug #26845. --- module/common/model.php | 1 + module/story/control.php | 3 ++- module/story/view/linkstories.html.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/module/common/model.php b/module/common/model.php index 8504097bf8..ca2401a3bd 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2501,6 +2501,7 @@ EOD; if($module == 'story' and !empty($params['storyType']) and strpos(",story,requirement,", ",{$params['storyType']},") !== false) $module = $params['storyType']; if($module == 'product' and $method == 'browse' and !empty($app->params['storyType']) and $app->params['storyType'] == 'requirement') $method = 'requirement'; if($module == 'product' and $method == 'browse' and !empty($params['storyType']) and $params['storyType'] == 'requirement') $method = 'requirement'; + if($module == 'story' and $method == 'linkrequirements') $module = 'requirement'; /* If the user is doing a tutorial, have all tutorial privs. */ if(defined('TUTORIAL')) diff --git a/module/story/control.php b/module/story/control.php index 395efa8d69..aa23b46d3e 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -2207,9 +2207,10 @@ class story extends control $products = $this->product->getPairs(); $queryID = ($browseType == 'bySearch') ? (int)$param : 0; $type = $story->type == 'story' ? 'linkRelateSR' : 'linkRelateUR'; + $method = $story->type == 'story' ? 'linkStories' : 'linkRequirements'; /* Build search form. */ - $actionURL = $this->createLink('story', 'linkStories', "storyID=$storyID&browseType=bySearch&excludeStories=$excludeStories&queryID=myQueryID", '', true); + $actionURL = $this->createLink('story', $method, "storyID=$storyID&browseType=bySearch&excludeStories=$excludeStories&queryID=myQueryID", '', true); $this->product->buildSearchForm($story->product, $products, $queryID, $actionURL); $this->view->story = $story; diff --git a/module/story/view/linkstories.html.php b/module/story/view/linkstories.html.php index fbb8e1c1b2..ad604ab44f 100644 --- a/module/story/view/linkstories.html.php +++ b/module/story/view/linkstories.html.php @@ -18,7 +18,7 @@ id;?> createLink('story', 'view', "storyID=$story->id"), $story->title, '_blank', "title='$story->title'");?> type == 'story' ? $lang->story->linkStoriesAB : $lang->story->linkRequirementsAB?> - arrow . $lang->story->linkStoriesAB;?> + arrow . $title;?>
    From ff5bc6ffaedb2d44082aa7ed7f40d20069fd0545 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Wed, 24 Aug 2022 17:21:52 +0800 Subject: [PATCH 145/223] * Modify error. --- api/v1/entries/execution.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/api/v1/entries/execution.php b/api/v1/entries/execution.php index cc9add74e9..3d66f624a0 100644 --- a/api/v1/entries/execution.php +++ b/api/v1/entries/execution.php @@ -20,9 +20,8 @@ class executionEntry extends Entry */ public function get($executionID) { - $fields = $this->param('fields'); - $productID = $this->param('productID'); - $status = $this->param('status', 'all'); + $fields = $this->param('fields'); + $status = $this->param('status', 'all'); $control = $this->loadController('execution', 'view'); $control->view($executionID); @@ -47,8 +46,8 @@ class executionEntry extends Entry foreach($executionProduct->plans as $planID) { $plan = new stdclass(); - $plan->id = $planID; - $plan->name = $data->data->planGroups->{$productID}->{$planID}; + $plan->id = trim($planID, ','); + $plan->name = $data->data->planGroups->{$productID}->{$plan->id}; $product->plans[] = $plan; } $execution->products[] = $product; From dca623d4294606221d28d651af334ff7759d5285 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 17:40:34 +0800 Subject: [PATCH 146/223] * Fix bug#26780. --- module/story/model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/story/model.php b/module/story/model.php index af047c8b79..dda6cac00c 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -5562,7 +5562,8 @@ class storyModel extends model if($reviewRule == 'halfpass') { - if($rejectCount == floor(count($revireList) / 2)) return 'closed'; + /* When the number of reviewers is even, half of them reject to close. */ + if(count($reviewerList) > 1 and count($reviewerList) % 2 == 0 and $rejectCount == floor(count($reviewerList) / 2)) return 'closed'; if($passCount >= floor(count($reviewerList) / 2) + 1) $status = 'active'; if($rejectCount >= floor(count($reviewerList) / 2) + 1) $status = 'closed'; From 3df376cabb35ee0d0dbcc954f161037c82da9254 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 18:31:17 +0800 Subject: [PATCH 147/223] * Fix bug#26777. --- module/my/view/requirement.html.php | 29 +++++++++++++++++++++++------ module/my/view/story.html.php | 24 +++++++++++++++++++++--- module/story/model.php | 2 +- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/module/my/view/requirement.html.php b/module/my/view/requirement.html.php index b26b4eec70..9628c48df1 100644 --- a/module/my/view/requirement.html.php +++ b/module/my/view/requirement.html.php @@ -103,7 +103,15 @@ { $vars = "story={$story->id}"; echo common::buildIconButton('story', 'change', "$vars&from=&storyType=requirement", $story, 'list', 'alter', '', 'iframe', true); - echo common::buildIconButton('story', 'review', "$vars&from=product&storyType=requirement", $story, 'list', 'search', '', 'iframe', true); + + if(strpos('draft,changing', $story->status) !== false) + { + echo common::buildIconButton('story', 'submitReview', "$vars&storyType=requirement", $story, 'list', 'sub-review', '', 'iframe', true); + } + else + { + echo common::buildIconButton('story', 'review', "$vars&from=product&storyType=requirement", $story, 'list', 'search', '', 'iframe', true); + } echo common::buildIconButton('story', 'recall', "$vars&from=list&storyType=requirement", $story, 'list', 'undo', 'hiddenwin', '', '', '', $lang->story->recall); echo common::buildIconButton('story', 'close', "$vars&from=&storyType=requirement", $story, 'list', '', '', 'iframe', true); echo common::buildIconButton('story', 'edit', "$vars&from=default&storyType=requirement", $story, 'list', '', '', 'iframe', true, "data-width='95%'"); @@ -147,11 +155,20 @@ } else { - common::printIcon('story', 'change', $vars, $child, 'list', 'alter'); - common::printIcon('story', 'review', $vars, $child, 'list', 'search'); - common::printIcon('story', 'close', $vars, $child, 'list', '', '', 'iframe', true); - common::printIcon('story', 'edit', $vars, $child, 'list'); - common::printIcon('story', 'createCase', "productID=$child->product&branch=$child->branch&module=0&from=¶m=0&$vars", $child, 'list', 'sitemap'); + common::printIcon('story', 'change', "$vars&from=&storyType=requirement", $child, 'list', 'alter'); + + if(strpos('draft,changing', $child->status) !== false) + { + common::printIcon('story', 'submitReview', "$vars&storyType=requirement", $child, 'list', 'sub-review', '', 'iframe', true); + } + else + { + common::printIcon('story', 'review', "$vars&from=product&storyType=requirement", $child, 'list', 'search', '', 'iframe', true); + } + + common::printIcon('story', 'recall', "$vars&from=list&storyType=requirement", $child, 'list', 'undo', 'hiddenwin', '', '', '', $lang->story->recall); + common::printIcon('story', 'close', "$vars&from=&storyType=requirement", $child, 'list', '', '', 'iframe', true); + common::printIcon('story', 'edit', "$vars&from=default&storyType=requirement", $child, 'list'); } } ?> diff --git a/module/my/view/story.html.php b/module/my/view/story.html.php index 192f898a06..e19a82ece3 100644 --- a/module/my/view/story.html.php +++ b/module/my/view/story.html.php @@ -105,7 +105,16 @@ { $vars = "story={$story->id}"; echo common::buildIconButton('story', 'change', $vars, $story, 'list', 'alter', '', 'iframe', true); - echo common::buildIconButton('story', 'review', $vars, $story, 'list', 'search', '', 'iframe', true); + + if(strpos('draft,changing', $story->status) !== false) + { + echo common::buildIconButton('story', 'submitReview', $vars, $story, 'list', 'sub-review', '', 'iframe', true); + } + else + { + echo common::buildIconButton('story', 'review', $vars, $story, 'list', 'search', '', 'iframe', true); + } + echo common::buildIconButton('story', 'recall', $vars, $story, 'list', 'undo', 'hiddenwin', '', '', '', $lang->story->recall); echo common::buildIconButton('story', 'close', $vars, $story, 'list', '', '', 'iframe', true); echo common::buildIconButton('story', 'edit', $vars, $story, 'list', '', '', 'iframe', true, "data-width='95%'"); @@ -145,8 +154,17 @@ if($canBeChanged) { $vars = "story={$child->id}"; - common::printIcon('story', 'change', $vars, $child, 'list', 'alter', '', 'iframe', true); - common::printIcon('story', 'review', $vars, $child, 'list', 'search', '', 'iframe', true); + common::printIcon('story', 'change', $vars, $child, 'list', 'alter', '', 'iframe', true); + + if(strpos('draft,changing', $child->status) !== false) + { + common::printIcon('story', 'submitReview', $vars, $child, 'list', 'sub-review', '', 'iframe', true); + } + else + { + common::printIcon('story', 'review', $vars, $child, 'list', 'search', '', 'iframe', true); + } + common::printIcon('story', 'recall', $vars, $child, 'list', 'undo', 'hiddenwin', '', '', '', $lang->story->recall); common::printIcon('story', 'close', $vars, $child, 'list', '', '', 'iframe', true); common::printIcon('story', 'edit', $vars, $child, 'list', '', '', 'iframe', true, "data-width='95%'"); common::printIcon('story', 'createCase', "productID=$child->product&branch=$child->branch&module=0&from=¶m=0&$vars", $child, 'list', 'sitemap', '', 'iframe', true, "data-width='95%'"); diff --git a/module/story/model.php b/module/story/model.php index dda6cac00c..00b23b32ea 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4290,7 +4290,7 @@ class storyModel extends model if($type == 'view') { $menu .= $this->buildMenu('story', 'change', $params . "&from=&storyType=$story->type", $story, $type, 'alter', '', 'showinonlybody'); - if($story->status == 'draft') $menu .= $this->buildMenu('story', 'submitReview', $params . "&storyType=$story->type", $story, $type, 'sub-review', '', 'showinonlybody iframe', true, "data-width='50%'"); + if(strpos('draft,changing', $story->status) !== false) $menu .= $this->buildMenu('story', 'submitReview', $params . "&storyType=$story->type", $story, $type, 'sub-review', '', 'showinonlybody iframe', true, "data-width='50%'"); $title = $story->status == 'changing' ? $this->lang->story->recallChange : $this->lang->story->recall; $menu .= $this->buildMenu('story', 'recall', $params . "&from=view&confirm=no&storyType=$story->type", $story, $type, 'undo', 'hiddenwin', 'showinonlybody', false, '', $title); From 3ce0a2946a287d7deca1e966203192c00bbac659 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 18:32:43 +0800 Subject: [PATCH 148/223] * Fix bug#26777. --- module/my/view/requirement.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/my/view/requirement.html.php b/module/my/view/requirement.html.php index 9628c48df1..1d846ef2c9 100644 --- a/module/my/view/requirement.html.php +++ b/module/my/view/requirement.html.php @@ -155,7 +155,7 @@ } else { - common::printIcon('story', 'change', "$vars&from=&storyType=requirement", $child, 'list', 'alter'); + common::printIcon('story', 'change', "$vars&from=&storyType=requirement", $child, 'list', 'alter', '', 'iframe', true); if(strpos('draft,changing', $child->status) !== false) { From 3796dd0e47af62315aa787c29e4b59bb29a25991 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 18:48:19 +0800 Subject: [PATCH 149/223] * Fix bug#26785. --- module/story/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/config.php b/module/story/config.php index 0f5dd3d966..c3f2cf57cc 100644 --- a/module/story/config.php +++ b/module/story/config.php @@ -43,7 +43,7 @@ $config->story->list->customCreateFields = 'source,verify,pri,estimate,mail $config->story->list->customBatchCreateFields = 'plan,spec,source,verify,pri,estimate,review,keywords'; $config->story->list->customBatchEditFields = 'branch,plan,estimate,pri,assignedTo,source,stage,closedBy,closedReason,keywords'; -$config->story->list->actionsOpratedParentStory = ',edit,batchcreate,change,review,recall,'; +$config->story->list->actionsOpratedParentStory = ',edit,batchcreate,change,review,recall,submitreview,'; $config->story->custom = new stdclass(); $config->story->custom->createFields = $config->story->list->customCreateFields; From c863d5869c93f034dd9ba5ecc9d4e00ddf0b840b Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 19:03:52 +0800 Subject: [PATCH 150/223] * Fix bug#26802. --- module/story/js/change.js | 1 + 1 file changed, 1 insertion(+) diff --git a/module/story/js/change.js b/module/story/js/change.js index 48b438264f..26c5e8c194 100644 --- a/module/story/js/change.js +++ b/module/story/js/change.js @@ -12,6 +12,7 @@ $(function() $('.input-group-addon').addClass('required'); } }); + if(!$('#reviewer').val()) $('#needNotReview').change(); if($('.tabs .tab-content .tab-pane.active').children().length == 0) $('.tabs .nav-tabs li.active').css('border-bottom', '1px solid #ccc'); }); From b2becfb0ec3831fa945458367d7222e647c7db6f Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 21:06:12 +0800 Subject: [PATCH 151/223] * Fix bug#26806. --- module/story/model.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 00b23b32ea..57a6a0fa15 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -1507,10 +1507,11 @@ class storyModel extends model foreach($storyIdList as $storyID) { if(!$storyID) continue; - $oldStory = $oldStories[$storyID]; - $isSuperReviewer = strpos(',' . trim(zget($this->config->story, 'superReviewers', ''), ',') . ',', ',' . $this->app->user->account . ','); - if($oldStory->status != 'draft' and $oldStory->status != 'changing') continue; + $isSuperReviewer = strpos(',' . trim(zget($this->config->story, 'superReviewers', ''), ',') . ',', ',' . $this->app->user->account . ','); + $oldStory = $oldStories[$storyID]; + + if($oldStory->status != 'reviewing') continue; if(!in_array($this->app->user->account, array_keys($reviewerList[$storyID])) and $isSuperReviewer === false) continue; if(isset($hasResult[$storyID]) and $hasResult[$storyID]->version == $oldStories[$storyID]->version) continue; From 14ce3c97f900e3971cc9b9fc848d69d58afb24a5 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 24 Aug 2022 22:43:27 +0800 Subject: [PATCH 152/223] * Fix bug#26804,26797. --- .../lite/story/ext/view/batchcreate.html.php | 3 +- extension/lite/story/ext/view/create.html.php | 38 ++++++------ extension/lite/story/ext/view/edit.html.php | 59 +++++++++++++++---- extension/lite/story/ext/view/view.html.php | 18 +++++- module/story/view/create.html.php | 11 +--- 5 files changed, 88 insertions(+), 41 deletions(-) diff --git a/extension/lite/story/ext/view/batchcreate.html.php b/extension/lite/story/ext/view/batchcreate.html.php index 99a33b5476..d94de7cee7 100644 --- a/extension/lite/story/ext/view/batchcreate.html.php +++ b/extension/lite/story/ext/view/batchcreate.html.php @@ -85,7 +85,8 @@
    - save);?> + save, "id='saveButton'", 'btn btn-primary btn-wide');?> + story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?>
    - - @@ -134,10 +134,6 @@ noticePasteImg) . "'");?> - - - - printExtendFields('', 'table', 'columns=4');?> @@ -147,7 +143,7 @@ @@ -162,10 +158,12 @@ diff --git a/extension/lite/story/ext/view/edit.html.php b/extension/lite/story/ext/view/edit.html.php index fa7458cbc8..bf24a2e266 100644 --- a/extension/lite/story/ext/view/edit.html.php +++ b/extension/lite/story/ext/view/edit.html.php @@ -14,14 +14,16 @@ app->getModuleRoot() . 'common/view/kindeditor.html.php';?> product);?> +id);?> children));?> story->moveChildrenTips);?> app->rawModule);?> story->module);?> - + story->notice->reviewerNotEmpty);?> story->feedbackSource); ?> +status);?>
    @@ -34,7 +36,7 @@
    -
    +
    @@ -43,12 +45,40 @@
    - title, 'class="form-control disabled story-title" disabled="disabled"');?> + title, 'class="form-control disabled story-title"' . (strpos('draft,changing', $story->status) !== false ? '' : ' disabled="disabled"'));?>
    + status) !== false):?> +
    +
    story->reviewers;?>
    +
    +
    + story->checkForceReview()):?> +
    + +
    +
    + +
    + /> + +
    +
    +
    + +
    + +
    + +
    +
    +
    +
    story->legendSpec;?>
    -
    spec;?>
    +
    + status) !== false ? html::textarea('spec', htmlSpecialString($story->spec), "rows='5' class='form-control'") : $story->spec;?> +
    printExtendFields($story, 'div', 'position=left');?>
    @@ -61,7 +91,15 @@ lastEditedDate); echo html::hidden('product', $story->product); - echo html::submitButton($lang->save); + if(strpos('draft,changing', $story->status) !== false) + { + echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide'); + echo html::commonButton($story->status == 'changing' ? $lang->story->doNotSubmit : $lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide'); + } + else + { + echo html::submitButton($lang->save); + } if(!isonlybody()) echo html::backButton(); ?>
    @@ -85,7 +123,7 @@ echo ""; echo html::a($this->createLink('tree', 'browse', "rootID=$story->product&view=story¤tModuleID=0&branch=$story->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'"); echo '  '; - echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($story->product)'"); + echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='$lang->refresh' onclick='loadProductModules($story->product)'"); echo ''; } ?> @@ -129,7 +167,7 @@
    @@ -145,12 +183,13 @@ - + status == 'closed' ? $users + array('closed' => 'Closed') : $users;?> + - + status == 'reviewing'):?> - + status == 'closed'):?> diff --git a/extension/lite/story/ext/view/view.html.php b/extension/lite/story/ext/view/view.html.php index 6636f8b094..716172554b 100644 --- a/extension/lite/story/ext/view/view.html.php +++ b/extension/lite/story/ext/view/view.html.php @@ -108,7 +108,14 @@ From de58e793b4be09e2fdef928626c7fd625c2b1bb5 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 25 Aug 2022 08:39:47 +0800 Subject: [PATCH 153/223] * Fix bug #26841. --- module/product/view/browse.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index 6e21e3e6c8..144fb11439 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -449,7 +449,7 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; echo "'; @@ -549,7 +549,7 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; 10; - $actionLink = $this->createLink('story', 'batchAssignTo', "productID=$productID"); + $actionLink = $this->createLink('story', 'batchAssignTo', "storyType=$storyType"); echo html::select('assignedTo', $users, '', 'class="hidden"'); ?> @@ -185,7 +181,7 @@ unset($lang->story->reviewResultList['revert']); foreach($lang->story->reviewResultList as $key => $result) { - $actionLink = $this->createLink('story', 'batchReview', "result=$key"); + $actionLink = $this->createLink('story', 'batchReview', "result=$key&reason=&storyType=requirement"); if($key == 'reject') { echo "
  • "; echo html::a('#', $reason, '', "onclick=\"setFormAction('$actionLink', 'hiddenwin')\""); echo "
  • "; @@ -218,7 +214,7 @@ 10; - $actionLink = $this->createLink('story', 'batchAssignTo'); + $actionLink = $this->createLink('story', 'batchAssignTo', 'storyType=requirement'); echo html::select('assignedTo', $users, '', 'class="hidden"'); if($withSearch) { diff --git a/module/product/css/browse.css b/module/product/css/browse.css index 1c3707a691..c2a8328f56 100644 --- a/module/product/css/browse.css +++ b/module/product/css/browse.css @@ -39,3 +39,4 @@ a.removeModule:hover {color: red;} #batchUnlinkStoryTip .table th:first-child {width: 460px;} #mainMenu .dropdown-menu>li>a>.icon {top: 4px;} #productStoryForm tbody tr td .label {max-width: 100px; text-overflow: unset;} +.c-span {margin-left: 19px;} diff --git a/module/story/model.php b/module/story/model.php index 3065c5edbf..a4868b8b69 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4710,7 +4710,8 @@ class storyModel extends model switch($id) { case 'id': - if($canBatchAction) echo html::checkbox('storyIdList', array($story->id => '')); + if($canBatchAction and ($storyType == 'story' or ($storyType == 'requirement' and $story->type == 'requirement'))) echo html::checkbox('storyIdList', array($story->id => '')); + if($canBatchAction and $storyType == 'requirement' and $story->type == 'story') echo ""; echo $canView ? html::a($storyLink, sprintf('%03d', $story->id), '', "data-app='$tab'") : sprintf('%03d', $story->id); break; case 'order': @@ -4735,7 +4736,7 @@ class storyModel extends model { $showBranch = isset($this->config->product->browse->showBranch) ? $this->config->product->browse->showBranch : 1; } - if($storyType == 'requirement') echo 'SR '; + if($storyType == 'requirement' and $story->type == 'story') echo 'SR '; if($story->parent > 0 and isset($story->parentName)) $story->title = "{$story->parentName} / {$story->title}"; if(isset($branches[$story->branch]) and $showBranch and $this->config->vision == 'rnd') echo "branch]}>{$branches[$story->branch]} "; if($story->module and isset($modulePairs[$story->module])) echo "{$modulePairs[$story->module]} "; From 2aff11fbd7a4147b8e225b8640c717f71768d3da Mon Sep 17 00:00:00 2001 From: liuhong Date: Thu, 25 Aug 2022 01:12:22 +0000 Subject: [PATCH 159/223] Fix bug #66226. --- module/productplan/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/productplan/control.php b/module/productplan/control.php index 224abbbdbb..3e681d4f96 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -732,7 +732,7 @@ class productplan extends control $this->productplan->unlinkStory($storyID, $planID); $this->loadModel('action')->create('productplan', $planID, 'unlinkstory', '', $storyID); - echo js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story"), 'parent'); + return js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story"), 'parent'); } } From cac2e8ddb39c76c1b5ec4a4736c4bff24508ea69 Mon Sep 17 00:00:00 2001 From: liuhong Date: Thu, 25 Aug 2022 01:16:07 +0000 Subject: [PATCH 160/223] *Fix bug #66226. --- module/productplan/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/productplan/control.php b/module/productplan/control.php index 3e681d4f96..d449f3da2e 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -732,7 +732,7 @@ class productplan extends control $this->productplan->unlinkStory($storyID, $planID); $this->loadModel('action')->create('productplan', $planID, 'unlinkstory', '', $storyID); - return js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story"), 'parent'); + return print js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story"), 'parent'); } } From 88e6b8c92eff085cc5caf47c2cf6b3f4d856e329 Mon Sep 17 00:00:00 2001 From: liuhong Date: Thu, 25 Aug 2022 01:22:35 +0000 Subject: [PATCH 161/223] *Fix bug #66226. --- module/productplan/control.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/productplan/control.php b/module/productplan/control.php index d449f3da2e..f1593811e5 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -732,7 +732,7 @@ class productplan extends control $this->productplan->unlinkStory($storyID, $planID); $this->loadModel('action')->create('productplan', $planID, 'unlinkstory', '', $storyID); - return print js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story"), 'parent'); + return print (js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story"), 'parent')); } } @@ -749,7 +749,7 @@ class productplan extends control { foreach($this->post->storyIdList as $storyID) $this->productplan->unlinkStory($storyID, $planID); $this->loadModel('action')->create('productplan', $planID, 'unlinkstory', '', implode(',', $this->post->storyIdList)); - echo js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story&orderBy=$orderBy"), 'parent'); + return print(js::locate($this->createLink('productplan', 'view', "planID=$planID&type=story&orderBy=$orderBy"), 'parent')); } /** @@ -876,7 +876,7 @@ class productplan extends control { foreach($this->post->bugIDList as $bugID) $this->productplan->unlinkBug($bugID); $this->loadModel('action')->create('productplan', $planID, 'unlinkbug', '', implode(',', $this->post->bugIDList)); - echo js::locate($this->createLink('productplan', 'view', "planID=$planID&type=bug&orderBy=$orderBy"), 'parent'); + return print (js::locate($this->createLink('productplan', 'view', "planID=$planID&type=bug&orderBy=$orderBy"), 'parent')); } /** From 1c1ccb2c6aac9c760e9fbb8be3e3b64f00e2877e Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 09:27:57 +0800 Subject: [PATCH 162/223] * Fix bug #26834. --- module/product/view/browse.html.php | 4 +++- module/story/model.php | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index 6e21e3e6c8..6cec51de0d 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -388,8 +388,10 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; $disabled = $canBatchEdit ? '' : "disabled='disabled'"; $actionLink = $this->createLink('story', 'batchEdit', "productID=$productID&projectID=$projectID&branch=$branch&storyType=$storyType"); ?> - edit, "data-form-action='$actionLink' $disabled");?> + edit, "data-form-action='$actionLink' $disabled");?> + + From 9408410fee9aa97f146c03de3a4072a22bc1d9fd Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 25 Aug 2022 09:56:42 +0800 Subject: [PATCH 166/223] * Fix bug #26846. --- module/story/view/batchclose.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/view/batchclose.html.php b/module/story/view/batchclose.html.php index 11ba36be4c..0c27cb184f 100755 --- a/module/story/view/batchclose.html.php +++ b/module/story/view/batchclose.html.php @@ -15,7 +15,7 @@ tab);?>
    -

    story->common . $lang->colon . $lang->story->batchClose;?>

    +

    SRCommon : $lang->URCommon) . $lang->colon . $lang->story->batchClose;?>

    From 723093c840c55495aa0f709c6433d26425740ef2 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 25 Aug 2022 10:01:58 +0800 Subject: [PATCH 167/223] * Fix bug for task #65808. --- module/common/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/common/model.php b/module/common/model.php index ca2401a3bd..4ad05649c9 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2117,8 +2117,8 @@ EOD; $select = ''; if($this->session->$typeOnlyCondition) { - if(strpos($orderBy, 'priOrder_') !== false) $select .= ", IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder"; - if(strpos($orderBy, 'severityOrder_') !== false) $select .= ", IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder"; + if(strpos($orderBy, 'priOrder') !== false) $select .= ", IF(`pri` = 0, {$this->config->maxPriValue}, `pri`) as priOrder"; + if(strpos($orderBy, 'severityOrder') !== false) $select .= ", IF(`severity` = 0, {$this->config->maxPriValue}, `severity`) as severityOrder"; $sql = $this->dao->select("*$select")->from($table) ->where($queryCondition) ->beginIF($orderBy != false)->orderBy($orderBy)->fi() From d764b13971b0e2aebbaaf422ca91ba3fd85c6400 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Thu, 25 Aug 2022 10:08:36 +0800 Subject: [PATCH 168/223] * Modify api param and app error. --- api/v1/entries/tabs.php | 2 +- api/v1/entries/user.php | 6 +++--- module/execution/control.php | 1 + module/message/model.php | 9 +++++---- module/webhook/model.php | 3 ++- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/api/v1/entries/tabs.php b/api/v1/entries/tabs.php index 9078299d8c..af0c938f46 100644 --- a/api/v1/entries/tabs.php +++ b/api/v1/entries/tabs.php @@ -29,7 +29,7 @@ class tabsEntry extends baseEntry foreach($tabs as $menuKey) { if(!isset($this->lang->my->$menuKey)) continue; - if(!common::hasPriv('my', $menuKey)) continue; + if(!common::hasPriv('my', 'work')) continue; $label = $this->lang->my->$menuKey; if($menuKey == 'calendar') $label = $this->lang->my->calendarAction; diff --git a/api/v1/entries/user.php b/api/v1/entries/user.php index 5a77a6b2af..8940d9ee05 100644 --- a/api/v1/entries/user.php +++ b/api/v1/entries/user.php @@ -254,7 +254,7 @@ class userEntry extends Entry if(!common::hasPriv('my', 'todo')) break; $control = $this->loadController('my', 'todo'); - $control->todo($this->param('date', 'all'), '', 'all', 'date_desc', 0, 0, $this->param('limit', 5), 1); + $control->todo($this->param('date', 'before'), '', 'all', 'date_desc', 0, $this->param('limit', 5), 1); $data = $this->getData(); if($data->status == 'success') @@ -313,7 +313,7 @@ class userEntry extends Entry { $this->config->openMethods[] = 'my.risk'; $control = $this->loadController('my', 'risk'); - $control->risk('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1); + $control->risk('assignedTo', 0, 'id_desc', 0, $this->param('limit', 5), 1); $data = $this->getData(); if($data->status == 'success') @@ -331,7 +331,7 @@ class userEntry extends Entry { $this->config->openMethods[] = 'my.myMeeting'; $control = $this->loadController('my', 'myMeeting'); - $control->myMeeting('all', '', 'id_desc', 0, $this->param('limit', 5), 1); + $control->myMeeting('futureMeeting', '', 'id_desc', 0, $this->param('limit', 5), 1); $data = $this->getData(); if($data->status == 'success') diff --git a/module/execution/control.php b/module/execution/control.php index 82b40a9cf1..dea8b3e57b 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -3752,6 +3752,7 @@ class execution extends control $this->view->pager = $pager; $this->view->orderBy = $orderBy; $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->projects = array('') + $this->project->getPairsByProgram(); $this->view->status = $status; $this->view->from = $from; $this->view->param = $param; diff --git a/module/message/model.php b/module/message/model.php index b640916bc4..1dd601e02c 100755 --- a/module/message/model.php +++ b/module/message/model.php @@ -155,10 +155,11 @@ class messageModel extends model $moduleName = $objectType == 'case' ? 'testcase' : $objectType; $moduleName = $objectType == 'kanbancard' ? 'kanban' : $objectType; - $space = common::checkNotCN() ? ' ' : ''; - $data = $user->realname . $space . $this->lang->action->label->$actionType . $space . $this->lang->action->objectTypes[$objectType]; - $dataID = $objectType == 'kanbancard' ? $object->kanban : $objectID; - $data .= ' ' . html::a($sysURL . helper::createLink($moduleName, 'view', "id=$dataID"), "[#{$objectID}::{$object->$field}]"); + $space = common::checkNotCN() ? ' ' : ''; + $data = $user->realname . $space . $this->lang->action->label->$actionType . $space . $this->lang->action->objectTypes[$objectType]; + $dataID = $objectType == 'kanbancard' ? $object->kanban : $objectID; + $url = helper::createLink($moduleName, 'view', "id=$dataID"); + $data .= ' ' . html::a((strpos($url, $sysURL) === 0 ? '' : $sysURL) . $url, "[#{$objectID}::{$object->$field}]"); if($isonlybody) $_GET['onlybody'] = 'yes'; diff --git a/module/webhook/model.php b/module/webhook/model.php index 02428402bd..f34a4ca685 100644 --- a/module/webhook/model.php +++ b/module/webhook/model.php @@ -487,10 +487,11 @@ class webhookModel extends model $tab = $meeting->project ? '#app=project' : '#app=my'; } + $sysUrl = common::getSysURL(); $viewLink = helper::createLink($objectType, 'view', "id=$objectID", 'html') . $tab; if($oldOnlyBody) $_GET['onlybody'] = $oldOnlyBody; - return $viewLink; + return ltrim($viewLink, $sysUrl); } /** From e0826b52714e7517fea53335c3f99dd076fde408 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 25 Aug 2022 10:16:51 +0800 Subject: [PATCH 169/223] * Fix bug of my requirement. --- module/my/view/requirement.html.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/module/my/view/requirement.html.php b/module/my/view/requirement.html.php index 647a909166..bd365b7a1c 100644 --- a/module/my/view/requirement.html.php +++ b/module/my/view/requirement.html.php @@ -151,20 +151,20 @@ } else { - common::printIcon('story', 'change', "$vars&from=&storyType=requirement", $child, 'list', 'alter', '', 'iframe', true); + common::printIcon('story', 'change', "$vars&from=&storyType=story", $child, 'list', 'alter', '', 'iframe', true); if(strpos('draft,changing', $child->status) !== false) { - common::printIcon('story', 'submitReview', "$vars&storyType=requirement", $child, 'list', 'sub-review', '', 'iframe', true); + common::printIcon('story', 'submitReview', "$vars&storyType=story", $child, 'list', 'sub-review', '', 'iframe', true); } else { - common::printIcon('story', 'review', "$vars&from=product&storyType=requirement", $child, 'list', 'search', '', 'iframe', true); + common::printIcon('story', 'review', "$vars&from=product&storyType=story", $child, 'list', 'search', '', 'iframe', true); } - common::printIcon('story', 'recall', "$vars&from=list&storyType=requirement", $child, 'list', 'undo', 'hiddenwin', '', '', '', $lang->story->recall); - common::printIcon('story', 'close', "$vars&from=&storyType=requirement", $child, 'list', '', '', 'iframe', true); - common::printIcon('story', 'edit', "$vars&from=default&storyType=requirement", $child, 'list'); + common::printIcon('story', 'recall', "$vars&from=list&storyType=story", $child, 'list', 'undo', 'hiddenwin', '', '', '', $lang->story->recall); + common::printIcon('story', 'close', "$vars&from=&storyType=story", $child, 'list', '', '', 'iframe', true); + common::printIcon('story', 'edit', "$vars&from=default&storyType=story", $child, 'list'); } } ?> From b964b5e17acc18b870e3d64add1e84e2d1292508 Mon Sep 17 00:00:00 2001 From: lanzongjun Date: Thu, 25 Aug 2022 10:20:05 +0800 Subject: [PATCH 170/223] * add import white list --- config/zentaopms.php | 2 ++ module/common/model.php | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/zentaopms.php b/config/zentaopms.php index 08fed1ce95..a10d6a941c 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -399,3 +399,5 @@ $config->waterfallModules = array('workestimation', 'durationestimation', 'budge $config->showMainMenu = true; $config->maxPriValue = '256'; + +$config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback'); \ No newline at end of file diff --git a/module/common/model.php b/module/common/model.php index c696f149b6..a1adfdcfcd 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2536,7 +2536,7 @@ EOD; $acls = $app->user->rights['acls']; /* White list of import method. */ - if(in_array($module, array('user', 'task', 'story', 'bug', 'testcase')) and $method == 'showimport') + if(in_array($module, $app->config->importWhiteList) and $method == 'showimport') { if(isset($rights[$module]['import']) and commonModel::hasDBPriv($object, $module, 'import')) return true; } From 90c9cdc9fac5dc42283abb812aa89ebe6fefe783 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Thu, 25 Aug 2022 10:34:32 +0800 Subject: [PATCH 171/223] * Add php 8.1 for package. --- tools/packDeb.php | 6 +++--- tools/packRpm.php | 6 +++--- tools/packZip.php | 15 +++++++++------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/tools/packDeb.php b/tools/packDeb.php index 25545d2555..8df6633a86 100644 --- a/tools/packDeb.php +++ b/tools/packDeb.php @@ -10,13 +10,13 @@ $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php5.4_5.6.zip"; $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php7.0.zip"; $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php7.1.zip"; $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php7.2_7.4.zip"; -$fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php8.0.zip"; +$fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php8.1.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php5.4_5.6.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php7.0.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php7.1.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php7.2_7.4.zip"; -$fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php8.0.zip"; +$fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php8.1.zip"; foreach($fileList as $file) if(!file_exists($file)) echo basename($file) . " is not exists\n"; @@ -30,7 +30,7 @@ foreach(array('zh-cn', 'en') as $langType) $dirName = $langType == 'zh-cn' ? 'zentaopms' : 'zentaoalm'; /* Cycle the php versions. */ - foreach(array('5.4_5.6', '7.0', '7.1', '7.2_7.4', '8.0') as $phpVersion) + foreach(array('5.4_5.6', '7.0', '7.1', '7.2_7.4', '8.1') as $phpVersion) { /* File name. */ $workDir = "tmp/$packPrefix.{$version}.{$phpVersion}/"; diff --git a/tools/packRpm.php b/tools/packRpm.php index 349b307df6..cb3e684f03 100644 --- a/tools/packRpm.php +++ b/tools/packRpm.php @@ -10,13 +10,13 @@ $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php5.4_5.6.zip"; $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php7.0.zip"; $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php7.1.zip"; $fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php7.2_7.4.zip"; -$fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php8.0.zip"; +$fileList[] = "{$basePath}/ZenTaoPMS.$pmsVersion.php8.1.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php5.4_5.6.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php7.0.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php7.1.zip"; $fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php7.2_7.4.zip"; -$fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php8.0.zip"; +$fileList[] = "{$basePath}/ZenTaoALM.$pmsVersion.int.php8.1.zip"; foreach($fileList as $file) if(!file_exists($file)) echo basename($file) . " is not exists\n"; @@ -30,7 +30,7 @@ foreach(array('zh-cn', 'en') as $langType) $dirName = $langType == 'zh-cn' ? 'zentaopms' : 'zentaoalm'; /* Cycle the php versions. */ - foreach(array('5.4_5.6', '7.0', '7.1', '7.2_7.4', '8.0') as $phpVersion) + foreach(array('5.4_5.6', '7.0', '7.1', '7.2_7.4', '8.1') as $phpVersion) { /* File name. */ $workDir = "tmp/$packPrefix.{$version}.{$phpVersion}/"; diff --git a/tools/packZip.php b/tools/packZip.php index ea7abd8064..6709315202 100644 --- a/tools/packZip.php +++ b/tools/packZip.php @@ -21,11 +21,13 @@ $fileList[] = "{$basePath}/zentaobiz.php5.4_5.6.zip"; $fileList[] = "{$basePath}/zentaobiz.php7.0.zip"; $fileList[] = "{$basePath}/zentaobiz.php7.1.zip"; $fileList[] = "{$basePath}/zentaobiz.php7.2_7.4.zip"; +$fileList[] = "{$basePath}/zentaobiz.php8.1.zip"; $fileList[] = "{$basePath}/zentaomax.php5.4_5.6.zip"; $fileList[] = "{$basePath}/zentaomax.php7.0.zip"; $fileList[] = "{$basePath}/zentaomax.php7.1.zip"; $fileList[] = "{$basePath}/zentaomax.php7.2_7.4.zip"; +$fileList[] = "{$basePath}/zentaomax.php8.1.zip"; foreach($fileList as $file) if(!file_exists($file)) echo basename($file) . " is not exists\n"; @@ -33,10 +35,12 @@ foreach($fileList as $file) if(!file_exists($file)) echo basename($file) . " is `unzip {$basePath}/zentaobiz.php7.0.zip; mv biz zentaobiz.php7.0`; `unzip {$basePath}/zentaobiz.php7.1.zip; mv biz zentaobiz.php7.1`; `unzip {$basePath}/zentaobiz.php7.2_7.4.zip; mv biz zentaobiz.php7.2_7.4`; +`unzip {$basePath}/zentaobiz.php8.1.zip; mv biz zentaobiz.php8.1`; `unzip {$basePath}/zentaomax.php5.4_5.6.zip; mv max zentaomax.php5.4_5.6`; `unzip {$basePath}/zentaomax.php7.0.zip; mv max zentaomax.php7.0`; `unzip {$basePath}/zentaomax.php7.1.zip; mv max zentaomax.php7.1`; `unzip {$basePath}/zentaomax.php7.2_7.4.zip; mv max zentaomax.php7.2_7.4`; +`unzip {$basePath}/zentaomax.php8.1.zip; mv max zentaomax.php8.1`; /* Create shells to make zip format packages. */ $shellList = array(); @@ -48,12 +52,11 @@ foreach(array('zh-cn', 'en') as $langType) $dirName = $langType == 'zh-cn' ? 'zentaopms' : 'zentaoalm'; /* Cycle the php versions. */ - foreach(array('5.4_5.6', '7.0', '7.1', '7.2_7.4', '8.0') as $phpVersion) + foreach(array('5.4_5.6', '7.0', '7.1', '7.2_7.4', '8.1') as $phpVersion) { /* File name. */ - $workDir = "tmp/$packPrefix.{$version}.{$phpVersion}/"; - $shellName = $workDir . "make.sh"; - $encryptedPhpVersion = $phpVersion == '8.0' ? '7.2_7.4' : $phpVersion; + $workDir = "tmp/$packPrefix.{$version}.{$phpVersion}/"; + $shellName = $workDir . "make.sh"; echo "Creating $shellName\n"; mkdir($workDir, 0777, true); @@ -63,8 +66,8 @@ foreach(array('zh-cn', 'en') as $langType) //$command .= "if [ ! -d ../$dirName ]; then unzip ../../$packPrefix.{$version}.zip -d ../ ; fi\n"; $command .= "unzip ../../$packPrefix.{$version}.zip\n"; //$command .= "cp -raf ../$dirName .\n"; - $command .= "cp -rf ../../zentaobiz.php$encryptedPhpVersion/* $dirName/\n"; - $command .= "cp -rf ../../zentaomax.php$encryptedPhpVersion/* $dirName/\n"; + $command .= "cp -rf ../../zentaobiz.php$phpVersion/* $dirName/\n"; + $command .= "cp -rf ../../zentaomax.php$phpVersion/* $dirName/\n"; $command .= "zip -r ../../$packPrefix.{$version}.php{$phpVersion}.zip $dirName\n"; $command .= "rm -rf $dirName/\n"; From c6220519b15db53c8ed55b570d6c88b6f82b29c6 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 10:40:26 +0800 Subject: [PATCH 172/223] * Modify the required fields on the page for creating a task are incorrect. --- module/task/view/create.html.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/module/task/view/create.html.php b/module/task/view/create.html.php index 720502042d..68d2055eeb 100644 --- a/module/task/view/create.html.php +++ b/module/task/view/create.html.php @@ -21,9 +21,6 @@ error->notempty, $lang->task->estimate))?> lifetime);?> - - - task->create->requiredFields) as $field) From cc3ebce871a17d4076a5fffbed59594a64edd370 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 10:42:34 +0800 Subject: [PATCH 173/223] * Fix bug #26862. --- module/product/view/browse.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index 63d643e367..0bf15441d8 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -388,8 +388,8 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; $disabled = $canBatchEdit ? '' : "disabled='disabled'"; $actionLink = $this->createLink('story', 'batchEdit', "productID=$productID&projectID=$projectID&branch=$branch&storyType=$storyType"); ?> - edit, "data-form-action='$actionLink' $disabled");?> - + edit, "data-form-action='$actionLink' $disabled");?> +
    From fa9ea8cdcad57ff88e19c1e43edf1d64e6dc26ce Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Thu, 25 Aug 2022 11:16:44 +0800 Subject: [PATCH 175/223] * Calculate height in html format. --- module/doc/view/createtexttype.html.php | 3 +-- module/doc/view/edittexttype.html.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/module/doc/view/createtexttype.html.php b/module/doc/view/createtexttype.html.php index af17839cb6..f74ded32e3 100644 --- a/module/doc/view/createtexttype.html.php +++ b/module/doc/view/createtexttype.html.php @@ -158,8 +158,7 @@ $(function() { var contentHeight = $(document).height() - 120; - setTimeout(function(){$('.ke-edit-iframe, .ke-edit').height(contentHeight);}, 100); - setTimeout(function(){$('.CodeMirror').height(contentHeight);}, 100); + setTimeout(function(){$('.ke-edit-iframe, .ke-edit, .ke-edit-textarea, .CodeMirror').height(contentHeight);}, 100); $(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');}); diff --git a/module/doc/view/edittexttype.html.php b/module/doc/view/edittexttype.html.php index 137a001a85..f15cd256e0 100644 --- a/module/doc/view/edittexttype.html.php +++ b/module/doc/view/edittexttype.html.php @@ -155,8 +155,7 @@ $(function() { var contentHeight = $(document).height() - 100; - setTimeout(function(){$('.ke-edit-iframe, .ke-edit').height(contentHeight);}, 100); - setTimeout(function(){$('.CodeMirror').height(contentHeight);}, 100); + setTimeout(function(){$('.ke-edit-iframe, .ke-edit, .ke-edit-textarea, .CodeMirror').height(contentHeight);}, 100); $(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');}); From 7f90361e59ea30a46213d1183719b9a9b5eee95b Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 25 Aug 2022 03:30:54 +0000 Subject: [PATCH 176/223] * Fix sprint231 bugs --- module/story/control.php | 4 ++++ module/story/js/edit.js | 6 ++++++ module/story/view/batchclose.html.php | 4 ++-- module/story/view/edit.html.php | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 430e243ea7..f5ec022331 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -853,6 +853,9 @@ class story extends control /* Process the module when branch products are switched to normal products. */ if($product->type == 'normal' and !empty($story->branch)) $this->view->moduleOptionMenu += $this->tree->getModulesName($story->module); + $branch = $product->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all'; + $productStories = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, ''); + $this->view->title = $this->lang->story->edit . "STORY" . $this->lang->colon . $this->view->story->title; $this->view->position[] = $this->lang->story->edit; $this->view->story = $story; @@ -861,6 +864,7 @@ class story extends control $this->view->product = $product; $this->view->plans = $this->loadModel('productplan')->getPairsForStory($story->product, $story->branch == 0 ? 'all' : $story->branch, 'skipParent'); $this->view->products = $products; + $this->view->productStories = $productStories; $this->view->branchOption = $branchOption; $this->view->branchTagOption = $branchTagOption; $this->view->reviewers = array_keys($reviewerList); diff --git a/module/story/js/edit.js b/module/story/js/edit.js index 852681c02f..8f012085db 100644 --- a/module/story/js/edit.js +++ b/module/story/js/edit.js @@ -79,4 +79,10 @@ $(function() var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '95%', url: link}); modalTrigger.show(); }); + + $('#duplicateStory').picker( + { + disableEmptySearch : true, + dropWidth : 'auto' + }); }) diff --git a/module/story/view/batchclose.html.php b/module/story/view/batchclose.html.php index 0c27cb184f..3125507ffe 100755 --- a/module/story/view/batchclose.html.php +++ b/module/story/view/batchclose.html.php @@ -38,12 +38,12 @@
    resolution != 'duplicate') echo "style='display:none'";?>> - + diff --git a/module/bug/view/resolve.html.php b/module/bug/view/resolve.html.php index a9d91cffb2..12e1e27e31 100644 --- a/module/bug/view/resolve.html.php +++ b/module/bug/view/resolve.html.php @@ -38,7 +38,7 @@ js::set('productID' , $bug->product); - + diff --git a/module/story/control.php b/module/story/control.php index f5ec022331..f2ddb20508 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -26,6 +26,7 @@ class story extends control $this->loadModel('tree'); $this->loadModel('user'); $this->loadModel('action'); + } /** @@ -747,6 +748,7 @@ class story extends control */ public function edit($storyID, $kanbanGroup = 'default', $storyType = 'story') { + $this->app->loadLang('bug'); $story = $this->story->getById($storyID, 0, true); if(!empty($_POST)) @@ -1611,6 +1613,7 @@ class story extends control */ public function close($storyID, $from = '', $storyType = 'story') { + $this->app->loadLang('bug'); $story = $this->story->getById($storyID); if(!empty($_POST)) @@ -1712,6 +1715,7 @@ class story extends control */ public function batchClose($productID = 0, $executionID = 0, $storyType = 'story', $from = '') { + $this->app->loadLang('bug'); if(!$this->post->storyIdList) return print(js::locate($this->session->storyList, 'parent')); $storyIdList = $this->post->storyIdList; $storyIdList = array_unique($storyIdList); diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 38beb03d80..d68a60cd42 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -155,7 +155,7 @@ $lang->story->childrenAB = "C"; $lang->story->linkStories = 'Story verknüpfen'; $lang->story->linkRequirements = "Linked {$lang->URCommon}"; $lang->story->childStories = 'Story aufteilen'; -$lang->story->duplicateStory = 'Story ID kopieren'; +$lang->story->duplicateStory = 'Story kopieren'; $lang->story->reviewResult = 'Ergbnis prüfen'; $lang->story->reviewResultAB = 'Bewertungsergebnisse'; $lang->story->preVersion = 'Frühere Version'; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index 0814bc98d0..8001b3e6e7 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -155,7 +155,7 @@ $lang->story->childrenAB = "C"; $lang->story->linkStories = 'Linked Story'; $lang->story->linkRequirements = "Linked {$lang->URCommon}"; $lang->story->childStories = 'Decomposed Story'; -$lang->story->duplicateStory = 'Duplicated Story ID'; +$lang->story->duplicateStory = 'Duplicated Story'; $lang->story->reviewResult = 'Review Result'; $lang->story->reviewResultAB = 'Assessment results'; $lang->story->preVersion = 'Last Version'; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index 6904949d10..573de4d391 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -155,7 +155,7 @@ $lang->story->childrenAB = "C"; $lang->story->linkStories = 'Stories Liées'; $lang->story->linkRequirements = "{$lang->URCommon} Lié es"; $lang->story->childStories = 'Stories Décomposées'; -$lang->story->duplicateStory = 'Story ID Dupliquées'; +$lang->story->duplicateStory = 'Story Dupliquées'; $lang->story->reviewResult = 'Résultat Validation'; $lang->story->reviewResultAB = 'Résultats de lévaluation'; $lang->story->preVersion = 'Dernière Version'; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 9b854de29b..bf5f5b8528 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -155,7 +155,7 @@ $lang->story->childrenAB = "子"; $lang->story->linkStories = "相关{$lang->SRCommon}"; $lang->story->linkRequirements = "相关{$lang->URCommon}"; $lang->story->childStories = "细分需求"; -$lang->story->duplicateStory = "重复需求ID"; +$lang->story->duplicateStory = "重复需求"; $lang->story->reviewResult = '评审意见'; $lang->story->reviewResultAB = '评审结果'; $lang->story->preVersion = '之前版本'; diff --git a/module/story/view/batchclose.html.php b/module/story/view/batchclose.html.php index 3125507ffe..15d999f9fb 100755 --- a/module/story/view/batchclose.html.php +++ b/module/story/view/batchclose.html.php @@ -44,7 +44,7 @@ - + diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index d8ddeac626..74043a0151 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -285,7 +285,7 @@
    story->module;?> +
    "; echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=story¤tModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='90%'"); echo '  '; - echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'"); + echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='refresh' onclick='loadProductModules($productID)'"); echo '
    '; } ?> @@ -48,21 +56,13 @@
    story->reviewedBy;?>' id='reviewerBox'> +
    + story->checkForceReview() ? 'required' : '';?> + story->checkForceReview() ? '' : html::hidden('needNotReview', 1);?>
    - PO : '', "class='form-control chosen' multiple");?> + PO : '', "class='form-control picker-select' multiple $required");?>
    - story->checkForceReview()):?> -
    - -
    - /> - -
    -
    -
    -
    story->status;?>
    story->legendAttatch;?>story->mailto;?>
    - chooseUsersToMail}' multiple");?> + chooseUsersToMail}' multiple");?> fetch('my', 'buildContactLists');?>
    - + + save, "id='saveButton'", 'btn btn-primary btn-wide');?> + story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?>
    story->mailto;?>
    - mailto), "class='form-control chosen' multiple");?> + mailto), "class='form-control picker-select' multiple");?> fetch('my', 'buildContactLists');?>
    story->assignedTo;?>assignedTo, 'class="form-control chosen"');?>assignedTo, 'class="form-control chosen"');?>
    story->reviewers;?>
    id", $child, 'list', 'alter'); - common::printIcon('story', 'review', "storyID=$child->id", $child, 'list', 'search', '', 'iframe showinonlybody', true); + if(strpos('draft,changing', $child->status) !== false) + { + common::printIcon('story', 'submitReview', "storyID=$child->id", $child, 'list', 'sub-review', '', 'iframe showinonlybody', true); + } + else + { + common::printIcon('story', 'review', "storyID=$child->id", $child, 'list', 'search', '', 'iframe showinonlybody', true); + } common::printIcon('story', 'assignTo', "storyID=$child->id", $child, 'list', '', '', 'iframe showinonlybody', true); common::printIcon('story', 'close', "storyID=$child->id", $child, 'list', '', '', 'iframe showinonlybody', true); common::printIcon('story', 'activate', "storyID=$child->id", $child, 'list', '', '', 'iframe showinonlybody', true); @@ -134,7 +141,14 @@ deleted):?> id", $story, 'button', 'alter', '', 'showinonlybody'); - common::printIcon('story', 'review', "storyID=$story->id", $story, 'button', 'search', '', 'showinonlybody'); + if(strpos('draft,changing', $story->status) !== false) + { + common::printIcon('story', 'submitReview', "storyID=$story->id", $story, 'button', 'sub-review', '', 'iframe showinonlybody', true); + } + else + { + common::printIcon('story', 'review', "storyID=$story->id", $story, 'button', 'search', '', 'iframe showinonlybody', true); + } if($story->status == 'active' and $story->stage == 'wait' and $story->parent <= 0 and !isonlybody()) { $divideLang = $lang->story->subdivide; diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index 64adfb65e5..b035884158 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -147,16 +147,11 @@ foreach(explode(',', $config->story->create->requiredFields) as $field) story->reviewedBy;?>
    - story->checkForceReview()):?> + story->checkForceReview() ? 'required' : '';?> + story->checkForceReview() ? '' : html::hidden('needNotReview', 1);?>
    - PO : '', "class='form-control picker-select' multiple");?> + PO : '', "class='form-control picker-select' multiple $required");?>
    - - -
    - PO : '', "class='form-control picker-select' multiple required");?> -
    -
    @@ -119,12 +120,7 @@ children)) ? ' table-child-bottom' : '';?>
    - -
    - - -
    - + id);?>
    pri;?>' title='story->priList, $child->pri, $child->pri);?>'>story->priList, $child->pri, $child->pri);?>processStatus('story', $story);?> status == 'draft') unset($reasonList['cancel']);?> - +
    -
    ' closedReason != 'duplicate') echo "style='display:none'";?>> + ' closedReason != 'duplicate') echo "style='display:none'";?>> product][$story->branch], $story->duplicateStory, "class='form-control' placeholder='{$lang->idAB}'");?> ' closedReason != 'subdivided') echo "style='display:none'";?>> diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index 7ba57f8114..cf0718f6ab 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -285,7 +285,7 @@ - + From 06ab4ea7a584ee478a4973b4523daf68eee5a61f Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 13:06:38 +0800 Subject: [PATCH 177/223] * Fix bug #26862. --- module/product/view/browse.html.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index 0bf15441d8..43f642332b 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -458,6 +458,11 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; if($withSearch) echo ""; echo ''; } + else + { + $class= "class='disabled'"; + echo "
  • " . html::a('javascript:;', $lang->product->branchName[$this->session->currentProductType], '', $class) . '
  • '; + } if($storyType == 'story') { From 5ddd08d2e40fa17c75e6f05ea909f8c3cc97ac6a Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Thu, 25 Aug 2022 13:14:14 +0800 Subject: [PATCH 178/223] * Fix bug #26849. --- module/testcase/view/caseheader.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/testcase/view/caseheader.html.php b/module/testcase/view/caseheader.html.php index f440b8306e..f65de1485b 100644 --- a/module/testcase/view/caseheader.html.php +++ b/module/testcase/view/caseheader.html.php @@ -130,7 +130,7 @@ $class = common::hasPriv('testcase', 'exportTemplate') ? '' : "class=disabled"; $misc = common::hasPriv('testcase', 'exportTemplate') ? "class='export'" : "class=disabled"; $link = common::hasPriv('testcase', 'exportTemplate') ? $this->createLink('testcase', 'exportTemplate', "productID=$productID") : '#'; - echo "
  • " . html::a($link, $lang->testcase->exportTemplate, '', $misc . "data-app={$this->app->tab} data-width='60%'") . "
  • "; + echo "
  • " . html::a($link, $lang->testcase->exportTemplate, '', $misc . "data-app={$this->app->tab} data-width='65%'") . "
  • "; ?> From 3c7a896b3a3acc77591ad4bbfcd53e3c8eb077cf Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 25 Aug 2022 13:33:56 +0800 Subject: [PATCH 179/223] * Fix bug #26607. --- module/doc/model.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/doc/model.php b/module/doc/model.php index f25b659ee5..4c7105951e 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -930,6 +930,8 @@ class docModel extends model { $this->loadModel('product'); + if($this->app->getMethodName() == 'objectlibs') $type = 'objectlibs'; + if($this->app->rawMethod == 'contribute') { $this->config->doc->search['module'] = 'contributeDoc'; From cebd16d8ea4fdcf810f8ca86c4105f2444b5e6f5 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 25 Aug 2022 13:35:56 +0800 Subject: [PATCH 180/223] * Fix bug#26859. --- module/story/model.php | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 2ffa1e3596..71c9352f68 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4214,7 +4214,7 @@ class storyModel extends model if(strpos('draft,changing', $story->status) !== false) { - $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id&storyType=$story->type", $story, $type, 'sub-review', '', 'iframe', true, "data-width='50%'"); + $menu .= $this->buildMenu('story', 'submitReview', "storyID=$story->id&storyType=$story->type", $story, $type, 'confirm', '', 'iframe', true, "data-width='50%'"); } else { @@ -4291,7 +4291,7 @@ class storyModel extends model if($type == 'view') { $menu .= $this->buildMenu('story', 'change', $params . "&from=&storyType=$story->type", $story, $type, 'alter', '', 'showinonlybody'); - if(strpos('draft,changing', $story->status) !== false) $menu .= $this->buildMenu('story', 'submitReview', $params . "&storyType=$story->type", $story, $type, 'sub-review', '', 'showinonlybody iframe', true, "data-width='50%'"); + if(strpos('draft,changing', $story->status) !== false) $menu .= $this->buildMenu('story', 'submitReview', $params . "&storyType=$story->type", $story, $type, 'confirm', '', 'showinonlybody iframe', true, "data-width='50%'"); $title = $story->status == 'changing' ? $this->lang->story->recallChange : $this->lang->story->recall; $menu .= $this->buildMenu('story', 'recall', $params . "&from=view&confirm=no&storyType=$story->type", $story, $type, 'undo', 'hiddenwin', 'showinonlybody', false, '', $title); @@ -4355,17 +4355,25 @@ class storyModel extends model $story->reviewer = isset($story->reviewer) ? $story->reviewer : array(); $story->notReview = isset($story->notReview) ? $story->notReview : array(); - if(common::hasPriv('story', 'review')) + if(strpos('draft,changing', $story->status) !== false) { - $reviewDisabled = in_array($this->app->user->account, $story->notReview) and ($story->status == 'draft' or $story->status == 'changing') ? '' : 'disabled'; - $story->from = 'execution'; - $menu .= common::printIcon('story', 'review', "story={$story->id}&from=story", $story, 'list', 'search', '', $reviewDisabled, false, "data-group=execution"); + if(common::hasPriv('story', 'submitReview')) $menu .= common::printIcon('story', 'submitReview', "storyID=$story->id&from=story", $story, 'list', 'confirm', '', 'iframe', true, "data-width='50%'"); + } + else + { + if(common::hasPriv('story', 'review')) + { + $reviewDisabled = in_array($this->app->user->account, $story->notReview) and ($story->status == 'draft' or $story->status == 'changing') ? '' : 'disabled'; + $story->from = 'execution'; + $menu .= common::printIcon('story', 'review', "story={$story->id}&from=story", $story, 'list', 'search', '', $reviewDisabled, false, "data-group=execution"); + } } if(common::hasPriv('story', 'recall')) { $recallDisabled = empty($story->reviewedBy) and strpos('draft,changing', $story->status) !== false and !empty($story->reviewer) ? '' : 'disabled'; - $menu .= common::printIcon('story', 'recall', "story={$story->id}", $story, 'list', 'undo', 'hiddenwin', $recallDisabled, '', '', $this->lang->story->recall); + $title = $story->status == 'changing' ? $this->lang->story->recallChange : $this->lang->story->recall; + $menu .= common::printIcon('story', 'recall', "story={$story->id}", $story, 'list', 'undo', 'hiddenwin', $recallDisabled, '', '', $title); } $this->lang->task->create = $this->lang->execution->wbs; From 1bef0993ae964d4854030ed56009a7fdcfdc8e82 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 25 Aug 2022 14:16:54 +0800 Subject: [PATCH 181/223] * Fix bug#26873. --- module/story/view/edit.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index cf0718f6ab..03ccdc9fda 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -240,7 +240,7 @@
    From 6245e0423362cf3abec59c7d4ee941e149847e85 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 25 Aug 2022 14:45:02 +0800 Subject: [PATCH 182/223] * Fix bug#26870. --- extension/lite/group/ext/lang/resource.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extension/lite/group/ext/lang/resource.php b/extension/lite/group/ext/lang/resource.php index 7fe9577dbd..45d77bcd6f 100644 --- a/extension/lite/group/ext/lang/resource.php +++ b/extension/lite/group/ext/lang/resource.php @@ -261,6 +261,7 @@ $lang->resource->story->delete = 'deleteAction'; $lang->resource->story->view = 'view'; $lang->resource->story->change = 'changeAction'; $lang->resource->story->review = 'reviewAction'; +$lang->resource->story->submitReview = 'submitReview'; $lang->resource->story->batchReview = 'batchReview'; $lang->resource->story->recall = 'recall'; $lang->resource->story->assignTo = 'assignAction'; @@ -289,6 +290,7 @@ $lang->story->methodOrder[25] = 'delete'; $lang->story->methodOrder[30] = 'view'; $lang->story->methodOrder[35] = 'change'; $lang->story->methodOrder[40] = 'review'; +$lang->story->methodOrder[44] = 'submitReview'; $lang->story->methodOrder[45] = 'batchReview'; $lang->story->methodOrder[50] = 'recall'; $lang->story->methodOrder[55] = 'close'; From 766d166a5b9d14cf72c383a314dfaa5ce96dba8b Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 14:46:07 +0800 Subject: [PATCH 183/223] * Fix bug #26879. --- module/story/view/edit.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index cf0718f6ab..d8ddeac626 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -288,10 +288,10 @@ - + From d1576572ff653f56abf830c483f72a4c2359b76b Mon Sep 17 00:00:00 2001 From: liuhong Date: Thu, 25 Aug 2022 06:49:05 +0000 Subject: [PATCH 184/223] *Fix bug --- extension/lite/my/ext/view/task.html.php | 5 +++-- module/block/view/taskblock.html.php | 7 +++++-- module/my/view/task.html.php | 5 +++-- module/user/view/task.html.php | 7 +++++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/extension/lite/my/ext/view/task.html.php b/extension/lite/my/ext/view/task.html.php index 032ccfee7a..01f53c561d 100644 --- a/extension/lite/my/ext/view/task.html.php +++ b/extension/lite/my/ext/view/task.html.php @@ -95,8 +95,9 @@ } else { - $class = ($task->executionType == 'kanban') ? 'iframe' : ''; - echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'"); + $onlybody = $task->executionType == 'kanban' ? true : ''; + $class = $task->executionType == 'kanban' ? 'iframe' : ''; + echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'"); } ?> children)) echo '';?> diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index aacaca3a69..1a40a154b9 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -44,8 +44,11 @@ - executionType == 'kanban') ? 'iframe' : '';?> - + executionType == 'kanban' ? true : ''; + $class = $task->executionType == 'kanban' ? "class='iframe' data-toggle='modal'" : ''; + ?> + diff --git a/module/my/view/task.html.php b/module/my/view/task.html.php index 14af9270fd..69b47b7bfc 100644 --- a/module/my/view/task.html.php +++ b/module/my/view/task.html.php @@ -108,8 +108,9 @@ } else { - $class = ($task->executionType == 'kanban') ? 'iframe' : ''; - echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'"); + $onlybody = $task->executionType == 'kanban' ? true : ''; + $class = $task->executionType == 'kanban' ? 'iframe' : ''; + echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'"); } ?> children)) echo '';?> diff --git a/module/user/view/task.html.php b/module/user/view/task.html.php index 8c9999fd4d..0dbd01df7d 100644 --- a/module/user/view/task.html.php +++ b/module/user/view/task.html.php @@ -61,8 +61,11 @@ From 84cd1e4835c21388ee37d5992d5174aa9c180ab0 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 25 Aug 2022 14:56:39 +0800 Subject: [PATCH 185/223] * Fix bug#26878. --- module/story/view/view.html.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index 572e439daa..6d1934c703 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -326,7 +326,17 @@ - +
    story->duplicateStory;?>duplicateStory == 0 ? '' : $story->duplicateStory, "class='form-control'");?>duplicateStory, 'class="form-control"'); ?>
    story->linkStory;?>story->mailto;?>
    - mailto), "class='form-control picker-select' multiple");?> + mailto, "class='form-control picker-select' multiple");?> fetch('my', 'buildContactLists');?>
    duplicateStory, 'class="form-control"'); ?>
    story->linkStory;?>type == 'story' ? $lang->requirement->linkStory : $lang->story->linkStory;?> type == 'story') echo html::a("#", $lang->story->linkStoriesAB, '', "class='btn btn-info' id='linkStoriesLink'");?> - type == 'requirement') echo html::a("#", $lang->story->linkRequirementsAB, '', "class='btn btn-info' id='linkStoriesLink'");?> + type == 'requirement') echo html::a("#", $lang->story->linkRequirementsAB, '', "class='btn btn-info' id='linkStoriesLink'");?>
    id);?> task->priList, $task->pri, $task->pri)?>createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' data-toggle='modal'")?>createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "$class data-width='80%'")?> estimate . $lang->execution->workHourUnit;?> deadline, 0, 4) > 0) echo $task->deadline;?> team)) echo '' . $this->lang->task->multipleAB . ' ';?> parent > 0) echo '' . $this->lang->task->childrenAB . ' ';?> - executionType == 'kanban') ? 'iframe' : '';?> - createLink('task', 'view', "taskID=$task->id", '', true, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");?> + executionType == 'kanban' ? true : ''; + $class = $task->executionType == 'kanban' ? 'iframe' : ''; + ?> + createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");?> estimate . $lang->execution->workHourUnit;?> consumed . $lang->execution->workHourUnit;?>
    story->legendMailto;?>mailto); foreach($mailto as $account) {if(empty($account)) continue; echo "" . zget($users, trim($account)) . '  '; }?> + mailto)) + { + foreach(explode(',', $story->mailto) as $account) + { + if(empty($account)) continue; echo "" . zget($users, trim($account)) . '  '; + } + } + ?> +
    From 8afdaa7d27b7c914035ba43273271583f92a2180 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 25 Aug 2022 15:15:14 +0800 Subject: [PATCH 186/223] * Fix bug #26887. --- module/group/lang/resource.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 01dce8d056..a0ff9f225b 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -491,7 +491,7 @@ $lang->resource->story = new stdclass(); $lang->resource->story->create = 'create'; $lang->resource->story->batchCreate = 'batchCreate'; $lang->resource->story->edit = 'editAction'; -$lang->resource->story->linkStory = 'linkStory'; +if($config->URAndSR) $lang->resource->story->linkStory = 'linkStory'; $lang->resource->story->batchEdit = 'batchEdit'; $lang->resource->story->export = 'exportAction'; $lang->resource->story->delete = 'deleteAction'; @@ -540,7 +540,7 @@ $lang->story->methodOrder[90] = 'tasks'; $lang->story->methodOrder[95] = 'bugs'; $lang->story->methodOrder[100] = 'cases'; $lang->story->methodOrder[105] = 'report'; -$lang->story->methodOrder[110] = 'linkStory'; +if($config->URAndSR) $lang->story->methodOrder[110] = 'linkStory'; $lang->story->methodOrder[115] = 'batchChangeBranch'; $lang->story->methodOrder[120] = 'batchChangeModule'; $lang->story->methodOrder[125] = 'batchToTask'; From 704de14c419ae8bff7a5934ba8270f5b89f73513 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 15:22:56 +0800 Subject: [PATCH 187/223] * Fix bug #26880. --- module/product/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/product/model.php b/module/product/model.php index f953febae7..84d41ea26e 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -1077,7 +1077,7 @@ class productModel extends model $modules = array(); $branchList = $this->loadModel('branch')->getPairs($productID, '', $projectID); $branchModuleList = $this->tree->getOptionMenu($productID, 'story', 0, array_keys($branchList)); - foreach($branchModuleList as $branchID => $branchModules) $modules[] = $branchModules; + foreach($branchModuleList as $branchID => $branchModules) $modules = array_merge($modules, $branchModules); } else { From ad240eab6171c76248ef9da18b58d50771b5c123 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 15:28:47 +0800 Subject: [PATCH 188/223] * Fix bug #26889. --- module/execution/config.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/module/execution/config.php b/module/execution/config.php index 10694f9e4f..163e64c818 100644 --- a/module/execution/config.php +++ b/module/execution/config.php @@ -179,10 +179,13 @@ if(!isset($config->setCode) or $config->setCode == 1) { $config->execution->datatable->defaultField = array('id', 'name', 'code', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn'); } -else +elseif($config->systemMode == 'new') { $config->execution->datatable->defaultField = array('id', 'name', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn'); } +{ + $config->execution->datatable->defaultField = array('id', 'name', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn'); +} $config->execution->datatable->fieldList['id']['title'] = 'idAB'; $config->execution->datatable->fieldList['id']['fixed'] = 'left'; @@ -202,10 +205,13 @@ if(!isset($config->setCode) or $config->setCode == 1) $config->execution->datatable->fieldList['code']['required'] = 'no'; } -$config->execution->datatable->fieldList['project']['title'] = 'project'; -$config->execution->datatable->fieldList['project']['fixed'] = 'no'; -$config->execution->datatable->fieldList['project']['width'] = '100'; -$config->execution->datatable->fieldList['project']['required'] = 'no'; +if($config->systemMode == 'new') +{ + $config->execution->datatable->fieldList['project']['title'] = 'project'; + $config->execution->datatable->fieldList['project']['fixed'] = 'no'; + $config->execution->datatable->fieldList['project']['width'] = '100'; + $config->execution->datatable->fieldList['project']['required'] = 'no'; +} $config->execution->datatable->fieldList['PM']['title'] = 'owner'; $config->execution->datatable->fieldList['PM']['fixed'] = 'no'; From 147cdbec67956a5d07e419769729549aa4cfc36f Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 25 Aug 2022 15:31:02 +0800 Subject: [PATCH 189/223] * Fix bug#26881. --- module/story/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/model.php b/module/story/model.php index 71c9352f68..3b0ba376e7 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -784,7 +784,7 @@ class storyModel extends model return false; } - if($this->checkForceReview() and empty($_POST['reviewer'])) + if(strpos('draft,changing', $oldStory->status) !== false and $this->checkForceReview() and empty($_POST['reviewer'])) { dao::$errors[] = $this->lang->story->errorEmptyReviewedBy; return false; From db036c91721f5e4c7374ea7dd78271632abfa1cb Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 15:31:31 +0800 Subject: [PATCH 190/223] * Fix bug #26879. --- module/execution/config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/execution/config.php b/module/execution/config.php index 163e64c818..ae894c97ea 100644 --- a/module/execution/config.php +++ b/module/execution/config.php @@ -183,6 +183,7 @@ elseif($config->systemMode == 'new') { $config->execution->datatable->defaultField = array('id', 'name', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn'); } +else { $config->execution->datatable->defaultField = array('id', 'name', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn'); } From a90b732c3614460a37b5a8b4878ff63797a0f71a Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Thu, 25 Aug 2022 15:46:38 +0800 Subject: [PATCH 191/223] * Fix bug #26886. --- module/port/model.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/module/port/model.php b/module/port/model.php index 2e24b68648..f93951a470 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -780,9 +780,12 @@ class portModel extends model if(strpos($queryCondition, "`{$this->config->db->prefix}$model` AS t2") !== false) $selectKey = 't2.id'; $stmt = $this->dbh->query($queryCondition . ($this->post->exportType == 'selected' ? " AND $selectKey IN({$this->cookie->checkedItem})" : '')); - while($row = $stmt->fetch()) $modelDatas[$row->id] = $row; + while($row = $stmt->fetch()) + { + if($selectKey !== 't1.id' and isset($row->$model) and isset($row->id)) $row->id = $row->$model; + $modelDatas[$row->id] = $row; + } } - return $modelDatas; } From bf24ce64fdbe4a51f135934dbf084b09fc5753d8 Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 25 Aug 2022 07:49:02 +0000 Subject: [PATCH 192/223] * Fix sprint/231 issues --- module/bug/lang/de.php | 1 + module/bug/lang/en.php | 3 ++- module/bug/lang/fr.php | 3 ++- module/bug/lang/zh-cn.php | 3 ++- module/bug/view/batchedit.html.php | 2 +- module/bug/view/edit.html.php | 2 +- module/bug/view/resolve.html.php | 2 +- module/story/control.php | 4 ++++ module/story/lang/de.php | 2 +- module/story/lang/en.php | 2 +- module/story/lang/fr.php | 2 +- module/story/lang/zh-cn.php | 2 +- module/story/view/batchclose.html.php | 2 +- module/story/view/close.html.php | 2 +- module/story/view/edit.html.php | 2 +- 15 files changed, 21 insertions(+), 13 deletions(-) diff --git a/module/bug/lang/de.php b/module/bug/lang/de.php index 2378e62853..ae67b3dac0 100644 --- a/module/bug/lang/de.php +++ b/module/bug/lang/de.php @@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed'; $lang->bug->changed = 'Changed'; $lang->bug->storyChanged = 'Story Changed'; $lang->bug->linkMR = 'Related MRs'; +$lang->bug->duplicateTip = 'Please enter keyword search'; /* Page tags. */ $lang->bug->lblAssignedTo = 'Bearbeiter'; diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 6834b13499..f29895386a 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -77,7 +77,7 @@ $lang->bug->deadlineAB = 'Deadline'; $lang->bug->plan = 'Plan'; $lang->bug->closedBy = 'ClosedBy'; $lang->bug->closedDate = 'ClosedDate'; -$lang->bug->duplicateBug = 'Duplicated Bug ID'; +$lang->bug->duplicateBug = 'Duplicated Bug'; $lang->bug->lastEditedBy = 'EditedBy'; $lang->bug->linkBug = 'Linked Bugs'; $lang->bug->linkBugs = 'Link Bug'; @@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed'; $lang->bug->changed = 'Changed'; $lang->bug->storyChanged = 'Story Changed'; $lang->bug->linkMR = 'Related MRs'; +$lang->bug->duplicateTip = 'Please enter keyword search'; /* Page tags. */ $lang->bug->lblAssignedTo = 'AssignTo'; diff --git a/module/bug/lang/fr.php b/module/bug/lang/fr.php index 1fa2cf40b4..1d8df84e71 100644 --- a/module/bug/lang/fr.php +++ b/module/bug/lang/fr.php @@ -77,7 +77,7 @@ $lang->bug->deadlineAB = 'Butoir'; $lang->bug->plan = 'Plan'; $lang->bug->closedBy = 'Fermé par'; $lang->bug->closedDate = 'Date Fermeture'; -$lang->bug->duplicateBug = 'Bug ID en doublon'; +$lang->bug->duplicateBug = 'Bug en doublon'; $lang->bug->lastEditedBy = 'Edité par'; $lang->bug->linkBug = 'Bugs Liés'; $lang->bug->linkBugs = 'Associer Bug'; @@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed'; $lang->bug->changed = 'Changed'; $lang->bug->storyChanged = 'Story Changed'; $lang->bug->linkMR = 'Related MRs'; +$lang->bug->duplicateTip = 'Please enter keyword search'; /* Page tags. */ $lang->bug->lblAssignedTo = 'Affecté à'; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index c92bee374c..9a6ad14c53 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -77,7 +77,7 @@ $lang->bug->deadlineAB = '截止'; $lang->bug->plan = '所属' . '计划'; $lang->bug->closedBy = '由谁关闭'; $lang->bug->closedDate = '关闭日期'; -$lang->bug->duplicateBug = '重复ID'; +$lang->bug->duplicateBug = '重复Bug'; $lang->bug->lastEditedBy = '最后修改者'; $lang->bug->linkBug = '相关Bug'; $lang->bug->linkBugs = '关联相关Bug'; @@ -176,6 +176,7 @@ $lang->bug->labelPostponed = '被延期'; $lang->bug->changed = '已变动'; $lang->bug->storyChanged = '需求变动'; $lang->bug->linkMR = '相关合并请求'; +$lang->bug->duplicateTip = '请输入关键字'; /* 页面标签。*/ $lang->bug->lblAssignedTo = '当前指派'; diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php index 924c1f8c05..f1e9c9c348 100644 --- a/module/bug/view/batchedit.html.php +++ b/module/bug/view/batchedit.html.php @@ -143,7 +143,7 @@
    resolution, "class='form-control' onchange=setDuplicate(this.value,$bugID)");?> ' resolution != 'duplicate') echo "style='display:none'";?>> - product][$bug->branch], $bug->duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateBug}'");?> + product][$bug->branch], $bug->duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateTip}'");?>
    diff --git a/module/bug/view/edit.html.php b/module/bug/view/edit.html.php index b1d317dad4..ca71ef4b2d 100644 --- a/module/bug/view/edit.html.php +++ b/module/bug/view/edit.html.php @@ -265,7 +265,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
    bug->duplicateBug;?>duplicateBug, "class='form-control'");?>duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateTip}'");?>
    bug->closedBy;?>
    bug->duplicateBug;?>bug->duplicateTip}'");?>
    bug->resolvedBuild;?>' closedReason != 'duplicate') echo "style='display:none'";?>> - product][$story->branch], $story->duplicateStory, "class='form-control' placeholder='{$lang->idAB}'");?> + '') + $productStoryList[$story->product][$story->branch], $story->duplicateStory ? $story->duplicateStory : '', "class='form-control' placeholder='{$lang->bug->duplicateTip}'");?> ' closedReason != 'subdivided') echo "style='display:none'";?>> idAB}'");?> diff --git a/module/story/view/close.html.php b/module/story/view/close.html.php index 307352a5ba..8f09e2a651 100644 --- a/module/story/view/close.html.php +++ b/module/story/view/close.html.php @@ -30,7 +30,7 @@
    - + From 8e93a462f63b43f6f922c7e3996e0613b9727117 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Thu, 25 Aug 2022 16:10:13 +0800 Subject: [PATCH 193/223] * Fix bug for upload file. --- module/file/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/file/model.php b/module/file/model.php index 5a6d65185f..72d4a1d828 100755 --- a/module/file/model.php +++ b/module/file/model.php @@ -167,7 +167,7 @@ class fileModel extends model $files = array(); if(!isset($_FILES[$htmlTagName])) return $files; - if($_FILES[$htmlTagName]['error'] != 0) return $_FILES[$htmlTagName]; + if(!is_array($_FILES[$htmlTagName]['error']) and $_FILES[$htmlTagName]['error'] != 0) return $_FILES[$htmlTagName]; $this->app->loadClass('purifier', true); $config = HTMLPurifier_Config::createDefault(); From 769e701d7c7c624c22218897911ebbafae448f14 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 25 Aug 2022 16:13:50 +0800 Subject: [PATCH 194/223] * Fix bug #26784. --- module/bug/view/browse.html.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/bug/view/browse.html.php b/module/bug/view/browse.html.php index 248a4d7f4a..79c85912a5 100644 --- a/module/bug/view/browse.html.php +++ b/module/bug/view/browse.html.php @@ -71,16 +71,16 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow { $moreLabel = $lang->more; $moreLabelActive = ''; - if(isset($lang->bug->moreSelects[$browseType])) + if(isset($lang->bug->moreSelects[$this->session->bugBrowseType])) { - $moreLabel = "{$lang->bug->moreSelects[$browseType]} {$pager->recTotal}"; + $moreLabel = "{$lang->bug->moreSelects[$this->session->bugBrowseType]} {$pager->recTotal}"; $moreLabelActive = 'btn-active-text'; } echo "
    {$moreLabel} "; echo "
    '; From f18bba53af2d2362501c21126e124bdf1ed2b24e Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 25 Aug 2022 16:18:53 +0800 Subject: [PATCH 195/223] * adjust for ioncube php8.1. --- framework/base/router.class.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 1651cab8a6..5df2970834 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -1461,6 +1461,17 @@ class baseRouter chdir(dirname($file2Included)); helper::import($file2Included); + /* Check file is encode by ioncube. */ + $isEncrypted = false; + if($isExt) + { + $fp = fopen($file2Included, 'r'); + $line1 = fgets($fp); + $line2 = fgets($fp); + fclose($fp); + if(strpos($line1, 'isDefaultValueAvailable()) + elseif(!$isEncrypted and $param->isDefaultValueAvailable()) { $default = $param->getDefaultValue(); } From 1e59fbd3118d5eb90e05a13f2ebef39fa413ecc3 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 16:48:00 +0800 Subject: [PATCH 196/223] * Fix bug #26882. --- module/common/view/datatable.fix.html.php | 2 +- module/datatable/lang/de.php | 2 +- module/datatable/lang/en.php | 2 +- module/datatable/lang/fr.php | 2 +- module/datatable/lang/zh-cn.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/module/common/view/datatable.fix.html.php b/module/common/view/datatable.fix.html.php index 48a26082c2..1181adb8f6 100644 --- a/module/common/view/datatable.fix.html.php +++ b/module/common/view/datatable.fix.html.php @@ -99,7 +99,7 @@ $(function()
    story->duplicateStory;?>duplicateStory, 'class="form-control"'); ?> '') + $productStories, $story->duplicateStory ? $story->duplicateStory : '', "class='form-control' placeholder='{$lang->bug->duplicateTip}'"); ?>
    type == 'story' ? $lang->requirement->linkStory : $lang->story->linkStory;?>
    - + moduleName == 'execution' and $app->methodName == 'task' and $this->config->vision != 'lite'):?> diff --git a/module/datatable/lang/de.php b/module/datatable/lang/de.php index 55aafa1a75..8518cf8ef5 100644 --- a/module/datatable/lang/de.php +++ b/module/datatable/lang/de.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = 'Set list'; $lang->datatable->showModule = 'Anzeigen/Verstecken des Modul Names'; $lang->datatable->showBranch = 'Show branches in the list'; $lang->datatable->showAllModule = 'Show product modules'; -$lang->datatable->showModuleList[] = 'N/A'; +$lang->datatable->showModuleList[0] = 'N/A'; $lang->datatable->showModuleList['base'] = 'Basisknoten'; $lang->datatable->showModuleList['end'] = 'Endknoten'; $lang->datatable->showAllModuleList[0] = 'Hide'; diff --git a/module/datatable/lang/en.php b/module/datatable/lang/en.php index e5ab3098df..ef3b43ecbd 100644 --- a/module/datatable/lang/en.php +++ b/module/datatable/lang/en.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = 'Set List'; $lang->datatable->showModule = 'Show modules in the list'; $lang->datatable->showBranch = 'Show branches in the list'; $lang->datatable->showAllModule = 'Show product modules'; -$lang->datatable->showModuleList[] = 'N/A'; +$lang->datatable->showModuleList[0] = 'N/A'; $lang->datatable->showModuleList['base'] = 'Base Node'; $lang->datatable->showModuleList['end'] = 'End Node'; $lang->datatable->showAllModuleList[0] = 'Hide'; diff --git a/module/datatable/lang/fr.php b/module/datatable/lang/fr.php index 6ced0da225..ef0714f758 100644 --- a/module/datatable/lang/fr.php +++ b/module/datatable/lang/fr.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = 'Set list'; $lang->datatable->showModule = 'Montrer les noms des modules dans la page de listes'; $lang->datatable->showBranch = 'Show branches in the list'; $lang->datatable->showAllModule = 'Afficher les modules de produits'; -$lang->datatable->showModuleList[] = 'N/A'; +$lang->datatable->showModuleList[0] = 'N/A'; $lang->datatable->showModuleList['base'] = 'Base Node'; $lang->datatable->showModuleList['end'] = 'End Node'; $lang->datatable->showAllModuleList[0] = 'Cacher'; diff --git a/module/datatable/lang/zh-cn.php b/module/datatable/lang/zh-cn.php index 8da7db89b1..5fbe0bff64 100644 --- a/module/datatable/lang/zh-cn.php +++ b/module/datatable/lang/zh-cn.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = '显示设置'; $lang->datatable->showModule = '列表页是否显示模块名'; $lang->datatable->showBranch = '列表页是否显示%s名'; $lang->datatable->showAllModule = '是否显示完整产品模块'; -$lang->datatable->showModuleList[] = '不显示'; +$lang->datatable->showModuleList[0] = '不显示'; $lang->datatable->showModuleList['base'] = '只显示一级模块'; $lang->datatable->showModuleList['end'] = '只显示最后一级模块'; $lang->datatable->showAllModuleList[0] = '不显示'; From bc938caaa494d626065173e21102ee00264f077a Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 25 Aug 2022 16:55:27 +0800 Subject: [PATCH 197/223] * Fix bug #26607. --- module/doc/model.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/module/doc/model.php b/module/doc/model.php index 4c7105951e..5ab62fcd87 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -930,7 +930,12 @@ class docModel extends model { $this->loadModel('product'); - if($this->app->getMethodName() == 'objectlibs') $type = 'objectlibs'; + /* Fixed search modal for doc view. */ + if($this->app->getMethodName() == 'objectlibs') + { + $queryName = $type . 'Doc'; + $type = 'objectlibs'; + } if($this->app->rawMethod == 'contribute') { @@ -955,6 +960,7 @@ class docModel extends model } else { + $this->config->doc->search['module'] = $queryName; $products = $this->product->getPairs('nocode', $this->session->project); $this->config->doc->search['params']['execution']['values'] = array('' => '') + $this->loadModel('execution')->getPairs($this->session->project, 'all', 'noclosed') + array('all' => $this->lang->doc->allExecutions); $this->config->doc->search['params']['lib']['values'] = array('' => '', $libID => ($libID ? $libs[$libID] : 0), 'all' => $this->lang->doclib->all); From 8ddddc63dba52e28ead6df5165794cc48b6d181e Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 25 Aug 2022 17:00:41 +0800 Subject: [PATCH 198/223] * Fix bug #26882. --- module/datatable/lang/de.php | 2 +- module/datatable/lang/en.php | 2 +- module/datatable/lang/fr.php | 2 +- module/datatable/lang/zh-cn.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/datatable/lang/de.php b/module/datatable/lang/de.php index 8518cf8ef5..3034fb390d 100644 --- a/module/datatable/lang/de.php +++ b/module/datatable/lang/de.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = 'Set list'; $lang->datatable->showModule = 'Anzeigen/Verstecken des Modul Names'; $lang->datatable->showBranch = 'Show branches in the list'; $lang->datatable->showAllModule = 'Show product modules'; -$lang->datatable->showModuleList[0] = 'N/A'; +$lang->datatable->showModuleList['0'] = 'N/A'; $lang->datatable->showModuleList['base'] = 'Basisknoten'; $lang->datatable->showModuleList['end'] = 'Endknoten'; $lang->datatable->showAllModuleList[0] = 'Hide'; diff --git a/module/datatable/lang/en.php b/module/datatable/lang/en.php index ef3b43ecbd..9c4b86de8d 100644 --- a/module/datatable/lang/en.php +++ b/module/datatable/lang/en.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = 'Set List'; $lang->datatable->showModule = 'Show modules in the list'; $lang->datatable->showBranch = 'Show branches in the list'; $lang->datatable->showAllModule = 'Show product modules'; -$lang->datatable->showModuleList[0] = 'N/A'; +$lang->datatable->showModuleList['0'] = 'N/A'; $lang->datatable->showModuleList['base'] = 'Base Node'; $lang->datatable->showModuleList['end'] = 'End Node'; $lang->datatable->showAllModuleList[0] = 'Hide'; diff --git a/module/datatable/lang/fr.php b/module/datatable/lang/fr.php index ef0714f758..33a98bd90a 100644 --- a/module/datatable/lang/fr.php +++ b/module/datatable/lang/fr.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = 'Set list'; $lang->datatable->showModule = 'Montrer les noms des modules dans la page de listes'; $lang->datatable->showBranch = 'Show branches in the list'; $lang->datatable->showAllModule = 'Afficher les modules de produits'; -$lang->datatable->showModuleList[0] = 'N/A'; +$lang->datatable->showModuleList['0'] = 'N/A'; $lang->datatable->showModuleList['base'] = 'Base Node'; $lang->datatable->showModuleList['end'] = 'End Node'; $lang->datatable->showAllModuleList[0] = 'Cacher'; diff --git a/module/datatable/lang/zh-cn.php b/module/datatable/lang/zh-cn.php index 5fbe0bff64..b4d63aeb80 100644 --- a/module/datatable/lang/zh-cn.php +++ b/module/datatable/lang/zh-cn.php @@ -23,7 +23,7 @@ $lang->datatable->displaySetting = '显示设置'; $lang->datatable->showModule = '列表页是否显示模块名'; $lang->datatable->showBranch = '列表页是否显示%s名'; $lang->datatable->showAllModule = '是否显示完整产品模块'; -$lang->datatable->showModuleList[0] = '不显示'; +$lang->datatable->showModuleList['0'] = '不显示'; $lang->datatable->showModuleList['base'] = '只显示一级模块'; $lang->datatable->showModuleList['end'] = '只显示最后一级模块'; $lang->datatable->showAllModuleList[0] = '不显示'; From b3008f2d190cf36a7b8cc2ddb35856f1d46ebdda Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 25 Aug 2022 17:08:06 +0800 Subject: [PATCH 199/223] * Optimize code. --- module/doc/control.php | 2 +- module/doc/model.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/doc/control.php b/module/doc/control.php index 3335e01e46..76ba88cd19 100755 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -1125,7 +1125,7 @@ class doc extends control /* Set Custom. */ foreach(explode(',', $this->config->doc->customObjectLibs) as $libType) $customObjectLibs[$libType] = $this->lang->doc->customObjectLibs[$libType]; - $actionURL = $this->createLink('doc', 'browse', "lib=0&browseType=bySearch&queryID=myQueryID"); + $actionURL = $this->createLink('doc', 'tableContents', "type=$type&objectID=$objectID&libID=$libID&browseType=bySearch¶m=myQueryID"); $this->doc->buildSearchForm(0, array(), 0, $actionURL, $type); $moduleTree = $type == 'book' ? $this->doc->getBookStructure($libID) : $this->doc->getTreeMenu($type, $objectID, $libID, 0, $docID); diff --git a/module/doc/model.php b/module/doc/model.php index 5ab62fcd87..eaa031b44b 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -934,7 +934,7 @@ class docModel extends model if($this->app->getMethodName() == 'objectlibs') { $queryName = $type . 'Doc'; - $type = 'objectlibs'; + $type = 'objectLibs'; } if($this->app->rawMethod == 'contribute') From e9d398addd5ee0a41c8562290be8eda35fd34da2 Mon Sep 17 00:00:00 2001 From: liuhong Date: Thu, 25 Aug 2022 09:15:12 +0000 Subject: [PATCH 200/223] *Fix bug before 26230. --- module/my/view/requirement.html.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/my/view/requirement.html.php b/module/my/view/requirement.html.php index bd365b7a1c..8472470c53 100644 --- a/module/my/view/requirement.html.php +++ b/module/my/view/requirement.html.php @@ -90,10 +90,10 @@ - + @@ -133,9 +133,9 @@ - + From 63fa2567dce38d689f608865464d357bba6baf17 Mon Sep 17 00:00:00 2001 From: liuhong Date: Thu, 25 Aug 2022 22:22:37 +0000 Subject: [PATCH 201/223] *Fix bug #66222. --- module/bug/control.php | 2 +- module/bug/js/common.js | 2 +- module/story/model.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index d408e70eab..fd6740cc13 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -1165,7 +1165,7 @@ class bug extends control $this->view->moduleOptionMenu = $moduleOptionMenu; $this->view->currentModuleID = $currentModuleID; $this->view->executions = array(0 => '') + $this->product->getExecutionPairsByProduct($bug->product, $bug->branch, 'id_desc', $bug->project); - $this->view->stories = $bug->execution ? $this->story->getExecutionStoryPairs($bug->execution) : $this->story->getProductStoryPairs($bug->product, $bug->branch); + $this->view->stories = $bug->execution ? $this->story->getExecutionStoryPairs($bug->execution) : $this->story->getProductStoryPairs($bug->product, $bug->branch, 0, 'all', 'id_desc', 0, 'full', 'story', false); $this->view->branchOption = $branchOption; $this->view->branchTagOption = $branchTagOption; $this->view->tasks = $this->task->getExecutionTaskPairs($bug->execution); diff --git a/module/bug/js/common.js b/module/bug/js/common.js index 3ddab97a57..4c8975c98e 100644 --- a/module/bug/js/common.js +++ b/module/bug/js/common.js @@ -678,7 +678,7 @@ function setStories(moduleID, productID, storyID) if(typeof(branch) == 'undefined') branch = 0; var executionID = $('#execution').val(); if(typeof(executionID) == 'undefined') executionID = 0; - link = createLink('story', 'ajaxGetProductStories', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID + '&storyID=' + storyID + '&onlyOption=false&status=&limit=0&type=full&hasParent=1&executionID=' + executionID); + link = createLink('story', 'ajaxGetProductStories', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID + '&storyID=' + storyID + '&onlyOption=false&status=&limit=0&type=full&hasParent=false&executionID=' + executionID); $.get(link, function(stories) { if(!stories) stories = ''; diff --git a/module/story/model.php b/module/story/model.php index a8528407d6..8ef732c9dd 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2739,7 +2739,7 @@ class storyModel extends model ->beginIF($productID)->andWhere('t1.product')->in($productID)->fi() ->beginIF($moduleIdList)->andWhere('t1.module')->in($moduleIdList)->fi() ->beginIF($branch !== 'all')->andWhere('t1.branch')->in("0,$branch")->fi() - ->beginIF(!$hasParent)->andWhere('t1.parent')->ge(0)->fi() + ->beginIF(!$hasParent or $hasParent == 'false')->andWhere('t1.parent')->ge(0)->fi() ->beginIF($status and $status != 'all')->andWhere('t1.status')->in($status)->fi() ->andWhere('t1.type')->eq($storyType) ->andWhere('t1.deleted')->eq(0) From 6717931bf5cc3b68510f2838e6d9edd2f34523df Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 26 Aug 2022 08:07:40 +0800 Subject: [PATCH 202/223] * Fix bug#26878. --- module/story/view/view.html.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index 6d1934c703..9525f3372d 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -332,7 +332,8 @@ { foreach(explode(',', $story->mailto) as $account) { - if(empty($account)) continue; echo "" . zget($users, trim($account)) . '  '; + if(empty($account)) continue; + echo "" . zget($users, trim($account)) . '  '; } } ?> From 01956d14b3665e507e9e6ddda640c116ed8a4a64 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 26 Aug 2022 08:08:16 +0800 Subject: [PATCH 203/223] * Fix bug#26878. --- extension/lite/story/ext/view/view.html.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/extension/lite/story/ext/view/view.html.php b/extension/lite/story/ext/view/view.html.php index 716172554b..c002b4c445 100644 --- a/extension/lite/story/ext/view/view.html.php +++ b/extension/lite/story/ext/view/view.html.php @@ -235,7 +235,18 @@ - +
    datatable->showModule;?>datatable->showModuleList, isset($config->datatable->$datatableId->showModule) ? $config->datatable->$datatableId->showModule : '');?>datatable->showModuleList, isset($config->datatable->$datatableId->showModule) ? $config->datatable->$datatableId->showModule : '0');?>
    pri;?>' title='story->priList, $story->pri, $story->pri);?>'>story->priList, $story->pri, $story->pri);?> - title, null, "style='color: $story->color' data-group='product'") : "$story->title";?> + title, null, "style='color: $story->color' data-group='product' title='$story->title'") : "$story->title";?> children)) echo '';?> productTitle;?>productTitle;?> openedBy);?> estimate . $config->hourUnit;?> processStatus('story', $story);?> pri;?>' title='story->priList, $child->pri, $child->pri);?>'>story->priList, $child->pri, $child->pri);?> - lang->story->children .'">SR ' . (common::hasPriv('story', 'view') ? html::a($storyLink, $child->title, null, "style='color: $child->color' data-group='product'") : $child->title);?> + lang->story->children .'">SR ' . (common::hasPriv('story', 'view') ? html::a($storyLink, $child->title, null, "style='color: $child->color' data-group='product' title='$child->title'") : $child->title);?> productTitle;?>productTitle;?> openedBy);?> estimate . $config->hourUnit;?> URChanged ? "{$this->lang->story->URChanged}" : "" . $this->processStatus('story', $child) . ''?>
    story->legendMailto;?>mailto); foreach($mailto as $account) {if(empty($account)) continue; echo "" . zget($users, trim($account)) . '  '; }?> + mailto)) + { + foreach(explode(',', $story->mailto) as $account) + { + if(empty($account)) continue; + echo "" . zget($users, trim($account)) . '  '; + } + } + ?> +
    From 2753d2d60b66e132ced741148dcd7f39d87751f3 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 26 Aug 2022 08:56:49 +0800 Subject: [PATCH 204/223] * Fix bug#26897. --- module/bug/view/view.html.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index 2b78e900a7..684b8df6e1 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -262,7 +262,14 @@ bug->mailto;?> - mailto)); foreach($mailto as $account) echo ' ' . zget($users, $account); ?> + + mailto)) + { + foreach(explode(',', str_replace(' ', '', $bug->mailto)) as $account) echo ' ' . zget($users, $account); + } + ?> + From 827d6f50820d3e8c8b309e34e792de8d6b47a41f Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Fri, 26 Aug 2022 09:09:45 +0800 Subject: [PATCH 205/223] * Fix bug #26903 and Fix todo unit test. --- module/story/lang/zh-cn.php | 4 ++-- module/user/model.php | 2 +- test/class/todo.class.php | 7 ++++--- test/model/todo/batchcreate.php | 10 +++++----- test/model/todo/batchupdate.php | 2 +- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 9b854de29b..c91748a806 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -154,8 +154,8 @@ $lang->story->children = "子需求"; $lang->story->childrenAB = "子"; $lang->story->linkStories = "相关{$lang->SRCommon}"; $lang->story->linkRequirements = "相关{$lang->URCommon}"; -$lang->story->childStories = "细分需求"; -$lang->story->duplicateStory = "重复需求ID"; +$lang->story->childStories = "细分{$lang->SRCommon}"; +$lang->story->duplicateStory = "重复{$lang->SRCommon}ID"; $lang->story->reviewResult = '评审意见'; $lang->story->reviewResultAB = '评审结果'; $lang->story->preVersion = '之前版本'; diff --git a/module/user/model.php b/module/user/model.php index f0d90532c9..a2c0442d3f 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -1087,7 +1087,7 @@ class userModel extends model if(!$stmt) return array('rights' => $rights, 'acls' => $acls); while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - $rights[strtolower($row['module'])][strtolower($row['method'])] = true; + if($row['module'] and $row['method']) $rights[strtolower($row['module'])][strtolower($row['method'])] = true; } /* Get can manage projects by user. */ diff --git a/test/class/todo.class.php b/test/class/todo.class.php index 0f5696d4ed..9ba0799c57 100755 --- a/test/class/todo.class.php +++ b/test/class/todo.class.php @@ -3,9 +3,10 @@ class todoTest { public function __construct() { - global $tester; - $this->objectModel = $tester->loadModel('todo'); - $tester->app->loadClass('dao'); + global $tester; + $this->objectModel = $tester->loadModel('todo'); + $tester->app->loadClass('dao'); + $_SERVER['HTTP_HOST'] = 'test.zentao.net'; } /** diff --git a/test/model/todo/batchcreate.php b/test/model/todo/batchcreate.php index 06ffc578f9..f412b75a6a 100755 --- a/test/model/todo/batchcreate.php +++ b/test/model/todo/batchcreate.php @@ -23,8 +23,8 @@ $descs = array('desc1', 'desc2', 'desc3', 'desc4', '' , '', '', ''); $begins = array('0830', '0900', '0930', '1000', '1030', '1100', '1130', '1200'); $ends = array('0900', '0930', '1000','1030', '1100', '1130', '1200', '1230'); $bugs = array('2' => '313'); - -$noname_create = array('types' => $types, 'pris' => $pris, 'names' => $names, 'descs' => $descs, 'begins' => $begins, 'ends' => $ends); +$assignedTos = array('user1', 'ditto', 'ditto', 'ditto', 'ditto', 'ditto', 'ditto', 'ditto',); +$noname_create = array('types' => $types, 'pris' => $pris, 'names' => $names, 'descs' => $descs, 'begins' => $begins, 'ends' => $ends, 'assignedTos' => $assignedTos); $names = array('批量创建待办4','批量创建待办5','批量创建待办6', '批量创建待办7', '', '', '', ''); $types = array('bug', 'story', 'task', 'testtask', 'custom', 'custom', 'custom', 'custom'); @@ -33,10 +33,10 @@ $stories = array('2' => '1'); $tasks = array('3' => '1'); $testtasks = array('4' => '1'); -$except_create = array('types' => $types, 'pris' => $pris, 'names' => $names, 'descs' => $descs, 'begins' => $begins, 'ends' => $ends, 'bugs' => $bugs, 'stories' => $stories, 'tasks' => $tasks, 'testtasks' => $testtasks); +$except_create = array('types' => $types, 'pris' => $pris, 'names' => $names, 'descs' => $descs, 'begins' => $begins, 'ends' => $ends, 'bugs' => $bugs, 'stories' => $stories, 'tasks' => $tasks, 'testtasks' => $testtasks, 'assignedTos' => $assignedTos); $todo = new todoTest(); r($todo->batchCreateTest($noname_create)) && p('2006:name,desc,pri,type,idvalue;2007:name,desc,pri,type,idvalue;2008:name,desc,pri,type,idvalue') && e('批量创建待办1,desc1,1,custom,0;批量创建待办2,desc2,2,custom,0;批量创建待办3,desc4,4,custom,0'); // 批量创建有个没有名字的待办 -r($todo->batchCreateTest($except_create)) && p('2009:name,desc,pri,type,idvalue;2010:name,desc,pri,type,idvalue;2011:name,desc,pri,type,idvalue;2012:name,desc,pri,type,idvalue') && e('测试单转Bug13,desc1,1,bug,313;用户需求版本一61,desc2,2,story,1;开发任务11,desc3,3,task,1;测试单1,desc4,4,testtask,1'); // 批量创建的待办 -$db->restoreDB(); \ No newline at end of file +r($todo->batchCreateTest($except_create)) && p('2009:name,desc,pri,type,idvalue;2010:name,desc,pri,type,idvalue;2011:name,desc,pri,type,idvalue;2012:name,desc,pri,type,idvalue') && e('测试单转Bug13,desc1,1,bug,313;软件需求版本一551,desc2,2,story,1;开发任务11,desc3,3,task,1;测试单1,desc4,4,testtask,1'); // 批量创建的待办 +$db->restoreDB(); diff --git a/test/model/todo/batchupdate.php b/test/model/todo/batchupdate.php index 3c8c5434e4..791074b8e4 100755 --- a/test/model/todo/batchupdate.php +++ b/test/model/todo/batchupdate.php @@ -32,4 +32,4 @@ $todo = new todoTest(); r($todo->batchUpdateTest($changeType, '3')) && p('0:field,old,new') && e('type,task,custom'); // 批量修改todo类型 r($todo->batchUpdateTest($changePri, '2')) && p('0:field,old,new') && e('pri,2,1'); // 批量修改todo优先级 r($todo->batchUpdateTest($changeStatus, '1')) && p('0:field,old,new') && e('status,wait,doing'); // 批量修改todo状态 -$db->restoreDB(); \ No newline at end of file +$db->restoreDB(); From a466aa32d79cd9020410e0528c29f0d68df933b1 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 26 Aug 2022 09:12:43 +0800 Subject: [PATCH 206/223] * Modify editor linked content style. --- module/repo/css/ajaxgeteditorcontent.css | 2 +- module/repo/css/ajaxgetrelationinfo.css | 6 +++-- .../repo/view/ajaxgeteditorcontent.html.php | 7 +++++ module/repo/view/ajaxgetrelationinfo.html.php | 26 ++++++++++++------- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/module/repo/css/ajaxgeteditorcontent.css b/module/repo/css/ajaxgeteditorcontent.css index 5f0fe98e8d..59fd859d12 100644 --- a/module/repo/css/ajaxgeteditorcontent.css +++ b/module/repo/css/ajaxgeteditorcontent.css @@ -2,7 +2,7 @@ #monacoEditor .tip {width: 15px; height: 15px; background: #D9D9D9; border-radius: 10px;} #log {background: #fff; margin-top: 2px; color: #707070; display: none; padding: 5px;} #log .history {margin-left: 5px;} -#related {display: none; margin-top: 2px;} +#related {display: none; margin-top: 2px; background: #fff;} #relationTabs .tab-pane {display: none;} #relationTabs .tabs-navbar {background: #F4F5F7;} #relationTabs .tab-pane.active {display: block;} diff --git a/module/repo/css/ajaxgetrelationinfo.css b/module/repo/css/ajaxgetrelationinfo.css index 2233e7d117..c94739741a 100644 --- a/module/repo/css/ajaxgetrelationinfo.css +++ b/module/repo/css/ajaxgetrelationinfo.css @@ -1,5 +1,7 @@ -.repoCode .panel {margin-bottom: 0;} +body {background-color: #fff; padding-bottom: 20px;} +.linkContent .panel {margin-bottom: 0; padding-bottom: 10px; border: none;} .left-content {border-right: 1px solid #EDEEF2; padding-top: 15px;} -.text {width: 85%; white-space: normal; word-wrap: break-word; word-break: break-all; font-weight: normal; padding-left: 10px;} +.text {width: 80%; white-space: normal; word-wrap: break-word; word-break: break-all; font-weight: normal; padding-left: 10px;} .cell {min-height: 300px;} .menu-title {width: 100%;} +.detail-content {margin-top: 0;} diff --git a/module/repo/view/ajaxgeteditorcontent.html.php b/module/repo/view/ajaxgeteditorcontent.html.php index 86653140fb..b84de046c1 100644 --- a/module/repo/view/ajaxgeteditorcontent.html.php +++ b/module/repo/view/ajaxgeteditorcontent.html.php @@ -67,6 +67,8 @@ $(function() function getRelation(commit) { $('#codeContainer').css('height', codeHeight / 5 * 3); + var relatedHeight = codeHeight / 5 * 2 - $('#log').height() - 10; + $('#related').css('height', relatedHeight); $tabs = $('#relationTabs').data('zui.tabs'); if($tabs) $tabs.closeAll(); @@ -102,6 +104,11 @@ $(function() $('#related').show(); } + $('#relationTabs').on('onOpen', function(event, tab) { + var relatedHeight = codeHeight / 5 * 2 - $('#log').height() - 45; + $('#relationTabs iframe').css('height', relatedHeight); + }); + /** * Set tab data. * diff --git a/module/repo/view/ajaxgetrelationinfo.html.php b/module/repo/view/ajaxgetrelationinfo.html.php index ee0d82ef9e..ebee0e9ae3 100644 --- a/module/repo/view/ajaxgetrelationinfo.html.php +++ b/module/repo/view/ajaxgetrelationinfo.html.php @@ -11,27 +11,27 @@ -
    -
    -
    +
    +
    +
    - - + + - - + + - +
    -
    +
    @@ -43,7 +43,13 @@ $(function() { $('a').attr('href', 'javascript:;').removeClass('iframe').css('color', '#3c4353'); $('blockquote a').empty(); + + if($('.linkContent .content').width() != 0) $.cookie('eidtorLinkedContentWidth', $('.linkContent .content').width()); + $('.right-content').css('width', $.cookie('eidtorLinkedContentWidth') / 5 * 2); }); -if(window.onblur) $('.left-content').css('width', $('.repoCode .content').width() / 5 * 3); +if(window.onblur) +{ + $('.right-content').css('width', $.cookie('eidtorLinkedContentWidth') / 5 * 2); +} From dedf5e6dc2d7204227158a8b07c48d7b68f6b6d2 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 26 Aug 2022 09:14:16 +0800 Subject: [PATCH 207/223] * Delete reset file name of story change page. --- module/file/control.php | 1 + module/file/view/printfiles.html.php | 2 +- module/story/view/change.html.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/file/control.php b/module/file/control.php index 36e29ae62e..c8230031b6 100755 --- a/module/file/control.php +++ b/module/file/control.php @@ -314,6 +314,7 @@ class file extends control $this->view->files = $files; $this->view->fieldset = $fieldset; $this->view->object = $object; + $this->view->method = $method; if($method == 'view') return $this->display('file', 'viewfiles'); $this->display(); diff --git a/module/file/view/printfiles.html.php b/module/file/view/printfiles.html.php index ee78a6ecc0..2c621c7413 100644 --- a/module/file/view/printfiles.html.php +++ b/module/file/view/printfiles.html.php @@ -92,7 +92,7 @@ if(common::hasPriv($objectType, 'edit', $object)) { echo "  "; - common::printLink('file', 'edit', "fileID=$file->id", $lang->file->edit, '', "data-width='400' class='fileAction btn btn-link edit iframe text-primary' title='{$lang->file->edit}'"); + if($method != 'storyChange') common::printLink('file', 'edit', "fileID=$file->id", $lang->file->edit, '', "data-width='400' class='fileAction btn btn-link edit iframe text-primary' title='{$lang->file->edit}'"); if(common::hasPriv('file', 'delete')) echo html::a('###', $lang->delete, '', "class='fileAction btn btn-link text-primary' onclick='deleteFile($file->id)' title='$lang->delete'"); echo ''; } diff --git a/module/story/view/change.html.php b/module/story/view/change.html.php index d274aceec6..a5b89ca66f 100644 --- a/module/story/view/change.html.php +++ b/module/story/view/change.html.php @@ -68,7 +68,7 @@ attatch;?> - fetch('file', 'printFiles', array('files' => $files, 'fieldset' => 'true', 'object' => $story, 'method' => 'change'));?> + fetch('file', 'printFiles', array('files' => $files, 'fieldset' => 'true', 'object' => $story, 'method' => 'storyChange'));?> fetch('file', 'buildform');?> From 13361f4b5a7f630a07b17ff51ea8bbcdd5486fe1 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 26 Aug 2022 09:15:55 +0800 Subject: [PATCH 208/223] * fix bug #26866. --- module/upgrade/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 5d9ae1e94b..dd1e706ff2 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -3233,7 +3233,7 @@ class upgradeModel extends model } } - $openVersion = $this->getOpenVersion($fromVersion); + $openVersion = $this->getOpenVersion(str_replace('.', '_', $fromVersion)); if(version_compare($openVersion, '17_4', '<=')) $needProcess['changeEngine'] = 'notice'; return $needProcess; From 3805d90035ec2e5c7fd8a4e26203a41aabf7480b Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 26 Aug 2022 09:17:07 +0800 Subject: [PATCH 209/223] * Fix bug for action. --- module/action/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/action/model.php b/module/action/model.php index c3e5577349..f9d2155fee 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -1025,7 +1025,7 @@ class actionModel extends model $authedProjects = array_intersect(array_keys($projects), explode(',', $authedProjects)); $authedExecutions = isset($authedExecutions) ? array_intersect(array_keys($executions), explode(',', $authedExecutions)) : array_keys($executions); - $productCondition = "product like '%,$productID,%'"; + $productCondition = "(execution = '0' and project = '0' and product like '%,$productID,%')"; $projectCondition = "(execution = '0' and project != '0' and project " . helper::dbIN($authedProjects) . ')'; $executionCondition = "(execution != '0' and execution " . helper::dbIN($authedExecutions) . ')'; } From 6b671ddd1ee8cdedc2243bda1d05a33f616aa6bb Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 26 Aug 2022 09:23:05 +0800 Subject: [PATCH 210/223] * Fix bug #26852. --- module/product/view/browse.html.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index 43f642332b..f234bbdbfd 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -290,14 +290,14 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; $canBatchClose = (common::hasPriv($storyType, 'batchClose') and strtolower($browseType) != 'closedbyme' and strtolower($browseType) != 'closedstory'); $canBatchReview = ($canBeChanged and common::hasPriv($storyType, 'batchReview')); $canBatchChangeStage = ($canBeChanged and common::hasPriv('story', 'batchChangeStage') and $storyType == 'story'); - $canBatchChangeBranch = ($canBeChanged and common::hasPriv($storyType, 'batchChangeBranch')); + $canBatchChangeBranch = ($canBeChanged and common::hasPriv($storyType, 'batchChangeBranch') and $this->session->currentProductType and $this->session->currentProductType != 'normal' and $productID); $canBatchChangeModule = ($canBeChanged and common::hasPriv($storyType, 'batchChangeModule')); $canBatchChangePlan = ($canBeChanged and common::hasPriv('story', 'batchChangePlan') and $storyType == 'story'); $canBatchAssignTo = ($canBeChanged and common::hasPriv($storyType, 'batchAssignTo')); $canBatchUnlink = ($canBeChanged and $this->app->tab == 'project' and common::hasPriv('projectstory', 'batchUnlinkStory')); $canBatchImportToLib = ($canBeChanged and $this->app->tab == 'project' and isset($this->config->maxVersion) and common::hasPriv('story', 'batchImportToLib')); - $canBatchAction = ($canBatchEdit or $canBatchClose or $canBatchReview or $canBatchChangeStage or $canBatchChangeModule or $canBatchChangePlan or $canBatchAssignTo or $canBatchUnlink or $canBatchImportToLib); + $canBatchAction = ($canBatchEdit or $canBatchClose or $canBatchReview or $canBatchChangeStage or $canBatchChangeModule or $canBatchChangePlan or $canBatchAssignTo or $canBatchUnlink or $canBatchImportToLib or $canBatchChangeBranch); ?> ';?> ' id='storyList' data-fixed-left-width='' data-fixed-right-width=''> @@ -442,7 +442,7 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; echo "
  • " . html::a('javascript:;', $lang->story->review, '', $class) . '
  • '; } - if($canBatchChangeBranch and $this->session->currentProductType and $this->session->currentProductType != 'normal' and $productID) + if($canBatchChangeBranch) { $withSearch = count($branchTagOption) > 8; echo " $value) { - $this->story->printCell($value, $story, $users, $branchOption, $storyStages, $modulePairs, $storyTasks, $storyBugs, $storyCases, $useDatatable ? 'datatable' : 'table', '', $execution, $showBranch); + $this->story->printCell($value, $story, $users, $branchOption, $storyStages, $modulePairs, $storyTasks, $storyBugs, $storyCases, $useDatatable ? 'datatable' : 'table', 'story', $execution, $showBranch); } ?> From d4b043d72dd34722dfd7c12126e9bbc48ce83731 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 26 Aug 2022 09:56:57 +0800 Subject: [PATCH 215/223] * Fix bug #26902. --- lib/front/front.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/front/front.class.php b/lib/front/front.class.php index 2d68563605..a2026338ac 100644 --- a/lib/front/front.class.php +++ b/lib/front/front.class.php @@ -57,6 +57,7 @@ class html extends baseHTML { $id = "id='$name'"; if(strpos($attrib, 'id=') !== false) $id = ''; + if(is_null($value)) $value = ''; $value = str_replace("'", ''', $value); $autocomplete = $autocomplete ? 'autocomplete="on"' : 'autocomplete="off"'; return "\n"; From c14d0ed155cdb92a1d19cd7e29c337913400974c Mon Sep 17 00:00:00 2001 From: liuhong Date: Fri, 26 Aug 2022 02:04:50 +0000 Subject: [PATCH 216/223] *Fix bug before #64879. --- module/block/view/taskblock.html.php | 4 ++-- module/user/view/task.html.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index 1a40a154b9..dc8423c01e 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -45,8 +45,8 @@ executionType == 'kanban' ? true : ''; - $class = $task->executionType == 'kanban' ? "class='iframe' data-toggle='modal'" : ''; + $onlybody = $task->executionType == 'kanban' ? true : ''; + $class = $task->executionType == 'kanban' ? "class='iframe' data-toggle='modal'" : ''; ?> diff --git a/module/user/view/task.html.php b/module/user/view/task.html.php index 0dbd01df7d..bae1a1e8f8 100644 --- a/module/user/view/task.html.php +++ b/module/user/view/task.html.php @@ -62,8 +62,8 @@ team)) echo '' . $this->lang->task->multipleAB . ' ';?> parent > 0) echo '' . $this->lang->task->childrenAB . ' ';?> executionType == 'kanban' ? true : ''; - $class = $task->executionType == 'kanban' ? 'iframe' : ''; + $onlybody = $task->executionType == 'kanban' ? true : ''; + $class = $task->executionType == 'kanban' ? 'iframe' : ''; ?> createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");?> From 6712743c25277e225f581d90de2a1e0ac8f13fbe Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 26 Aug 2022 02:09:07 +0000 Subject: [PATCH 217/223] * zentaoIcon: add icon-blame --- www/theme/zui/css/min.css | 4 +- www/theme/zui/fonts/ZentaoIcon.eot | Bin 66150 -> 66482 bytes www/theme/zui/fonts/ZentaoIcon.svg | 551 ++++++++++++++-------------- www/theme/zui/fonts/ZentaoIcon.ttf | Bin 65972 -> 66304 bytes www/theme/zui/fonts/ZentaoIcon.woff | Bin 66048 -> 66380 bytes 5 files changed, 278 insertions(+), 277 deletions(-) diff --git a/www/theme/zui/css/min.css b/www/theme/zui/css/min.css index 2846fd52e2..e668a0fe49 100644 --- a/www/theme/zui/css/min.css +++ b/www/theme/zui/css/min.css @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-08-18 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-08-26 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -13,4 +13,4 @@ * * Copyright (c) 2011-2016 Harvest http://getharvest.com * MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md -*/.chosen-container{position:relative;display:block;font-size:13px;vertical-align:middle;zoom:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;display:none;width:100%;background:#fff;border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-top:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container .chosen-drop.chosen-drop-size-limited{border-top:1px solid rgba(0,0,0,.15)}.chosen-container .chosen-drop.chosen-auto-max-width{min-width:100%;border-top:1px solid rgba(0,0,0,.15);opacity:0}.chosen-container .chosen-drop.chosen-auto-max-width>.chosen-results>li{display:inline-block;white-space:nowrap}.chosen-container .chosen-drop.chosen-auto-max-width.in{opacity:1}.chosen-container .chosen-drop.chosen-auto-max-width.in>.chosen-results>li{display:block;white-space:normal}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap!important}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container.chosen-up .chosen-drop{top:inherit;bottom:100%;margin-top:auto;margin-bottom:-1px;border-radius:2px 2px 0 0;-webkit-box-shadow:0 -3px 5px rgba(0,0,0,.175);box-shadow:0 -3px 5px rgba(0,0,0,.175)}.chosen-container.chosen-highlight-selected .result-selected{color:#0c64eb;background:#e9f2fb}.chosen-container-single .chosen-single{display:block;width:100%;height:32px;padding:5px 8px;overflow:hidden;line-height:1.42857143;color:#222;text-decoration:none;white-space:nowrap;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-single .chosen-default{color:#838a9d}.chosen-container-single .chosen-single>span{display:block;margin-right:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:5px;right:24px;display:block;width:20px;height:20px;font-family:sans-serif;font-size:18px;font-weight:700;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-single .chosen-single abbr:before{display:block;content:'×'}.chosen-container-single .chosen-single abbr:focus,.chosen-container-single .chosen-single abbr:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;height:100%;padding:5px 8px}.chosen-container-single .chosen-single div b{display:inline-block;width:0;height:0;margin-bottom:2px;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent;opacity:.5}.chosen-container-single .chosen-search{position:relative;z-index:1010;padding:3px 4px;margin:0;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{width:100%;height:27px;padding:2px 26px 2px 8px;margin:1px 0;font-size:12px;line-height:1.5;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;outline:0}.chosen-container-single .chosen-search input[type=text]:focus{border-color:#0c64eb}.chosen-container-single .chosen-search:before{position:absolute;top:10px;right:10px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-single .chosen-drop{margin-top:-1px;-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:0 0 4px 4px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;max-height:240px;padding:0;margin:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;padding:5px 10px;margin:0;line-height:15px;list-style:none;-webkit-transition:background-color .2s cubic-bezier(.175,.885,.32,1);-o-transition:background-color .2s cubic-bezier(.175,.885,.32,1);transition:background-color .2s cubic-bezier(.175,.885,.32,1);-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{color:#fff;background-color:#0c64eb}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;width:100%;min-height:32px;min-height:30px\9;padding:0;margin:0;overflow:hidden;cursor:text;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-multi .chosen-choices:after,.chosen-container-multi .chosen-choices:before{display:table;content:" "}.chosen-container-multi .chosen-choices:after{clear:both}.chosen-container-multi .chosen-choices li{display:block;float:left;padding:0 6px;margin:5px 4px;list-style:none}.chosen-container-multi .chosen-choices li.search-field{padding:0;line-height:12px;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:20px;font-size:100%;color:#838a9d;background:0 0!important;border:0!important;border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-field:before{position:absolute;right:8px;bottom:8px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";opacity:0;-webkit-transition:opacity .2s cubic-bezier(.175,.885,.32,1);-o-transition:opacity .2s cubic-bezier(.175,.885,.32,1);transition:opacity .2s cubic-bezier(.175,.885,.32,1);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice{position:relative;padding:3px 20px 3px 5px;line-height:12px;cursor:default;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.chosen-container-multi .chosen-choices li.search-choice:hover{background-color:#fff;border-color:#adb5c6;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 0 rgba(0,0,0,.1)}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:1px;right:0;display:block;width:20px;height:18px;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:focus,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;color:#666;background-color:#e4e4e4;border:1px solid #ccc}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{padding:5px 0;margin:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-bottom-right-radius:0!important;border-bottom-left-radius:0!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active.chosen-with-drop .chosen-single div{background:0 0;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{content:"";border-top:0 dotted;border-bottom:4px solid}.chosen-container-active.chosen-with-drop.chosen-up .chosen-single{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active .chosen-choices{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111!important}.chosen-container-active .chosen-choices li.search-field:before{opacity:1}.chosen-disabled{cursor:default;opacity:.5!important}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{left:0;display:none;padding:3px 4px;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:25px;padding:2px 26px 2px 4px;font-size:inherit}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{top:9px}.chosen-compact.chosen-with-search.chosen-with-drop .chosen-single>.chosen-search{display:block;opacity:1}select.chosen[multiple]{height:32px;overflow:hidden}select.chosen[multiple] option{visibility:hidden}.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.picker-focus .picker-selections{border-color:#0c64eb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6)}.disabled .picker-selections{cursor:not-allowed;background-color:#f5f5f5}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\e928";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\f0d7";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:"\e928"}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:18px;height:18px;text-align:center;cursor:pointer;opacity:.2;-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}.picker-selection-remove:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px;z-index:1}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-multi.picker-sortable .picker-selection-text{cursor:move}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.disabled .picker-search{cursor:not-allowed}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.picker-no-value.picker-focus .picker-placeholder{display:none}.picker-input-empty.picker-focus.picker-no-value .picker-placeholder,.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.42857143;color:#3c4353;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#0c64eb;background:#e9f2fb}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#0c64eb}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option.disabled{cursor:not-allowed!important}.picker-option-text-matched{position:relative;color:#0c64eb}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:2px;content:' ';background-color:#0c64eb;border-radius:2px;opacity:.5}.picker-option-active .picker-option-text-matched,.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option-active .picker-option-text-matched:before,.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ff5d5d}.picker-actions{padding:5px;border-top:1px solid #eee}.picker-no-actions .picker-actions{display:none}.picker-actions .btn{padding:2px 4px}.picker-actions .btn[disabled]{background-color:transparent;filter:grayscale(1);-webkit-filter:grayscale(1)}.picker-actions .btn+.btn{margin-left:4px}.picker-checkable .picker-option{position:relative;padding-left:32px;color:inherit!important;cursor:pointer!important}.picker-checkable .picker-option>.checkbox-primary{position:absolute;top:4px;left:10px}.picker-checkable .picker-option.picker-option-active{background-color:rgba(0,0,0,.05)!important}.picker-checkable .picker-option:hover{background-color:rgba(0,0,0,.075)!important}.picker-checkable .picker-option.picker-option-selected{background-color:#e9f2fb!important}.picker-checkable .picker-option-active .picker-option-text-matched,.picker-checkable .picker-option:hover .picker-option-text-matched{color:#0c64eb!important}.picker-checkable .picker-option-active .picker-option-text-matched:before,.picker-checkable .picker-option:hover .picker-option-text-matched:before{background:#0c64eb!important}:root{--color-primary:#0c64eb;--color-secondary:#16a8f8;--color-pale:#e9f2fb;--color-fore:#3c4353;--color-back:#fff;--color-red:#ff5d5d;--color-yellow:#ff9800;--color-green:#00da88;--color-blue:#2196f3;--color-purple:#8666b8;--color-brown:#bd7b46;--color-danger:#ff5d5d;--color-warning:#ff9800;--color-success:#00da88;--color-info:#2196f3;--color-special:#8666b8;--color-important:#bd7b46;--color-green-pale:#e8f5e9;--color-yellow-pale:#fff3e0;--color-red-pale:#ffebee;--color-blue-pale:#e3f2fd;--color-brown-pale:#efebe9;--color-purple-pale:#f3e5f5;--link-color:#3c4353;--link-hover-color:#0c64eb;--color-gray-darker:#222;--color-gray-dark:#3c495c;--color-gray:#838a9d;--color-gray-light:#cbd0db;--color-gray-lighter:#eee;--color-gray-pale:#f1f1f1;--border-radius:4px;--border-radius-lg:6px;--border-radius-sm:3px;--bg-gradient:linear-gradient(-90deg, #0a48d1 0%, #1183fb 100%)}.container,.container-fixed,.container-fluid{position:relative}.container{max-width:1800px!important}body{background-color:#efefef}body.article-content,body.body-modal{background:0 0}body.body-modal{padding:0}@media screen and (min-width:1920px){body{font-size:14px}}a:active,a:focus,button:active,button:focus{outline:0!important}.strong{font-weight:700}.font-normal{font-weight:400!important}.text-middle{vertical-align:middle!important}.text-bottom{vertical-align:bottom!important}.text-top{vertical-align:top!important}.inline-block{display:inline-block!important}.layer{border-radius:4px;-webkit-box-shadow:0 0 20px 0 #bdc9d8;box-shadow:0 0 20px 0 #bdc9d8}.space{margin-bottom:20px}.space-lg{margin-bottom:30px}.space-sm{margin-bottom:10px}.muted{opacity:.5}.text-muted em{color:#3c4353}.no-animate{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.template{display:none!important}.text-left{text-align:left!important}.text-yellow.icon-folder{color:#ffe066}.table-row{display:table;width:100%;table-layout:fixed}.table-col,.table-row>.col,.table-row>[class*=col-],.table-row>[class*="-col"]{display:table-cell;float:none;vertical-align:top}.side-col{width:200px;padding-right:20px}.side-col.col-4{width:33.3333333%}.col-lg{width:260px}.col-xl{width:320px}.col-sm{width:150px}.col-xs{width:100px}.main-col+.side-col{padding-right:0;padding-left:20px}.row-grid>[class*=col-],.row-grid>[class*="-col"]{padding-top:6px;padding-bottom:6px}hr.space{margin:10px 0;border:none}hr.space-sm{margin:5px 0;border:none}.text-secondary{color:#16a8f8}a.text-primary{color:#0c64eb}.nav-primary>li>a{min-width:100px;padding:5px 8px;color:#838a9d;border-color:#e7f1fc}.nav-primary>li.active>a{color:#0c64eb;background-color:#e7f1fc;border-color:#e7f1fc}.nav-primary>li.active>a:hover{color:#0c64eb;background-color:#c3dcf7;border-color:#c3dcf7}.end-marker{margin-bottom:20px;color:#cbd0db;text-align:center}@-webkit-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@-o-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}.highlight{-webkit-animation:highlight .5s linear 0s 2 alternate;-o-animation:highlight .5s linear 0s 2 alternate;animation:highlight .5s linear 0s 2 alternate}.progress.inline-block{width:100px;margin:0}.w-p5{width:5%!important}.w-p10{width:10%!important}.w-p15{width:15%!important}.w-p20{width:20%!important}.w-p25{width:25%!important}.w-p30{width:30%!important}.w-p35{width:35%!important}.w-p40{width:40%!important}.w-p45{width:45%!important}.w-p50{width:50%!important}.w-p55{width:55%!important}.w-p60{width:60%!important}.w-p65{width:65%!important}.w-p70{width:70%!important}.w-p75{width:75%!important}.w-p80{width:80%!important}.w-p85{width:85%!important}.w-p90{width:90%!important}.w-p94{width:94%!important}.w-p95{width:95%!important}.w-p98{width:98%!important}.w-p99{width:99%!important}.w-p100{width:100%!important}.w-auto{width:auto!important}.w-10px{width:10px!important}.w-20px{width:20px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-60px{width:60px!important}.w-70px{width:70px!important}.w-80px{width:80px!important}.w-90px{width:90px!important}.w-100px{width:100px!important}.w-110px{width:110px!important}.w-120px{width:120px!important}.w-130px{width:130px!important}.w-140px{width:140px!important}.w-150px{width:150px!important}.w-160px{width:160px!important}.w-180px{width:180px!important}.w-200px{width:200px!important}.w-230px{width:230px!important}.w-250px{width:250px!important}.w-300px{width:300px!important}.w-400px{width:400px!important}.w-500px{width:500px!important}.w-600px{width:600px!important}.w-700px{width:700px!important}.w-800px{width:800px!important}.w-900px{width:900px!important}.mw-200px{max-width:200px!important}.mw-300px{max-width:300px!important}.mw-400px{max-width:400px!important}.mw-500px{max-width:500px!important}.mw-600px{max-width:600px!important}.mw-700px{max-width:700px!important}.mw-800px{max-width:800px!important}.mw-900px{max-width:900px!important}.mw-1400px{max-width:1400px!important}.w-id{width:70px!important}.w-pri{width:40px!important}.w-severity{width:50px!important}.w-hour{width:57px!important}.w-date{width:90px!important}.w-status{width:60px!important}.w-resolution,.w-type,.w-user{width:80px!important}.w-p15-f{width:15%!important;min-width:120px!important}.w-p25-f{width:25%!important;min-width:200px!important}.w-p35-f{width:35%!important;min-width:300px!important}.w-p45-f{width:45%!important;min-width:400px!important}.h-5px{height:5px!important}.h-10px{height:10px!important}.h-20px{height:20px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-60px{height:60px!important}.h-70px{height:70px!important}.h-80px{height:80px!important}.h-100px{height:100px!important}.h-120px{height:120px!important}.h-130px{height:130px!important}.h-140px{height:140px!important}.h-150px{height:150px!important}.h-200px{height:200px!important}.pd-0{padding:0!important}.mg-0{margin:0!important}.mgb-20{margin-bottom:20px!important}.mgb-10{margin-bottom:10px!important}.pdb-20{padding-bottom:20px!important}.pdt-20{padding-top:20px!important}.br-0{border-radius:0!important}.bd-0,.bd-none,.borderless{border:none!important}.bg-none{background:0 0!important}.red{color:#ff5d5d!important}.icon-pro-version{font-size:14px!important}.icon-pro-version:before{position:relative;top:-1px;font-size:14px;color:#ff5d5d;content:"\e92b"}.bg-primary{color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb}.bg-primary-pure{color:#fff;background-color:#0c64eb}.bg-primary-pale{color:#0c64eb;background-color:#e9f2fb}.bg-secondary{color:#fff;background:#16a8f8}.hl-tutorial{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 0 0 #000!important;box-shadow:0 0 0 0 #000!important;-webkit-transition:-webkit-box-shadow 1s!important;-o-transition:box-shadow 1s!important;transition:-webkit-box-shadow 1s!important;transition:box-shadow 1s!important;transition:box-shadow 1s,-webkit-box-shadow 1s!important}.hl-tutorial.hl-in{-webkit-box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important;box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important}.btn.tooltip-tutorial,.hl-tutorial.hl-in:hover{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important;box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important}.tooltip-max .tooltip-inner{max-width:1000px;padding:8px 10px}.transition-all *{-webkit-transition:all .2s!important;-o-transition:all .2s!important;transition:all .2s!important}.scroll-x{overflow-x:auto!important}.scroll-y{overflow-y:auto!important}.divider+.divider{display:none}.ie *{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}@font-face{font-family:Oswald;font-weight:400;src:url(../fonts/Oswald-Regular.ttf)}@font-face{font-family:Oswald;font-weight:500;src:url(../fonts/Oswald-Medium.ttf)}@font-face{font-family:Oswald;font-weight:300;src:url(../fonts/Oswald-Light.ttf)}.num{font-family:Oswald;font-weight:400}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(../fonts/ZentaoIcon.eot?v=1.34);src:url(../fonts/ZentaoIcon.eot?#iefix&v=1.34) format('embedded-opentype'),url(../fonts/ZentaoIcon.woff?v=1.34) format('woff'),url(../fonts/ZentaoIcon.ttf?v=1.34) format('truetype'),url(../fonts/ZentaoIcon.svg#regular?v=1.34) format('svg')}.icon,[class*=" icon-"],[class^=icon-]{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}a .icon,a [class*=" icon-"],a [class^=icon-]{display:inline}.icon-lg:before{font-size:1.33333333em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-spin{display:inline-block;-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-spin{display:inline-block;text-decoration:none}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);-o-transform:rotate(359deg);transform:rotate(359deg)}}.icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.icon-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.icon.icon-flip-horizontal,.icon.icon-flip-vertical,.icon.icon-rotate-180,.icon.icon-rotate-270,.icon.icon-rotate-90{display:inline-block}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-help:before{content:"\e968"}.icon-import:before{content:"\e904"}.icon-download:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-plus:before{content:"\e925"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-chart-bar:before{content:"\e95d"}.icon-bar-chart:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before{content:"\e940"}.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-college:before{content:"\e9c8"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-menu-my:before{content:"\e97a"}.icon-home:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before{content:"\e98f"}.icon-product:before{content:"\e98f"}.icon-rocket:before{content:"\e99c"}.icon-project:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-test:before{content:"\e956"}.icon-infinite:before{content:"\e9a3"}.icon-devops:before{content:"\e9a3"}.icon-ops:before{content:"\e903"}.icon-doc:before{content:"\e99b"}.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-menu-backend:before{content:"\e993"}.icon-assets:before{content:"\e9ae"}.icon-diamond:before{content:"\e9ae"}.icon-feedback:before{content:"\e991"}.icon-flow:before{content:"\e994"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before{content:"\e996"}.icon-info:before{content:"\e996"}.icon-cog-outline:before{content:"\e997"}.icon-backend:before{content:"\e997"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before{content:"\f0ac"}.icon-lang:before{content:"\f0ac"}.icon-draft-edit:before{content:"\e9dd"}.icon-sub-review:before{content:"\e9df"}.icon-sub-review-user:before{content:"\e9db"}.icon-ztf:before{content:"\e9dc"}.icon-save:before{content:"\e9d8"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-customer:before{content:"\e9d9"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-kanban:before{content:"\e983"}.icon-lane:before{content:"\e9b1"}.icon-back:before{content:"\e9d3"}.icon-back-circle:before{content:"\e9da"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before{content:"\e9c7"}.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-thumbs-up-solid:before{content:"\e9d6"}.icon-thumbs-down-solid:before{content:"\e9d7"}.icon-hash:before{content:"\e9ab"}.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-file-log:before{content:"\e9de"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file:before{content:"\f016"}.icon-file-empty:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-group:before{content:"\e97e"}.icon-menu-users:before{content:"\e97e"}.icon-persons:before{content:"\e97e"}.icon-team:before{content:"\e97e"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-cancel:before{content:"\e951"}.icon-ban-circle:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before{content:"\e950"}.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-start:before{content:"\e90a"}.icon-play:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-change:before{content:"\e970"}.icon-alter:before{content:"\e970"}.icon-glasses:before{content:"\e914"}.icon-review:before{content:"\e914"}.icon-sitemap:before{content:"\e915"}.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-magic:before{content:"\e919"}.icon-active:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-delay:before{content:"\e91d"}.icon-calendar:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.icon-sm:before{font-size:14px;vertical-align:10%}.icon-qc{position:relative}.icon-qc:before{width:1em;color:#7cb938;content:"\e985"}.icon-qc:after{position:absolute;top:0;left:0;width:1em;height:1em;font-family:ZentaoIcon;font-size:14px;font-size:inherit;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#36a742;text-transform:none;content:"\e987";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-message.has-dot{position:relative}.icon-message.has-dot::after{position:absolute;top:-3px;right:-5px;display:block;width:6px;height:6px;content:' ';background-color:#ff5d5d;border-radius:50%}.icon-project{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.icon-product{-webkit-transform:scale(1.15);-ms-transform:scale(1.15);-o-transform:scale(1.15);transform:scale(1.15)}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:18px;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px;-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background,border,outline,opacity,-webkit-box-shadow;-o-transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,outline,opacity,-webkit-box-shadow;transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,box-shadow,outline,opacity,-webkit-box-shadow}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#3c4353;text-decoration:none}.btn:active{text-decoration:none;background-image:none;outline:0;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.1)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:grayscale(1);-webkit-box-shadow:none;box-shadow:none;opacity:.5;-webkit-filter:grayscale(1)}.btn{color:#3c4353;background-color:#fff;border-color:#d6dae3}.btn.active,.btn.hover,.btn:active,.btn:focus,.btn:hover,.open .dropdown-toggle.btn{color:#3c4353;background-color:rgba(255,255,255,.8);border-color:#b8bfce}.btn.active,.btn:active,.open .dropdown-toggle.btn{background-color:#f2f2f2;background-image:none;border-color:#b8bfce}.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn.active,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover{color:rgba(60,67,83,.3);background-color:#fff;border-color:#d6dae3}.btn-gray{color:#82899f;background-color:#f1f1f1;border-color:#f1f1f1}.btn-gray.active,.btn-gray.hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.open .dropdown-toggle.btn-gray{color:#82899f;background-color:rgba(241,241,241,.8);border-color:#d8d8d8}.btn-gray.active,.btn-gray:active,.open .dropdown-toggle.btn-gray{background-color:#e4e4e4;background-image:none;border-color:#d8d8d8}.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,fieldset[disabled] .btn-gray,fieldset[disabled] .btn-gray.active,fieldset[disabled] .btn-gray:active,fieldset[disabled] .btn-gray:focus,fieldset[disabled] .btn-gray:hover{color:rgba(130,137,159,.3);background-color:#f1f1f1;border-color:#f1f1f1}.btn-primary{color:#fff;background-color:#0c64eb;border-color:transparent}.btn-primary.active,.btn-primary.hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:rgba(12,100,235,.8);border-color:rgba(0,0,0,0)}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-color:#0b5ad3;background-image:none;border-color:rgba(0,0,0,0)}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{color:rgba(255,255,255,.3);background-color:#0c64eb;border-color:transparent}.btn-secondary{color:#fff;background-color:#16a8f8;border-color:transparent}.btn-secondary.active,.btn-secondary.hover,.btn-secondary:active,.btn-secondary:focus,.btn-secondary:hover,.open .dropdown-toggle.btn-secondary{color:#fff;background-color:rgba(22,168,248,.8);border-color:rgba(0,0,0,0)}.btn-secondary.active,.btn-secondary:active,.open .dropdown-toggle.btn-secondary{background-color:#079ced;background-image:none;border-color:rgba(0,0,0,0)}.btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:focus,.btn-secondary.disabled:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[disabled]:active,.btn-secondary[disabled]:focus,.btn-secondary[disabled]:hover,fieldset[disabled] .btn-secondary,fieldset[disabled] .btn-secondary.active,fieldset[disabled] .btn-secondary:active,fieldset[disabled] .btn-secondary:focus,fieldset[disabled] .btn-secondary:hover{color:rgba(255,255,255,.3);background-color:#16a8f8;border-color:transparent}.btn-warning{color:#fff;background-color:#ff9800;border-color:transparent}.btn-warning.active,.btn-warning.hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:rgba(255,152,0,.8);border-color:rgba(0,0,0,0)}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-color:#e68900;background-image:none;border-color:rgba(0,0,0,0)}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{color:rgba(255,255,255,.3);background-color:#ff9800;border-color:transparent}.btn-danger{color:#fff;background-color:#ff5d5d;border-color:transparent}.btn-danger.active,.btn-danger.hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:rgba(255,93,93,.8);border-color:rgba(0,0,0,0)}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-color:#ff4343;background-image:none;border-color:rgba(0,0,0,0)}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{color:rgba(255,255,255,.3);background-color:#ff5d5d;border-color:transparent}.btn-success{color:#fff;background-color:#00da88;border-color:transparent}.btn-success.active,.btn-success.hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:rgba(0,218,136,.8);border-color:rgba(0,0,0,0)}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-color:#00c178;background-image:none;border-color:rgba(0,0,0,0)}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{color:rgba(255,255,255,.3);background-color:#00da88;border-color:transparent}.btn-info{color:#0c64eb;background-color:#e9f2fb;border-color:transparent}.btn-info.active,.btn-info.hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#0c64eb;background-color:rgba(233,242,251,.8);border-color:rgba(0,0,0,0)}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-color:#d3e5f7;background-image:none;border-color:rgba(0,0,0,0)}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{color:rgba(12,100,235,.3);background-color:#e9f2fb;border-color:transparent}.btn-link{padding-right:6px;padding-left:6px;font-weight:400;color:#3c495c;text-shadow:none;cursor:pointer;background:0 0;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover,.btn-link[disabled],fieldset[disabled] .btn-link{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{color:#222;background:#f1f1f1;background:rgba(0,0,0,.075)}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#cbd0db;text-decoration:none}.btn-lg{padding:11px 16px;font-size:14px;line-height:18px;border-radius:4px}.btn-mini,.btn-sm{padding:3px 8px;font-size:12px;line-height:18px;border-radius:4px}.btn-mini,.btn-xs{padding:0 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-wide{min-width:120px}.btn-limit{max-width:180px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-limit>.caret{position:absolute;top:14px;right:8px}.btn-circle{border-radius:17px}.btn>.label-icon{top:3px;padding:3px;margin:-2px;background-color:rgba(0,0,0,.2);border-radius:12px}.btn>.label-icon>.icon{font-size:16px;line-height:18px}.btn>.icon+.text{margin-left:5px}.btn.btn-sm.btn-circle{border-radius:12px}.btn.btn-sm>.label-icon{top:2px;width:20px;height:20px;padding:1px;line-height:20px}.btn.btn-sm>.label-icon>.icon{position:relative;top:-1px;display:inline-block;font-size:14px;line-height:18px}.btn-icon-left{position:relative;padding-left:35px;overflow:hidden;text-align:right}.btn-icon-left>.label-icon{position:absolute;left:5px;margin:0}.btn-icon-left>.icon{position:absolute;top:0;bottom:0;left:0;display:block;width:30px;line-height:30px;color:#16a8f8;text-align:center;background:#e9f2fb}.btn-icon-left.btn-sm{padding-left:28px}.btn-icon-left.btn-sm>.label-icon{left:2px}.btn-icon-left.btn-sm>.icon{width:24px;line-height:24px}.btn-icon-right{position:relative;padding-right:35px;text-align:left}.btn-icon-right>.label-icon{position:absolute;right:5px;margin:0}.btn-icon-right.btn-sm{padding-right:28px}.btn-icon-right.btn-sm>.label-icon{right:2px}.btn-icon{min-width:32px;padding-right:0;padding-left:0}.btn-icon.btn-sm{width:24px;min-width:24px;height:24px}.btn-group{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>.btn-group{float:left}.btn-group>.btn{border-radius:0}.btn-group>.btn:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.dropdown{float:left;margin-right:10px}.btn-toolbar>.btn-group:last-child,.btn-toolbar>.btn:last-child,.btn-toolbar>.dropdown:last-child{margin-right:0}.btn-toolbar>.divider{float:left;height:20px;margin:7px 5px 4px 10px;border-left:1px solid rgba(0,0,0,.1)}.btn-toolbar .space{float:left;min-height:1px;margin:0 10px 0 10px}.btn-toolbar .input-control{float:left;width:120px}.btn-toolbar .page-title{float:left;line-height:34px}.btn-toolbar .page-title .text{font-size:14px;font-weight:700}.btn-toolbar .page-title .label{top:-2px;margin-right:10px}.btn-toolbar .divider+.page-title{margin-left:15px}.btn-active-line{position:relative;font-weight:700;color:#0c64eb}.btn-active-line:after{position:absolute;right:5px;bottom:1px;left:5px;display:block;content:' ';border-bottom:2px solid #0c64eb}.btn-active-line:hover{color:#0c64eb}.btn-active-text .text{position:relative;top:-1px;display:inline-block;font-weight:700;color:#0c64eb}.btn-active-text .text:after{position:absolute;bottom:-5px;display:block;width:100%;content:' ';border-bottom:2px solid #0c64eb}.angle-btn{position:relative;padding:1px;background:#fff;border:1px solid #cbd0db;border-right:none}.angle-btn:first-child{border-radius:2px 0 0 2px}.btn-toolbar>.angle-btn{margin-right:8px}.angle-btn:after,.angle-btn:before{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn:after{right:-7px;border-color:transparent transparent transparent #fff;border-radius:2px}.angle-btn .btn{padding:6px;font-weight:700;background:#fff;border:none;border-radius:4px!important}.angle-btn .btn.btn-limit{padding-right:16px}.angle-btn .btn.btn-limit>.caret{right:4px}.angle-btn+.angle-btn{border-left:none}.angle-btn+.angle-btn>.btn-group:first-child{padding-left:8px}.angle-btn+.angle-btn>.btn-group:first-child:after,.angle-btn+.angle-btn>.btn-group:first-child:before{position:absolute;top:-2px;left:0;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn+.angle-btn>.btn-group:first-child:after{left:-1px;border-color:transparent transparent transparent #fff;border-width:17px 0 17px 8px}.btn-toolbar>.angle-btn.active,.btn-toolbar>.angle-btn:last-child{border-color:#0c64eb}.btn-toolbar>.angle-btn.active .btn,.btn-toolbar>.angle-btn:last-child .btn{color:#0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn.active:before,.btn-toolbar>.angle-btn:last-child:after,.btn-toolbar>.angle-btn:last-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn:last-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:before,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn,.btn-toolbar>.angle-btn.normal{border-color:#cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn .btn,.btn-toolbar>.angle-btn.normal .btn{color:#3c4353}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.active+.angle-btn:before,.btn-toolbar>.angle-btn.normal:after,.btn-toolbar>.angle-btn.normal:before{border-color:transparent transparent transparent #cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.normal:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before,.btn-toolbar>.angle-btn.normal>.btn-group:first-child:before{border-color:transparent transparent transparent #cbd0db!important}.nav>li>.btn.btn-primary{color:#fff}.nav>li>.btn.btn-primary:focus,.nav>li>.btn.btn-primary:hover{background:rgba(12,100,235,.8)}.btn.btn-action,.c-actions .btn{display:inline-block;width:26px;padding:2px;overflow:hidden;line-height:20px;color:#16a8f8;background:0 0;border-color:transparent}.btn.btn-action>i,.c-actions .btn>i{position:relative;top:1px;font-size:18px}.btn.btn-action:hover,.c-actions .btn:hover{color:#0c64eb;background-color:#d3e5f7}.c-actions .btn+.btn{margin-left:-4px}.label{position:relative;display:inline-block;padding:3px 5px;font-size:12px;font-weight:400;vertical-align:middle;border-radius:2px}.label+.label{margin-left:4px}.label-pale{background:#bed8f3!important}.label-badge{border-radius:9px}.label-light{color:#3c4353;background-color:#ddd}.label-primary{background:#0c64eb!important}.label-gray{color:#878da0;background:#e8ebef}.label-outline.label-danger{color:#ff5d5d;background:#ffebee;border-color:rgba(255,93,93,.25)}.label-outline.label-light{color:#838a9d;background:#f2f5fb;border-color:#e1e5ee}.label-primary.label-outline{background:#e9f2fb!important;border-color:rgba(12,100,235,.25)}.label-outline.label-success{background:#e8f5e9;border-color:rgba(0,218,136,.25)}.label-outline.label-info{background:#e3f2fd;border-color:rgba(33,150,243,.25)}.label-outline.label-warning{background:#fff3e0;border-color:rgba(255,152,0,.25)}.label-dot{position:relative;top:-1px;padding:0;border-radius:50%}.label-dot+.status-text{display:inline-block;margin-left:5px}.label-icon{min-width:18px;padding:0;line-height:18px;border-radius:10px}.label-id{display:inline-block;min-width:30px;padding:0 5px;font-size:12px;line-height:16px;color:#838a9d;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid #838a9d;border-radius:2px}.pri-1,.todo-pri-1{color:#ff5d5d}[class*=" status-"],[class^=status-]{color:#3c4353}.status-changed,.status-changing,.status-delayed,.status-doing,.status-fail,.status-investigate{color:#ff5d5d}.status-changed>.label-dot,.status-changing>.label-dot,.status-delayed>.label-dot,.status-doing>.label-dot,.status-fail>.label-dot,.status-investigate>.label-dot{background-color:#ff5d5d}.status-wait{color:#838a9d}.status-wait>.label-dot{background-color:#7ec5ff}.status-unclosed{color:#838a9d}.status-unclosed>.label-dot{background-color:#0c64eb}.status-done,.status-normal,.status-pass,.status-resolved{color:#43a047}.status-done>.label-dot,.status-normal>.label-dot,.status-pass>.label-dot,.status-resolved>.label-dot{background-color:#00da88}.status-postpone{color:#838a9d}.status-postpone>.label-dot{background-color:#ff5d5d}.status-blocked{position:relative;left:-5px;display:inline-block;padding:0 5px;line-height:20px;color:#3c4353;background:0 0;border-radius:10px}.status-blocked>.label-dot{background-color:#ff9800}.status-pause,.status-suspended{color:#ff9800}.status-pause>.label-dot,.status-suspended>.label-dot{background-color:#ff9800}.status-active.status-bug,.status-draft{color:#8666b8}.status-active.status-bug>.label-dot,.status-draft>.label-dot{background-color:#8666b8}.status-closed,.status-terminate{color:#838a9d}.status-closed>.label-dot,.status-terminate>.label-dot{background-color:#838a9d}.status-cancel{color:#838a9d}.status-cancel>.label-dot{background-color:#cbd0db}.label-pri{display:inline-block;min-width:18px;max-width:100%;height:18px;padding:0 4px;overflow:hidden;font-size:12px;line-height:16px;color:#838a9d;text-align:center;text-overflow:clip;white-space:normal;vertical-align:middle;border:1px solid #838a9d;border-radius:10px}.label-pri-1,.label-selector>.label-pri[data-value="1"]{color:#d50000;border-color:#d50000}.label-pri-2,.label-selector>.label-pri[data-value="2"]{color:#ff9800;border-color:#ff9800}.label-pri-3,.label-selector>.label-pri[data-value="3"]{color:#2098ee;border-color:#2098ee}.label-pri-4,.label-selector>.label-pri[data-value="4"]{color:#009688;border-color:#009688}.label-pri-5,.label-selector>.label-pri[data-value="5"]{color:#838a9d;border-color:#838a9d}.label-pri-0,.label-selector>.label-pri.active[data-value="0"]{color:#d5d9df;border-color:#d5d9df}.label-severity{position:relative;display:inline-block;width:24px;height:20px;font-weight:bolder;text-align:center;vertical-align:middle}.label-severity:before{position:absolute;top:-3px;left:0;z-index:0;display:block;font-family:ZentaoIcon;font-size:14px;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:inherit;text-transform:none;content:"\e973";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.label-severity:after{position:absolute;top:7px;left:0;z-index:1;display:block;width:24px;font-size:12px;line-height:12px;text-align:center;content:attr(data-severity)}.label-severity[data-severity],.label-severity[data-value]{color:#ccc}.label-severity[data-severity="0"],.label-severity[data-value="0"]{color:#ccc}.label-severity[data-severity="1"],.label-severity[data-value="1"]{color:#c62828}.label-severity[data-severity="2"],.label-severity[data-value="2"]{color:#ff8f00}.label-severity[data-severity="3"],.label-severity[data-value="3"]{color:#fdd835}.label-severity[data-severity="4"],.label-severity[data-value="4"]{color:#cddc39}.label-severity[data-severity="5"],.label-severity[data-value="5"]{color:#8bc34a}.label-severity-custom[data-severity]{color:#d5d9df}.label-severity-custom[data-severity="1"]{color:#c62828}.label-severity-custom[data-severity="2"]{color:#ff8f00}.label-severity-custom[data-severity="3"]{color:#fdd835}.label-severity-custom[data-severity="4"]{color:#cddc39}.label-severity-custom[data-severity="5"]{color:#8bc34a}.label-selector{padding:0 10px}.label-selector>.label{display:inline-block;min-width:24px;height:24px;padding:0 5px;font-size:14px;line-height:20px;text-align:center;cursor:pointer;background:0 0;border:2px solid #d5d9df;border-radius:15px}.label-selector>.label+.label{margin-left:10px}.label-selector>.label.empty{border-color:transparent}.label-selector>.label.label-severity{font-size:12px;line-height:28px;border-color:transparent}.label-selector>.label.label-severity:before{top:-2px;left:-2px}.label-selector>.label.label-severity:after{display:none}.label-selector>.label.label-severity.active{background:0 0;filter:none;-webkit-filter:none}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-top:2px}.ie .checkbox input[type=checkbox],.ie .checkbox-inline input[type=checkbox],.ie .radio input[type=radio],.ie .radio-inline input[type=radio]{margin-top:4px}.is-firefox .checkbox input[type=checkbox],.is-firefox .checkbox-inline input[type=checkbox],.is-firefox .radio input[type=radio],.is-firefox .radio-inline input[type=radio]{margin-top:3px}.checkbox-primary,.radio-primary{position:relative;display:block;vertical-align:middle}.checkbox-primary.inline-block,.radio-primary.inline-block{display:inline-block}.checkbox-primary.inline-block+.inline-block,.radio-primary.inline-block+.inline-block{margin-left:15px}.checkbox-primary>input,.radio-primary>input{position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;margin:0;opacity:0}.checkbox-primary>label,.radio-primary>label{display:block;height:20px;padding-left:20px;margin:0;font-weight:400;line-height:20px;cursor:pointer}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{position:absolute;top:3px;right:0;left:0;display:block;width:14px;height:14px;line-height:14px;text-align:center;content:' ';border-radius:3px}.checkbox-primary>label:after,.radio-primary>label:after{z-index:1;border:1px solid #d9dbe1;border-color:rgba(0,0,0,.15);-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:border,background-color;-o-transition-property:border,background-color;transition-property:border,background-color}.checkbox-primary>label:before,.radio-primary>label:before{top:3px;z-index:2;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-weight:900;font-variant:normal;line-height:1;text-transform:none;content:"\e5ca";opacity:0;-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:opacity,-webkit-transform;-o-transition-property:opacity,-o-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform,-o-transform;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.checkbox-primary.checked>label:after,.checkbox-primary>input:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:#00da88;border-color:#00da88;border-width:4px}.checkbox-primary.checked>label:before,.checkbox-primary>input:checked+label:before,.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{color:#fff;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary input:indeterminate+label:before,.checkbox-primary.indeterminate>label:before,.radio-primary input:indeterminate+label:before,.radio-primary.indeterminate>label:before{top:9px;left:3px;width:8px;height:2px;content:' ';background-color:#a3a2bc;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary.focus>label:after,.checkbox-primary>input:focus+label:after,.radio-primary.focus>label:after,.radio-primary>input:focus+label:after{border-color:#00da88;-webkit-box-shadow:0 0 0 3px rgba(0,218,136,.2);box-shadow:0 0 0 3px rgba(0,218,136,.2)}.checkbox-primary:hover>label:after,.radio-primary:hover>label:after{border-color:#00da88}.checkbox-primary.checkbox-right>label,.radio-primary.checkbox-right>label{padding:0 30px 0 0}.checkbox-primary.checkbox-right>label:after,.checkbox-primary.checkbox-right>label:before,.radio-primary.checkbox-right>label:after,.radio-primary.checkbox-right>label:before{right:0;left:auto}.checkbox-primary input:disabled+label:after,.checkbox-primary.disabled>label:after,.radio-primary input:disabled+label:after,.radio-primary.disabled>label:after{background-color:#e5e5e5!important;border-color:#bbb!important}.checkbox-primary input:disabled:checked+label:after,.checkbox-primary.checked.disabled>label:after,.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:#bbb!important}.radio-primary>label:after{border-radius:50%}.radio-primary>label:before{top:7px;left:6px;width:6px;height:6px;content:' ';border:none;border-radius:50%}.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:transparent;border-color:#00da88;border-width:2px}.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{background-color:#00da88}.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:transparent;border-color:#bbb}.radio-primary input:disabled:checked+label:before,.radio-primary.checked.disabled>label:before{background-color:#bbb}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li>a{position:relative;border:none!important;border-radius:2px!important}.nav-tabs>li.active>a{font-weight:700;color:#3c4353!important}.nav-tabs>li.active>a:before{position:absolute;right:0;bottom:-1px;left:0;display:block;height:2px;content:' ';background:#0c64eb}.nav-tabs-primary>li.active>a{color:#0c64eb!important}.panel{position:relative;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.panel-body{padding:20px}.panel-body.has-table{padding:10px}.panel-body.has-table .table{margin-bottom:0;table-layout:fixed}.panel-heading{padding:12px 48px 12px 20px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading+.panel-body{padding-top:0}.panel-title{font-size:14px;font-weight:700;line-height:20px}.panel-title .label{top:-1px}.panel-actions{position:absolute;top:0;right:0;padding:7px 8px}.panel:hover .panel-actions{z-index:10}.panel-actions>li>a{display:inline-block;min-width:30px;padding:0 5px;line-height:30px;color:#a6aab8;text-align:center;border-radius:4px}.panel-actions>li>a:hover{color:#3c495c;text-decoration:initial;background-color:#f1f1f1}.panel-actions .btn-icon{color:#a6aab8}.panel-actions .btn.text-primary{color:#0c64eb}.panel .empty-tip{padding:30px 10px 50px;font-size:14px;color:#838a9d;text-align:center}.progress-text-left{position:relative;margin:7px 0;margin-left:35px;overflow:visible}.progress-text-left .progress-text{position:absolute;top:-7px;left:-35px;display:block;width:35px;height:20px;padding-right:5px;line-height:20px;color:#838a9d;text-align:right}.chart-color{width:20px}.chart-color-dot{display:inline-block;width:10px;height:10px;border-radius:50%}.chart-row{margin-top:10px}.chart-row+.chart-row{padding-top:10px;border-top:1px solid #eee}.chart-wrapper{padding:10px 5px;background:#eee}.chart-wrapper>h4{margin:5px 0 10px}.table-wrapper{max-height:250px;overflow:auto}.table-wrapper .table{margin:0}.progress-pie{position:relative}.progress-pie canvas{display:block}.progress-pie .progress-info{position:absolute;top:0;left:0;width:100%;height:100%;padding-top:25px;text-align:center}.progress-pie .progress-info>small{display:block;line-height:14px;color:#a6aab8}.progress-pie .progress-info>strong{display:block;font-size:36px;line-height:40px}.progress-pie .progress-info>strong>small{font-size:20px}.progress-pie-120 .progress-info{padding-top:30px}.progress-pie-120 .progress-info>small{line-height:18px}.progress-pie-50 .progress-info{padding-top:4px}.progress-pie-50 .progress-info>strong{font-size:20px;font-weight:400}.progress-pie-50 .progress-info>strong>small{font-size:14px}.progress-pie[data-value="100"] .progress-info>strong{-webkit-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);transform:scale(.7)}.progress-pie-24 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:24px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-24[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.progress-pie-26 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:26px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-26[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.status-bars{display:table;width:100%;height:140px;padding:5px;padding-top:50px;margin:0;overflow:hidden}.status-bars>li{position:relative;display:table-cell;text-align:center;vertical-align:bottom}.status-bars .bar{position:absolute;bottom:20px;left:50%;display:block;width:10px;margin-left:-5px;background:#0c64eb;border-radius:5px 5px 0 0}.status-bars .bar:after{position:absolute;right:-50px;bottom:0;left:-50px;display:block;height:1px;content:' ';background:#eee}.status-bars .title{font-size:12px;font-weight:400;color:#a6a8b6}.status-bars .value{position:relative;top:-20px;left:-20px;display:inline-block;width:50px;font-size:16px;font-weight:700;text-align:center}.status-bars-h{display:block;padding-right:50px;padding-left:60px;list-style:none}.status-bars-h>li{position:relative;height:40px;border-left:1px solid #eee}.status-bars-h .bar{position:relative;top:15px;display:block;height:10px;line-height:20px;background:#0c64eb;border-radius:0 5px 5px 0}.status-bars-h .title{position:absolute;top:-5px;left:-60px;width:60px;padding-right:10px;font-size:12px;color:#a6a8b6;text-align:right}.status-bars-h .value{position:absolute;top:-5px;right:-50px;display:block;width:40px;font-size:14px;font-weight:700;text-align:left;white-space:nowrap}.ring,[class*=" ring-"],[class^=ring-]{width:24px;height:24px;font-size:12px;line-height:24px;text-align:center;background-image:url(data:image/png;base64,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);background-position:0 0;-webkit-background-size:1224px 24px;background-size:1224px 24px}.ring>span,[class*=" ring-"]>span,[class^=ring-]>span{display:inline-block;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.messager{border-radius:4px;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1)}.messager-icon{vertical-align:middle}.messager-icon>.icon{font-size:24px}.messager-content{padding:18px 20px;font-size:18px;line-height:30px}.messager-content>.icon{font-size:28px;line-height:30px}.messager-actions{vertical-align:middle}.messagger-zt{color:#3c4353;background-color:#fff!important}.messagger-zt .messager-icon>.icon{color:#0c64eb}.messagger-zt .messager-actions>.action{color:#838a9d}.messagger-zt.messager-success .messager-icon>.icon{color:#00da88}.messagger-zt.messager-danger .messager-icon>.icon{color:#ff5d5d}.messagger-zt.messager-warning .messager-icon>.icon{color:#ff9800}.messagger-zt.messager-info .messager-icon>.icon{color:#2196f3}.tree{padding-left:0;overflow:hidden}.tree ul{position:relative;display:none;padding-left:0}.tree li{position:relative;padding:2px 0 2px 15px;list-style:none}.tree li.heading{padding-left:5px;color:#3c495c}.tree li>a{display:block;max-width:90%;padding:2px 6px;color:#3c495c;word-break:break-all}.tree li>a:hover{color:#3c4353}.tree li>a.tree-toggle:hover{background:0 0}.tree li.active>a{position:relative;font-weight:700;color:#0c64eb}.tree li>.list-toggle{position:absolute;top:1px;left:1px;z-index:10;width:20px;font-size:14px;line-height:22px;color:#cbd0db;text-align:center;cursor:pointer;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tree li>.list-toggle:before{content:"\f0da"}.tree li>.list-toggle:active,.tree li>.list-toggle:hover{color:#0c64eb}.tree li.has-active-item>.list-toggle{color:#3c4353}.tree li.has-list.open>ul{display:block}.tree li.has-list.open>.list-toggle{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.tree li.has-list.open:before{position:absolute;top:16px;bottom:-5px;left:10px;display:block;content:' ';border-left:1px solid #d8d8d8}.tree-actions{display:inline-block;margin-left:5px;vertical-align:middle}.tree-actions a{display:inline-block;margin-left:5px;font-size:13px;opacity:.6}.tree-actions a:hover{opacity:1}.tree li>.module-name{color:#3c495c;vertical-align:middle}.tree li>.module-name:hover{background-color:#f0f2f5}.tree li>.module-name:hover>a{color:#3c4353}.treemap-node-fold-icon:before{position:relative;left:-4px;min-width:18px}.dropdown-menu{padding:5px 0;border-color:rgba(0,0,0,.1)}.dropdown-menu>li{padding:0 10px}.dropdown-menu>li>a{padding:2px 10px;margin:5px 0;border-radius:3px}.dropdown-menu>li>a>.icon{position:relative;left:-5px;opacity:.5}.dropdown-menu>li>a:hover>.icon{opacity:.8}.dropdown-menu>li.active>a,.dropdown-menu>li.selected>a{position:relative;color:#fff;background-color:#16a8f8}.dropdown-menu>li.selected>a:after{position:absolute;top:2px;right:4px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:20px;text-transform:none;content:"\e5ca";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>li.divider{margin:10px}.dropdown-submenu>a:after{margin-right:-5px}.dropdown-submenu>.dropdown-menu.pull-left{margin-left:-1px}.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#3c4353;background-color:#e9f2fb}.dropdown-submenu:hover>a:after{border-left-color:#0c64eb}.dropdown-submenu>a:hover:after{border-left-color:#fff}.pager .btn{padding:3px 10px}.pager .btn .caret{opacity:.7}.pager>li>.pager-label{padding:2px;line-height:20px}.pager>li>.pager-item{min-width:20px;padding:1px;margin:2px 0;font-size:16px;line-height:20px;text-align:center;background:0 0;border-color:transparent}.pager>li>.pager-item:hover{background-color:rgba(0,0,0,.1)}.pager>li>.pager-item>.icon{position:relative;top:-1px}.pager>li>.btn:hover,.pager>li>a:hover{background:rgba(0,0,0,.1)}.pager>li.disabled>a.pager-item{background:0 0;border-color:transparent;opacity:.5}.pager>li.active>a{background-color:#16a8f8}.pager>li .btn-group .btn{padding:1px;margin:1px 0;border-radius:4px}.pager .dropdown-menu{width:200px}.pager .dropdown-menu>li{float:left;width:33.333333%}.modal-dialog{width:900px;max-width:1360px;border:none;border-radius:0;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,.25);box-shadow:0 0 20px 0 rgba(0,0,0,.25)}.modal-dialog.modal-md{width:700px}.modal-dialog.modal-xs{width:400px}.modal-dialog.modal-sm{width:500px}.modal-dialog.modal-lg{width:1200px}.modal-dialog.modal-fullscreen{position:fixed;max-width:initial}.modal-header{padding:20px 0;margin:0 20px}.modal-header>.close{color:#838a9d;text-shadow:0 1px 0 rgba(255,255,255,.85);opacity:1}.modal-header>.close:hover{color:#222}.modal-footer{padding:20px 0;margin:0 20px}.modal-title{font-size:14px;font-weight:400;line-height:20px}.modal-actions{position:absolute;top:16px;right:16px}.modal-actions .divider{position:relative;top:5px;display:inline-block;width:0;height:20px;margin:0 10px;border-left:#eee 1px solid}.modal-actions>.dropdown{display:inline-block}.modal-body{padding:20px}.modal-iframe .modal-body>iframe{border-radius:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-3%);-ms-transform:translate(0,-3%);-o-transform:translate(0,-3%);transform:translate(0,-3%)}.modal.fade.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-simple .modal-footer{padding-top:0;border-top:none}.modal-iframe .modal-header{position:relative;z-index:10;min-height:0;padding:0;border:none}.modal-iframe .modal-title{display:none}.modal-iframe .modal-header .close{position:absolute;top:12px;right:10px;font-size:32px;font-weight:200}.modal-iframe .modal-dialog{overflow:hidden}.modal-inverse .modal-header>.close{color:rgba(255,255,255,.7);text-shadow:none}.modal-inverse .modal-header>.close:hover{color:#fff}.modal-scroll-inside>.modal-dialog{max-height:100%}.hide-modal-close .modal-iframe .modal-header .close{display:none}.tile{text-align:center}.tile-title{line-height:20px;color:#3c495c}.tile-amount{font-size:32px;font-weight:700;line-height:56px}.timeline>li{position:relative;list-style:none}.timeline>li:before,.timeline>li>a:after,.timeline>li>div:after{position:absolute;left:-20px;display:block;width:15px;height:15px;content:' ';border-radius:50%}.timeline>li:before{top:12px;left:-16px;z-index:3;width:7px;height:7px;background-color:#cbd0db;border:none;border:1px solid #cbd0db}.timeline>li>a:after,.timeline>li>div:after{top:11px;left:-17px;z-index:3;width:9px;height:9px;background-color:#0c64eb;border-radius:50%;opacity:0}.timeline>li+li:after{position:absolute;top:-12px;bottom:20px;left:-13px;z-index:1;display:block;content:' ';border-left:1px solid #eee}.timeline>li.active>a:after,.timeline>li.active>div:after{opacity:1}.timeline>li.active:before{top:8px;left:-20px;width:15px;height:15px;background-color:rgba(12,100,235,.2);border:none}.timeline>li>a,.timeline>li>div{display:block;padding:5px;line-height:20px}.timeline>li.active>a{color:#3c4353}.timeline-tag{position:absolute;top:5px;left:-115px;font-size:12px}.timeline-tag-left{padding-left:115px}.timeline-sm{font-size:12px}.timeline-sm>li:before,.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:10px;left:-20px;width:11px;height:11px}.timeline-sm>li.active:before,.timeline-sm>li:before{top:10px;left:-18px;width:11px;height:11px;background:0 0;border:1px solid #eee}.timeline-sm>li>a,.timeline-sm>li>div{line-height:20px}.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:13px;left:-15px;width:5px;height:5px}.form-control{-webkit-box-shadow:none;box-shadow:none}.form-horizontal .form-group>label{padding-right:0}.form-actions{margin-top:20px;margin-bottom:0}.form-actions .btn{margin-right:10px}form label{font-weight:400;color:#3c495c}.form-group .btn+.btn{margin-left:5px}.table-form{margin-bottom:0;table-layout:fixed}.table-form>thead>tr>th.required:after{position:relative;top:3px;right:auto;left:4px;display:inline-block;vertical-align:middle}.table-form>tbody>tr>td,.table-form>tbody>tr>th,.table-form>tfoot>tr>td,.table-form>thead>tr>th{padding:7px;vertical-align:middle;border-bottom:none}.table-form>tfoot>tr>td{padding:20px 7px 10px}.table-form>tbody>tr>th{width:100px;font-weight:700;text-align:right}.table-form .input-group{width:100%}.chosen-container-single .chosen-single{position:relative}.chosen-container-single .chosen-single>span{height:20px;line-height:20px;word-break:break-all;white-space:normal}.chosen-container-single .chosen-single div b{position:relative;top:1px;color:#cbd0db;opacity:1}.chosen-container-single .chosen-search:before{top:8px;right:15px}.chosen-container-multi .chosen-choices li.search-choice{font-size:13px;background:#eee;border-color:#cbd0db;-webkit-box-shadow:none;box-shadow:none}.chosen-container-single .chosen-search input[type=text]{height:30px;padding:3px 25px 3px 5px}.chosen-container-single .chosen-search{padding:3px 10px 0}.chosen-container-single .chosen-single{overflow:visible}.chosen-container .chosen-results{max-height:245px;padding:10px}.chosen-container .chosen-results>li{border-radius:4px}.chosen-container .chosen-results li.highlighted em{color:#fff}.table-responsive .chosen-container .chosen-results{max-height:200px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{top:-2px;right:-1px;bottom:-1px;left:-1px;display:none;height:auto;padding:0;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:31px;padding:5px 26px 5px 8px;font-size:inherit;line-height:20px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{right:8px}.datetimepicker{padding:10px}.datetimepicker td.day.today{background-color:#f77}.datetimepicker td.day.active{background-color:#16a8f8}.datetimepicker tfoot th,.datetimepicker thead th{color:#838a9d}.input-control .colorpicker{top:0;z-index:auto;opacity:1}.input-control .colorpicker .btn{padding:5px}.input-control .input-control-icon-right.btn{top:0}.colorpicker .dropdown-menu{min-width:232px;padding:5px 10px 10px 10px}.colorpicker .dropdown-menu>li{display:block;float:left;padding:5px}.colorpicker .dropdown-menu>li.heading{width:100%;margin-bottom:5px;font-size:16px;font-weight:700;text-align:left}.colorpicker .dropdown-menu>li.heading>.icon-close{position:relative;top:4px;float:right;cursor:pointer;opacity:.6}.colorpicker .dropdown-menu>li>a{position:relative;display:block;width:100%;height:100%;padding:0;margin:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;border:1px solid transparent;border-radius:50%;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.colorpicker .dropdown-menu>li>a:before{position:absolute;top:0;display:block;width:100%;height:20px;line-height:18px}.colorpicker .dropdown-menu>li>a:hover{-webkit-box-shadow:0 1px 4px rgba(0,0,0,.25);box-shadow:0 1px 4px rgba(0,0,0,.25)}.colorpicker .dropdown-menu>li>a.active:before{font-size:14px;content:"\e5ca"}.colorpicker .dropdown-menu>li>a.empty{color:#666;background:#fff}.colorpicker .dropdown-menu>li>a.empty:before{content:"\e90d"}.colorpicker .btn{position:relative}.colorpicker .btn .color-bar{position:absolute;right:5px;bottom:3px;left:5px;height:3px}.colorpicker .btn .color-bar[style*='background: ']+.ic{position:relative;top:-2px}.colorpicker .btn .ic{color:#cbd0db}.colorpicker .btn:hover .ic{color:#838a9d}.input-group .colorpicker{z-index:3}.input-group .chosen-container{display:table-cell}.input-group-addon{border-right-width:0;border-left-width:0}.input-group-addon:first-child{border-left-width:1px}.input-group-addon:last-child{border-right-width:1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin:0}.input-group-cell{display:table-cell;width:1%;padding:0 12px;white-space:nowrap;vertical-align:middle}.ke-container{border-color:#dcdcdc!important;border-radius:2px!important}.ke-container.focus{border-color:#0c64eb!important}.ke-toolbar{border-color:#dcdcdc!important}.required:after{top:6px;right:-10px;font-size:20px}td.required:after{top:12px;right:-5px}.input-group>.chosen-container.required:after,.input-group>.input-control.required:after{top:1px;right:1px;z-index:2}.input-group.required .required:after{display:none}.file-input{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.file-input .input-group{width:auto}.file-input .input-group>.input-group-cell:first-child{padding-right:0;padding-left:7px}.file-input input[type=file]{position:absolute;width:0;height:0;opacity:0}.file-input .file-title{display:inline-block;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.file-input .file-editbox{min-width:200px;max-width:100%}.file-input .file-size{display:inline-block;vertical-align:middle}.edit .file-input-empty,.file-input-edit,.file-input-normal,.normal .file-input-empty{display:none}.edit .file-input-edit,.normal .file-input-normal{display:block}.edit .file-input-edit.input-group,.normal .file-input-normal.input-group{display:table}.edit .file-input-normal{display:none!important}.file-input-normal>.input-group-btn{width:auto}.input-group .chosen-container-active .chosen-choices{border-color:#0c64eb!important}.input-group .chosen-container{min-width:100px}.input-group .input-group-btn .btn>.icon{line-height:17px}.os-mac select.form-control{-webkit-appearance:none;background-image:url(data:image/gif;base64,R0lGODlhCQAFAIAAAMvQ2////yH5BAEAAAEALAAAAAAJAAUAAAIKhH+BGYoNGWxgFgA7);background-image:url(data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==);background-repeat:no-repeat;background-position:right 5px top 12px;-moz-appearance:none}input::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none!important;pointer-events:none;visibility:hidden}.chosen-choices.has-error,.chosen-single.has-error,.form-control.has-error{border-color:#ff5d5d!important;-webkit-box-shadow:0 0 6px #ffc3c3!important;box-shadow:0 0 6px #ffc3c3!important}.popover-success.popover-form-result{font-weight:700;color:#fff;background:#00da88}.popover-success.popover-form-result.popover.right .arrow:after{border-right-color:#00da88}textarea.kindeditor{padding:0!important}.form-unsaved{outline:2px solid #ff9800;-webkit-box-shadow:0 1px 12px #ff9800;box-shadow:0 1px 12px #ff9800;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s}select[multiple].picker-select,select[multiple][data-toggle=picker]{max-height:32px;visibility:hidden}.picker-selection-remove:before{font-size:18px}.picker-user-option{position:relative;padding-left:40px}.picker-user-option>.avatar{position:absolute;top:5px;left:10px}.picker-user-option>.picker-option-text{display:inline-block;min-width:40px;font-weight:700}.picker-user-option>.dept-name,.picker-user-option>.role-name{display:inline-block;margin-left:10px;font-size:12px;opacity:.6}.picker-user-option>.dept-name{min-width:50px}#mainHeader{height:50px;color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb;border-bottom-color:#e9f2fb}#mainHeader>.container{min-width:1200px;padding:0}#heading{position:absolute;top:10px;left:20px}@media (min-width:1400px){#heading{left:40px}}#heading h1{float:left;max-width:250px;margin:0;overflow:hidden;font-size:20px;font-weight:400;line-height:30px;text-overflow:ellipsis;white-space:nowrap}#heading h1 a{color:inherit;text-decoration:inherit}#heading h1.long-name{position:relative;top:-5px;display:table-cell;font-size:16px;line-height:20px;word-break:break-all;white-space:normal}#heading>.btn{display:block;float:left;height:20px;padding:1px 5px;margin:0;margin:5px 0 0 10px;font-size:12px;font-weight:lighter;line-height:18px;background-color:rgba(255,255,255,.2);border:none}#heading>.btn:hover{background-color:rgba(0,0,0,.1)}#navbar{margin:0 auto;text-align:center}#navbar .nav{display:inline-block}#navbar .nav>li>a{padding:10px;line-height:30px;color:#fff;border-radius:0;opacity:.9}@media (max-width:1400px){#navbar .nav>li>a{padding:10px 8px}}#navbar .nav>li>a:focus,#navbar .nav>li>a:hover{background:rgba(0,0,0,.15);opacity:1}#navbar .nav>li.active>a{font-weight:700;background:rgba(0,0,0,.1);opacity:1}#navbar .nav>li.divider{display:block;width:2px;height:20px;margin:15px 8px;background:rgba(255,255,255,.4)}@media (max-width:1400px){#navbar .nav>li.divider{margin:15px 5px}}@media (max-width:1300px){#navbar .nav>li.divider{margin:15px 3px}}#navbar .nav>li.divider:last-child{display:none}#navbar .nav .dropdown-menu li>a{text-align:left}#toolbar{position:absolute;top:12px;right:20px;font-size:12px;color:#fff}@media (min-width:1400px){#toolbar{right:40px}}#extraNav{text-align:right}#extraNav>li{display:inline-block;float:none;text-align:left}#extraNav>li>a{display:block;padding:0;color:#fff;opacity:.75}#extraNav>li>a:hover{text-decoration:unset;background-color:rgba(0,0,0,.1);opacity:1}#extraNav>li.open>a{background-color:rgba(0,0,0,.1)}#extraNav>li+li{margin-left:10px}#showSearchGo{color:#fff;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.5)}#searchbox{position:relative;float:left;width:150px}#searchbox .input-group-btn .btn{position:relative;padding:1px 4px;font-size:12px;line-height:20px;color:#fff;background-color:rgba(255,255,255,.15);border-right:none;border-radius:2px}#searchbox .input-group-btn .btn:after{position:absolute;top:3px;right:0;bottom:3px;display:block;width:1px;content:' ';background-color:rgba(255,255,255,.15)}#searchbox .input-group-btn .btn:hover{background-color:rgba(255,255,255,.25)}#searchGo{position:absolute;top:0;right:-1px;z-index:9;min-width:24px;height:24px;padding:2px 3px;font-size:12px;line-height:20px;color:#fff;background-color:#16a8f8;border-radius:2px}#searchGo:hover{color:#fff!important;background-color:#0c64eb}#searchInput{height:24px;padding:2px 30px 2px 5px;color:#fff;text-align:left;background:rgba(255,255,255,.15);border-color:transparent;border-radius:0 12px 12px 0;-webkit-transition:background .2s,border .2s;-o-transition:background .2s,border .2s;transition:background .2s,border .2s}#searchInput:hover{background:rgba(255,255,255,.25)}#searchInput:focus{color:#333;background:#fff}#searchInput::-webkit-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::-moz-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:-ms-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:focus::-webkit-input-placeholder{color:#838a9d}#searchInput:focus::-moz-placeholder{color:#838a9d}#searchInput:focus:-ms-input-placeholder{color:#838a9d}#searchInput:focus::placeholder{color:#838a9d}#searchTypeMenu{min-width:220px}#searchTypeMenu>li{float:left;width:50%}#searchTypeMenu>li>a{margin:4px 0}#userNav .avatar{display:inline-block;vertical-align:middle}#userNav>li>a{padding:2px 6px;line-height:20px;color:#fff;opacity:.9}#userNav>li>a .user-name{max-width:100px;overflow:hidden;font-size:15px;text-overflow:ellipsis;white-space:nowrap}#userNav>li>a:hover{background-color:rgba(0,0,0,.1);opacity:1}#userNav>li>a:hover>i{opacity:1}#userNav>li>a span{vertical-align:middle}#userNav>li.open>a{background-color:rgba(0,0,0,.1)}#userNav>li.has-new-items>a{position:relative}#userNav>li.has-new-items>a:before{position:absolute;top:3px;right:-1px;display:block;width:4px;height:4px;content:' ';background-color:#ff5d5d;border-radius:50%}#userNav .dropdown-menu{min-width:150px}#userNav .dropdown-menu>li>a>.icon{position:absolute;top:10px;right:5px;display:block;width:20px;height:20px;line-height:20px;text-align:center}#userNav .user-profile-item>a{position:relative;padding-left:45px}#userNav .user-profile-item .avatar{position:absolute;top:6px;left:5px}#userNav .user-profile-name{font-size:16px}#userNav .user-profile-role{font-size:12px;color:#a9abb8}#userNav .no-role .user-profile-role{display:none}#userNav .no-role .user-profile-name{line-height:40px}#subHeader{min-height:50px;background:#fff}#subHeader>.container{padding:0 20px}@media (min-width:1400px){#subHeader>.container{padding:0 40px}}#pageNav{position:absolute;top:8px;left:0;left:20px}@media (min-width:1400px){#pageNav{left:40px}}#subNavbar{margin-top:5px;font-size:14px;text-align:center}#subNavbar .nav{display:inline-block}#subNavbar .nav>li>a{padding:8px 12px;line-height:24px;color:#3c495c}#subNavbar .nav>li>a:hover{color:#3c495c;background-color:rgba(0,0,0,.075)}#subNavbar .nav>li.active>a{font-weight:700;color:#0c64eb}#subNavbar .nav>li.divider{display:block;width:2px;height:20px;margin:9px 5px;background-color:rgba(0,0,0,.05)}#subNavbar .dropdown-menu{text-align:left}[lang=en] #subNavbar>.nav>li>a{padding-right:8px;padding-left:8px}#pageActions{position:absolute;top:9px;right:20px}@media (min-width:1400px){#pageActions{right:40px}}.cell{padding:10px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.cell+.cell{margin-top:10px}.cell>.panel{margin:0;-webkit-box-shadow:none;box-shadow:none}.cell>.panel>.panel-heading{padding:5px 5px 10px}.cell>.panel>.panel-heading .panel-actions{padding:0}.cell>.panel>.panel-body{padding:5px}.cell>.table{margin:0}#main{min-width:1200px;padding:20px 0}#main>.container{padding:0 20px}@media (min-width:1400px){#main>.container{padding:0 40px}}#header,#header+#main{min-width:1200px}#mainMenu{margin:-10px 0 8px}.main-content{padding:20px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}@media (min-width:1400px){.main-content>.center-block{max-width:1350px;padding:20px;border:1px solid #eee}.main-content>.center-block .main-header{background-color:#f1f1f1}}.main-content>h2{margin:0 0 20px}.main-content .cell{-webkit-box-shadow:none;box-shadow:none}.main-header{padding:5px 20px;border-bottom:1px solid #eee}.main-header:after,.main-header:before{display:table;content:" "}.main-header:after{clear:both}.main-header>h2{display:block;float:left;margin:0 10px 0 0;font-size:14px;line-height:34px}.main-header>h2 .label-id{margin-right:5px}.main-header>h2 small{font-size:14px;font-weight:400}.main-content .main-header{margin:-20px -20px 10px}.main-header .label{top:-1px}.main-row{display:table;width:100%;table-layout:fixed}.main-row>[class*=" col-"],.main-row>[class*="-col"],.main-row>[class^=col-]{display:table-cell;vertical-align:top}@media (max-width:720px){.main-row{display:block}.main-row>*{display:block;width:100%}.main-row .side-col{width:100%;padding:0}.main-row .main-col+.side-col,.main-row .side-col+.main-col{margin-top:10px}}.main-row.hide-side .side-col{display:none}.main-form{margin:0}@media (min-width:720px){.main-content>.center-block .main-form{padding-right:20px}}#main .side-col .tabs{padding:5px}#main .side-col .nav-tabs{margin:0 5px 5px 5px}#main .side-col .nav-tabs>li{margin:0}#main .side-col .nav-tabs>li+li{margin-left:10px}#main .side-col .nav-tabs>li>a{padding:8px 5px}#main .side-col .tab-content .tab-pane table{border:none}.main-actions .btn-toolbar{display:inline-block;padding:4px 15px;color:#fff;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);border-radius:4px}.main-actions .btn-toolbar .divider{margin-right:15px;margin-left:15px;border-color:rgba(255,255,255,.1)}.main-actions .btn-toolbar .btn{height:30px;padding-right:10px;padding-left:10px;margin-right:0;color:#fff;background-color:transparent;border:none}.main-actions .btn-toolbar .btn+.btn{margin-left:10px}.main-actions .btn-toolbar .btn:focus,.main-actions .btn-toolbar .btn:hover{background-color:rgba(255,255,255,.2)}.main-actions .btn-toolbar .btn.btn-icon{min-width:32px;padding-right:0;padding-left:0}.main-actions .btn-toolbar .btn+.btn-group{margin-right:0;margin-left:10px}#mainContent .main-col>.main-actions{padding:30px 0 0 0;text-align:center}#mainContent .main-col>.main-actions>.btn-toolbar{visibility:visible;opacity:1;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}#mainActions{position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;pointer-events:none}#mainActions .btn-toolbar{position:relative;top:-90px}#mainActions .dropdown-menu{text-align:left}#mainActions>.container{height:100%}.main-actions-holder{display:none}.main-actions-fixed .main-actions-holder{display:block}.main-actions-fixed #mainContent .main-col>.main-actions{position:fixed;bottom:10px}.main-actions-fixed.body-modal #mainContent .main-col>.main-actions{bottom:20px}#nextPage,#prevPage{position:absolute;top:50%;left:-10px;width:40px;height:60px;padding:10px 0;margin-top:-30px;line-height:40px;color:#fff;text-align:center;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.05);box-shadow:0 2px 15px 2px rgba(0,0,0,.05)}#nextPage:hover,#prevPage:hover{-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.15);box-shadow:0 2px 15px 2px rgba(0,0,0,.15)}#nextPage>i,#prevPage>i{display:block;font-size:18px;line-height:36px}#nextPage{right:-10px;left:auto}@media (max-width:1800px){#prevPage{left:-3px}#nextPage{right:-3px}}#sidebarHeader{position:relative;float:left;width:180px;height:34px;padding-right:20px;margin-right:20px;background:#fff;border-left:4px solid #0c64eb;border-radius:4px 2px 2px 4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}#sidebarHeader:after{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #fff;border-style:solid;border-width:18px 0 18px 8px}#sidebarHeader .title{padding:0 5px;overflow:hidden;font-size:14px;font-weight:700;line-height:32px;color:#0c64eb;text-align:center;text-overflow:ellipsis;white-space:nowrap}#sidebarHeader .title>a{position:absolute;top:0;right:0;width:20px;opacity:.5}#sidebarHeader .title>a:hover{opacity:1}#sidebar{position:relative;-webkit-transition:width .2s,padding .2s;-o-transition:width .2s,padding .2s;transition:width .2s,padding .2s}#sidebar>.sidebar-toggle{position:absolute;top:0;right:5px;bottom:0;width:10px;cursor:pointer;background:0 0;border-radius:5px;-webkit-transition:background-color .2s,opacity .5s;-o-transition:background-color .2s,opacity .5s;transition:background-color .2s,opacity .5s}#sidebar>.sidebar-toggle>.icon{position:absolute;top:50%;left:-1px;width:12px;height:30px;margin-top:-10px;line-height:30px;color:#fff;text-align:center;background:#79cdfb;border-radius:6px}#sidebar>.sidebar-toggle>.icon:before{position:relative;left:-1px}#sidebar>.sidebar-toggle:before{position:absolute;top:0;right:-5px;bottom:0;left:-5px;display:block;content:' '}#sidebar>.sidebar-toggle:hover{background:rgba(0,0,0,.075)}#sidebar>.cell{position:relative;left:0;width:180px;-webkit-transition:left .2s,opacity .2s;-o-transition:left .2s,opacity .2s;transition:left .2s,opacity .2s}#sidebar.no-animate>.cell{display:none;-webkit-transition:none;-o-transition:none;transition:none}.hide-sidebar #sidebar>.cell{position:absolute;left:-200px;visibility:hidden;opacity:0}.hide-sidebar #sidebar{position:relative;width:0;padding:0}.hide-sidebar #sidebar>.sidebar-toggle>.icon:before{content:"\e315"}@media (max-width:720px){#sidebar>.cell{width:100%}}#queryBox{max-height:0;padding:0;overflow:hidden;-webkit-transition:cubic-bezier(.175,.885,.32,1) .2s;-o-transition:cubic-bezier(.175,.885,.32,1) .2s;transition:cubic-bezier(.175,.885,.32,1) .2s;-webkit-transition-property:padding,max-height,margin;-o-transition-property:padding,max-height,margin;transition-property:padding,max-height,margin}#queryBox>form{visibility:hidden;-webkit-transition:visibility .2s .2s;-o-transition:visibility .2s .2s;transition:visibility .2s .2s}#queryBox.loading{height:50px}#queryBox.show{min-height:110px;max-height:300px;margin-bottom:10px;overflow:visible}#queryBox.show>form{visibility:visible}#queryBox.divider{border-bottom:1px solid #eee}#main .querybox-toggle.querybox-opened{position:relative;color:#0c64eb;background:0 0;border:none}#main .querybox-toggle.querybox-opened:before{position:absolute;bottom:-14px;left:50%;width:0;height:0;content:' ';border-color:transparent transparent #fff transparent;border-style:solid;border-width:0 10px 10px 10px}#contentNav{padding:5px;background:#fff;border-bottom:1px solid #eee}#contentNav .nav>li>a{position:relative;padding:6px 10px;color:#838a9d}#contentNav .nav>li.active>a{font-weight:700;color:#0c64eb}#contentNav .nav>li.active>a:before{position:absolute;right:10px;bottom:3px;left:10px;display:block;height:2px;content:' ';background:#0c64eb}.body-modal{padding-bottom:0}.body-modal #main,.body-modal .container{min-width:0!important}.body-modal #main{padding:0}.body-modal .main-header{position:fixed;top:0;right:20px;left:20px;z-index:100;padding:13px 48px 13px 0;margin:0;background:#fff}.body-modal #mainContent{padding-top:70px}.body-modal .main-header>h2{max-width:100%;overflow:hidden;font-size:14px;text-overflow:ellipsis;white-space:nowrap}.body-modal .cell,.body-modal .main-content{-webkit-box-shadow:none;box-shadow:none}.body-modal #mainMenu{position:fixed;top:0;right:0;left:0;z-index:100;padding:12px 60px 12px 10px;margin:0;background:#fff}.body-modal #mainMenu>.btn-toolbar.pull-left.divider{display:none}.body-modal #mainMenu>.btn-toolbar{width:100%;margin-left:20px}.body-modal #mainMenu>.btn-toolbar>.divider:first-child{display:none}.body-modal #mainMenu>.btn-toolbar .page-title{width:100%;margin-left:0}.body-modal #mainMenu>.btn-toolbar .page-title>.text{position:relative;top:-2px;display:inline-block;max-width:85%;max-width:-webkit-calc(100% - 100px);max-width:calc(100% - 100px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.body-modal #mainMenu+#mainContent.main-row{padding:60px 10px 0}.body-modal #mainMenu+#mainContent.main-row .cell{border:1px solid #efefef;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.body-modal #mainActions{top:auto}.body-modal #mainActions .btn-toolbar{top:auto;bottom:10px}.body-modal.m-bug-view,.body-modal.m-story-view,.body-modal.m-task-view,.body-modal.m-testcase-view,.body-modal.m-testtask-view,.body-modal.m-todo-view{padding-bottom:20px;border-radius:3px}#tabsNav{position:relative}#tabsNav .tab-pane>.actions{position:absolute;top:-8px;right:0}#tabsNav .tab-pane>.cell,#tabsNav .tab-pane>.main-table{padding:0;border:1px solid #cbd0db;border-top:none;border-radius:0 0 4px 4px}#tabsNav .tab-pane>.cell .detail-title{padding-left:5px}#helpContent{position:fixed;top:50px;right:0;bottom:40px;left:0;display:none;background-color:#fff}#helpContent .load-error{display:none;padding:20px}#helpContent .show-error .load-error{display:block}.text-middle td,.text-middle th{vertical-align:middle}.text-center td,.text-center th{text-align:center}.c-sm{width:40px}.c-id{width:90px}.c-id-sm{width:70px}.c-id-xs{width:55px}.c-date{width:100px}.c-num,.c-pri,.c-type{width:80px;overflow:hidden}.c-begin,.c-end,.c-time{width:65px}.c-hours{width:60px}.c-actions-1{width:50px}.c-actions-2{width:75px}.c-actions-3{width:102px}.c-actions,.c-actions-4{width:128px}.c-actions-5{width:155px}.c-actions-6{width:180px}.c-product,.c-project{width:180px}.c-plan{width:130px}.c-datetime{width:120px}.c-stage,.c-status,.c-user{width:80px}.c-side{width:200px;border-right:10px solid #efefef}.c-assign,.c-assignedTo,.c-openedBy{width:130px}.c-progress{width:155px}.c-assign,.c-assignedTo,.c-openedBy,.c-product,.c-project,.c-status,.c-url,.c-user{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:ellipsis;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;white-space:nowrap;vertical-align:middle}td.c-actions .btn-link{color:#3c495c;background:0 0}td.c-actions .btn-link:hover{color:#0c64eb;background:#e9f2fb}td.c-actions .btn.disabled,td.c-actions .btn[disabled]{pointer-events:auto}td.c-actions .more{position:absolute;top:50%;right:100%;display:none;padding-right:4px;padding-left:20px;margin-top:-15px;margin-right:-6px;white-space:nowrap;background-color:#fafafa;-webkit-transition:opacity .3s,margin .3s;-o-transition:opacity .3s,margin .3s;transition:opacity .3s,margin .3s}tr:hover td.c-actions .more{display:block}td:hover+td.c-actions>.more{margin-right:-15px;pointer-events:none;opacity:.15}tr[data-url]{cursor:pointer}.table tbody>tr>td,.table thead>tr>th{vertical-align:middle}.table tbody>tr>td.has-btn,.table thead>tr>th.has-btn{padding-top:1px;padding-bottom:1px;overflow:visible}.table tbody>tr>td .progress,.table thead>tr>th .progress{height:6px}.table .em,.table em{color:#3c4353}.table .divider{border-bottom:10px solid #efefef}.table .divider-top{border-top:10px solid #efefef}.table .btn-icon-left{max-width:100%;padding-left:20px;overflow:hidden;line-height:18px;text-align:left;text-overflow:ellipsis;background:0 0;border-color:#eaf3fc}.table .btn-icon-left>.icon{width:20px;font-size:14px;background:0 0!important;opacity:0}.table .btn-icon-left.btn-sm{height:26px;font-size:13px}.table .btn-icon-left:active,.table .btn-icon-left:focus,.table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.table .btn-icon-left:active>.icon,.table .btn-icon-left:focus>.icon,.table .btn-icon-left:hover>.icon{opacity:1}.table .btn-icon-left>.text{padding-left:25px}.table thead>tr>th.c-assign,.table thead>tr>th.c-assignedTo{padding-left:29px}.table a{vertical-align:middle}.table tbody>tr:last-child{border-bottom:none}.table caption{margin-bottom:5px;background:#f1f1f1;border:none}.is-firefox .table .btn-icon-left>.icon{line-height:22px}.main-table{border-radius:4px}.main-table>.table,.main-table>.table-footer,.main-table>.table-header,.main-table>.table-responsive{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.main-table .table{font-size:13px;table-layout:fixed;background-color:#fff;border-radius:4px 4px 0 0}.main-table .table.table-lg{font-size:14px}.main-table .table .btn-icon-left{border-color:transparent}.main-table .table .btn-icon-left>.icon{background:0 0;border-radius:4px}.main-table .table .btn-icon-left.btn-sm{height:26px}.main-table .table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.main-table .table .btn-icon-left:hover>.icon{background:#e9f2fb;border-radius:4px 0 0 4px}.main-table tbody>tr>td,.main-table thead>tr>th{min-height:36px;padding:2px 8px;line-height:30px}.main-table tbody>tr>td:first-child,.main-table thead>tr>th:first-child{padding-right:4px;padding-left:15px}.main-table thead>tr>th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #ddd}.main-table tbody>tr:nth-child(odd){background-color:#f5f5f5}.main-table tbody>tr:last-child>td{border-bottom:1px solid #ddd}.main-table tbody>tr>td{position:relative;border-bottom:none;border-bottom:1px solid #eee}.main-table tbody>tr>td .label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main-table tbody>tr>td>a{line-height:28px;color:#0c60e1}.main-table tbody>tr>td>a:not(.btn):visited{color:#082999;opacity:.9}.main-table tbody>tr>td>a:hover,.main-table tbody>tr>td>a:visited:hover{color:#0c64eb}.main-table tbody>tr>td.c-actions{padding-right:10px}.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{position:absolute;top:0;bottom:0;left:0;display:block;width:0;content:'';background:#0c64eb;opacity:0;-webkit-transition:.2s linear;-o-transition:.2s linear;transition:.2s linear;-webkit-transition-property:width,opacity,border-radius;-o-transition-property:width,opacity,border-radius;transition-property:width,opacity,border-radius}@-moz-document url-prefix(){.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{bottom:-1px}}.main-table tbody>tr>td.c-side:before{display:none}.main-table tbody>tr{-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background-color,-webkit-box-shadow;-o-transition-property:box-shadow,background-color;transition-property:background-color,-webkit-box-shadow;transition-property:box-shadow,background-color;transition-property:box-shadow,background-color,-webkit-box-shadow}.main-table tbody>tr:hover{background:#e9f2fb}.main-table .table-grouped tbody>tr:hover{background:#f2f7fd;-webkit-box-shadow:none;box-shadow:none}.main-table .table-grouped tbody>tr:hover td.c-actions .more{background:#f2f7fd}.main-table tbody>tr.checked{background:#fff3e0}.main-table tbody>tr.checked:hover{background:#ffebbc}.main-table tbody>tr.checked>td.c-side+td:before,.main-table tbody>tr.checked>td:first-child:before{width:4px;opacity:1}.main-table tbody>tr.checked.row-check-begin{border-top-left-radius:4px;border-top-right-radius:2px}.main-table tbody>tr.checked.row-check-begin>td:first-child:before{border-top-left-radius:4px}.main-table tbody>tr.checked.row-check-end{border-bottom-right-radius:2px;border-bottom-left-radius:4px}.main-table tbody>tr.checked.row-check-end>td:first-child:before{border-bottom-left-radius:4px}.main-table .checkbox-primary{display:inline-block;line-height:20px}.main-table .checkbox-primary label{margin:0}.main-table .table{margin:0}.table-header{padding:4px 0 12px}.table-header .table-statistic{color:#838a9d}.table-header .table-statistic strong{font-size:15px;color:#3c4353}.table-header .btn-toolbar{margin-top:-28px}.table-header.fixed-right{position:relative;z-index:5;padding:0}.table-header.fixed-right>.btn-toolbar{position:absolute;top:0;right:1px;z-index:1;padding:1px;margin:0;background:#fff;border-radius:4px}.table-header.fixed-right>.btn-toolbar .btn{opacity:.65}.table-header.fixed-right>.btn-toolbar .btn:hover{opacity:1}.table-header-fixed .table-header{position:fixed;top:0}.table-header-fixed .table-header>.btn-toolbar{background-color:transparent}.table-header-fixed .table-header>.btn-toolbar .btn{color:#fff}.table-footer{position:relative;min-height:40px;padding:6px 15px;background:#fff;border-radius:0 0 4px 4px}.body-modal .table-footer{margin-bottom:20px}.talbe-lg+.table-footer{padding:11px 15px}.table-footer .btn-toolbar,.table-footer .checkbox-primary{float:left}.table-footer .btn-toolbar+.btn-toolbar{margin-left:8px}.table-footer .checkbox-primary{margin:5px 20px 0 0}.table-footer .checkbox-primary.checked label:after{border-color:#00da88!important}.table-footer .btn{padding:3px 10px;line-height:20px}.table-footer .pager{position:absolute;top:0;right:0;z-index:5;height:40px;padding:6px 5px 6px 10px;margin:0;background:#fff;opacity:1;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.table-footer .pager:before{position:absolute;top:0;bottom:0;left:-50px;display:block;width:50px;content:' ';background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(#fff));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%)}.table-footer .pager .btn,.table-footer .pager>li>.pager-item,.table-footer .pager>li>.pager-label{color:#838a9d;background:0 0;border-color:transparent}.table-footer .pager .btn,.table-footer .pager>li>a{border-radius:3px}.table-footer .pager .btn:hover,.table-footer .pager>li>a:hover{background:rgba(0,0,0,.1)}.table-footer .pager>li.disabled>a.pager-item{opacity:1}.table-footer .form-control{height:28px;padding:3px 8px}.table-footer .table-statistic{position:relative;z-index:2;float:left;padding-right:30px;line-height:28px;color:#838a9d;background:#fff}.table-footer .table-statistic:hover{z-index:4}.table-footer .table-statistic:hover+.pager{z-index:2;opacity:.3}.table-footer .btn-toolbar+.table-statistic,.table-footer .btn-toolbar+.text{margin-left:10px}.table-footer .text{float:left;line-height:28px}.table-footer.fixed-footer{position:fixed;z-index:10;margin:0;background:rgba(75,75,75,.85);border-top-color:transparent}.table-footer.fixed-footer .checkbox-primary label{color:#fff}.table-footer.fixed-footer .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.table-footer.fixed-footer .table-statistic{color:#fff;background:0 0}.table-footer.fixed-footer .pager{background:#666}.table-footer.fixed-footer .pager:before{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0)),to(#666));background:-webkit-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:-o-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:linear-gradient(to right,rgba(0,0,0,0) 0,#666 100%)}.table-footer.fixed-footer .pager .btn,.table-footer.fixed-footer .pager>li>.pager-item,.table-footer.fixed-footer .pager>li>.pager-label{color:#fff}.table-footer.fixed-footer .pager .btn:hover,.table-footer.fixed-footer .pager>li>a:hover{background:rgba(255,255,255,.3)}.table-footer.fixed-footer .pager>li.disabled>a.pager-item{opacity:.5}.table-actions{display:none;height:28px}.table-actions.show-always{display:block;pointer-events:none;cursor:not-allowed}.has-row-checked .table-actions{display:block;pointer-events:auto!important;cursor:default}.table-lg tbody>tr>td{padding:9px 10px}.table-lg tbody>tr>td .btn+.btn{margin-left:5px}.table.has-sort-head thead>tr>th{padding-right:0}.table.has-sort-head thead>tr>th>a{position:relative;display:inline-block;padding-right:16px;color:#3c4353}.table.has-sort-head thead>tr>th>a:after,.table.has-sort-head thead>tr>th>a:before{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:30px;color:#3c495c;text-transform:none;content:"\f0de";opacity:.5;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.table.has-sort-head thead>tr>th>a:after{content:"\f0dd"}.table.has-sort-head thead>tr>th>a.sort-down,.table.has-sort-head thead>tr>th>a.sort-up{color:#000;text-decoration:none}.table.has-sort-head thead>tr>th>a:hover,.table.has-sort-head thead>tr>th>a:hover:after,.table.has-sort-head thead>tr>th>a:hover:before{color:#0c64eb;opacity:1}.table.has-sort-head thead>tr>th>a.sort-down:after,.table.has-sort-head thead>tr>th>a.sort-up:before{color:#000;opacity:1}.head-fixed .datatable-head-span .table,.table.fixed-header-copy{z-index:10;color:#fff;background:rgba(75,75,75,.85)}.head-fixed .datatable-head-span .table thead>tr>th,.table.fixed-header-copy thead>tr>th{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a,.table.fixed-header-copy thead>tr>th>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>a:after,.head-fixed .datatable-head-span .table thead>tr>th>a:before,.table.fixed-header-copy thead>tr>th>a:after,.table.fixed-header-copy thead>tr>th>a:before{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down:after,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up:before,.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:after,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:before,.table.fixed-header-copy thead>tr>th>a.sort-down,.table.fixed-header-copy thead>tr>th>a.sort-down:after,.table.fixed-header-copy thead>tr>th>a.sort-up,.table.fixed-header-copy thead>tr>th>a.sort-up:before,.table.fixed-header-copy thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover:after,.table.fixed-header-copy thead>tr>th>a:hover:before{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a,.table.fixed-header-copy thead>tr>th>.dropdown>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a:hover,.table.fixed-header-copy thead>tr>th>.dropdown>a:hover{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary,.table.fixed-header-copy .checkbox-primary{z-index:1}.head-fixed .datatable-head-span .table .checkbox-primary label,.table.fixed-header-copy .checkbox-primary label{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary label:after,.table.fixed-header-copy .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.head-fixed .datatable-head-span .table .checkbox-primary.checked label:after,.table.fixed-header-copy .checkbox-primary.checked label:after{border-color:#00da88!important}.table-data{margin:0;table-layout:fixed}.table-data tbody>tr>td,.table-data tbody>tr>th{padding:6px 8px;word-break:break-all;border:none}.table-data tbody>tr>th{width:70px;padding-left:0;font-weight:400;color:#838a9d;text-align:right;vertical-align:middle}.table-data tbody>tr>td{padding-right:0}.table-data tbody>tr>td>a{color:#0c60e1}.table-data tbody>tr>td>a:not(.btn):visited{color:#082999}.table-data tbody>tr>td>a:hover,.table-data tbody>tr>td>a:visited:hover{color:#0c64eb}.table-data ol,.table-data ul{margin:0}.fixed-head-table{background:rgba(0,0,0,.7);border-bottom:1px solid #ddd}.fixed-head-table thead>tr>th{color:#fff}.table-empty-tip{padding:80px 10px;text-align:center;background:#fff}.not-firefox .table-grouped>tbody>tr>td.c-side{background:#fff!important}.table-grouped .group-toggle{cursor:pointer}.table-grouped .group-toggle.group-summary{border-top:10px solid #efefef}.table-grouped tbody>tr>td:first-child,.table-grouped thead>tr>th:first-child{padding-left:8px}.group-expand-all,.table-group-collapsed .group-collapse-all{display:none}.table-group-collapsed .group-expand-all{display:inline-block}.table-auto{table-layout:auto}.datatable .table>tbody>tr.checked.hover>td,.datatable .table>tbody>tr.checked>td.col-hover{background:#ffebbc}body.has-fixed-footer{padding-bottom:60px}.table.with-footer-fixed{margin-bottom:20px}.table-nest-hide{display:none!important}th.table-nest-title{position:relative;padding-left:30px!important}.table-nest-icon{position:relative;display:inline-block;width:22px;height:22px;font-size:16px;color:#a6aab8;text-align:center;border-radius:4px}.table-nest-toggle:before{line-height:22px;content:"\e6f2"}.table-nest-toggle:hover{color:#0c64eb;background-color:rgba(0,0,0,.1)}.table-nest-child-hide .table-nest-toggle:before{font-size:16px;content:"\e6f1"}th.table-nest-title .table-nest-toggle{position:absolute!important;top:7px;left:8px}.table-nest-toggle.table-nest-toggle-global{width:22px;height:22px;padding:0!important;line-height:22px;text-align:center;border-radius:4px}.table-nest-toggle.table-nest-toggle-global:before{position:static!important;font-size:16px!important;line-height:22px!important;content:"\e6f2"!important;opacity:1!important}.table-nest-toggle.table-nest-toggle-global:after{display:none!important}.table-nest-collapsed .table-nest-toggle.table-nest-toggle-global:before{font-size:16px!important;content:"\e6f1"!important}.disable-empty-nest-row .is-nest-child .table-nest-icon:before,.disable-empty-nest-row .no-nest .table-nest-icon:before{position:relative;top:-1px;width:6px;min-width:6px;height:6px;content:' ';background-color:#cbd0db;border-radius:1px}.table-nest-child-hover>td:first-child,.table-nest-hover>td:first-child{-webkit-box-shadow:inset 3px 0 0 #cbd0db;box-shadow:inset 3px 0 0 #cbd0db}.article-content{overflow:auto}.article-content img{margin-top:0}.article-content table{margin:10px 0}.article-content table td,.article-content table th{border:1px solid #cbd0db}.article-content table th{background:#eee}.article-content a{color:#0c64eb}.article-content a:focus,.article-content a:hover{color:#16a8f8}.article-content,.article>.content{word-wrap:break-word}.detail{padding:10px 0;margin:0 10px}.detail+.detail{padding-top:25px;border-top:1px solid #eee}.detail-title{font-size:14px;font-weight:700;line-height:20px}.detail-title>.pull-right{position:relative;top:-8px}h2.detail-title{margin:0;font-size:15px;font-weight:700}h2.detail-title .label,h2.detail-title .label-id{position:relative;top:-1px}.detail-content{padding:0;margin-top:10px}.detail-content em{color:#3c4353}.detail-content .list-unstyled>li+li{margin-top:5px}.side-col .detail-content{padding-left:0}details.detail{padding:10px 0}details.detail summary{position:relative;cursor:pointer;outline:0}details.detail summary::-webkit-details-marker{display:none}details.detail summary:after{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e316";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}details.detail[open] summary:after{content:"\e313"}.files-list{padding-left:0;list-style:none}.files-list>li>a{display:block;line-height:24px}.files-list>li>a>.icon{display:inline-block;margin-right:5px;opacity:.7}.files-list>li>a:hover{color:#0c64eb}.files-list>li>.right-icon{opacity:0;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.files-list>li:hover>.right-icon{opacity:1}.histories-list{padding-left:15px;margin-bottom:0}.histories-list>li{position:relative}.histories-list>li+li{margin-top:5px}.histories-list>li strong{color:#3c4353}.histories-list .comment,.histories-list .show-form .comment-edit-form{padding:5px 5px 5px 10px;margin:5px 0 0;background-color:rgba(0,0,0,.025);border:1px solid #eee}.histories-list .btn-edit-comment{position:absolute;top:28px;right:2px}.histories-list .comment-edit-form,.histories-list .show-form .btn-edit-comment,.histories-list .show-form .comment{display:none}.histories-list .show-form .comment-edit-form{display:block;padding:10px;border:1px solid #eee}.histories .btn-mini{width:16px;min-width:16px;height:16px;overflow:hidden;line-height:16px;color:#cbd0db;vertical-align:-8%;border-radius:1px}.histories .btn-mini:focus,.histories .btn-mini:hover{color:#0c64eb;border-color:#0c64eb}.histories .show-changes .btn-expand>.icon:before{content:"\e926"}.histories .btn-strip{display:none}.histories .show-changes .btn-strip{display:inline-block}.history-changes{display:none;padding:5px;margin-bottom:-5px;margin-left:5px;font-size:12px;line-height:20px}.history-changes blockquote{padding:5px 5px 5px 10px;margin:5px 0 0;font-size:12px;background-color:rgba(0,0,0,.05);border-left:3px solid #eee}.history-changes blockquote.original{display:none}.show-changes .history-changes,.show-original .history-changes blockquote.original{display:block}.show-original .history-changes blockquote.textdiff{display:none}.syntaxhighlighter{overflow:auto}.list-group{overflow-y:auto}.list-group>a{display:block;padding:2px 10px 2px 5px;overflow:hidden;line-height:20px;text-overflow:ellipsis;white-space:nowrap;border-radius:4px}.list-group>a+a{margin-top:5px}.list-group>a>.icon{display:inline-block;margin-right:3px;opacity:.5}.list-group>a.selected{color:#e9f2fb;background-color:#0c64eb}.list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.list-group>a.active:hover,.list-group>a:hover{color:#fff;background-color:#0c64eb}.list-group>.heading{padding:2px 5px;line-height:20px;color:#838a9d}.list-group>a+.heading{margin-top:4px}.dropup .search-box-sink{padding-top:5px;padding-bottom:45px}.dropup .search-box-sink .search-box{position:absolute;right:10px;bottom:10px;left:10px;margin:0}.dropup .search-box-sink .search-box+.list-group{height:auto;max-height:171px}.search-list{min-width:200px;max-width:300px;padding:0}.search-list .search-box{float:none;width:auto;margin:10px}.search-list .search-box .icon-search{opacity:.5}.search-list .list-group{max-height:248px;padding:5px 10px;margin:5px 0}.dropup .search-list .search-box+.list-group{height:171px;padding-top:0}.search-list .search-input{height:30px}.search-list .input-control-icon-right{height:28px;line-height:28px}.search-list .list-group>a.active{color:inherit;background-color:inherit}.search-list.searchbox-focus .list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.search-list .list-group>a.active:hover,.search-list.searchbox-focus .list-group>a.active:hover{color:#fff;background-color:#0c64eb}#dropMenu{width:initial;max-width:initial}#dropMenu>.search-box{width:100%;padding:10px 10px 0;margin:0}#dropMenu>.search-box .icon-search{color:#333}#dropMenu>.search-box.has-icon-right>.form-control{padding-left:26px}#dropMenu .input-control-icon-left{top:10px;left:10px}#dropMenu .input-control-icon-right{top:11px;right:11px}#dropMenu .input-control-icon-right .icon{position:relative;top:2px}#dropMenu .list-group{max-height:initial;margin:0}#dropMenu .table-row{margin:0 -10px;table-layout:auto}#dropMenu .table-col{position:relative;width:100%;min-width:250px;max-width:450px}#dropMenu .table-col .list-group{max-height:300px;padding:0 10px 5px}#dropMenu .col-left{padding-bottom:30px}#dropMenu .col-right{display:none}#dropMenu .col-footer{position:absolute;right:0;bottom:-5px;left:0;padding:8px 10px;border-top:1px solid #eee}#dropMenu .col-footer>a{opacity:.8}#dropMenu .col-footer>a:hover{opacity:1}#dropMenu.show-right-col .table-col{width:50%}#dropMenu.show-right-col .col-right{display:table-cell;border-left:1px solid #eee}#dropMenu.show-right-col .col-right>.list-group{max-height:335px;margin:0}#dropMenu.show-right-col .col-right>.list-group>a{opacity:.7}#dropMenu.show-right-col .col-right>.list-group>a:hover{opacity:1}#dropMenu.show-right-col .toggle-right-col>.icon-angle-right:before{content:"\e314"}#dropMenu.has-search-text .list-group{overflow-x:hidden}#dropMenu.has-search-text>.search-box{width:100%!important}#dropMenu.has-search-text>.list-group>.table-row{display:block}#dropMenu.has-search-text>.list-group>.table-row>.table-col{display:block;width:100%}#dropMenu.has-search-text .col-left{padding-bottom:0}#dropMenu.has-search-text .pull-right.toggle-right-col{display:none}#dropMenu.has-search-text .col-left .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group>a{opacity:.7}#dropMenu.has-search-text .col-footer,#dropMenu.has-search-text .hide-in-search{display:none}#swapper{position:relative}#swapper #dropMenu .tree li>.selected{color:#0c64eb!important;background:#e9f2fb!important}#swapper #dropMenu .list-group>a.active:hover,#swapper #dropMenu .search-box .list-group>a.active,#swapper #dropMenu .tree li>.clickable:hover,#swapper #dropMenu.searchbox-focus .list-group>a.active:hover{color:#fff!important;background:#0c64eb!important}#swapper #dropMenu .tree{margin:0}.release-path{overflow:hidden}.release-line{display:table;width:100%;padding:0;table-layout:fixed}.release-line>li{display:table-cell;list-style:none}.release-line>li>a{position:relative;display:block}.release-line>li>a:before{position:absolute;left:0;display:block;width:13px;height:13px;content:' ';background:#fff;border:2px solid #838a9d;border-radius:50%}.release-line>li>a:after{position:absolute;left:5px;display:block;width:2px;height:30px;content:' ';background:#cbe0f6}.release-line>li>a>.icon{position:absolute;left:4px;font-size:24px}.release-line>li>a .title{display:block;font-size:14px;white-space:nowrap}.release-line>li>a .date,.release-line>li>a .info{display:block;max-height:18px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.release-line>li>a:hover:before{background-color:#e9f2fb}.release-line>li>a:hover:after{background-color:#838a9d}.release-line>li>a:hover .title{color:#0c64eb}.release-line>li>a:hover .date,.release-line>li>a:hover .info{color:#838a9d}.release-line>li:nth-child(odd){padding-top:80px;vertical-align:top}.release-line>li:nth-child(odd)>a{height:85px;padding-top:36px;border-top:5px solid #cbe0f6}.release-line>li:nth-child(odd)>a:before{top:-9px}.release-line>li:nth-child(odd)>a:after{top:6px}.release-line>li:nth-child(odd)>a>.icon{top:-26px}.release-line>li:nth-child(even){padding-bottom:80px;vertical-align:bottom}.release-line>li:nth-child(even)>a{height:85px;padding-bottom:36px;border-bottom:5px solid #cbe0f6}.release-line>li:nth-child(even)>a:before{bottom:-9px}.release-line>li:nth-child(even)>a:after{bottom:6px}.release-line>li:nth-child(even)>a>.icon{bottom:-2px}.release-line>li:last-child>a{border-color:transparent}.release-line>li.active>a:before{border-color:#0c64eb}.release-line>li+li>a>.date,.release-line>li+li>a>.info,.release-line>li+li>a>.title{position:relative;left:-36%}#footer{position:fixed;right:0;bottom:0;left:0;z-index:1010;height:40px;background:#fff;border-top:1px solid #eff1f7}#footer .breadcrumb{padding:10px 0;margin:0}#footer .breadcrumb>li{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#footer .breadcrumb>.active,#footer .breadcrumb>li>a{color:#838a9e}#footer .breadcrumb>.active>.icon,#footer .breadcrumb>li>a>.icon{display:none}#footer .breadcrumb>.active:hover,#footer .breadcrumb>li>a:hover{color:#16a8f8}#footer .breadcrumb>li+li:before{content:'>'}#footer>.container{padding:0 20px}@media (min-width:1400px){#footer>.container{padding:0 40px}}#poweredBy{position:absolute;top:4px;right:0;padding:5px 10px}#poweredBy .icon-zentao{color:#0097fd}#poweredBy a{color:#3c4353}#poweredBy a:hover{color:#0c64eb}#poweredBy a:hover .icon-zentao{color:#0c64eb}#poweredBy a.text-important{color:#bd7b46}#poweredBy a.text-important:hover{color:#ff5d5d}#poweredBy a.text-primary{color:#0c64eb}#poweredBy a.text-primary:hover{color:#16a8f8}#poweredBy #aiux{color:#cbd0dc}#noticeBox .alert{-webkit-box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px}#heading{top:0}.header-btn{position:relative;padding:8px 0}.header-btn .btn{position:relative;height:34px;padding:1px 6px;margin:0;overflow:visible;font-size:13px;font-weight:400;line-height:28px;color:#fff;background-color:transparent;border-color:transparent!important;border-right:none;-webkit-transition:none;-o-transition:none;transition:none}.header-btn .btn>.caret{margin-left:0;border-width:4px}.header-btn .btn>.text{display:inline-block;max-width:150px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.header-btn .btn:hover{-webkit-box-shadow:none;box-shadow:none}.header-btn .btn:hover,.header-btn.active .btn{color:#fff;background:rgba(0,0,0,.15)}.header-btn .btn:hover>.caret,.header-btn.active .btn>.caret{opacity:1}.header-btn+.header-btn{margin-left:10px}.header-btn+.header-btn:before{position:absolute;top:16px;left:-13px;display:block;font-family:ZentaoIcon;font-size:14px;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e315";opacity:.6;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.header-btn .dropdown-menu{margin-top:-10px}#toolbar{top:0;height:50px}#userNav>li{margin-right:0}#userNav>li>a{padding:10px 5px}#userNav>li>a>.icon{font-size:30px;filter:brightness(1.2) hue-rotate(30deg);opacity:.9;-webkit-filter:brightness(1.2) hue-rotate(30deg)}#userNav>li:hover>a{background-color:rgba(0,0,0,.1)}#userNav .dropdown-menu>li>a{position:relative;padding-left:24px}#userNav .dropdown-menu>li>a>.icon{top:1px;left:0}#userNav .dropdown-menu>li.user-profile-item>a{padding-left:45px} \ No newline at end of file +*/.chosen-container{position:relative;display:block;font-size:13px;vertical-align:middle;zoom:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;display:none;width:100%;background:#fff;border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-top:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container .chosen-drop.chosen-drop-size-limited{border-top:1px solid rgba(0,0,0,.15)}.chosen-container .chosen-drop.chosen-auto-max-width{min-width:100%;border-top:1px solid rgba(0,0,0,.15);opacity:0}.chosen-container .chosen-drop.chosen-auto-max-width>.chosen-results>li{display:inline-block;white-space:nowrap}.chosen-container .chosen-drop.chosen-auto-max-width.in{opacity:1}.chosen-container .chosen-drop.chosen-auto-max-width.in>.chosen-results>li{display:block;white-space:normal}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap!important}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container.chosen-up .chosen-drop{top:inherit;bottom:100%;margin-top:auto;margin-bottom:-1px;border-radius:2px 2px 0 0;-webkit-box-shadow:0 -3px 5px rgba(0,0,0,.175);box-shadow:0 -3px 5px rgba(0,0,0,.175)}.chosen-container.chosen-highlight-selected .result-selected{color:#0c64eb;background:#e9f2fb}.chosen-container-single .chosen-single{display:block;width:100%;height:32px;padding:5px 8px;overflow:hidden;line-height:1.42857143;color:#222;text-decoration:none;white-space:nowrap;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-single .chosen-default{color:#838a9d}.chosen-container-single .chosen-single>span{display:block;margin-right:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:5px;right:24px;display:block;width:20px;height:20px;font-family:sans-serif;font-size:18px;font-weight:700;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-single .chosen-single abbr:before{display:block;content:'×'}.chosen-container-single .chosen-single abbr:focus,.chosen-container-single .chosen-single abbr:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;height:100%;padding:5px 8px}.chosen-container-single .chosen-single div b{display:inline-block;width:0;height:0;margin-bottom:2px;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent;opacity:.5}.chosen-container-single .chosen-search{position:relative;z-index:1010;padding:3px 4px;margin:0;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{width:100%;height:27px;padding:2px 26px 2px 8px;margin:1px 0;font-size:12px;line-height:1.5;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;outline:0}.chosen-container-single .chosen-search input[type=text]:focus{border-color:#0c64eb}.chosen-container-single .chosen-search:before{position:absolute;top:10px;right:10px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-single .chosen-drop{margin-top:-1px;-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:0 0 4px 4px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;max-height:240px;padding:0;margin:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;padding:5px 10px;margin:0;line-height:15px;list-style:none;-webkit-transition:background-color .2s cubic-bezier(.175,.885,.32,1);-o-transition:background-color .2s cubic-bezier(.175,.885,.32,1);transition:background-color .2s cubic-bezier(.175,.885,.32,1);-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{color:#fff;background-color:#0c64eb}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;width:100%;min-height:32px;min-height:30px\9;padding:0;margin:0;overflow:hidden;cursor:text;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-multi .chosen-choices:after,.chosen-container-multi .chosen-choices:before{display:table;content:" "}.chosen-container-multi .chosen-choices:after{clear:both}.chosen-container-multi .chosen-choices li{display:block;float:left;padding:0 6px;margin:5px 4px;list-style:none}.chosen-container-multi .chosen-choices li.search-field{padding:0;line-height:12px;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:20px;font-size:100%;color:#838a9d;background:0 0!important;border:0!important;border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-field:before{position:absolute;right:8px;bottom:8px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";opacity:0;-webkit-transition:opacity .2s cubic-bezier(.175,.885,.32,1);-o-transition:opacity .2s cubic-bezier(.175,.885,.32,1);transition:opacity .2s cubic-bezier(.175,.885,.32,1);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice{position:relative;padding:3px 20px 3px 5px;line-height:12px;cursor:default;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.chosen-container-multi .chosen-choices li.search-choice:hover{background-color:#fff;border-color:#adb5c6;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 0 rgba(0,0,0,.1)}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:1px;right:0;display:block;width:20px;height:18px;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:focus,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;color:#666;background-color:#e4e4e4;border:1px solid #ccc}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{padding:5px 0;margin:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-bottom-right-radius:0!important;border-bottom-left-radius:0!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active.chosen-with-drop .chosen-single div{background:0 0;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{content:"";border-top:0 dotted;border-bottom:4px solid}.chosen-container-active.chosen-with-drop.chosen-up .chosen-single{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active .chosen-choices{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111!important}.chosen-container-active .chosen-choices li.search-field:before{opacity:1}.chosen-disabled{cursor:default;opacity:.5!important}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{left:0;display:none;padding:3px 4px;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:25px;padding:2px 26px 2px 4px;font-size:inherit}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{top:9px}.chosen-compact.chosen-with-search.chosen-with-drop .chosen-single>.chosen-search{display:block;opacity:1}select.chosen[multiple]{height:32px;overflow:hidden}select.chosen[multiple] option{visibility:hidden}.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.picker-focus .picker-selections{border-color:#0c64eb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6)}.disabled .picker-selections{cursor:not-allowed;background-color:#f5f5f5}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\e928";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\f0d7";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:"\e928"}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:18px;height:18px;text-align:center;cursor:pointer;opacity:.2;-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}.picker-selection-remove:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px;z-index:1}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-multi.picker-sortable .picker-selection-text{cursor:move}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.disabled .picker-search{cursor:not-allowed}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.picker-no-value.picker-focus .picker-placeholder{display:none}.picker-input-empty.picker-focus.picker-no-value .picker-placeholder,.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.42857143;color:#3c4353;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#0c64eb;background:#e9f2fb}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#0c64eb}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option.disabled{cursor:not-allowed!important}.picker-option-text-matched{position:relative;color:#0c64eb}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:2px;content:' ';background-color:#0c64eb;border-radius:2px;opacity:.5}.picker-option-active .picker-option-text-matched,.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option-active .picker-option-text-matched:before,.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ff5d5d}.picker-actions{padding:5px;border-top:1px solid #eee}.picker-no-actions .picker-actions{display:none}.picker-actions .btn{padding:2px 4px}.picker-actions .btn[disabled]{background-color:transparent;filter:grayscale(1);-webkit-filter:grayscale(1)}.picker-actions .btn+.btn{margin-left:4px}.picker-checkable .picker-option{position:relative;padding-left:32px;color:inherit!important;cursor:pointer!important}.picker-checkable .picker-option>.checkbox-primary{position:absolute;top:4px;left:10px}.picker-checkable .picker-option.picker-option-active{background-color:rgba(0,0,0,.05)!important}.picker-checkable .picker-option:hover{background-color:rgba(0,0,0,.075)!important}.picker-checkable .picker-option.picker-option-selected{background-color:#e9f2fb!important}.picker-checkable .picker-option-active .picker-option-text-matched,.picker-checkable .picker-option:hover .picker-option-text-matched{color:#0c64eb!important}.picker-checkable .picker-option-active .picker-option-text-matched:before,.picker-checkable .picker-option:hover .picker-option-text-matched:before{background:#0c64eb!important}:root{--color-primary:#0c64eb;--color-secondary:#16a8f8;--color-pale:#e9f2fb;--color-fore:#3c4353;--color-back:#fff;--color-red:#ff5d5d;--color-yellow:#ff9800;--color-green:#00da88;--color-blue:#2196f3;--color-purple:#8666b8;--color-brown:#bd7b46;--color-danger:#ff5d5d;--color-warning:#ff9800;--color-success:#00da88;--color-info:#2196f3;--color-special:#8666b8;--color-important:#bd7b46;--color-green-pale:#e8f5e9;--color-yellow-pale:#fff3e0;--color-red-pale:#ffebee;--color-blue-pale:#e3f2fd;--color-brown-pale:#efebe9;--color-purple-pale:#f3e5f5;--link-color:#3c4353;--link-hover-color:#0c64eb;--color-gray-darker:#222;--color-gray-dark:#3c495c;--color-gray:#838a9d;--color-gray-light:#cbd0db;--color-gray-lighter:#eee;--color-gray-pale:#f1f1f1;--border-radius:4px;--border-radius-lg:6px;--border-radius-sm:3px;--bg-gradient:linear-gradient(-90deg, #0a48d1 0%, #1183fb 100%)}.container,.container-fixed,.container-fluid{position:relative}.container{max-width:1800px!important}body{background-color:#efefef}body.article-content,body.body-modal{background:0 0}body.body-modal{padding:0}@media screen and (min-width:1920px){body{font-size:14px}}a:active,a:focus,button:active,button:focus{outline:0!important}.strong{font-weight:700}.font-normal{font-weight:400!important}.text-middle{vertical-align:middle!important}.text-bottom{vertical-align:bottom!important}.text-top{vertical-align:top!important}.inline-block{display:inline-block!important}.layer{border-radius:4px;-webkit-box-shadow:0 0 20px 0 #bdc9d8;box-shadow:0 0 20px 0 #bdc9d8}.space{margin-bottom:20px}.space-lg{margin-bottom:30px}.space-sm{margin-bottom:10px}.muted{opacity:.5}.text-muted em{color:#3c4353}.no-animate{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.template{display:none!important}.text-left{text-align:left!important}.text-yellow.icon-folder{color:#ffe066}.table-row{display:table;width:100%;table-layout:fixed}.table-col,.table-row>.col,.table-row>[class*=col-],.table-row>[class*="-col"]{display:table-cell;float:none;vertical-align:top}.side-col{width:200px;padding-right:20px}.side-col.col-4{width:33.3333333%}.col-lg{width:260px}.col-xl{width:320px}.col-sm{width:150px}.col-xs{width:100px}.main-col+.side-col{padding-right:0;padding-left:20px}.row-grid>[class*=col-],.row-grid>[class*="-col"]{padding-top:6px;padding-bottom:6px}hr.space{margin:10px 0;border:none}hr.space-sm{margin:5px 0;border:none}.text-secondary{color:#16a8f8}a.text-primary{color:#0c64eb}.nav-primary>li>a{min-width:100px;padding:5px 8px;color:#838a9d;border-color:#e7f1fc}.nav-primary>li.active>a{color:#0c64eb;background-color:#e7f1fc;border-color:#e7f1fc}.nav-primary>li.active>a:hover{color:#0c64eb;background-color:#c3dcf7;border-color:#c3dcf7}.end-marker{margin-bottom:20px;color:#cbd0db;text-align:center}@-webkit-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@-o-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}.highlight{-webkit-animation:highlight .5s linear 0s 2 alternate;-o-animation:highlight .5s linear 0s 2 alternate;animation:highlight .5s linear 0s 2 alternate}.progress.inline-block{width:100px;margin:0}.w-p5{width:5%!important}.w-p10{width:10%!important}.w-p15{width:15%!important}.w-p20{width:20%!important}.w-p25{width:25%!important}.w-p30{width:30%!important}.w-p35{width:35%!important}.w-p40{width:40%!important}.w-p45{width:45%!important}.w-p50{width:50%!important}.w-p55{width:55%!important}.w-p60{width:60%!important}.w-p65{width:65%!important}.w-p70{width:70%!important}.w-p75{width:75%!important}.w-p80{width:80%!important}.w-p85{width:85%!important}.w-p90{width:90%!important}.w-p94{width:94%!important}.w-p95{width:95%!important}.w-p98{width:98%!important}.w-p99{width:99%!important}.w-p100{width:100%!important}.w-auto{width:auto!important}.w-10px{width:10px!important}.w-20px{width:20px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-60px{width:60px!important}.w-70px{width:70px!important}.w-80px{width:80px!important}.w-90px{width:90px!important}.w-100px{width:100px!important}.w-110px{width:110px!important}.w-120px{width:120px!important}.w-130px{width:130px!important}.w-140px{width:140px!important}.w-150px{width:150px!important}.w-160px{width:160px!important}.w-180px{width:180px!important}.w-200px{width:200px!important}.w-230px{width:230px!important}.w-250px{width:250px!important}.w-300px{width:300px!important}.w-400px{width:400px!important}.w-500px{width:500px!important}.w-600px{width:600px!important}.w-700px{width:700px!important}.w-800px{width:800px!important}.w-900px{width:900px!important}.mw-200px{max-width:200px!important}.mw-300px{max-width:300px!important}.mw-400px{max-width:400px!important}.mw-500px{max-width:500px!important}.mw-600px{max-width:600px!important}.mw-700px{max-width:700px!important}.mw-800px{max-width:800px!important}.mw-900px{max-width:900px!important}.mw-1400px{max-width:1400px!important}.w-id{width:70px!important}.w-pri{width:40px!important}.w-severity{width:50px!important}.w-hour{width:57px!important}.w-date{width:90px!important}.w-status{width:60px!important}.w-resolution,.w-type,.w-user{width:80px!important}.w-p15-f{width:15%!important;min-width:120px!important}.w-p25-f{width:25%!important;min-width:200px!important}.w-p35-f{width:35%!important;min-width:300px!important}.w-p45-f{width:45%!important;min-width:400px!important}.h-5px{height:5px!important}.h-10px{height:10px!important}.h-20px{height:20px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-60px{height:60px!important}.h-70px{height:70px!important}.h-80px{height:80px!important}.h-100px{height:100px!important}.h-120px{height:120px!important}.h-130px{height:130px!important}.h-140px{height:140px!important}.h-150px{height:150px!important}.h-200px{height:200px!important}.pd-0{padding:0!important}.mg-0{margin:0!important}.mgb-20{margin-bottom:20px!important}.mgb-10{margin-bottom:10px!important}.pdb-20{padding-bottom:20px!important}.pdt-20{padding-top:20px!important}.br-0{border-radius:0!important}.bd-0,.bd-none,.borderless{border:none!important}.bg-none{background:0 0!important}.red{color:#ff5d5d!important}.icon-pro-version{font-size:14px!important}.icon-pro-version:before{position:relative;top:-1px;font-size:14px;color:#ff5d5d;content:"\e92b"}.bg-primary{color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb}.bg-primary-pure{color:#fff;background-color:#0c64eb}.bg-primary-pale{color:#0c64eb;background-color:#e9f2fb}.bg-secondary{color:#fff;background:#16a8f8}.hl-tutorial{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 0 0 #000!important;box-shadow:0 0 0 0 #000!important;-webkit-transition:-webkit-box-shadow 1s!important;-o-transition:box-shadow 1s!important;transition:-webkit-box-shadow 1s!important;transition:box-shadow 1s!important;transition:box-shadow 1s,-webkit-box-shadow 1s!important}.hl-tutorial.hl-in{-webkit-box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important;box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important}.btn.tooltip-tutorial,.hl-tutorial.hl-in:hover{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important;box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important}.tooltip-max .tooltip-inner{max-width:1000px;padding:8px 10px}.transition-all *{-webkit-transition:all .2s!important;-o-transition:all .2s!important;transition:all .2s!important}.scroll-x{overflow-x:auto!important}.scroll-y{overflow-y:auto!important}.divider+.divider{display:none}.ie *{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}@font-face{font-family:Oswald;font-weight:400;src:url(../fonts/Oswald-Regular.ttf)}@font-face{font-family:Oswald;font-weight:500;src:url(../fonts/Oswald-Medium.ttf)}@font-face{font-family:Oswald;font-weight:300;src:url(../fonts/Oswald-Light.ttf)}.num{font-family:Oswald;font-weight:400}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(../fonts/ZentaoIcon.eot?v=1.35);src:url(../fonts/ZentaoIcon.eot?#iefix&v=1.35) format('embedded-opentype'),url(../fonts/ZentaoIcon.woff?v=1.35) format('woff'),url(../fonts/ZentaoIcon.ttf?v=1.35) format('truetype'),url(../fonts/ZentaoIcon.svg#regular?v=1.35) format('svg')}.icon,[class*=" icon-"],[class^=icon-]{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}a .icon,a [class*=" icon-"],a [class^=icon-]{display:inline}.icon-lg:before{font-size:1.33333333em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-spin{display:inline-block;-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-spin{display:inline-block;text-decoration:none}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);-o-transform:rotate(359deg);transform:rotate(359deg)}}.icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.icon-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.icon.icon-flip-horizontal,.icon.icon-flip-vertical,.icon.icon-rotate-180,.icon.icon-rotate-270,.icon.icon-rotate-90{display:inline-block}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-help:before{content:"\e968"}.icon-import:before{content:"\e904"}.icon-download:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-plus:before{content:"\e925"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-chart-bar:before{content:"\e95d"}.icon-bar-chart:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before{content:"\e940"}.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-college:before{content:"\e9c8"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-menu-my:before{content:"\e97a"}.icon-home:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before{content:"\e98f"}.icon-product:before{content:"\e98f"}.icon-rocket:before{content:"\e99c"}.icon-project:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-test:before{content:"\e956"}.icon-infinite:before{content:"\e9a3"}.icon-devops:before{content:"\e9a3"}.icon-ops:before{content:"\e903"}.icon-doc:before{content:"\e99b"}.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-menu-backend:before{content:"\e993"}.icon-assets:before{content:"\e9ae"}.icon-diamond:before{content:"\e9ae"}.icon-feedback:before{content:"\e991"}.icon-flow:before{content:"\e994"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before{content:"\e996"}.icon-info:before{content:"\e996"}.icon-cog-outline:before{content:"\e997"}.icon-backend:before{content:"\e997"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before{content:"\f0ac"}.icon-lang:before{content:"\f0ac"}.icon-blame:before{content:"\e9e0"}.icon-draft-edit:before{content:"\e9dd"}.icon-sub-review:before{content:"\e9df"}.icon-sub-review-user:before{content:"\e9db"}.icon-ztf:before{content:"\e9dc"}.icon-save:before{content:"\e9d8"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-customer:before{content:"\e9d9"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-kanban:before{content:"\e983"}.icon-lane:before{content:"\e9b1"}.icon-back:before{content:"\e9d3"}.icon-back-circle:before{content:"\e9da"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before{content:"\e9c7"}.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-thumbs-up-solid:before{content:"\e9d6"}.icon-thumbs-down-solid:before{content:"\e9d7"}.icon-hash:before{content:"\e9ab"}.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-file-log:before{content:"\e9de"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file:before{content:"\f016"}.icon-file-empty:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-group:before{content:"\e97e"}.icon-menu-users:before{content:"\e97e"}.icon-persons:before{content:"\e97e"}.icon-team:before{content:"\e97e"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-cancel:before{content:"\e951"}.icon-ban-circle:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before{content:"\e950"}.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-start:before{content:"\e90a"}.icon-play:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-change:before{content:"\e970"}.icon-alter:before{content:"\e970"}.icon-glasses:before{content:"\e914"}.icon-review:before{content:"\e914"}.icon-sitemap:before{content:"\e915"}.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-magic:before{content:"\e919"}.icon-active:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-delay:before{content:"\e91d"}.icon-calendar:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.icon-sm:before{font-size:14px;vertical-align:10%}.icon-qc{position:relative}.icon-qc:before{width:1em;color:#7cb938;content:"\e985"}.icon-qc:after{position:absolute;top:0;left:0;width:1em;height:1em;font-family:ZentaoIcon;font-size:14px;font-size:inherit;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#36a742;text-transform:none;content:"\e987";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-message.has-dot{position:relative}.icon-message.has-dot::after{position:absolute;top:-3px;right:-5px;display:block;width:6px;height:6px;content:' ';background-color:#ff5d5d;border-radius:50%}.icon-project{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.icon-product{-webkit-transform:scale(1.15);-ms-transform:scale(1.15);-o-transform:scale(1.15);transform:scale(1.15)}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:18px;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px;-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background,border,outline,opacity,-webkit-box-shadow;-o-transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,outline,opacity,-webkit-box-shadow;transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,box-shadow,outline,opacity,-webkit-box-shadow}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#3c4353;text-decoration:none}.btn:active{text-decoration:none;background-image:none;outline:0;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.1)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:grayscale(1);-webkit-box-shadow:none;box-shadow:none;opacity:.5;-webkit-filter:grayscale(1)}.btn{color:#3c4353;background-color:#fff;border-color:#d6dae3}.btn.active,.btn.hover,.btn:active,.btn:focus,.btn:hover,.open .dropdown-toggle.btn{color:#3c4353;background-color:rgba(255,255,255,.8);border-color:#b8bfce}.btn.active,.btn:active,.open .dropdown-toggle.btn{background-color:#f2f2f2;background-image:none;border-color:#b8bfce}.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn.active,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover{color:rgba(60,67,83,.3);background-color:#fff;border-color:#d6dae3}.btn-gray{color:#82899f;background-color:#f1f1f1;border-color:#f1f1f1}.btn-gray.active,.btn-gray.hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.open .dropdown-toggle.btn-gray{color:#82899f;background-color:rgba(241,241,241,.8);border-color:#d8d8d8}.btn-gray.active,.btn-gray:active,.open .dropdown-toggle.btn-gray{background-color:#e4e4e4;background-image:none;border-color:#d8d8d8}.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,fieldset[disabled] .btn-gray,fieldset[disabled] .btn-gray.active,fieldset[disabled] .btn-gray:active,fieldset[disabled] .btn-gray:focus,fieldset[disabled] .btn-gray:hover{color:rgba(130,137,159,.3);background-color:#f1f1f1;border-color:#f1f1f1}.btn-primary{color:#fff;background-color:#0c64eb;border-color:transparent}.btn-primary.active,.btn-primary.hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:rgba(12,100,235,.8);border-color:rgba(0,0,0,0)}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-color:#0b5ad3;background-image:none;border-color:rgba(0,0,0,0)}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{color:rgba(255,255,255,.3);background-color:#0c64eb;border-color:transparent}.btn-secondary{color:#fff;background-color:#16a8f8;border-color:transparent}.btn-secondary.active,.btn-secondary.hover,.btn-secondary:active,.btn-secondary:focus,.btn-secondary:hover,.open .dropdown-toggle.btn-secondary{color:#fff;background-color:rgba(22,168,248,.8);border-color:rgba(0,0,0,0)}.btn-secondary.active,.btn-secondary:active,.open .dropdown-toggle.btn-secondary{background-color:#079ced;background-image:none;border-color:rgba(0,0,0,0)}.btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:focus,.btn-secondary.disabled:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[disabled]:active,.btn-secondary[disabled]:focus,.btn-secondary[disabled]:hover,fieldset[disabled] .btn-secondary,fieldset[disabled] .btn-secondary.active,fieldset[disabled] .btn-secondary:active,fieldset[disabled] .btn-secondary:focus,fieldset[disabled] .btn-secondary:hover{color:rgba(255,255,255,.3);background-color:#16a8f8;border-color:transparent}.btn-warning{color:#fff;background-color:#ff9800;border-color:transparent}.btn-warning.active,.btn-warning.hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:rgba(255,152,0,.8);border-color:rgba(0,0,0,0)}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-color:#e68900;background-image:none;border-color:rgba(0,0,0,0)}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{color:rgba(255,255,255,.3);background-color:#ff9800;border-color:transparent}.btn-danger{color:#fff;background-color:#ff5d5d;border-color:transparent}.btn-danger.active,.btn-danger.hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:rgba(255,93,93,.8);border-color:rgba(0,0,0,0)}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-color:#ff4343;background-image:none;border-color:rgba(0,0,0,0)}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{color:rgba(255,255,255,.3);background-color:#ff5d5d;border-color:transparent}.btn-success{color:#fff;background-color:#00da88;border-color:transparent}.btn-success.active,.btn-success.hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:rgba(0,218,136,.8);border-color:rgba(0,0,0,0)}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-color:#00c178;background-image:none;border-color:rgba(0,0,0,0)}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{color:rgba(255,255,255,.3);background-color:#00da88;border-color:transparent}.btn-info{color:#0c64eb;background-color:#e9f2fb;border-color:transparent}.btn-info.active,.btn-info.hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#0c64eb;background-color:rgba(233,242,251,.8);border-color:rgba(0,0,0,0)}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-color:#d3e5f7;background-image:none;border-color:rgba(0,0,0,0)}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{color:rgba(12,100,235,.3);background-color:#e9f2fb;border-color:transparent}.btn-link{padding-right:6px;padding-left:6px;font-weight:400;color:#3c495c;text-shadow:none;cursor:pointer;background:0 0;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover,.btn-link[disabled],fieldset[disabled] .btn-link{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{color:#222;background:#f1f1f1;background:rgba(0,0,0,.075)}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#cbd0db;text-decoration:none}.btn-lg{padding:11px 16px;font-size:14px;line-height:18px;border-radius:4px}.btn-mini,.btn-sm{padding:3px 8px;font-size:12px;line-height:18px;border-radius:4px}.btn-mini,.btn-xs{padding:0 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-wide{min-width:120px}.btn-limit{max-width:180px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-limit>.caret{position:absolute;top:14px;right:8px}.btn-circle{border-radius:17px}.btn>.label-icon{top:3px;padding:3px;margin:-2px;background-color:rgba(0,0,0,.2);border-radius:12px}.btn>.label-icon>.icon{font-size:16px;line-height:18px}.btn>.icon+.text{margin-left:5px}.btn.btn-sm.btn-circle{border-radius:12px}.btn.btn-sm>.label-icon{top:2px;width:20px;height:20px;padding:1px;line-height:20px}.btn.btn-sm>.label-icon>.icon{position:relative;top:-1px;display:inline-block;font-size:14px;line-height:18px}.btn-icon-left{position:relative;padding-left:35px;overflow:hidden;text-align:right}.btn-icon-left>.label-icon{position:absolute;left:5px;margin:0}.btn-icon-left>.icon{position:absolute;top:0;bottom:0;left:0;display:block;width:30px;line-height:30px;color:#16a8f8;text-align:center;background:#e9f2fb}.btn-icon-left.btn-sm{padding-left:28px}.btn-icon-left.btn-sm>.label-icon{left:2px}.btn-icon-left.btn-sm>.icon{width:24px;line-height:24px}.btn-icon-right{position:relative;padding-right:35px;text-align:left}.btn-icon-right>.label-icon{position:absolute;right:5px;margin:0}.btn-icon-right.btn-sm{padding-right:28px}.btn-icon-right.btn-sm>.label-icon{right:2px}.btn-icon{min-width:32px;padding-right:0;padding-left:0}.btn-icon.btn-sm{width:24px;min-width:24px;height:24px}.btn-group{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>.btn-group{float:left}.btn-group>.btn{border-radius:0}.btn-group>.btn:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.dropdown{float:left;margin-right:10px}.btn-toolbar>.btn-group:last-child,.btn-toolbar>.btn:last-child,.btn-toolbar>.dropdown:last-child{margin-right:0}.btn-toolbar>.divider{float:left;height:20px;margin:7px 5px 4px 10px;border-left:1px solid rgba(0,0,0,.1)}.btn-toolbar .space{float:left;min-height:1px;margin:0 10px 0 10px}.btn-toolbar .input-control{float:left;width:120px}.btn-toolbar .page-title{float:left;line-height:34px}.btn-toolbar .page-title .text{font-size:14px;font-weight:700}.btn-toolbar .page-title .label{top:-2px;margin-right:10px}.btn-toolbar .divider+.page-title{margin-left:15px}.btn-active-line{position:relative;font-weight:700;color:#0c64eb}.btn-active-line:after{position:absolute;right:5px;bottom:1px;left:5px;display:block;content:' ';border-bottom:2px solid #0c64eb}.btn-active-line:hover{color:#0c64eb}.btn-active-text .text{position:relative;top:-1px;display:inline-block;font-weight:700;color:#0c64eb}.btn-active-text .text:after{position:absolute;bottom:-5px;display:block;width:100%;content:' ';border-bottom:2px solid #0c64eb}.angle-btn{position:relative;padding:1px;background:#fff;border:1px solid #cbd0db;border-right:none}.angle-btn:first-child{border-radius:2px 0 0 2px}.btn-toolbar>.angle-btn{margin-right:8px}.angle-btn:after,.angle-btn:before{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn:after{right:-7px;border-color:transparent transparent transparent #fff;border-radius:2px}.angle-btn .btn{padding:6px;font-weight:700;background:#fff;border:none;border-radius:4px!important}.angle-btn .btn.btn-limit{padding-right:16px}.angle-btn .btn.btn-limit>.caret{right:4px}.angle-btn+.angle-btn{border-left:none}.angle-btn+.angle-btn>.btn-group:first-child{padding-left:8px}.angle-btn+.angle-btn>.btn-group:first-child:after,.angle-btn+.angle-btn>.btn-group:first-child:before{position:absolute;top:-2px;left:0;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn+.angle-btn>.btn-group:first-child:after{left:-1px;border-color:transparent transparent transparent #fff;border-width:17px 0 17px 8px}.btn-toolbar>.angle-btn.active,.btn-toolbar>.angle-btn:last-child{border-color:#0c64eb}.btn-toolbar>.angle-btn.active .btn,.btn-toolbar>.angle-btn:last-child .btn{color:#0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn.active:before,.btn-toolbar>.angle-btn:last-child:after,.btn-toolbar>.angle-btn:last-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn:last-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:before,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn,.btn-toolbar>.angle-btn.normal{border-color:#cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn .btn,.btn-toolbar>.angle-btn.normal .btn{color:#3c4353}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.active+.angle-btn:before,.btn-toolbar>.angle-btn.normal:after,.btn-toolbar>.angle-btn.normal:before{border-color:transparent transparent transparent #cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.normal:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before,.btn-toolbar>.angle-btn.normal>.btn-group:first-child:before{border-color:transparent transparent transparent #cbd0db!important}.nav>li>.btn.btn-primary{color:#fff}.nav>li>.btn.btn-primary:focus,.nav>li>.btn.btn-primary:hover{background:rgba(12,100,235,.8)}.btn.btn-action,.c-actions .btn{display:inline-block;width:26px;padding:2px;overflow:hidden;line-height:20px;color:#16a8f8;background:0 0;border-color:transparent}.btn.btn-action>i,.c-actions .btn>i{position:relative;top:1px;font-size:18px}.btn.btn-action:hover,.c-actions .btn:hover{color:#0c64eb;background-color:#d3e5f7}.c-actions .btn+.btn{margin-left:-4px}.label{position:relative;display:inline-block;padding:3px 5px;font-size:12px;font-weight:400;vertical-align:middle;border-radius:2px}.label+.label{margin-left:4px}.label-pale{background:#bed8f3!important}.label-badge{border-radius:9px}.label-light{color:#3c4353;background-color:#ddd}.label-primary{background:#0c64eb!important}.label-gray{color:#878da0;background:#e8ebef}.label-outline.label-danger{color:#ff5d5d;background:#ffebee;border-color:rgba(255,93,93,.25)}.label-outline.label-light{color:#838a9d;background:#f2f5fb;border-color:#e1e5ee}.label-primary.label-outline{background:#e9f2fb!important;border-color:rgba(12,100,235,.25)}.label-outline.label-success{background:#e8f5e9;border-color:rgba(0,218,136,.25)}.label-outline.label-info{background:#e3f2fd;border-color:rgba(33,150,243,.25)}.label-outline.label-warning{background:#fff3e0;border-color:rgba(255,152,0,.25)}.label-dot{position:relative;top:-1px;padding:0;border-radius:50%}.label-dot+.status-text{display:inline-block;margin-left:5px}.label-icon{min-width:18px;padding:0;line-height:18px;border-radius:10px}.label-id{display:inline-block;min-width:30px;padding:0 5px;font-size:12px;line-height:16px;color:#838a9d;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid #838a9d;border-radius:2px}.pri-1,.todo-pri-1{color:#ff5d5d}[class*=" status-"],[class^=status-]{color:#3c4353}.status-changed,.status-delayed,.status-doing,.status-fail,.status-investigate{color:#ff5d5d}.status-changed>.label-dot,.status-delayed>.label-dot,.status-doing>.label-dot,.status-fail>.label-dot,.status-investigate>.label-dot{background-color:#ff5d5d}.status-wait{color:#838a9d}.status-wait>.label-dot{background-color:#7ec5ff}.status-unclosed{color:#838a9d}.status-unclosed>.label-dot{background-color:#0c64eb}.status-done,.status-normal,.status-pass,.status-resolved{color:#43a047}.status-done>.label-dot,.status-normal>.label-dot,.status-pass>.label-dot,.status-resolved>.label-dot{background-color:#00da88}.status-postpone{color:#838a9d}.status-postpone>.label-dot{background-color:#ff5d5d}.status-blocked{position:relative;left:-5px;display:inline-block;padding:0 5px;line-height:20px;color:#3c4353;background:0 0;border-radius:10px}.status-blocked>.label-dot{background-color:#ff9800}.status-pause,.status-suspended{color:#ff9800}.status-pause>.label-dot,.status-suspended>.label-dot{background-color:#ff9800}.status-active.status-bug,.status-draft{color:#8666b8}.status-active.status-bug>.label-dot,.status-draft>.label-dot{background-color:#8666b8}.status-closed,.status-terminate{color:#838a9d}.status-closed>.label-dot,.status-terminate>.label-dot{background-color:#838a9d}.status-cancel{color:#838a9d}.status-cancel>.label-dot{background-color:#cbd0db}.label-pri{display:inline-block;min-width:18px;max-width:100%;height:18px;padding:0 4px;overflow:hidden;font-size:12px;line-height:16px;color:#838a9d;text-align:center;text-overflow:clip;white-space:normal;vertical-align:middle;border:1px solid #838a9d;border-radius:10px}.label-pri-1,.label-selector>.label-pri[data-value="1"]{color:#d50000;border-color:#d50000}.label-pri-2,.label-selector>.label-pri[data-value="2"]{color:#ff9800;border-color:#ff9800}.label-pri-3,.label-selector>.label-pri[data-value="3"]{color:#2098ee;border-color:#2098ee}.label-pri-4,.label-selector>.label-pri[data-value="4"]{color:#009688;border-color:#009688}.label-pri-5,.label-selector>.label-pri[data-value="5"]{color:#838a9d;border-color:#838a9d}.label-pri-0,.label-selector>.label-pri.active[data-value="0"]{color:#d5d9df;border-color:#d5d9df}.label-severity{position:relative;display:inline-block;width:24px;height:20px;font-weight:bolder;text-align:center;vertical-align:middle}.label-severity:before{position:absolute;top:-3px;left:0;z-index:0;display:block;font-family:ZentaoIcon;font-size:14px;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:inherit;text-transform:none;content:"\e973";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.label-severity:after{position:absolute;top:7px;left:0;z-index:1;display:block;width:24px;font-size:12px;line-height:12px;text-align:center;content:attr(data-severity)}.label-severity[data-severity],.label-severity[data-value]{color:#ccc}.label-severity[data-severity="0"],.label-severity[data-value="0"]{color:#ccc}.label-severity[data-severity="1"],.label-severity[data-value="1"]{color:#c62828}.label-severity[data-severity="2"],.label-severity[data-value="2"]{color:#ff8f00}.label-severity[data-severity="3"],.label-severity[data-value="3"]{color:#fdd835}.label-severity[data-severity="4"],.label-severity[data-value="4"]{color:#cddc39}.label-severity[data-severity="5"],.label-severity[data-value="5"]{color:#8bc34a}.label-severity-custom[data-severity]{color:#d5d9df}.label-severity-custom[data-severity="1"]{color:#c62828}.label-severity-custom[data-severity="2"]{color:#ff8f00}.label-severity-custom[data-severity="3"]{color:#fdd835}.label-severity-custom[data-severity="4"]{color:#cddc39}.label-severity-custom[data-severity="5"]{color:#8bc34a}.label-selector{padding:0 10px}.label-selector>.label{display:inline-block;min-width:24px;height:24px;padding:0 5px;font-size:14px;line-height:20px;text-align:center;cursor:pointer;background:0 0;border:2px solid #d5d9df;border-radius:15px}.label-selector>.label+.label{margin-left:10px}.label-selector>.label.empty{border-color:transparent}.label-selector>.label.label-severity{font-size:12px;line-height:28px;border-color:transparent}.label-selector>.label.label-severity:before{top:-2px;left:-2px}.label-selector>.label.label-severity:after{display:none}.label-selector>.label.label-severity.active{background:0 0;filter:none;-webkit-filter:none}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-top:2px}.ie .checkbox input[type=checkbox],.ie .checkbox-inline input[type=checkbox],.ie .radio input[type=radio],.ie .radio-inline input[type=radio]{margin-top:4px}.is-firefox .checkbox input[type=checkbox],.is-firefox .checkbox-inline input[type=checkbox],.is-firefox .radio input[type=radio],.is-firefox .radio-inline input[type=radio]{margin-top:3px}.checkbox-primary,.radio-primary{position:relative;display:block;vertical-align:middle}.checkbox-primary.inline-block,.radio-primary.inline-block{display:inline-block}.checkbox-primary.inline-block+.inline-block,.radio-primary.inline-block+.inline-block{margin-left:15px}.checkbox-primary>input,.radio-primary>input{position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;margin:0;opacity:0}.checkbox-primary>label,.radio-primary>label{display:block;height:20px;padding-left:20px;margin:0;font-weight:400;line-height:20px;cursor:pointer}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{position:absolute;top:3px;right:0;left:0;display:block;width:14px;height:14px;line-height:14px;text-align:center;content:' ';border-radius:3px}.checkbox-primary>label:after,.radio-primary>label:after{z-index:1;border:1px solid #d9dbe1;border-color:rgba(0,0,0,.15);-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:border,background-color;-o-transition-property:border,background-color;transition-property:border,background-color}.checkbox-primary>label:before,.radio-primary>label:before{top:3px;z-index:2;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-weight:900;font-variant:normal;line-height:1;text-transform:none;content:"\e5ca";opacity:0;-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:opacity,-webkit-transform;-o-transition-property:opacity,-o-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform,-o-transform;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.checkbox-primary.checked>label:after,.checkbox-primary>input:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:#00da88;border-color:#00da88;border-width:4px}.checkbox-primary.checked>label:before,.checkbox-primary>input:checked+label:before,.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{color:#fff;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary input:indeterminate+label:before,.checkbox-primary.indeterminate>label:before,.radio-primary input:indeterminate+label:before,.radio-primary.indeterminate>label:before{top:9px;left:3px;width:8px;height:2px;content:' ';background-color:#a3a2bc;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary.focus>label:after,.checkbox-primary>input:focus+label:after,.radio-primary.focus>label:after,.radio-primary>input:focus+label:after{border-color:#00da88;-webkit-box-shadow:0 0 0 3px rgba(0,218,136,.2);box-shadow:0 0 0 3px rgba(0,218,136,.2)}.checkbox-primary:hover>label:after,.radio-primary:hover>label:after{border-color:#00da88}.checkbox-primary.checkbox-right>label,.radio-primary.checkbox-right>label{padding:0 30px 0 0}.checkbox-primary.checkbox-right>label:after,.checkbox-primary.checkbox-right>label:before,.radio-primary.checkbox-right>label:after,.radio-primary.checkbox-right>label:before{right:0;left:auto}.checkbox-primary input:disabled+label:after,.checkbox-primary.disabled>label:after,.radio-primary input:disabled+label:after,.radio-primary.disabled>label:after{background-color:#e5e5e5!important;border-color:#bbb!important}.checkbox-primary input:disabled:checked+label:after,.checkbox-primary.checked.disabled>label:after,.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:#bbb!important}.radio-primary>label:after{border-radius:50%}.radio-primary>label:before{top:7px;left:6px;width:6px;height:6px;content:' ';border:none;border-radius:50%}.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:transparent;border-color:#00da88;border-width:2px}.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{background-color:#00da88}.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:transparent;border-color:#bbb}.radio-primary input:disabled:checked+label:before,.radio-primary.checked.disabled>label:before{background-color:#bbb}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li>a{position:relative;border:none!important;border-radius:2px!important}.nav-tabs>li.active>a{font-weight:700;color:#3c4353!important}.nav-tabs>li.active>a:before{position:absolute;right:0;bottom:-1px;left:0;display:block;height:2px;content:' ';background:#0c64eb}.nav-tabs-primary>li.active>a{color:#0c64eb!important}.panel{position:relative;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.panel-body{padding:20px}.panel-body.has-table{padding:10px}.panel-body.has-table .table{margin-bottom:0;table-layout:fixed}.panel-heading{padding:12px 48px 12px 20px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading+.panel-body{padding-top:0}.panel-title{font-size:14px;font-weight:700;line-height:20px}.panel-title .label{top:-1px}.panel-actions{position:absolute;top:0;right:0;padding:7px 8px}.panel:hover .panel-actions{z-index:10}.panel-actions>li>a{display:inline-block;min-width:30px;padding:0 5px;line-height:30px;color:#a6aab8;text-align:center;border-radius:4px}.panel-actions>li>a:hover{color:#3c495c;text-decoration:initial;background-color:#f1f1f1}.panel-actions .btn-icon{color:#a6aab8}.panel-actions .btn.text-primary{color:#0c64eb}.panel .empty-tip{padding:30px 10px 50px;font-size:14px;color:#838a9d;text-align:center}.progress-text-left{position:relative;margin:7px 0;margin-left:35px;overflow:visible}.progress-text-left .progress-text{position:absolute;top:-7px;left:-35px;display:block;width:35px;height:20px;padding-right:5px;line-height:20px;color:#838a9d;text-align:right}.chart-color{width:20px}.chart-color-dot{display:inline-block;width:10px;height:10px;border-radius:50%}.chart-row{margin-top:10px}.chart-row+.chart-row{padding-top:10px;border-top:1px solid #eee}.chart-wrapper{padding:10px 5px;background:#eee}.chart-wrapper>h4{margin:5px 0 10px}.table-wrapper{max-height:250px;overflow:auto}.table-wrapper .table{margin:0}.progress-pie{position:relative}.progress-pie canvas{display:block}.progress-pie .progress-info{position:absolute;top:0;left:0;width:100%;height:100%;padding-top:25px;text-align:center}.progress-pie .progress-info>small{display:block;line-height:14px;color:#a6aab8}.progress-pie .progress-info>strong{display:block;font-size:36px;line-height:40px}.progress-pie .progress-info>strong>small{font-size:20px}.progress-pie-120 .progress-info{padding-top:30px}.progress-pie-120 .progress-info>small{line-height:18px}.progress-pie-50 .progress-info{padding-top:4px}.progress-pie-50 .progress-info>strong{font-size:20px;font-weight:400}.progress-pie-50 .progress-info>strong>small{font-size:14px}.progress-pie[data-value="100"] .progress-info>strong{-webkit-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);transform:scale(.7)}.progress-pie-24 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:24px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-24[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.progress-pie-26 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:26px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-26[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.status-bars{display:table;width:100%;height:140px;padding:5px;padding-top:50px;margin:0;overflow:hidden}.status-bars>li{position:relative;display:table-cell;text-align:center;vertical-align:bottom}.status-bars .bar{position:absolute;bottom:20px;left:50%;display:block;width:10px;margin-left:-5px;background:#0c64eb;border-radius:5px 5px 0 0}.status-bars .bar:after{position:absolute;right:-50px;bottom:0;left:-50px;display:block;height:1px;content:' ';background:#eee}.status-bars .title{font-size:12px;font-weight:400;color:#a6a8b6}.status-bars .value{position:relative;top:-20px;left:-20px;display:inline-block;width:50px;font-size:16px;font-weight:700;text-align:center}.status-bars-h{display:block;padding-right:50px;padding-left:60px;list-style:none}.status-bars-h>li{position:relative;height:40px;border-left:1px solid #eee}.status-bars-h .bar{position:relative;top:15px;display:block;height:10px;line-height:20px;background:#0c64eb;border-radius:0 5px 5px 0}.status-bars-h .title{position:absolute;top:-5px;left:-60px;width:60px;padding-right:10px;font-size:12px;color:#a6a8b6;text-align:right}.status-bars-h .value{position:absolute;top:-5px;right:-50px;display:block;width:40px;font-size:14px;font-weight:700;text-align:left;white-space:nowrap}.ring,[class*=" ring-"],[class^=ring-]{width:24px;height:24px;font-size:12px;line-height:24px;text-align:center;background-image:url(data:image/png;base64,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);background-position:0 0;-webkit-background-size:1224px 24px;background-size:1224px 24px}.ring>span,[class*=" ring-"]>span,[class^=ring-]>span{display:inline-block;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.messager{border-radius:4px;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1)}.messager-icon{vertical-align:middle}.messager-icon>.icon{font-size:24px}.messager-content{padding:18px 20px;font-size:18px;line-height:30px}.messager-content>.icon{font-size:28px;line-height:30px}.messager-actions{vertical-align:middle}.messagger-zt{color:#3c4353;background-color:#fff!important}.messagger-zt .messager-icon>.icon{color:#0c64eb}.messagger-zt .messager-actions>.action{color:#838a9d}.messagger-zt.messager-success .messager-icon>.icon{color:#00da88}.messagger-zt.messager-danger .messager-icon>.icon{color:#ff5d5d}.messagger-zt.messager-warning .messager-icon>.icon{color:#ff9800}.messagger-zt.messager-info .messager-icon>.icon{color:#2196f3}.tree{padding-left:0;overflow:hidden}.tree ul{position:relative;display:none;padding-left:0}.tree li{position:relative;padding:2px 0 2px 15px;list-style:none}.tree li.heading{padding-left:5px;color:#3c495c}.tree li>a{display:block;max-width:90%;padding:2px 6px;color:#3c495c;word-break:break-all}.tree li>a:hover{color:#3c4353}.tree li>a.tree-toggle:hover{background:0 0}.tree li.active>a{position:relative;font-weight:700;color:#0c64eb}.tree li>.list-toggle{position:absolute;top:1px;left:1px;z-index:10;width:20px;font-size:14px;line-height:22px;color:#cbd0db;text-align:center;cursor:pointer;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tree li>.list-toggle:before{content:"\f0da"}.tree li>.list-toggle:active,.tree li>.list-toggle:hover{color:#0c64eb}.tree li.has-active-item>.list-toggle{color:#3c4353}.tree li.has-list.open>ul{display:block}.tree li.has-list.open>.list-toggle{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.tree li.has-list.open:before{position:absolute;top:16px;bottom:-5px;left:10px;display:block;content:' ';border-left:1px solid #d8d8d8}.tree-actions{display:inline-block;margin-left:5px;vertical-align:middle}.tree-actions a{display:inline-block;margin-left:5px;font-size:13px;opacity:.6}.tree-actions a:hover{opacity:1}.tree li>.module-name{color:#3c495c;vertical-align:middle}.tree li>.module-name:hover{background-color:#f0f2f5}.tree li>.module-name:hover>a{color:#3c4353}.treemap-node-fold-icon:before{position:relative;left:-4px;min-width:18px}.dropdown-menu{padding:5px 0;border-color:rgba(0,0,0,.1)}.dropdown-menu>li{padding:0 10px}.dropdown-menu>li>a{padding:2px 10px;margin:5px 0;border-radius:3px}.dropdown-menu>li>a>.icon{position:relative;left:-5px;opacity:.5}.dropdown-menu>li>a:hover>.icon{opacity:.8}.dropdown-menu>li.active>a,.dropdown-menu>li.selected>a{position:relative;color:#fff;background-color:#16a8f8}.dropdown-menu>li.selected>a:after{position:absolute;top:2px;right:4px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:20px;text-transform:none;content:"\e5ca";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>li.divider{margin:10px}.dropdown-submenu>a:after{margin-right:-5px}.dropdown-submenu>.dropdown-menu.pull-left{margin-left:-1px}.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#3c4353;background-color:#e9f2fb}.dropdown-submenu:hover>a:after{border-left-color:#0c64eb}.dropdown-submenu>a:hover:after{border-left-color:#fff}.pager .btn{padding:3px 10px}.pager .btn .caret{opacity:.7}.pager>li>.pager-label{padding:2px;line-height:20px}.pager>li>.pager-item{min-width:20px;padding:1px;margin:2px 0;font-size:16px;line-height:20px;text-align:center;background:0 0;border-color:transparent}.pager>li>.pager-item:hover{background-color:rgba(0,0,0,.1)}.pager>li>.pager-item>.icon{position:relative;top:-1px}.pager>li>.btn:hover,.pager>li>a:hover{background:rgba(0,0,0,.1)}.pager>li.disabled>a.pager-item{background:0 0;border-color:transparent;opacity:.5}.pager>li.active>a{background-color:#16a8f8}.pager>li .btn-group .btn{padding:1px;margin:1px 0;border-radius:4px}.pager .dropdown-menu{width:200px}.pager .dropdown-menu>li{float:left;width:33.333333%}.modal-dialog{width:900px;max-width:1360px;border:none;border-radius:0;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,.25);box-shadow:0 0 20px 0 rgba(0,0,0,.25)}.modal-dialog.modal-md{width:700px}.modal-dialog.modal-xs{width:400px}.modal-dialog.modal-sm{width:500px}.modal-dialog.modal-lg{width:1200px}.modal-dialog.modal-fullscreen{position:fixed;max-width:initial}.modal-header{padding:20px 0;margin:0 20px}.modal-header>.close{color:#838a9d;text-shadow:0 1px 0 rgba(255,255,255,.85);opacity:1}.modal-header>.close:hover{color:#222}.modal-footer{padding:20px 0;margin:0 20px}.modal-title{font-size:14px;font-weight:400;line-height:20px}.modal-actions{position:absolute;top:16px;right:16px}.modal-actions .divider{position:relative;top:5px;display:inline-block;width:0;height:20px;margin:0 10px;border-left:#eee 1px solid}.modal-actions>.dropdown{display:inline-block}.modal-body{padding:20px}.modal-iframe .modal-body>iframe{border-radius:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-3%);-ms-transform:translate(0,-3%);-o-transform:translate(0,-3%);transform:translate(0,-3%)}.modal.fade.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-simple .modal-footer{padding-top:0;border-top:none}.modal-iframe .modal-header{position:relative;z-index:10;min-height:0;padding:0;border:none}.modal-iframe .modal-title{display:none}.modal-iframe .modal-header .close{position:absolute;top:12px;right:10px;font-size:32px;font-weight:200}.modal-iframe .modal-dialog{overflow:hidden}.modal-inverse .modal-header>.close{color:rgba(255,255,255,.7);text-shadow:none}.modal-inverse .modal-header>.close:hover{color:#fff}.modal-scroll-inside>.modal-dialog{max-height:100%}.hide-modal-close .modal-iframe .modal-header .close{display:none}.tile{text-align:center}.tile-title{line-height:20px;color:#3c495c}.tile-amount{font-size:32px;font-weight:700;line-height:56px}.timeline>li{position:relative;list-style:none}.timeline>li:before,.timeline>li>a:after,.timeline>li>div:after{position:absolute;left:-20px;display:block;width:15px;height:15px;content:' ';border-radius:50%}.timeline>li:before{top:12px;left:-16px;z-index:3;width:7px;height:7px;background-color:#cbd0db;border:none;border:1px solid #cbd0db}.timeline>li>a:after,.timeline>li>div:after{top:11px;left:-17px;z-index:3;width:9px;height:9px;background-color:#0c64eb;border-radius:50%;opacity:0}.timeline>li+li:after{position:absolute;top:-12px;bottom:20px;left:-13px;z-index:1;display:block;content:' ';border-left:1px solid #eee}.timeline>li.active>a:after,.timeline>li.active>div:after{opacity:1}.timeline>li.active:before{top:8px;left:-20px;width:15px;height:15px;background-color:rgba(12,100,235,.2);border:none}.timeline>li>a,.timeline>li>div{display:block;padding:5px;line-height:20px}.timeline>li.active>a{color:#3c4353}.timeline-tag{position:absolute;top:5px;left:-115px;font-size:12px}.timeline-tag-left{padding-left:115px}.timeline-sm{font-size:12px}.timeline-sm>li:before,.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:10px;left:-20px;width:11px;height:11px}.timeline-sm>li.active:before,.timeline-sm>li:before{top:10px;left:-18px;width:11px;height:11px;background:0 0;border:1px solid #eee}.timeline-sm>li>a,.timeline-sm>li>div{line-height:20px}.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:13px;left:-15px;width:5px;height:5px}.form-control{-webkit-box-shadow:none;box-shadow:none}.form-horizontal .form-group>label{padding-right:0}.form-actions{margin-top:20px;margin-bottom:0}.form-actions .btn{margin-right:10px}form label{font-weight:400;color:#3c495c}.form-group .btn+.btn{margin-left:5px}.table-form{margin-bottom:0;table-layout:fixed}.table-form>thead>tr>th.required:after{position:relative;top:3px;right:auto;left:4px;display:inline-block;vertical-align:middle}.table-form>tbody>tr>td,.table-form>tbody>tr>th,.table-form>tfoot>tr>td,.table-form>thead>tr>th{padding:7px;vertical-align:middle;border-bottom:none}.table-form>tfoot>tr>td{padding:20px 7px 10px}.table-form>tbody>tr>th{width:100px;font-weight:700;text-align:right}.table-form .input-group{width:100%}.chosen-container-single .chosen-single{position:relative}.chosen-container-single .chosen-single>span{height:20px;line-height:20px;word-break:break-all;white-space:normal}.chosen-container-single .chosen-single div b{position:relative;top:1px;color:#cbd0db;opacity:1}.chosen-container-single .chosen-search:before{top:8px;right:15px}.chosen-container-multi .chosen-choices li.search-choice{font-size:13px;background:#eee;border-color:#cbd0db;-webkit-box-shadow:none;box-shadow:none}.chosen-container-single .chosen-search input[type=text]{height:30px;padding:3px 25px 3px 5px}.chosen-container-single .chosen-search{padding:3px 10px 0}.chosen-container-single .chosen-single{overflow:visible}.chosen-container .chosen-results{max-height:245px;padding:10px}.chosen-container .chosen-results>li{border-radius:4px}.chosen-container .chosen-results li.highlighted em{color:#fff}.table-responsive .chosen-container .chosen-results{max-height:200px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{top:-2px;right:-1px;bottom:-1px;left:-1px;display:none;height:auto;padding:0;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:31px;padding:5px 26px 5px 8px;font-size:inherit;line-height:20px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{right:8px}.datetimepicker{padding:10px}.datetimepicker td.day.today{background-color:#f77}.datetimepicker td.day.active{background-color:#16a8f8}.datetimepicker tfoot th,.datetimepicker thead th{color:#838a9d}.input-control .colorpicker{top:0;z-index:auto;opacity:1}.input-control .colorpicker .btn{padding:5px}.input-control .input-control-icon-right.btn{top:0}.colorpicker .dropdown-menu{min-width:232px;padding:5px 10px 10px 10px}.colorpicker .dropdown-menu>li{display:block;float:left;padding:5px}.colorpicker .dropdown-menu>li.heading{width:100%;margin-bottom:5px;font-size:16px;font-weight:700;text-align:left}.colorpicker .dropdown-menu>li.heading>.icon-close{position:relative;top:4px;float:right;cursor:pointer;opacity:.6}.colorpicker .dropdown-menu>li>a{position:relative;display:block;width:100%;height:100%;padding:0;margin:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;border:1px solid transparent;border-radius:50%;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.colorpicker .dropdown-menu>li>a:before{position:absolute;top:0;display:block;width:100%;height:20px;line-height:18px}.colorpicker .dropdown-menu>li>a:hover{-webkit-box-shadow:0 1px 4px rgba(0,0,0,.25);box-shadow:0 1px 4px rgba(0,0,0,.25)}.colorpicker .dropdown-menu>li>a.active:before{font-size:14px;content:"\e5ca"}.colorpicker .dropdown-menu>li>a.empty{color:#666;background:#fff}.colorpicker .dropdown-menu>li>a.empty:before{content:"\e90d"}.colorpicker .btn{position:relative}.colorpicker .btn .color-bar{position:absolute;right:5px;bottom:3px;left:5px;height:3px}.colorpicker .btn .color-bar[style*='background: ']+.ic{position:relative;top:-2px}.colorpicker .btn .ic{color:#cbd0db}.colorpicker .btn:hover .ic{color:#838a9d}.input-group .colorpicker{z-index:3}.input-group .chosen-container{display:table-cell}.input-group-addon{border-right-width:0;border-left-width:0}.input-group-addon:first-child{border-left-width:1px}.input-group-addon:last-child{border-right-width:1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin:0}.input-group-cell{display:table-cell;width:1%;padding:0 12px;white-space:nowrap;vertical-align:middle}.ke-container{border-color:#dcdcdc!important;border-radius:2px!important}.ke-container.focus{border-color:#0c64eb!important}.ke-toolbar{border-color:#dcdcdc!important}.required:after{top:6px;right:-10px;font-size:20px}td.required:after{top:12px;right:-5px}.input-group>.chosen-container.required:after,.input-group>.input-control.required:after{top:1px;right:1px;z-index:2}.input-group.required .required:after{display:none}.file-input{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.file-input .input-group{width:auto}.file-input .input-group>.input-group-cell:first-child{padding-right:0;padding-left:7px}.file-input input[type=file]{position:absolute;width:0;height:0;opacity:0}.file-input .file-title{display:inline-block;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.file-input .file-editbox{min-width:200px;max-width:100%}.file-input .file-size{display:inline-block;vertical-align:middle}.edit .file-input-empty,.file-input-edit,.file-input-normal,.normal .file-input-empty{display:none}.edit .file-input-edit,.normal .file-input-normal{display:block}.edit .file-input-edit.input-group,.normal .file-input-normal.input-group{display:table}.edit .file-input-normal{display:none!important}.file-input-normal>.input-group-btn{width:auto}.input-group .chosen-container-active .chosen-choices{border-color:#0c64eb!important}.input-group .chosen-container{min-width:100px}.input-group .input-group-btn .btn>.icon{line-height:17px}.os-mac select.form-control{-webkit-appearance:none;background-image:url(data:image/gif;base64,R0lGODlhCQAFAIAAAMvQ2////yH5BAEAAAEALAAAAAAJAAUAAAIKhH+BGYoNGWxgFgA7);background-image:url(data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==);background-repeat:no-repeat;background-position:right 5px top 12px;-moz-appearance:none}input::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none!important;pointer-events:none;visibility:hidden}.chosen-choices.has-error,.chosen-single.has-error,.form-control.has-error{border-color:#ff5d5d!important;-webkit-box-shadow:0 0 6px #ffc3c3!important;box-shadow:0 0 6px #ffc3c3!important}.popover-success.popover-form-result{font-weight:700;color:#fff;background:#00da88}.popover-success.popover-form-result.popover.right .arrow:after{border-right-color:#00da88}textarea.kindeditor{padding:0!important}.form-unsaved{outline:2px solid #ff9800;-webkit-box-shadow:0 1px 12px #ff9800;box-shadow:0 1px 12px #ff9800;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s}select[multiple].picker-select,select[multiple][data-toggle=picker]{max-height:32px;visibility:hidden}.picker-selection-remove:before{font-size:18px}.picker-user-option{position:relative;padding-left:40px}.picker-user-option>.avatar{position:absolute;top:5px;left:10px}.picker-user-option>.picker-option-text{display:inline-block;min-width:40px;font-weight:700}.picker-user-option>.dept-name,.picker-user-option>.role-name{display:inline-block;margin-left:10px;font-size:12px;opacity:.6}.picker-user-option>.dept-name{min-width:50px}#mainHeader{height:50px;color:#fff;background:-webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:-webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:-o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);border-top-color:#0c64eb;border-bottom-color:#e9f2fb}#mainHeader>.container{min-width:1200px;padding:0}#heading{position:absolute;top:10px;left:20px}@media (min-width:1400px){#heading{left:40px}}#heading h1{float:left;max-width:250px;margin:0;overflow:hidden;font-size:20px;font-weight:400;line-height:30px;text-overflow:ellipsis;white-space:nowrap}#heading h1 a{color:inherit;text-decoration:inherit}#heading h1.long-name{position:relative;top:-5px;display:table-cell;font-size:16px;line-height:20px;word-break:break-all;white-space:normal}#heading>.btn{display:block;float:left;height:20px;padding:1px 5px;margin:0;margin:5px 0 0 10px;font-size:12px;font-weight:lighter;line-height:18px;background-color:rgba(255,255,255,.2);border:none}#heading>.btn:hover{background-color:rgba(0,0,0,.1)}#navbar{margin:0 auto;text-align:center}#navbar .nav{display:inline-block}#navbar .nav>li>a{padding:10px;line-height:30px;color:#fff;border-radius:0;opacity:.9}@media (max-width:1400px){#navbar .nav>li>a{padding:10px 8px}}#navbar .nav>li>a:focus,#navbar .nav>li>a:hover{background:rgba(0,0,0,.15);opacity:1}#navbar .nav>li.active>a{font-weight:700;background:rgba(0,0,0,.1);opacity:1}#navbar .nav>li.divider{display:block;width:2px;height:20px;margin:15px 8px;background:rgba(255,255,255,.4)}@media (max-width:1400px){#navbar .nav>li.divider{margin:15px 5px}}@media (max-width:1300px){#navbar .nav>li.divider{margin:15px 3px}}#navbar .nav>li.divider:last-child{display:none}#navbar .nav .dropdown-menu li>a{text-align:left}#toolbar{position:absolute;top:12px;right:20px;font-size:12px;color:#fff}@media (min-width:1400px){#toolbar{right:40px}}#extraNav{text-align:right}#extraNav>li{display:inline-block;float:none;text-align:left}#extraNav>li>a{display:block;padding:0;color:#fff;opacity:.75}#extraNav>li>a:hover{text-decoration:unset;background-color:rgba(0,0,0,.1);opacity:1}#extraNav>li.open>a{background-color:rgba(0,0,0,.1)}#extraNav>li+li{margin-left:10px}#showSearchGo{color:#fff;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.5)}#searchbox{position:relative;float:left;width:150px}#searchbox .input-group-btn .btn{position:relative;padding:1px 4px;font-size:12px;line-height:20px;color:#fff;background-color:rgba(255,255,255,.15);border-right:none;border-radius:2px}#searchbox .input-group-btn .btn:after{position:absolute;top:3px;right:0;bottom:3px;display:block;width:1px;content:' ';background-color:rgba(255,255,255,.15)}#searchbox .input-group-btn .btn:hover{background-color:rgba(255,255,255,.25)}#searchGo{position:absolute;top:0;right:-1px;z-index:9;min-width:24px;height:24px;padding:2px 3px;font-size:12px;line-height:20px;color:#fff;background-color:#16a8f8;border-radius:2px}#searchGo:hover{color:#fff!important;background-color:#0c64eb}#searchInput{height:24px;padding:2px 30px 2px 5px;color:#fff;text-align:left;background:rgba(255,255,255,.15);border-color:transparent;border-radius:0 12px 12px 0;-webkit-transition:background .2s,border .2s;-o-transition:background .2s,border .2s;transition:background .2s,border .2s}#searchInput:hover{background:rgba(255,255,255,.25)}#searchInput:focus{color:#333;background:#fff}#searchInput::-webkit-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::-moz-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:-ms-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:focus::-webkit-input-placeholder{color:#838a9d}#searchInput:focus::-moz-placeholder{color:#838a9d}#searchInput:focus:-ms-input-placeholder{color:#838a9d}#searchInput:focus::placeholder{color:#838a9d}#searchTypeMenu{min-width:220px}#searchTypeMenu>li{float:left;width:50%}#searchTypeMenu>li>a{margin:4px 0}#userNav .avatar{display:inline-block;vertical-align:middle}#userNav>li>a{padding:2px 6px;line-height:20px;color:#fff;opacity:.9}#userNav>li>a .user-name{max-width:100px;overflow:hidden;font-size:15px;text-overflow:ellipsis;white-space:nowrap}#userNav>li>a:hover{background-color:rgba(0,0,0,.1);opacity:1}#userNav>li>a:hover>i{opacity:1}#userNav>li>a span{vertical-align:middle}#userNav>li.open>a{background-color:rgba(0,0,0,.1)}#userNav>li.has-new-items>a{position:relative}#userNav>li.has-new-items>a:before{position:absolute;top:3px;right:-1px;display:block;width:4px;height:4px;content:' ';background-color:#ff5d5d;border-radius:50%}#userNav .dropdown-menu{min-width:150px}#userNav .dropdown-menu>li>a>.icon{position:absolute;top:10px;right:5px;display:block;width:20px;height:20px;line-height:20px;text-align:center}#userNav .user-profile-item>a{position:relative;padding-left:45px}#userNav .user-profile-item .avatar{position:absolute;top:6px;left:5px}#userNav .user-profile-name{font-size:16px}#userNav .user-profile-role{font-size:12px;color:#a9abb8}#userNav .no-role .user-profile-role{display:none}#userNav .no-role .user-profile-name{line-height:40px}#subHeader{min-height:50px;background:#fff}#subHeader>.container{padding:0 20px}@media (min-width:1400px){#subHeader>.container{padding:0 40px}}#pageNav{position:absolute;top:8px;left:0;left:20px}@media (min-width:1400px){#pageNav{left:40px}}#subNavbar{margin-top:5px;font-size:14px;text-align:center}#subNavbar .nav{display:inline-block}#subNavbar .nav>li>a{padding:8px 12px;line-height:24px;color:#3c495c}#subNavbar .nav>li>a:hover{color:#3c495c;background-color:rgba(0,0,0,.075)}#subNavbar .nav>li.active>a{font-weight:700;color:#0c64eb}#subNavbar .nav>li.divider{display:block;width:2px;height:20px;margin:9px 5px;background-color:rgba(0,0,0,.05)}#subNavbar .dropdown-menu{text-align:left}[lang=en] #subNavbar>.nav>li>a{padding-right:8px;padding-left:8px}#pageActions{position:absolute;top:9px;right:20px}@media (min-width:1400px){#pageActions{right:40px}}.cell{padding:10px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.cell+.cell{margin-top:10px}.cell>.panel{margin:0;-webkit-box-shadow:none;box-shadow:none}.cell>.panel>.panel-heading{padding:5px 5px 10px}.cell>.panel>.panel-heading .panel-actions{padding:0}.cell>.panel>.panel-body{padding:5px}.cell>.table{margin:0}#main{min-width:1200px;padding:20px 0}#main>.container{padding:0 20px}@media (min-width:1400px){#main>.container{padding:0 40px}}#header,#header+#main{min-width:1200px}#mainMenu{margin:-10px 0 8px}.main-content{padding:20px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}@media (min-width:1400px){.main-content>.center-block{max-width:1350px;padding:20px;border:1px solid #eee}.main-content>.center-block .main-header{background-color:#f1f1f1}}.main-content>h2{margin:0 0 20px}.main-content .cell{-webkit-box-shadow:none;box-shadow:none}.main-header{padding:5px 20px;border-bottom:1px solid #eee}.main-header:after,.main-header:before{display:table;content:" "}.main-header:after{clear:both}.main-header>h2{display:block;float:left;margin:0 10px 0 0;font-size:14px;line-height:34px}.main-header>h2 .label-id{margin-right:5px}.main-header>h2 small{font-size:14px;font-weight:400}.main-content .main-header{margin:-20px -20px 10px}.main-header .label{top:-1px}.main-row{display:table;width:100%;table-layout:fixed}.main-row>[class*=" col-"],.main-row>[class*="-col"],.main-row>[class^=col-]{display:table-cell;vertical-align:top}@media (max-width:720px){.main-row{display:block}.main-row>*{display:block;width:100%}.main-row .side-col{width:100%;padding:0}.main-row .main-col+.side-col,.main-row .side-col+.main-col{margin-top:10px}}.main-row.hide-side .side-col{display:none}.main-form{margin:0}@media (min-width:720px){.main-content>.center-block .main-form{padding-right:20px}}#main .side-col .tabs{padding:5px}#main .side-col .nav-tabs{margin:0 5px 5px 5px}#main .side-col .nav-tabs>li{margin:0}#main .side-col .nav-tabs>li+li{margin-left:10px}#main .side-col .nav-tabs>li>a{padding:8px 5px}#main .side-col .tab-content .tab-pane table{border:none}.main-actions .btn-toolbar{display:inline-block;padding:4px 15px;color:#fff;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);border-radius:4px}.main-actions .btn-toolbar .divider{margin-right:15px;margin-left:15px;border-color:rgba(255,255,255,.1)}.main-actions .btn-toolbar .btn{height:30px;padding-right:10px;padding-left:10px;margin-right:0;color:#fff;background-color:transparent;border:none}.main-actions .btn-toolbar .btn+.btn{margin-left:10px}.main-actions .btn-toolbar .btn:focus,.main-actions .btn-toolbar .btn:hover{background-color:rgba(255,255,255,.2)}.main-actions .btn-toolbar .btn.btn-icon{min-width:32px;padding-right:0;padding-left:0}.main-actions .btn-toolbar .btn+.btn-group{margin-right:0;margin-left:10px}#mainContent .main-col>.main-actions{padding:30px 0 0 0;text-align:center}#mainContent .main-col>.main-actions>.btn-toolbar{visibility:visible;opacity:1;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}#mainActions{position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;pointer-events:none}#mainActions .btn-toolbar{position:relative;top:-90px}#mainActions .dropdown-menu{text-align:left}#mainActions>.container{height:100%}.main-actions-holder{display:none}.main-actions-fixed .main-actions-holder{display:block}.main-actions-fixed #mainContent .main-col>.main-actions{position:fixed;bottom:10px}.main-actions-fixed.body-modal #mainContent .main-col>.main-actions{bottom:20px}#nextPage,#prevPage{position:absolute;top:50%;left:-10px;width:40px;height:60px;padding:10px 0;margin-top:-30px;line-height:40px;color:#fff;text-align:center;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.05);box-shadow:0 2px 15px 2px rgba(0,0,0,.05)}#nextPage:hover,#prevPage:hover{-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.15);box-shadow:0 2px 15px 2px rgba(0,0,0,.15)}#nextPage>i,#prevPage>i{display:block;font-size:18px;line-height:36px}#nextPage{right:-10px;left:auto}@media (max-width:1800px){#prevPage{left:-3px}#nextPage{right:-3px}}#sidebarHeader{position:relative;float:left;width:180px;height:34px;padding-right:20px;margin-right:20px;background:#fff;border-left:4px solid #0c64eb;border-radius:4px 2px 2px 4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}#sidebarHeader:after{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #fff;border-style:solid;border-width:18px 0 18px 8px}#sidebarHeader .title{padding:0 5px;overflow:hidden;font-size:14px;font-weight:700;line-height:32px;color:#0c64eb;text-align:center;text-overflow:ellipsis;white-space:nowrap}#sidebarHeader .title>a{position:absolute;top:0;right:0;width:20px;opacity:.5}#sidebarHeader .title>a:hover{opacity:1}#sidebar{position:relative;-webkit-transition:width .2s,padding .2s;-o-transition:width .2s,padding .2s;transition:width .2s,padding .2s}#sidebar>.sidebar-toggle{position:absolute;top:0;right:5px;bottom:0;width:10px;cursor:pointer;background:0 0;border-radius:5px;-webkit-transition:background-color .2s,opacity .5s;-o-transition:background-color .2s,opacity .5s;transition:background-color .2s,opacity .5s}#sidebar>.sidebar-toggle>.icon{position:absolute;top:50%;left:-1px;width:12px;height:30px;margin-top:-10px;line-height:30px;color:#fff;text-align:center;background:#79cdfb;border-radius:6px}#sidebar>.sidebar-toggle>.icon:before{position:relative;left:-1px}#sidebar>.sidebar-toggle:before{position:absolute;top:0;right:-5px;bottom:0;left:-5px;display:block;content:' '}#sidebar>.sidebar-toggle:hover{background:rgba(0,0,0,.075)}#sidebar>.cell{position:relative;left:0;width:180px;-webkit-transition:left .2s,opacity .2s;-o-transition:left .2s,opacity .2s;transition:left .2s,opacity .2s}#sidebar.no-animate>.cell{display:none;-webkit-transition:none;-o-transition:none;transition:none}.hide-sidebar #sidebar>.cell{position:absolute;left:-200px;visibility:hidden;opacity:0}.hide-sidebar #sidebar{position:relative;width:0;padding:0}.hide-sidebar #sidebar>.sidebar-toggle>.icon:before{content:"\e315"}@media (max-width:720px){#sidebar>.cell{width:100%}}#queryBox{max-height:0;padding:0;overflow:hidden;-webkit-transition:cubic-bezier(.175,.885,.32,1) .2s;-o-transition:cubic-bezier(.175,.885,.32,1) .2s;transition:cubic-bezier(.175,.885,.32,1) .2s;-webkit-transition-property:padding,max-height,margin;-o-transition-property:padding,max-height,margin;transition-property:padding,max-height,margin}#queryBox>form{visibility:hidden;-webkit-transition:visibility .2s .2s;-o-transition:visibility .2s .2s;transition:visibility .2s .2s}#queryBox.loading{height:50px}#queryBox.show{min-height:110px;max-height:300px;margin-bottom:10px;overflow:visible}#queryBox.show>form{visibility:visible}#queryBox.divider{border-bottom:1px solid #eee}#main .querybox-toggle.querybox-opened{position:relative;color:#0c64eb;background:0 0;border:none}#main .querybox-toggle.querybox-opened:before{position:absolute;bottom:-14px;left:50%;width:0;height:0;content:' ';border-color:transparent transparent #fff transparent;border-style:solid;border-width:0 10px 10px 10px}#contentNav{padding:5px;background:#fff;border-bottom:1px solid #eee}#contentNav .nav>li>a{position:relative;padding:6px 10px;color:#838a9d}#contentNav .nav>li.active>a{font-weight:700;color:#0c64eb}#contentNav .nav>li.active>a:before{position:absolute;right:10px;bottom:3px;left:10px;display:block;height:2px;content:' ';background:#0c64eb}.body-modal{padding-bottom:0}.body-modal #main,.body-modal .container{min-width:0!important}.body-modal #main{padding:0}.body-modal .main-header{position:fixed;top:0;right:20px;left:20px;z-index:100;padding:13px 48px 13px 0;margin:0;background:#fff}.body-modal #mainContent{padding-top:70px}.body-modal .main-header>h2{max-width:100%;overflow:hidden;font-size:14px;text-overflow:ellipsis;white-space:nowrap}.body-modal .cell,.body-modal .main-content{-webkit-box-shadow:none;box-shadow:none}.body-modal #mainMenu{position:fixed;top:0;right:0;left:0;z-index:100;padding:12px 60px 12px 10px;margin:0;background:#fff}.body-modal #mainMenu>.btn-toolbar.pull-left.divider{display:none}.body-modal #mainMenu>.btn-toolbar{width:100%;margin-left:20px}.body-modal #mainMenu>.btn-toolbar>.divider:first-child{display:none}.body-modal #mainMenu>.btn-toolbar .page-title{width:100%;margin-left:0}.body-modal #mainMenu>.btn-toolbar .page-title>.text{position:relative;top:-2px;display:inline-block;max-width:85%;max-width:-webkit-calc(100% - 100px);max-width:calc(100% - 100px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.body-modal #mainMenu+#mainContent.main-row{padding:60px 10px 0}.body-modal #mainMenu+#mainContent.main-row .cell{border:1px solid #efefef;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.body-modal #mainActions{top:auto}.body-modal #mainActions .btn-toolbar{top:auto;bottom:10px}.body-modal.m-bug-view,.body-modal.m-story-view,.body-modal.m-task-view,.body-modal.m-testcase-view,.body-modal.m-testtask-view,.body-modal.m-todo-view{padding-bottom:20px;border-radius:3px}#tabsNav{position:relative}#tabsNav .tab-pane>.actions{position:absolute;top:-8px;right:0}#tabsNav .tab-pane>.cell,#tabsNav .tab-pane>.main-table{padding:0;border:1px solid #cbd0db;border-top:none;border-radius:0 0 4px 4px}#tabsNav .tab-pane>.cell .detail-title{padding-left:5px}#helpContent{position:fixed;top:50px;right:0;bottom:40px;left:0;display:none;background-color:#fff}#helpContent .load-error{display:none;padding:20px}#helpContent .show-error .load-error{display:block}.text-middle td,.text-middle th{vertical-align:middle}.text-center td,.text-center th{text-align:center}.c-sm{width:40px}.c-id{width:90px}.c-id-sm{width:70px}.c-id-xs{width:55px}.c-date{width:100px}.c-num,.c-pri,.c-type{width:80px;overflow:hidden}.c-begin,.c-end,.c-time{width:65px}.c-hours{width:60px}.c-actions-1{width:50px}.c-actions-2{width:75px}.c-actions-3{width:102px}.c-actions,.c-actions-4{width:128px}.c-actions-5{width:155px}.c-actions-6{width:180px}.c-product,.c-project{width:180px}.c-plan{width:130px}.c-datetime{width:120px}.c-stage,.c-status,.c-user{width:80px}.c-side{width:200px;border-right:10px solid #efefef}.c-assign,.c-assignedTo,.c-openedBy{width:130px}.c-progress{width:155px}.c-assign,.c-assignedTo,.c-openedBy,.c-product,.c-project,.c-status,.c-url,.c-user{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:ellipsis;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;white-space:nowrap;vertical-align:middle}td.c-actions .btn-link{color:#3c495c;background:0 0}td.c-actions .btn-link:hover{color:#0c64eb;background:#e9f2fb}td.c-actions .btn.disabled,td.c-actions .btn[disabled]{pointer-events:auto}td.c-actions .more{position:absolute;top:50%;right:100%;display:none;padding-right:4px;padding-left:20px;margin-top:-15px;margin-right:-6px;white-space:nowrap;background-color:#fafafa;-webkit-transition:opacity .3s,margin .3s;-o-transition:opacity .3s,margin .3s;transition:opacity .3s,margin .3s}tr:hover td.c-actions .more{display:block}td:hover+td.c-actions>.more{margin-right:-15px;pointer-events:none;opacity:.15}tr[data-url]{cursor:pointer}.table tbody>tr>td,.table thead>tr>th{vertical-align:middle}.table tbody>tr>td.has-btn,.table thead>tr>th.has-btn{padding-top:1px;padding-bottom:1px;overflow:visible}.table tbody>tr>td .progress,.table thead>tr>th .progress{height:6px}.table .em,.table em{color:#3c4353}.table .divider{border-bottom:10px solid #efefef}.table .divider-top{border-top:10px solid #efefef}.table .btn-icon-left{max-width:100%;padding-left:20px;overflow:hidden;line-height:18px;text-align:left;text-overflow:ellipsis;background:0 0;border-color:#eaf3fc}.table .btn-icon-left>.icon{width:20px;font-size:14px;background:0 0!important;opacity:0}.table .btn-icon-left.btn-sm{height:26px;font-size:13px}.table .btn-icon-left:active,.table .btn-icon-left:focus,.table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.table .btn-icon-left:active>.icon,.table .btn-icon-left:focus>.icon,.table .btn-icon-left:hover>.icon{opacity:1}.table .btn-icon-left>.text{padding-left:25px}.table thead>tr>th.c-assign,.table thead>tr>th.c-assignedTo{padding-left:29px}.table a{vertical-align:middle}.table tbody>tr:last-child{border-bottom:none}.table caption{margin-bottom:5px;background:#f1f1f1;border:none}.is-firefox .table .btn-icon-left>.icon{line-height:22px}.main-table{border-radius:4px}.main-table>.table,.main-table>.table-footer,.main-table>.table-header,.main-table>.table-responsive{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.main-table .table{font-size:13px;table-layout:fixed;background-color:#fff;border-radius:4px 4px 0 0}.main-table .table.table-lg{font-size:14px}.main-table .table .btn-icon-left{border-color:transparent}.main-table .table .btn-icon-left>.icon{background:0 0;border-radius:4px}.main-table .table .btn-icon-left.btn-sm{height:26px}.main-table .table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.main-table .table .btn-icon-left:hover>.icon{background:#e9f2fb;border-radius:4px 0 0 4px}.main-table tbody>tr>td,.main-table thead>tr>th{min-height:36px;padding:2px 8px;line-height:30px}.main-table tbody>tr>td:first-child,.main-table thead>tr>th:first-child{padding-right:4px;padding-left:15px}.main-table thead>tr>th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #ddd}.main-table tbody>tr:nth-child(odd){background-color:#f5f5f5}.main-table tbody>tr:last-child>td{border-bottom:1px solid #ddd}.main-table tbody>tr>td{position:relative;border-bottom:none;border-bottom:1px solid #eee}.main-table tbody>tr>td .label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main-table tbody>tr>td>a{line-height:28px;color:#0c60e1}.main-table tbody>tr>td>a:not(.btn):visited{color:#082999;opacity:.9}.main-table tbody>tr>td>a:hover,.main-table tbody>tr>td>a:visited:hover{color:#0c64eb}.main-table tbody>tr>td.c-actions{padding-right:10px}.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{position:absolute;top:0;bottom:0;left:0;display:block;width:0;content:'';background:#0c64eb;opacity:0;-webkit-transition:.2s linear;-o-transition:.2s linear;transition:.2s linear;-webkit-transition-property:width,opacity,border-radius;-o-transition-property:width,opacity,border-radius;transition-property:width,opacity,border-radius}@-moz-document url-prefix(){.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{bottom:-1px}}.main-table tbody>tr>td.c-side:before{display:none}.main-table tbody>tr{-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background-color,-webkit-box-shadow;-o-transition-property:box-shadow,background-color;transition-property:background-color,-webkit-box-shadow;transition-property:box-shadow,background-color;transition-property:box-shadow,background-color,-webkit-box-shadow}.main-table tbody>tr:hover{background:#e9f2fb}.main-table .table-grouped tbody>tr:hover{background:#f2f7fd;-webkit-box-shadow:none;box-shadow:none}.main-table .table-grouped tbody>tr:hover td.c-actions .more{background:#f2f7fd}.main-table tbody>tr.checked{background:#fff3e0}.main-table tbody>tr.checked:hover{background:#ffebbc}.main-table tbody>tr.checked>td.c-side+td:before,.main-table tbody>tr.checked>td:first-child:before{width:4px;opacity:1}.main-table tbody>tr.checked.row-check-begin{border-top-left-radius:4px;border-top-right-radius:2px}.main-table tbody>tr.checked.row-check-begin>td:first-child:before{border-top-left-radius:4px}.main-table tbody>tr.checked.row-check-end{border-bottom-right-radius:2px;border-bottom-left-radius:4px}.main-table tbody>tr.checked.row-check-end>td:first-child:before{border-bottom-left-radius:4px}.main-table .checkbox-primary{display:inline-block;line-height:20px}.main-table .checkbox-primary label{margin:0}.main-table .table{margin:0}.table-header{padding:4px 0 12px}.table-header .table-statistic{color:#838a9d}.table-header .table-statistic strong{font-size:15px;color:#3c4353}.table-header .btn-toolbar{margin-top:-28px}.table-header.fixed-right{position:relative;z-index:5;padding:0}.table-header.fixed-right>.btn-toolbar{position:absolute;top:0;right:1px;z-index:1;padding:1px;margin:0;background:#fff;border-radius:4px}.table-header.fixed-right>.btn-toolbar .btn{opacity:.65}.table-header.fixed-right>.btn-toolbar .btn:hover{opacity:1}.table-header-fixed .table-header{position:fixed;top:0}.table-header-fixed .table-header>.btn-toolbar{background-color:transparent}.table-header-fixed .table-header>.btn-toolbar .btn{color:#fff}.table-footer{position:relative;min-height:40px;padding:6px 15px;background:#fff;border-radius:0 0 4px 4px}.body-modal .table-footer{margin-bottom:20px}.talbe-lg+.table-footer{padding:11px 15px}.table-footer .btn-toolbar,.table-footer .checkbox-primary{float:left}.table-footer .btn-toolbar+.btn-toolbar{margin-left:8px}.table-footer .checkbox-primary{margin:5px 20px 0 0}.table-footer .checkbox-primary.checked label:after{border-color:#00da88!important}.table-footer .btn{padding:3px 10px;line-height:20px}.table-footer .pager{position:absolute;top:0;right:0;z-index:5;height:40px;padding:6px 5px 6px 10px;margin:0;background:#fff;opacity:1;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.table-footer .pager:before{position:absolute;top:0;bottom:0;left:-50px;display:block;width:50px;content:' ';background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(#fff));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%)}.table-footer .pager .btn,.table-footer .pager>li>.pager-item,.table-footer .pager>li>.pager-label{color:#838a9d;background:0 0;border-color:transparent}.table-footer .pager .btn,.table-footer .pager>li>a{border-radius:3px}.table-footer .pager .btn:hover,.table-footer .pager>li>a:hover{background:rgba(0,0,0,.1)}.table-footer .pager>li.disabled>a.pager-item{opacity:1}.table-footer .form-control{height:28px;padding:3px 8px}.table-footer .table-statistic{position:relative;z-index:2;float:left;padding-right:30px;line-height:28px;color:#838a9d;background:#fff}.table-footer .table-statistic:hover{z-index:4}.table-footer .table-statistic:hover+.pager{z-index:2;opacity:.3}.table-footer .btn-toolbar+.table-statistic,.table-footer .btn-toolbar+.text{margin-left:10px}.table-footer .text{float:left;line-height:28px}.table-footer.fixed-footer{position:fixed;z-index:10;margin:0;background:rgba(75,75,75,.85);border-top-color:transparent}.table-footer.fixed-footer .checkbox-primary label{color:#fff}.table-footer.fixed-footer .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.table-footer.fixed-footer .table-statistic{color:#fff;background:0 0}.table-footer.fixed-footer .pager{background:#666}.table-footer.fixed-footer .pager:before{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0)),to(#666));background:-webkit-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:-o-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:linear-gradient(to right,rgba(0,0,0,0) 0,#666 100%)}.table-footer.fixed-footer .pager .btn,.table-footer.fixed-footer .pager>li>.pager-item,.table-footer.fixed-footer .pager>li>.pager-label{color:#fff}.table-footer.fixed-footer .pager .btn:hover,.table-footer.fixed-footer .pager>li>a:hover{background:rgba(255,255,255,.3)}.table-footer.fixed-footer .pager>li.disabled>a.pager-item{opacity:.5}.table-actions{display:none;height:28px}.table-actions.show-always{display:block;pointer-events:none;cursor:not-allowed}.has-row-checked .table-actions{display:block;pointer-events:auto!important;cursor:default}.table-lg tbody>tr>td{padding:9px 10px}.table-lg tbody>tr>td .btn+.btn{margin-left:5px}.table.has-sort-head thead>tr>th{padding-right:0}.table.has-sort-head thead>tr>th>a{position:relative;display:inline-block;padding-right:16px;color:#3c4353}.table.has-sort-head thead>tr>th>a:after,.table.has-sort-head thead>tr>th>a:before{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:30px;color:#3c495c;text-transform:none;content:"\f0de";opacity:.5;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.table.has-sort-head thead>tr>th>a:after{content:"\f0dd"}.table.has-sort-head thead>tr>th>a.sort-down,.table.has-sort-head thead>tr>th>a.sort-up{color:#000;text-decoration:none}.table.has-sort-head thead>tr>th>a:hover,.table.has-sort-head thead>tr>th>a:hover:after,.table.has-sort-head thead>tr>th>a:hover:before{color:#0c64eb;opacity:1}.table.has-sort-head thead>tr>th>a.sort-down:after,.table.has-sort-head thead>tr>th>a.sort-up:before{color:#000;opacity:1}.head-fixed .datatable-head-span .table,.table.fixed-header-copy{z-index:10;color:#fff;background:rgba(75,75,75,.85)}.head-fixed .datatable-head-span .table thead>tr>th,.table.fixed-header-copy thead>tr>th{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a,.table.fixed-header-copy thead>tr>th>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>a:after,.head-fixed .datatable-head-span .table thead>tr>th>a:before,.table.fixed-header-copy thead>tr>th>a:after,.table.fixed-header-copy thead>tr>th>a:before{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down:after,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up:before,.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:after,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:before,.table.fixed-header-copy thead>tr>th>a.sort-down,.table.fixed-header-copy thead>tr>th>a.sort-down:after,.table.fixed-header-copy thead>tr>th>a.sort-up,.table.fixed-header-copy thead>tr>th>a.sort-up:before,.table.fixed-header-copy thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover:after,.table.fixed-header-copy thead>tr>th>a:hover:before{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a,.table.fixed-header-copy thead>tr>th>.dropdown>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a:hover,.table.fixed-header-copy thead>tr>th>.dropdown>a:hover{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary,.table.fixed-header-copy .checkbox-primary{z-index:1}.head-fixed .datatable-head-span .table .checkbox-primary label,.table.fixed-header-copy .checkbox-primary label{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary label:after,.table.fixed-header-copy .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.head-fixed .datatable-head-span .table .checkbox-primary.checked label:after,.table.fixed-header-copy .checkbox-primary.checked label:after{border-color:#00da88!important}.table-data{margin:0;table-layout:fixed}.table-data tbody>tr>td,.table-data tbody>tr>th{padding:6px 8px;word-break:break-all;border:none}.table-data tbody>tr>th{width:70px;padding-left:0;font-weight:400;color:#838a9d;text-align:right;vertical-align:middle}.table-data tbody>tr>td{padding-right:0}.table-data tbody>tr>td>a{color:#0c60e1}.table-data tbody>tr>td>a:not(.btn):visited{color:#082999}.table-data tbody>tr>td>a:hover,.table-data tbody>tr>td>a:visited:hover{color:#0c64eb}.table-data ol,.table-data ul{margin:0}.fixed-head-table{background:rgba(0,0,0,.7);border-bottom:1px solid #ddd}.fixed-head-table thead>tr>th{color:#fff}.table-empty-tip{padding:80px 10px;text-align:center;background:#fff}.not-firefox .table-grouped>tbody>tr>td.c-side{background:#fff!important}.table-grouped .group-toggle{cursor:pointer}.table-grouped .group-toggle.group-summary{border-top:10px solid #efefef}.table-grouped tbody>tr>td:first-child,.table-grouped thead>tr>th:first-child{padding-left:8px}.group-expand-all,.table-group-collapsed .group-collapse-all{display:none}.table-group-collapsed .group-expand-all{display:inline-block}.table-auto{table-layout:auto}.datatable .table>tbody>tr.checked.hover>td,.datatable .table>tbody>tr.checked>td.col-hover{background:#ffebbc}body.has-fixed-footer{padding-bottom:60px}.table.with-footer-fixed{margin-bottom:20px}.table-nest-hide{display:none!important}th.table-nest-title{position:relative;padding-left:30px!important}.table-nest-icon{position:relative;display:inline-block;width:22px;height:22px;font-size:16px;color:#a6aab8;text-align:center;border-radius:4px}.table-nest-toggle:before{line-height:22px;content:"\e6f2"}.table-nest-toggle:hover{color:#0c64eb;background-color:rgba(0,0,0,.1)}.table-nest-child-hide .table-nest-toggle:before{font-size:16px;content:"\e6f1"}th.table-nest-title .table-nest-toggle{position:absolute!important;top:7px;left:8px}.table-nest-toggle.table-nest-toggle-global{width:22px;height:22px;padding:0!important;line-height:22px;text-align:center;border-radius:4px}.table-nest-toggle.table-nest-toggle-global:before{position:static!important;font-size:16px!important;line-height:22px!important;content:"\e6f2"!important;opacity:1!important}.table-nest-toggle.table-nest-toggle-global:after{display:none!important}.table-nest-collapsed .table-nest-toggle.table-nest-toggle-global:before{font-size:16px!important;content:"\e6f1"!important}.disable-empty-nest-row .is-nest-child .table-nest-icon:before,.disable-empty-nest-row .no-nest .table-nest-icon:before{position:relative;top:-1px;width:6px;min-width:6px;height:6px;content:' ';background-color:#cbd0db;border-radius:1px}.table-nest-child-hover>td:first-child,.table-nest-hover>td:first-child{-webkit-box-shadow:inset 3px 0 0 #cbd0db;box-shadow:inset 3px 0 0 #cbd0db}.article-content{overflow:auto}.article-content img{margin-top:0}.article-content table{margin:10px 0}.article-content table td,.article-content table th{border:1px solid #cbd0db}.article-content table th{background:#eee}.article-content a{color:#0c64eb}.article-content a:focus,.article-content a:hover{color:#16a8f8}.article-content,.article>.content{word-wrap:break-word}.detail{padding:10px 0;margin:0 10px}.detail+.detail{padding-top:25px;border-top:1px solid #eee}.detail-title{font-size:14px;font-weight:700;line-height:20px}.detail-title>.pull-right{position:relative;top:-8px}h2.detail-title{margin:0;font-size:15px;font-weight:700}h2.detail-title .label,h2.detail-title .label-id{position:relative;top:-1px}.detail-content{padding:0;margin-top:10px}.detail-content em{color:#3c4353}.detail-content .list-unstyled>li+li{margin-top:5px}.side-col .detail-content{padding-left:0}details.detail{padding:10px 0}details.detail summary{position:relative;cursor:pointer;outline:0}details.detail summary::-webkit-details-marker{display:none}details.detail summary:after{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e316";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}details.detail[open] summary:after{content:"\e313"}.files-list{padding-left:0;list-style:none}.files-list>li>a{display:block;line-height:24px}.files-list>li>a>.icon{display:inline-block;margin-right:5px;opacity:.7}.files-list>li>a:hover{color:#0c64eb}.files-list>li>.right-icon{opacity:0;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.files-list>li:hover>.right-icon{opacity:1}.histories-list{padding-left:15px;margin-bottom:0}.histories-list>li{position:relative}.histories-list>li+li{margin-top:5px}.histories-list>li strong{color:#3c4353}.histories-list .comment,.histories-list .show-form .comment-edit-form{padding:5px 5px 5px 10px;margin:5px 0 0;background-color:rgba(0,0,0,.025);border:1px solid #eee}.histories-list .btn-edit-comment{position:absolute;top:28px;right:2px}.histories-list .comment-edit-form,.histories-list .show-form .btn-edit-comment,.histories-list .show-form .comment{display:none}.histories-list .show-form .comment-edit-form{display:block;padding:10px;border:1px solid #eee}.histories .btn-mini{width:16px;min-width:16px;height:16px;overflow:hidden;line-height:16px;color:#cbd0db;vertical-align:-8%;border-radius:1px}.histories .btn-mini:focus,.histories .btn-mini:hover{color:#0c64eb;border-color:#0c64eb}.histories .show-changes .btn-expand>.icon:before{content:"\e926"}.histories .btn-strip{display:none}.histories .show-changes .btn-strip{display:inline-block}.history-changes{display:none;padding:5px;margin-bottom:-5px;margin-left:5px;font-size:12px;line-height:20px}.history-changes blockquote{padding:5px 5px 5px 10px;margin:5px 0 0;font-size:12px;background-color:rgba(0,0,0,.05);border-left:3px solid #eee}.history-changes blockquote.original{display:none}.show-changes .history-changes,.show-original .history-changes blockquote.original{display:block}.show-original .history-changes blockquote.textdiff{display:none}.syntaxhighlighter{overflow:auto}.list-group{overflow-y:auto}.list-group>a{display:block;padding:2px 10px 2px 5px;overflow:hidden;line-height:20px;text-overflow:ellipsis;white-space:nowrap;border-radius:4px}.list-group>a+a{margin-top:5px}.list-group>a>.icon{display:inline-block;margin-right:3px;opacity:.5}.list-group>a.selected{color:#e9f2fb;background-color:#0c64eb}.list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.list-group>a.active:hover,.list-group>a:hover{color:#fff;background-color:#0c64eb}.list-group>.heading{padding:2px 5px;line-height:20px;color:#838a9d}.list-group>a+.heading{margin-top:4px}.dropup .search-box-sink{padding-top:5px;padding-bottom:45px}.dropup .search-box-sink .search-box{position:absolute;right:10px;bottom:10px;left:10px;margin:0}.dropup .search-box-sink .search-box+.list-group{height:auto;max-height:171px}.search-list{min-width:200px;max-width:300px;padding:0}.search-list .search-box{float:none;width:auto;margin:10px}.search-list .search-box .icon-search{opacity:.5}.search-list .list-group{max-height:248px;padding:5px 10px;margin:5px 0}.dropup .search-list .search-box+.list-group{height:171px;padding-top:0}.search-list .search-input{height:30px}.search-list .input-control-icon-right{height:28px;line-height:28px}.search-list .list-group>a.active{color:inherit;background-color:inherit}.search-list.searchbox-focus .list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.search-list .list-group>a.active:hover,.search-list.searchbox-focus .list-group>a.active:hover{color:#fff;background-color:#0c64eb}#dropMenu{width:initial;max-width:initial}#dropMenu>.search-box{width:100%;padding:10px 10px 0;margin:0}#dropMenu>.search-box .icon-search{color:#333}#dropMenu>.search-box.has-icon-right>.form-control{padding-left:26px}#dropMenu .input-control-icon-left{top:10px;left:10px}#dropMenu .input-control-icon-right{top:11px;right:11px}#dropMenu .input-control-icon-right .icon{position:relative;top:2px}#dropMenu .list-group{max-height:initial;margin:0}#dropMenu .table-row{margin:0 -10px;table-layout:auto}#dropMenu .table-col{position:relative;width:100%;min-width:250px;max-width:450px}#dropMenu .table-col .list-group{max-height:300px;padding:0 10px 5px}#dropMenu .col-left{padding-bottom:30px}#dropMenu .col-right{display:none}#dropMenu .col-footer{position:absolute;right:0;bottom:-5px;left:0;padding:8px 10px;border-top:1px solid #eee}#dropMenu .col-footer>a{opacity:.8}#dropMenu .col-footer>a:hover{opacity:1}#dropMenu.show-right-col .table-col{width:50%}#dropMenu.show-right-col .col-right{display:table-cell;border-left:1px solid #eee}#dropMenu.show-right-col .col-right>.list-group{max-height:335px;margin:0}#dropMenu.show-right-col .col-right>.list-group>a{opacity:.7}#dropMenu.show-right-col .col-right>.list-group>a:hover{opacity:1}#dropMenu.show-right-col .toggle-right-col>.icon-angle-right:before{content:"\e314"}#dropMenu.has-search-text .list-group{overflow-x:hidden}#dropMenu.has-search-text>.search-box{width:100%!important}#dropMenu.has-search-text>.list-group>.table-row{display:block}#dropMenu.has-search-text>.list-group>.table-row>.table-col{display:block;width:100%}#dropMenu.has-search-text .col-left{padding-bottom:0}#dropMenu.has-search-text .pull-right.toggle-right-col{display:none}#dropMenu.has-search-text .col-left .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group>a{opacity:.7}#dropMenu.has-search-text .col-footer,#dropMenu.has-search-text .hide-in-search{display:none}#swapper{position:relative}#swapper #dropMenu .tree li>.selected{color:#0c64eb!important;background:#e9f2fb!important}#swapper #dropMenu .list-group>a.active:hover,#swapper #dropMenu .search-box .list-group>a.active,#swapper #dropMenu .tree li>.clickable:hover,#swapper #dropMenu.searchbox-focus .list-group>a.active:hover{color:#fff!important;background:#0c64eb!important}#swapper #dropMenu .tree{margin:0}.release-path{overflow:hidden}.release-line{display:table;width:100%;padding:0;table-layout:fixed}.release-line>li{display:table-cell;list-style:none}.release-line>li>a{position:relative;display:block}.release-line>li>a:before{position:absolute;left:0;display:block;width:13px;height:13px;content:' ';background:#fff;border:2px solid #838a9d;border-radius:50%}.release-line>li>a:after{position:absolute;left:5px;display:block;width:2px;height:30px;content:' ';background:#cbe0f6}.release-line>li>a>.icon{position:absolute;left:4px;font-size:24px}.release-line>li>a .title{display:block;font-size:14px;white-space:nowrap}.release-line>li>a .date,.release-line>li>a .info{display:block;max-height:18px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.release-line>li>a:hover:before{background-color:#e9f2fb}.release-line>li>a:hover:after{background-color:#838a9d}.release-line>li>a:hover .title{color:#0c64eb}.release-line>li>a:hover .date,.release-line>li>a:hover .info{color:#838a9d}.release-line>li:nth-child(odd){padding-top:80px;vertical-align:top}.release-line>li:nth-child(odd)>a{height:85px;padding-top:36px;border-top:5px solid #cbe0f6}.release-line>li:nth-child(odd)>a:before{top:-9px}.release-line>li:nth-child(odd)>a:after{top:6px}.release-line>li:nth-child(odd)>a>.icon{top:-26px}.release-line>li:nth-child(even){padding-bottom:80px;vertical-align:bottom}.release-line>li:nth-child(even)>a{height:85px;padding-bottom:36px;border-bottom:5px solid #cbe0f6}.release-line>li:nth-child(even)>a:before{bottom:-9px}.release-line>li:nth-child(even)>a:after{bottom:6px}.release-line>li:nth-child(even)>a>.icon{bottom:-2px}.release-line>li:last-child>a{border-color:transparent}.release-line>li.active>a:before{border-color:#0c64eb}.release-line>li+li>a>.date,.release-line>li+li>a>.info,.release-line>li+li>a>.title{position:relative;left:-36%}#footer{position:fixed;right:0;bottom:0;left:0;z-index:1010;height:40px;background:#fff;border-top:1px solid #eff1f7}#footer .breadcrumb{padding:10px 0;margin:0}#footer .breadcrumb>li{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#footer .breadcrumb>.active,#footer .breadcrumb>li>a{color:#838a9e}#footer .breadcrumb>.active>.icon,#footer .breadcrumb>li>a>.icon{display:none}#footer .breadcrumb>.active:hover,#footer .breadcrumb>li>a:hover{color:#16a8f8}#footer .breadcrumb>li+li:before{content:'>'}#footer>.container{padding:0 20px}@media (min-width:1400px){#footer>.container{padding:0 40px}}#poweredBy{position:absolute;top:4px;right:0;padding:5px 10px}#poweredBy .icon-zentao{color:#0097fd}#poweredBy a{color:#3c4353}#poweredBy a:hover{color:#0c64eb}#poweredBy a:hover .icon-zentao{color:#0c64eb}#poweredBy a.text-important{color:#bd7b46}#poweredBy a.text-important:hover{color:#ff5d5d}#poweredBy a.text-primary{color:#0c64eb}#poweredBy a.text-primary:hover{color:#16a8f8}#poweredBy #aiux{color:#cbd0dc}#noticeBox .alert{-webkit-box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px}#heading{top:0}.header-btn{position:relative;padding:8px 0}.header-btn .btn{position:relative;height:34px;padding:1px 6px;margin:0;overflow:visible;font-size:13px;font-weight:400;line-height:28px;color:#fff;background-color:transparent;border-color:transparent!important;border-right:none;-webkit-transition:none;-o-transition:none;transition:none}.header-btn .btn>.caret{margin-left:0;border-width:4px}.header-btn .btn>.text{display:inline-block;max-width:150px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.header-btn .btn:hover{-webkit-box-shadow:none;box-shadow:none}.header-btn .btn:hover,.header-btn.active .btn{color:#fff;background:rgba(0,0,0,.15)}.header-btn .btn:hover>.caret,.header-btn.active .btn>.caret{opacity:1}.header-btn+.header-btn{margin-left:10px}.header-btn+.header-btn:before{position:absolute;top:16px;left:-13px;display:block;font-family:ZentaoIcon;font-size:14px;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e315";opacity:.6;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.header-btn .dropdown-menu{margin-top:-10px}#toolbar{top:0;height:50px}#userNav>li{margin-right:0}#userNav>li>a{padding:10px 5px}#userNav>li>a>.icon{font-size:30px;filter:brightness(1.2) hue-rotate(30deg);opacity:.9;-webkit-filter:brightness(1.2) hue-rotate(30deg)}#userNav>li:hover>a{background-color:rgba(0,0,0,.1)}#userNav .dropdown-menu>li>a{position:relative;padding-left:24px}#userNav .dropdown-menu>li>a>.icon{top:1px;left:0}#userNav .dropdown-menu>li.user-profile-item>a{padding-left:45px} \ No newline at end of file diff --git a/www/theme/zui/fonts/ZentaoIcon.eot b/www/theme/zui/fonts/ZentaoIcon.eot index a21820526649db47c17f7f44bd7951f261773033..ca3c22f3f3a4d0edfee13eb129cf9307832f7580 100644 GIT binary patch delta 977 zcmZ`&O-vJ86uxI>I#t@vz1JzD1_aWUPL-LWozjw)C`tuS8VboUhGYesn1d?=)2n5gM+ih1XU}tyd*kmack& zLC@V_L{T~oBNQ@xor==Zc*3Xd>go~?O47!lX02RDR);AKxmE3p$LaDDjEUdn^!yn6 zbvsE0uXqJRjRSWN}C@Xv*){K?Pk|Z~(8MX0J?O1!rFxcR4 zOSF&GZcjbvkZf3z%O%Zf(YD_>RaUV#{B8fQV;DC$T?^AOA$VaEm$L!mplomP>VCtk zM`XKQj_6*)uX|hUGW47da%)`qEl-MkwyM~{-(&Y|LR~1quIf{&f!am01ZIa@^+G*R zzuV~$afx+0+$9_ct_35YEUki)Rxx~mU;|~8$zI}0a4j_WOVzB9bt+#2f68RJe_}&C zm;{r>EZR&aGeB#{rgjq~2KFa}pZK=Tf3@*^^1ysACD@}VD>0@N)(}Edn1!iy(+BDU^w(f~~bV+-%|M z_QcNo(rTgUeEfH8zHRpSa#x==In#@qJ|m03o+m=j^g9o~`(mM3x#%f-dT+nf1I|~? z<@xezCOce`GOOqRMh@ny@-OChavKu+5*L!)$?3zpkBCPuq{dShQ@2x}(v|6L>2v9S s)31)kk3JgSJ$!oj>#@Sf$x&`JJ$h%XC$l7Ta=Zqy-wXKqIJ|-X0SQsyivR!s delta 649 zcmdng&ho5cPb@9~(gF+&OhC-Q zk)BhT)>W7y4&+NPFns%wk(!vI=BW9Mf#D}e-Yf$sz$3^h4di8#Vqo}x1gKsiFEKY&;;{NvC7{3)pd;26 z_ z^ENiNvNAUI787%}Xf{-j4hv(;=HqiU*Wr=26ELtA6tq-V*ZHZTtYX41Ai!^;qO75z zqHM|!1g6R=8Ya4W&LYCXBF=icCdPWYF2W)r!Y;ac9yR}-F3{Fu`XE>@Xr-pEW1S?! z`R|h;Pc^roFdv_=xq7vR`7*UiPb(v1A2A^CF*dUDtW*mwy6(-($ImA$%BRi4qZ53n zol_>sT1Q>YN>K1mr2x=IRNFO_fi4j+2U}?jc8Z7yl2aJtd(4>(R5$zG`Omz0>cd(| zm0s`JPVxLUUm3VrfFaAka9`O^A4dQG_g{wNE-=*0e(N*xZBF~WnOV>PsH_mA6o~bi z_b@1J*83m9e_Me-!H&YD!hc0KiW!PEiUW!(iq{o?DUm60DLGPVR=T6~MOj37 iRQaQdxQYvvT9v!1@~R$H*8q)T1R}oeCm0!DF#-Vdk+B8< diff --git a/www/theme/zui/fonts/ZentaoIcon.svg b/www/theme/zui/fonts/ZentaoIcon.svg index 330852886d..9d60e3a7ef 100644 --- a/www/theme/zui/fonts/ZentaoIcon.svg +++ b/www/theme/zui/fonts/ZentaoIcon.svg @@ -1,276 +1,277 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/theme/zui/fonts/ZentaoIcon.ttf b/www/theme/zui/fonts/ZentaoIcon.ttf index 563822fd631500b5c514ec058ddf173bfc6dd38b..041009540e737c248ab3a42c467bbdfc3674cf67 100644 GIT binary patch delta 960 zcmZ`%Ur19?7(eIUySsARJ?C`i&Ct}gxw~?Ans++cMp;g?G>8ld6K(2rnY!twsS_3$ z_7Y)8&_fSV5d`)$A9@Ii0)q&jGO<6DJw)|V^pA|(I#UFTdieOh-|zc?AYX!k;oFal z)Wj4uN6lvp3_n5gW*I;M9zjlNAm0PXSINjNsnFnblm+s07#LVAa`KZCk9fBkF);jH z0yIM|H?g9CQHJpq1H=C#K=lfFiMgo~ht;nt0R^4_9kI3`zqo{f87RfbIA!9F#f#=peVp4z`%cpe+9n_P$A>whl~cB`IsJFXE*q7#QcfbX!5t4 z%j%gJbkx-?1qH1Q1pd9`5ftQE!zV1vw?^HIZ(crrK4DQlZ5|$-;6v@4GD+4t>S|Vkf`2LnfHtDq zuAvNciGVrSN@K87L`0CB!WiFU&SapvdCu+s%$pxSsFhUd^`7k%&u{aUftv*wunY|M zmHqT#^#6bVWjO8vL#^ePJ|o}eEx$H13mO2G6@ruku|D%22Bpn4|00-t^8V#-D-bBy zQJ7TtujocGL$OA2KygL!y5cV-G9@l0M@r2~ca**;iztsOe^e1yaiLPHa#vMe)uZYf cpizuK#K-u8ffr;k0~0XTgtr?rGM;4w0Qgq08~^|S diff --git a/www/theme/zui/fonts/ZentaoIcon.woff b/www/theme/zui/fonts/ZentaoIcon.woff index 92b2904fc7ea205f9f1428f0f3d29e7ffd56adc5..8fb9c224ad6e200c8586660030a8977644d37d67 100644 GIT binary patch delta 1028 zcmZ{jO-vI(6vt-g~>5*?*9` zJVtVBRg838b!Ri8y}K)w1b}I$$r(R|yLSz2qiibxUm6UJ z?r2*bk9E=b>uFk3Ysk}Dp~Wer>?w_1hOA_!J>HY<2jCkGxq3tD%q0tUCAQGI0*#q+ zL$@NPg*{#UNfkh745kp2!+G#sZ&y!@vLU+UMMF20`;KHHm8Scv$0yIjmm_Ckcga&c zhL7Q1ybedP16wde&(Jxv46p#w4^u}P7;|nT^ZcQ?tl(x}vF?$jkI!V`dsR__n1m`x z{;ib|>jgm+g$v$5zV@5@9(}})54M{N?}d&|K>Mm@^4O5EMQ)fEDkD)8rob^l>dOO87mP5L9A0U zO5GXvU{g@n>EItrG!44frXIEkHYA9}f@-y>Yi}GXD%l+RvH#>CLN!j;^mK$Vn%>0a ztU)LsN{v3vuluyHC`n>i^XY!g*C>gw<4Az1a^=RK6xeKOp@qHA0#FZHL4y9{YPk#& zi8l+-?C>Z)SP6;W<8<)IpiYO!h-(9jpk6D_E`>&|tXJ0tY6wLp$zVpf2-f(G)AS(i zR9prBm&r2MV!bRhaVCqIx0y_42qP`cO(vMwu`R*(qlyv5q!d7=Gj}9LLin zSHzq0wn#&$!NOE*iXHu{)pXOT_`hiG)r$jjU0c*sW1Xn}Gq7;<{sQnqyZh*uE#wRK z8PDj|J3LVdQSQn_jx8>uWxI`1s!H}Ma8O&C8=6|rL=#&RCzEZ-OS{|m@Ow_ChEk_f zw^N_e_Vk+cX!?43d~ba3n>w L6A&-!@DBVAvp?g# delta 699 zcmX@p#?sKjB2n(|=ElItz`(%B#K6D}q8YaU`LdG@nM5Y)sMePXi>4OD^H~N^5GXbU$X5Yj9zjm&jNFn6 zpx6!u1{Mnt*5GuM&B;#&s{8u^Xr>$pAMtK8%1x{&&;hzd0H{#`gc)TRU*#p{rUJzb zfDT;?!iUwbDi!1xmjK=UVB(+EjQ1z6U`&_3EpSwzUm#Z?SioCAQGiQ;f&UKw3Vs&` zW(G!}$8;t;FtKlrWx98r-Qd3w^CxDb$xgSH)iW{ZsHN?g*GMxWD3G!5P3kvh`37e}|YnU%ntMs%oGWHPz0v}@|E6+-`;G*l^ynOt8 z!lHcIJUlwVhuS%1lB{*q)vN>s|5OS9ZA7(QLmB820dugG#$cz2h#)zIF}}x~$v}1U zi`)O1H|syFl~n2Vp6wLRZ}XLbn*|v33=H>`{q$k<|9}5wIPL;N?ZPj8M!rqIH!}+w z096%&R06R+^BxAJ%_sgvF!|*D%imTYP_UygsqkOXjbeskjpBgfisE&}UrJ<3TuP3V znw9P-eNh%s9##IRBCg^>rB>yxs=TU4)ipq)fT@y^kMRWqFUVd7CSb$~Z?9)$Jj)0G DAc3?i From 44e31923f730c6017568fee84fd01c8daac10d5a Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 26 Aug 2022 10:12:12 +0800 Subject: [PATCH 218/223] * Fix bug #26918. --- module/task/config.php | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/module/task/config.php b/module/task/config.php index b14fdcb456..96ca1d4d79 100644 --- a/module/task/config.php +++ b/module/task/config.php @@ -71,9 +71,6 @@ $config->task->datatable->fieldList['mode']['control'] = 'hidden'; $config->task->datatable->fieldList['desc']['title'] = 'idAB'; $config->task->datatable->fieldList['desc']['control'] = 'textarea'; -$config->task->datatable->fieldList['deadline']['title'] = 'idAB'; -$config->task->datatable->fieldList['deadline']['control'] = 'date'; - $config->task->datatable->fieldList['pri']['title'] = 'priAB'; $config->task->datatable->fieldList['pri']['fixed'] = 'left'; $config->task->datatable->fieldList['pri']['width'] = '50'; @@ -95,6 +92,18 @@ $config->task->datatable->fieldList['status']['fixed'] = 'no'; $config->task->datatable->fieldList['status']['width'] = '60'; $config->task->datatable->fieldList['status']['required'] = 'no'; +$config->task->datatable->fieldList['assignedTo']['title'] = 'assignedTo'; +$config->task->datatable->fieldList['assignedTo']['fixed'] = 'no'; +$config->task->datatable->fieldList['assignedTo']['width'] = '100'; +$config->task->datatable->fieldList['assignedTo']['required'] = 'no'; +$config->task->datatable->fieldList['assignedTo']['control'] = 'select'; +$config->task->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' => 'getTeamMemberPairs', 'params' => '$executionID&execution'); + +$config->task->datatable->fieldList['finishedBy']['title'] = 'finishedByAB'; +$config->task->datatable->fieldList['finishedBy']['fixed'] = 'no'; +$config->task->datatable->fieldList['finishedBy']['width'] = '80'; +$config->task->datatable->fieldList['finishedBy']['required'] = 'no'; + $config->task->datatable->fieldList['estimate']['title'] = 'estimateAB'; $config->task->datatable->fieldList['estimate']['fixed'] = 'no'; $config->task->datatable->fieldList['estimate']['width'] = '60'; @@ -121,6 +130,7 @@ $config->task->datatable->fieldList['deadline']['title'] = 'deadlineAB'; $config->task->datatable->fieldList['deadline']['fixed'] = 'no'; $config->task->datatable->fieldList['deadline']['width'] = '70'; $config->task->datatable->fieldList['deadline']['required'] = 'no'; +$config->task->datatable->fieldList['deadline']['control'] = 'date'; $config->task->datatable->fieldList['openedBy']['title'] = 'openedByAB'; $config->task->datatable->fieldList['openedBy']['fixed'] = 'no'; @@ -143,23 +153,11 @@ $config->task->datatable->fieldList['realStarted']['fixed'] = 'no'; $config->task->datatable->fieldList['realStarted']['width'] = '95'; $config->task->datatable->fieldList['realStarted']['required'] = 'no'; -$config->task->datatable->fieldList['assignedTo']['title'] = 'assignedTo'; -$config->task->datatable->fieldList['assignedTo']['fixed'] = 'no'; -$config->task->datatable->fieldList['assignedTo']['width'] = '100'; -$config->task->datatable->fieldList['assignedTo']['required'] = 'no'; -$config->task->datatable->fieldList['assignedTo']['control'] = 'select'; -$config->task->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' => 'getTeamMemberPairs', 'params' => '$executionID&execution'); - $config->task->datatable->fieldList['assignedDate']['title'] = 'assignedDate'; $config->task->datatable->fieldList['assignedDate']['fixed'] = 'no'; $config->task->datatable->fieldList['assignedDate']['width'] = '110'; $config->task->datatable->fieldList['assignedDate']['required'] = 'no'; -$config->task->datatable->fieldList['finishedBy']['title'] = 'finishedByAB'; -$config->task->datatable->fieldList['finishedBy']['fixed'] = 'no'; -$config->task->datatable->fieldList['finishedBy']['width'] = '80'; -$config->task->datatable->fieldList['finishedBy']['required'] = 'no'; - $config->task->datatable->fieldList['finishedDate']['title'] = 'finishedDateAB'; $config->task->datatable->fieldList['finishedDate']['fixed'] = 'no'; $config->task->datatable->fieldList['finishedDate']['width'] = '105'; From 6a77010b1dbd6df09a346224209c26a7c2570b7a Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Fri, 26 Aug 2022 10:12:58 +0800 Subject: [PATCH 219/223] * Modify the max version. --- module/upgrade/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/upgrade/config.php b/module/upgrade/config.php index 2ee20afa01..c60d898753 100644 --- a/module/upgrade/config.php +++ b/module/upgrade/config.php @@ -23,7 +23,7 @@ $config->upgrade->maxVersion['max3_3'] = '17_2'; $config->upgrade->maxVersion['max3_4'] = '17_3'; $config->upgrade->maxVersion['max3_5'] = '17_4'; $config->upgrade->maxVersion['max3_6'] = '17_5'; -$config->upgrade->maxVersion['max3_7'] = '17_6'; +$config->upgrade->maxVersion['max3_6_1'] = '17_6'; $config->upgrade->bizVersion = array(); $config->upgrade->bizVersion['biz1_0'] = '9_5_1'; From 24dab5df386c7cd619944c28fb09c73dd5e21cc6 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Fri, 26 Aug 2022 11:30:14 +0800 Subject: [PATCH 220/223] * Fix bug #26906. --- module/program/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/program/model.php b/module/program/model.php index 7d051e6e65..31e2a26a72 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -1570,10 +1570,10 @@ class programModel extends model $menu .= "
    "; $menu .= ""; $menu .= "
    resolution != 'duplicate') echo "style='display:none'";?>> - + diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index 684b8df6e1..02a731de39 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -355,10 +355,10 @@ - diff --git a/module/story/control.php b/module/story/control.php index 354c325f40..b2b2b432df 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1046,7 +1046,7 @@ class story extends control { $storyProduct = $products[$story->product]; $branch = $storyProduct->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all'; - if(!isset($productStoryList[$story->product][$story->branch])) $productStoryList[$story->product][$story->branch] = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, ''); + if(!isset($productStoryList[$story->product][$story->branch])) $productStoryList[$story->product][$story->branch] = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, '', $story->type); } } @@ -1686,7 +1686,7 @@ class story extends control unset($reasonList['subdivided']); $branch = $product->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all'; - $productStories = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, ''); + $productStories = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, '', $storyType); $this->view->title = $this->lang->story->close . "STORY" . $this->lang->colon . $story->title; $this->view->position[] = html::a($this->createLink('product', 'browse', "product=$product->id&branch=$story->branch"), $product->name); @@ -1738,7 +1738,7 @@ class story extends control $storyProduct = isset($productList[$story->product]) ? $productList[$story->product] : $this->product->getByID($story->product); $branch = $storyProduct->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all'; - if(!isset($productStoryList[$story->product][$story->branch])) $productStoryList[$story->product][$story->branch] = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, ''); + if(!isset($productStoryList[$story->product][$story->branch])) $productStoryList[$story->product][$story->branch] = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, '', $story->type); } if($this->post->comments) diff --git a/module/story/css/close.zh-cn.css b/module/story/css/close.zh-cn.css index 76da72e24c..9dfc0a5865 100644 --- a/module/story/css/close.zh-cn.css +++ b/module/story/css/close.zh-cn.css @@ -1 +1 @@ -.thWidth {width: 80px !important;} +.thWidth {width: 95px !important;} diff --git a/module/story/css/view.css b/module/story/css/view.css index f671114a5e..782054d7ad 100644 --- a/module/story/css/view.css +++ b/module/story/css/view.css @@ -12,3 +12,4 @@ .linkStoryTr > th {width: 90px;} .linkStoryTr > td {padding-left: 0px !important;} .removeButton {margin-left: -10px;} +.resolution {white-space: nowrap; overflow: hidden;} diff --git a/module/story/model.php b/module/story/model.php index 3b0ba376e7..57159dbed8 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -1744,6 +1744,7 @@ class storyModel extends model ->setDefault('closedDate', $now) ->setDefault('closedBy', $this->app->user->account) ->setDefault('assignedDate', $now) + ->setDefault('duplicateStory', 0) ->stripTags($this->config->story->editor->close['id'], $this->config->allowedTags) ->removeIF($this->post->closedReason != 'duplicate', 'duplicateStory') ->removeIF($this->post->closedReason != 'subdivided', 'childStories') diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index 9525f3372d..5a1ccabe35 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -377,12 +377,12 @@ - From 7e9454c81523b9fdb46f01bbb4d6366d8b87d08d Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 26 Aug 2022 13:37:24 +0800 Subject: [PATCH 223/223] * Modify icon and page style. --- module/mr/view/link.html.php | 2 +- module/repo/css/ajaxgeteditorcontent.css | 4 ++ module/repo/css/common.css | 2 + module/repo/js/common.js | 40 +++++++++++++++++++ module/repo/js/monaco.js | 27 +++---------- .../repo/view/ajaxgeteditorcontent.html.php | 13 ++++-- module/repo/view/monaco.html.php | 2 +- 7 files changed, 63 insertions(+), 27 deletions(-) diff --git a/module/mr/view/link.html.php b/module/mr/view/link.html.php index 57ffa878a5..71d9b4e22a 100644 --- a/module/mr/view/link.html.php +++ b/module/mr/view/link.html.php @@ -41,7 +41,7 @@
  • id}"), $lang->mr->viewDiff);?>
  • '>icons['story'], 'text-primary') . ' ' . $lang->productplan->linkedStories;?>
  • '>icons['bug'], 'text-red') . ' ' . $lang->productplan->linkedBugs;?>
  • -
  • '>mr->linkedTasks;?>
  • +
  • '>mr->linkedTasks;?>
  • '> diff --git a/module/repo/css/ajaxgeteditorcontent.css b/module/repo/css/ajaxgeteditorcontent.css index 59fd859d12..c44b1c5b30 100644 --- a/module/repo/css/ajaxgeteditorcontent.css +++ b/module/repo/css/ajaxgeteditorcontent.css @@ -3,10 +3,14 @@ #log {background: #fff; margin-top: 2px; color: #707070; display: none; padding: 5px;} #log .history {margin-left: 5px;} #related {display: none; margin-top: 2px; background: #fff;} + +#relationTabs .nav > li > a {padding: 8px 10px; display: flex; white-space: pre;} +#relationTabs .nav-tabs > li > a > span {margin-right: 5px;} #relationTabs .tab-pane {display: none;} #relationTabs .tabs-navbar {background: #F4F5F7;} #relationTabs .tab-pane.active {display: block;} #relationTabs .tab-nav-item {max-width: none !important;} +#relationTabs .tab-nav-item .icon {line-height: inherit;} #relationTabs > .tabs-navbar {overflow: hidden; padding-bottom: 10px; position: relative; height: 35px;} #relationTabs > .tabs-navbar > .nav-tabs {position: absolute; display: flex;} #related .content, #related .btn {background-color: #F4F5F7; border: none;} diff --git a/module/repo/css/common.css b/module/repo/css/common.css index c299a069b0..809ee039dd 100644 --- a/module/repo/css/common.css +++ b/module/repo/css/common.css @@ -234,3 +234,5 @@ h3 {font-size: 16px;} .file-tree #modules .icon {color: #9EA3B0;} .file-tree #modules .icon-folder {padding-left: 5px;} li.selected .doc-title .icon, li.selected .doc-title a {color: #438EFF !important;} + +.btn-left, .btn-right {display: none;} diff --git a/module/repo/js/common.js b/module/repo/js/common.js index a2e805f948..e1ca5fdf60 100644 --- a/module/repo/js/common.js +++ b/module/repo/js/common.js @@ -61,6 +61,46 @@ $("input:checkbox[name='revision[]']").click(function(){ } }); +var distance = 0; + +/** + * Aarrow tabs area. + * + * @param string domID + * @param number shift 1|-1 + * @param bool hideRightBtn + * @access public + * @return void + */ +function arrowTabs(domID, shift, hideRightBtn) +{ + $('.btn-right, .btn-left').show(); + if(hideRightBtn) $('.btn-right').hide(); + + var tabItemWidth = $('#' + domID + ' > .tabs-navbar > .nav-tabs')[0].clientWidth; + var tabsWidth = $('#' + domID + '')[0].clientWidth; + if(tabItemWidth < tabsWidth) + { + $('.btn-right, .btn-left').hide(); + return; + } + + distance += tabsWidth * shift * 0.2; + if(distance > 0) distance = 0; + if(distance == 0) + { + $('.btn-left').hide(); + } + + if((tabItemWidth + distance) < tabsWidth * 0.75) + { + $('.btn-right').hide(); + return arrowTabs(domID, 1, true); + } + + $('#' + domID + ' > .tabs-navbar > .tabs-nav')[0].style.transform = 'translateX('+ distance +'px)'; +} + $(function() { $(document).on('click', '.ajaxPager', function() diff --git a/module/repo/js/monaco.js b/module/repo/js/monaco.js index ff3d66f057..ade52cf187 100644 --- a/module/repo/js/monaco.js +++ b/module/repo/js/monaco.js @@ -1,27 +1,7 @@ $(function() { - var distance = 0; - - /** - * Arrow tab line. - * - * @param int $num - * @access public - * @return void - */ - function arrow(num){ - var tabItemWidth = $('#fileTabs > .tabs-navbar > .nav-tabs')[0].clientWidth; - var tabsWidth = $('#fileTabs')[0].clientWidth; - if(tabItemWidth < tabsWidth) return; - - distance += tabsWidth * num * 0.2; - if(distance > 0) distance = 0; - if((tabItemWidth + distance) < tabsWidth * 0.7) return; - - $('#fileTabs > .tabs-navbar > .tabs-nav')[0].style.transform = 'translateX('+ distance +'px)'; - } - $('.btn-left').click(function() {arrow(1);}); - $('.btn-right').click(function() {arrow(-1);}); + $('.btn-left').click(function() {arrowTabs('fileTabs', 1);}); + $('.btn-right').click(function() {arrowTabs('fileTabs', -2);}); /** * Create file tab. @@ -67,6 +47,7 @@ $(function() $tabs.open(createTab(name, path)); setHeight(); + arrowTabs('fileTabs', -2); }); /* Remove file path for opened files. */ @@ -78,6 +59,8 @@ $(function() openedFiles.splice(index, 1) $('[data-path="' + filepath + '"]').closest('li').removeClass('selected'); } + + if(index == openedFiles.length) arrowTabs('fileTabs', -2); }); /* Append file path into the title. */ diff --git a/module/repo/view/ajaxgeteditorcontent.html.php b/module/repo/view/ajaxgeteditorcontent.html.php index b84de046c1..9f02ebf556 100644 --- a/module/repo/view/ajaxgeteditorcontent.html.php +++ b/module/repo/view/ajaxgeteditorcontent.html.php @@ -42,7 +42,7 @@ js::import($jsRoot . 'monaco-editor/min/vs/loader.js');
    -
    +
    @@ -51,11 +51,16 @@ js::import($jsRoot . 'monaco-editor/min/vs/loader.js');
    +
    id);?> task->priList, $task->pri, $task->pri)?> createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "$class data-width='80%'")?>
    bug->duplicateBug;?>duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateTip}'");?>duplicateBug, "class='form-control' placeholder='{$lang->bug->duplicateTip}'");?>
    bug->closedBy;?>
    bug->resolution;?> + bug->resolutionList[$bug->resolution]) ? $lang->bug->resolutionList[$bug->resolution] : $bug->resolution; - if(isset($bug->duplicateBugTitle)) echo " #$bug->duplicateBug:" . html::a($this->createLink('bug', 'view', "bugID=$bug->duplicateBug", '', true), $bug->duplicateBugTitle, '', "class='iframe' data-width='80%'"); + if(isset($bug->duplicateBugTitle)) echo " #$bug->duplicateBug:" . html::a($this->createLink('bug', 'view', "bugID=$bug->duplicateBug", '', true), $bug->duplicateBugTitle, '', "title='{$bug->duplicateBugTitle}' class='iframe' data-width='80%'"); ?>
    story->closedReason;?> + closedReason) echo $lang->story->reasonList[$story->closedReason]; if(isset($story->extraStories[$story->duplicateStory])) { - echo html::a(inlink('view', "storyID=$story->duplicateStory"), '#' . $story->duplicateStory . ' ' . $story->extraStories[$story->duplicateStory]); + echo html::a(inlink('view', "storyID=$story->duplicateStory"), '#' . $story->duplicateStory . ' ' . $story->extraStories[$story->duplicateStory], '', "title='{$story->extraStories[$story->duplicateStory]}'"); } ?>