From c5f3a49071ff5ca58897af2ab7985a12c40d601e Mon Sep 17 00:00:00 2001 From: zhaoke Date: Wed, 31 Aug 2022 09:52:31 +0800 Subject: [PATCH 001/168] * Add insert case result for unit ciresult. --- module/testtask/model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/testtask/model.php b/module/testtask/model.php index 029545908c..f0691ab8f7 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -2112,6 +2112,7 @@ class testtaskModel extends model if(!isset($suites[$suiteIndex])) $suites[$suiteIndex] = $suite; $case = new stdclass(); + if(isset($caseResult->id)) $case->id = $caseResult->id; $case->product = $productID; $case->title = $caseResult->title; $case->pri = 3; @@ -2121,7 +2122,7 @@ class testtaskModel extends model $case->openedBy = $this->app->user->account; $case->openedDate = $now; $case->version = 1; - $case->auto = 'unit'; + $case->auto = 'func'; $case->frame = $frame; $result = new stdclass(); From 89c7aa1ffa8e5c7dcf8f26f25f70feb7fc042606 Mon Sep 17 00:00:00 2001 From: zhaoke Date: Wed, 31 Aug 2022 10:02:05 +0800 Subject: [PATCH 002/168] * Do not change case auto when ci unit result. --- module/testtask/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 module/testtask/model.php diff --git a/module/testtask/model.php b/module/testtask/model.php old mode 100644 new mode 100755 index f0691ab8f7..30c0007e8f --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -2122,7 +2122,7 @@ class testtaskModel extends model $case->openedBy = $this->app->user->account; $case->openedDate = $now; $case->version = 1; - $case->auto = 'func'; + // $case->auto = 'unit'; $case->frame = $frame; $result = new stdclass(); From f82ca09e99a297d72a74f01387f0aaef5d208563 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Wed, 31 Aug 2022 11:15:59 +0800 Subject: [PATCH 003/168] * Compatible workflow fields for import|export. --- module/common/view/noticeimport.html.php | 5 ++ module/port/control.php | 1 - module/port/model.php | 89 ++++++++++++++++++------ module/port/view/thead.html.php | 13 ---- 4 files changed, 73 insertions(+), 35 deletions(-) diff --git a/module/common/view/noticeimport.html.php b/module/common/view/noticeimport.html.php index 5f87dd9b43..a3a5b3a8b5 100644 --- a/module/common/view/noticeimport.html.php +++ b/module/common/view/noticeimport.html.php @@ -28,4 +28,9 @@ function submitForm(type) $('#importNoticeModal .form-actions .btn').addClass('disabled'); $("button[data-target='#importNoticeModal']").closest('form').submit(); } + +$('#importNoticeModal .close').click(function() +{ + $('#importNoticeModal .form-actions .btn').removeClass('disabled'); +}) diff --git a/module/port/control.php b/module/port/control.php index 39257735fb..7d465cf754 100644 --- a/module/port/control.php +++ b/module/port/control.php @@ -159,7 +159,6 @@ class port extends control $datas = $this->port->getPageDatas($formatDatas, $pagerID); if($model == 'task') $datas = $this->task->processDatas4Task($datas); - $html = $this->port->buildNextList($datas->datas, $lastID, $fields, $pagerID, $model); die($html); } diff --git a/module/port/model.php b/module/port/model.php index f93951a470..11a4d61249 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -198,8 +198,12 @@ class portModel extends model /* Get export rows and fields datas */ $exportDatas = $this->getExportDatas($fieldList, $rows); - $this->post->set('rows', $exportDatas['rows']); - $this->post->set('fields', $exportDatas['fields']); + $fields = $exportDatas['fields']; + $rows = $exportDatas['rows']; + if($this->config->edition != 'open') list($fields, $rows) = $this->loadModel('workflowfield')->appendDataFromFlow($fields, $rows, $model); + + $this->post->set('rows', $rows); + $this->post->set('fields', $fields); $this->post->set('kind', $model); } @@ -249,6 +253,7 @@ class portModel extends model if(empty($fields)) return false; if(!is_array($fields)) $fields = explode(',', $fields); + $fieldList = array(); /* build module fieldList. */ foreach ($fields as $key => $field) @@ -275,6 +280,32 @@ class portModel extends model $fieldList['mailto']['control'] = 'multiple'; $fieldList['mailto']['values'] = $this->portConfig->sysDataList['user']; } + + /* Set workflow fields .*/ + $workflowFields = $this->dao->select('*')->from(TABLE_WORKFLOWFIELD) + ->where('module')->eq($model) + ->andWhere('buildin')->eq(0) + ->fetchAll('id'); + + foreach($workflowFields as $field) + { + if(!in_array($field->control, array('select', 'radio', 'multi-select'))) continue; + if(!isset($fields[$field->field]) and !array_search($field->field, $fields)) continue; + if(empty($field->options)) continue; + + $field = $this->loadModel('workflowfield')->processFieldOptions($field); + $options = $this->workflowfield->getFieldOptions($field, true); + if($options) + { + $control = $field->control == 'multi-select' ? 'multiple' : 'select'; + $fieldList[$field->field]['title'] = $field->name; + $fieldList[$field->field]['control'] = $control; + $fieldList[$field->field]['values'] = $options; + $fieldList[$field->field]['from'] = 'workflow'; + $this->config->$model->listFields .= ',' . $field->field; + } + } + return $fieldList; } @@ -441,7 +472,7 @@ class portModel extends model $modelData = $this->processRows4Fields($rows, $fields); - $modelData = $this->getNatureDatas($model, $modelData, $filter); + $modelData = $this->getNatureDatas($model, $modelData, $filter, $fields); $this->createTmpFile($modelData); } @@ -449,7 +480,8 @@ class portModel extends model { $modelData = $this->getDatasByFile($tmpFile); } - + if(isset($fields['id'])) unset($fields['id']); + $this->session->set($model . 'TemplateFields', array_keys($fields)); return $modelData; } @@ -648,7 +680,6 @@ class portModel extends model { $lists = array(); $this->commonActions($model); - if(!empty($this->modelListFields)) { $listFields = $this->modelListFields; @@ -661,6 +692,7 @@ class portModel extends model $lists[$listName] = $fieldList[$field]['values']; if(strpos($this->config->$model->sysLangFields, $field)) $lists[$listName] = join(',', $fieldList[$field]['values']); } + $this->config->excel->sysDataField[] = $field; } $lists['listStyle'] = $listFields; @@ -829,17 +861,35 @@ class portModel extends model * @access public * @return void */ - public function getNatureDatas($model, $datas, $filter = '') + public function getNatureDatas($model, $datas, $filter = '', $fields = '') { + $fieldList = $this->initFieldList($model, array_keys($fields), false); $lang = $this->lang->$model; + foreach($datas as $key => $data) { foreach($data as $field => $cellValue) { + if(empty($cellValue)) continue; if(strpos($this->portConfig->dateFeilds, $field) !== false and helper::isZeroDate($cellValue)) $datas[$key]->$field = ''; - if(strpos($filter, $field) !== false) continue; + //if(strpos($filter, $field) !== false) continue; if(is_array($cellValue)) continue; - if(strrpos($cellValue, '(#') === false) + + if(!empty($fieldList[$field]['from']) and in_array($fieldList[$field]['control'], array('select', 'multiple'))) + { + $control = $fieldList[$field]['control']; + if($control == 'multiple') + { + $cellValue = explode("\n", $cellValue); + foreach($cellValue as &$value) $value = array_search($value, $fieldList[$field]['values'], true); + $datas[$key]->$field = join(',', $cellValue); + } + else + { + $datas[$key]->$field = array_search($cellValue, $fieldList[$field]['values']); + } + } + elseif(strrpos($cellValue, '(#') === false) { if(!isset($lang->{$field . 'List'}) or !is_array($lang->{$field . 'List'})) continue; @@ -942,6 +992,7 @@ class portModel extends model $this->commonActions($model); $modelLang = $this->lang->$model; $fields = explode(',', $this->modelConfig->templateFields); + array_unshift($fields, 'id'); foreach($fields as $key => $fieldName) { @@ -950,6 +1001,15 @@ class portModel extends model unset($fields[$key]); } + if($this->config->edition != 'open') + { + $appendFields = $this->loadModel('workflowaction')->getFields($model, 'showimport', false); + foreach($appendFields as $appendField) + { + if(!$appendField->buildin and $appendField->show) $fields[$appendField->field] = $appendField->name; + } + } + return $fields; } @@ -1224,8 +1284,6 @@ class portModel extends model $importFields = !empty($_SESSION[$model . 'TemplateFields']) ? $_SESSION[$model . 'TemplateFields'] : $this->config->$model->templateFields; - $this->getWorkFlowFields($model); - $datas->requiredFields = $this->config->$model->create->requiredFields; $datas->allPager = isset($datas->allPager) ? $datas->allPager : 1; $datas->pagerID = $pagerID; @@ -1257,7 +1315,6 @@ class portModel extends model $addID = 1; if($model == 'task') $members = $this->loadModel('user')->getTeamMemberPairs($this->session->taskPortParams['executionID'], 'execution'); - $appendFields = $this->session->appendFields; $showImportCount = $this->config->port->lazyLoading ? $this->config->port->showImportCount : $this->maxImport; $lastRow = $lastID + $key + $showImportCount; @@ -1344,16 +1401,6 @@ class portModel extends model else $html .= '' . html::input("$name", $selected, "class='form-control autocomplete='off'") . ''; } - if(!empty($appendFields)) - { - $this->loadModel('flow'); - foreach($appendFields as $field) - { - if(!$field->show) continue; - $value = $field->defaultValue ? $field->defaultValue : zget($object, $field->field, ''); - $html .='' . $this->flow->buildControl($field, $value, "$field->field[$key]", true) . ''; - } - } $html .= '' . "\n"; } diff --git a/module/port/view/thead.html.php b/module/port/view/thead.html.php index 1099ef1652..94c3161658 100644 --- a/module/port/view/thead.html.php +++ b/module/port/view/thead.html.php @@ -4,16 +4,3 @@ -show) continue; - - $width = ($field->width && $field->width != 'auto' ? $field->width . 'px' : 'auto'); - $required = strpos(",$field->rules,", ",$notEmptyRule->id,") !== false ? 'required' : ''; - echo "$field->name"; - } -} -?> From 8dfd913f574f38f9f6ffb848444fd9cb986acf4a Mon Sep 17 00:00:00 2001 From: zhaoke Date: Wed, 31 Aug 2022 14:32:09 +0800 Subject: [PATCH 004/168] * Fix error when caseid is zero. --- module/testtask/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/testtask/model.php b/module/testtask/model.php index 30c0007e8f..69179e5156 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -2112,7 +2112,7 @@ class testtaskModel extends model if(!isset($suites[$suiteIndex])) $suites[$suiteIndex] = $suite; $case = new stdclass(); - if(isset($caseResult->id)) $case->id = $caseResult->id; + if(!empty($caseResult->id)) $case->id = $caseResult->id; $case->product = $productID; $case->title = $caseResult->title; $case->pri = 3; @@ -2122,7 +2122,7 @@ class testtaskModel extends model $case->openedBy = $this->app->user->account; $case->openedDate = $now; $case->version = 1; - // $case->auto = 'unit'; + if(empty($caseResult->id)) $case->auto = 'unit'; $case->frame = $frame; $result = new stdclass(); From acc7e1b88e131d11519f2725170b74c154e3446b Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 6 Sep 2022 10:08:02 +0800 Subject: [PATCH 005/168] * Fix bug #27007. --- module/dept/model.php | 10 ++------ module/report/control.php | 33 ++++++++++++-------------- module/report/view/annualdata.html.php | 10 ++++---- 3 files changed, 22 insertions(+), 31 deletions(-) diff --git a/module/dept/model.php b/module/dept/model.php index d50338310a..7fd5752c90 100644 --- a/module/dept/model.php +++ b/module/dept/model.php @@ -113,14 +113,8 @@ class deptModel extends model krsort($deptMenu); $topMenu = array_pop($deptMenu); $topMenu = explode("\n", trim((string)$topMenu)); - if($this->app->tab == 'report') - { - $lastMenu[] = '/' . $this->lang->dept->noDepartment; - } - else - { - $lastMenu[] = '/'; - } + + $lastMenu[] = '/'; foreach($topMenu as $menu) { if(!strpos($menu, '|')) continue; diff --git a/module/report/control.php b/module/report/control.php index 71b38ffc84..aadaaf9f13 100644 --- a/module/report/control.php +++ b/module/report/control.php @@ -289,6 +289,8 @@ class report extends control $this->app->loadLang('task'); $this->app->loadLang('bug'); $this->app->loadLang('testcase'); + $this->loadModel('dept'); + $this->loadModel('user'); $firstAction = $this->dao->select('*')->from(TABLE_ACTION)->orderBy('id')->limit(1)->fetch(); $currentYear = date('Y'); @@ -311,38 +313,32 @@ class report extends control } /* Get users and depts. */ - $users = $this->loadModel('user')->getPairs('noletter|useid|noclosed'); - $users[''] = $this->lang->report->annualData->allUser; - - $depts = $this->loadModel('dept')->getOptionMenu(); - if($this->app->tab == 'report') - { - $noDepartment = $depts[0]; - unset($depts[0]); - $depts += array('0' => $noDepartment); - } - $accounts = array(); if($userID) { - $user = $this->loadModel('user')->getById($userID, 'id'); + $user = $this->user->getById($userID, 'id'); $dept = $user->dept; - $users = $this->loadModel('dept')->getDeptUserPairs($dept, 'id'); + $users = array('' => $this->lang->report->annualData->allUser) + $this->dept->getDeptUserPairs($dept, 'id'); $accounts = array($user->account => ($user->realname ? $user->realname : $user->account)); } else { - $users = $this->loadModel('dept')->getDeptUserPairs($dept, 'id'); - $users = array('' => $this->lang->report->annualData->allUser) + $users; - $accounts = $this->loadModel('dept')->getDeptUserPairs($dept); + $users = array('' => $this->lang->report->annualData->allUser) + $this->dept->getDeptUserPairs($dept, 'id'); + $accounts = $this->dept->getDeptUserPairs($dept); } + + $noDepartment = array('0' => '/' . $this->lang->dept->noDepartment); + $depts = $this->dept->getOptionMenu(); if(!$this->app->user->admin) { - foreach($depts as $id => $name) if($id != $this->app->user->dept) unset($depts[$id]); + $depts = ($dept and isset($depts[$dept])) ? array($dept => $depts[$dept]) : $this->lang->dept->noDepartment; } else { $depts = array('' => $this->lang->report->annualData->allDept) + $depts; + + unset($depts[0]); + $depts += $noDepartment; } if($accounts) $accounts = array_keys($accounts); @@ -357,6 +353,7 @@ class report extends control { $data['logins'] = $this->report->getUserYearLogins($accounts, $year); } + $data['actions'] = $this->report->getUserYearActions($accounts, $year); $data['todos'] = $this->report->getUserYearTodos($accounts, $year); $data['contributions'] = $this->report->getUserYearContributions($accounts, $year); @@ -372,7 +369,7 @@ class report extends control if(empty($dept) and empty($userID)) $data['statusStat'] = $this->report->getAllTimeStatusStat(); - $this->view->title = sprintf($this->lang->report->annualData->title, ($userID ? zget($users, $userID, '') : ($dept ? substr($depts[$dept], strrpos($depts[$dept], '/') + 1) : $depts[''])), $year); + $this->view->title = sprintf($this->lang->report->annualData->title, ($userID ? zget($users, $userID, '') : (($dept !== '') ? substr($depts[$dept], strrpos($depts[$dept], '/') + 1) : $depts[''])), $year); $this->view->data = $data; $this->view->year = $year; $this->view->users = $users; diff --git a/module/report/view/annualdata.html.php b/module/report/view/annualdata.html.php index 210c2c74f4..4cf774c9c2 100644 --- a/module/report/view/annualdata.html.php +++ b/module/report/view/annualdata.html.php @@ -27,7 +27,7 @@
  • - logins : ($dept ? $annualDataLang->deptUsers : $annualDataLang->companyUsers);?> + logins : ($dept !== '' ? $annualDataLang->deptUsers : $annualDataLang->companyUsers);?>
  • @@ -65,7 +65,7 @@ } } ?> - +
  • contributions;?> @@ -75,7 +75,7 @@
-

actionData :$annualDataLang->contributionData) . $soFar;?>

+

actionData :$annualDataLang->contributionData) . $soFar;?>

    objectTypeList as $objectType => $objectName):?> @@ -207,7 +207,7 @@
- +

statusStat;?>

@@ -287,7 +287,7 @@ $(function() story->statusList['']);?> bug->statusList['']);?> task->statusList['']);?> - + $objectStatusStat):?> Date: Tue, 6 Sep 2022 10:42:20 +0800 Subject: [PATCH 006/168] * Add judge edition for port. --- module/port/model.php | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/module/port/model.php b/module/port/model.php index 11a4d61249..16f72d1fc0 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -281,28 +281,31 @@ class portModel extends model $fieldList['mailto']['values'] = $this->portConfig->sysDataList['user']; } - /* Set workflow fields .*/ - $workflowFields = $this->dao->select('*')->from(TABLE_WORKFLOWFIELD) - ->where('module')->eq($model) - ->andWhere('buildin')->eq(0) - ->fetchAll('id'); - - foreach($workflowFields as $field) + if($this->config->edition != 'open') { - if(!in_array($field->control, array('select', 'radio', 'multi-select'))) continue; - if(!isset($fields[$field->field]) and !array_search($field->field, $fields)) continue; - if(empty($field->options)) continue; + /* Set workflow fields .*/ + $workflowFields = $this->dao->select('*')->from(TABLE_WORKFLOWFIELD) + ->where('module')->eq($model) + ->andWhere('buildin')->eq(0) + ->fetchAll('id'); - $field = $this->loadModel('workflowfield')->processFieldOptions($field); - $options = $this->workflowfield->getFieldOptions($field, true); - if($options) + foreach($workflowFields as $field) { - $control = $field->control == 'multi-select' ? 'multiple' : 'select'; - $fieldList[$field->field]['title'] = $field->name; - $fieldList[$field->field]['control'] = $control; - $fieldList[$field->field]['values'] = $options; - $fieldList[$field->field]['from'] = 'workflow'; - $this->config->$model->listFields .= ',' . $field->field; + if(!in_array($field->control, array('select', 'radio', 'multi-select'))) continue; + if(!isset($fields[$field->field]) and !array_search($field->field, $fields)) continue; + if(empty($field->options)) continue; + + $field = $this->loadModel('workflowfield')->processFieldOptions($field); + $options = $this->workflowfield->getFieldOptions($field, true); + if($options) + { + $control = $field->control == 'multi-select' ? 'multiple' : 'select'; + $fieldList[$field->field]['title'] = $field->name; + $fieldList[$field->field]['control'] = $control; + $fieldList[$field->field]['values'] = $options; + $fieldList[$field->field]['from'] = 'workflow'; + $this->config->$model->listFields .= ',' . $field->field; + } } } From 6e118674b9340d3aad22d825786ae869aefe633e Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 6 Sep 2022 10:57:20 +0800 Subject: [PATCH 007/168] * Fix bug #26193. --- module/my/js/changepassword.js | 14 +++++++++----- module/my/js/editprofile.js | 12 ++++++++---- module/my/view/changepassword.html.php | 2 +- module/my/view/editprofile.html.php | 2 +- module/user/js/create.js | 13 +++++++++---- module/user/js/edit.js | 9 +++++++-- module/user/js/reset.js | 4 +++- module/user/js/resetpassword.js | 9 +++++++-- module/user/view/create.html.php | 2 +- module/user/view/edit.html.php | 2 +- module/user/view/resetpassword.html.php | 2 +- 11 files changed, 48 insertions(+), 23 deletions(-) diff --git a/module/my/js/changepassword.js b/module/my/js/changepassword.js index d3d6b0014a..25f455269e 100644 --- a/module/my/js/changepassword.js +++ b/module/my/js/changepassword.js @@ -8,13 +8,17 @@ $(document).ready(function() $('#password1').change(function(){password1Encrypted = false}); $('#password2').change(function(){password2Encrypted = false}); + var passwordStrength = 0; $('#submit').click(function() { - var password = $('input#originalPassword').val().trim(); - var password1 = $('input#password1').val().trim(); - var passwordStrength = computePasswordStrength(password1); - var rand = $('input#verifyRand').val(); - if(!password1Encrypted) $("#passwordLength").val(password1.length); + var password = $('input#originalPassword').val().trim(); + var password1 = $('input#password1').val().trim(); + var rand = $('input#verifyRand').val(); + if(!password1Encrypted) + { + passwordStrength = computePasswordStrength(password1); + $("#passwordLength").val(password1.length); + } if($("form input[name=passwordStrength]").length == 0) $('#submit').after(""); $("form input[name=passwordStrength]").val(passwordStrength); diff --git a/module/my/js/editprofile.js b/module/my/js/editprofile.js index aa60cedfa6..3d91b9161c 100644 --- a/module/my/js/editprofile.js +++ b/module/my/js/editprofile.js @@ -8,12 +8,16 @@ $(document).ready(function() $('#password1').change(function(){password1Encrypted = false}); $('#password2').change(function(){password2Encrypted = false}); + var passwordStrength = 0; $('#submit').click(function() { - var password = $('input#verifyPassword').val(); - var password1 = $('input#password1').val(); - var passwordStrength = computePasswordStrength(password1); - if(!password1Encrypted) $("#passwordLength").val(password1.length); + var password = $('input#verifyPassword').val(); + var password1 = $('input#password1').val(); + if(!password1Encrypted) + { + passwordStrength = computePasswordStrength(password1); + $("#passwordLength").val(password1.length); + } if($("form input[name=passwordStrength]").length == 0) $('#submit').after(""); $("form input[name=passwordStrength]").val(passwordStrength); diff --git a/module/my/view/changepassword.html.php b/module/my/view/changepassword.html.php index 4fc172707a..3d14b5ae17 100755 --- a/module/my/view/changepassword.html.php +++ b/module/my/view/changepassword.html.php @@ -35,7 +35,7 @@ user->newPassword;?> - user->placeholder->passwordStrength, $config->safe->mode, '') . "'");?> + user->placeholder->passwordStrength, $config->safe->mode, '') . "'");?> diff --git a/module/my/view/editprofile.html.php b/module/my/view/editprofile.html.php index 45d197587a..5d286ef4e6 100644 --- a/module/my/view/editprofile.html.php +++ b/module/my/view/editprofile.html.php @@ -46,7 +46,7 @@ - safe->mode) ? $lang->user->placeholder->passwordStrength[$config->safe->mode] : '') . "'");?> + safe->mode) ? $lang->user->placeholder->passwordStrength[$config->safe->mode] : '') . "'");?> diff --git a/module/user/js/create.js b/module/user/js/create.js index 32c6596e9a..111660bdba 100644 --- a/module/user/js/create.js +++ b/module/user/js/create.js @@ -90,14 +90,19 @@ $(function() var password2Encrypted = false $('#password1').change(function(){password1Encrypted = false}); $('#password2').change(function(){password2Encrypted = false}); + + var passwordStrength = 0; $('#submit').click(function() { if(!password1Encrypted || !password2Encrypted) { - var password1 = $('#password1').val(); - var password2 = $('#password2').val(); - var passwordStrength = computePasswordStrength(password1); - if(!password1Encrypted) $("#passwordLength").val(password1.length); + var password1 = $('#password1').val(); + var password2 = $('#password2').val(); + if(!password1Encrypted) + { + passwordStrength = computePasswordStrength(password1); + $("#passwordLength").val(password1.length); + } if($("form input[name=passwordStrength]").length == 0) $('#submit').after(""); $("form input[name=passwordStrength]").val(passwordStrength); diff --git a/module/user/js/edit.js b/module/user/js/edit.js index 6b673efc4e..3b3501e708 100644 --- a/module/user/js/edit.js +++ b/module/user/js/edit.js @@ -4,14 +4,19 @@ $(function() var password2Encrypted = false $('#password1').change(function(){password1Encrypted = false}); $('#password2').change(function(){password2Encrypted = false}); + + var passwordStrength = 0; $('#submit').click(function() { if(!password1Encrypted || !password2Encrypted) { var password1 = $('#password1').val().trim(); var password2 = $('#password2').val().trim(); - var passwordStrength = computePasswordStrength(password1); - if(!password1Encrypted) $("#passwordLength").val(password1.length); + if(!password1Encrypted) + { + passwordStrength = computePasswordStrength(password1); + $("#passwordLength").val(password1.length); + } if($("form input[name=passwordStrength]").length == 0) $('#submit').after(""); $("form input[name=passwordStrength]").val(passwordStrength); diff --git a/module/user/js/reset.js b/module/user/js/reset.js index ccf8593186..7102b85dfc 100644 --- a/module/user/js/reset.js +++ b/module/user/js/reset.js @@ -4,13 +4,15 @@ $(document).ready(function() var password2Encrypted = false $('#password1').change(function(){password1Encrypted = false}); $('#password2').change(function(){password2Encrypted = false}); + + var passwordStrength = 0; $('form #submit').click(function() { if(!password1Encrypted || !password2Encrypted) { var password1 = $('#password1').val().trim(); var password2 = $('#password2').val().trim(); - var passwordStrength = computePasswordStrength(password1); + if(!password1Encrypted) passwordStrength = computePasswordStrength(password1); if($("form input[name=passwordStrength]").length == 0) $('#submit').after(""); $("form input[name=passwordStrength]").val(passwordStrength); diff --git a/module/user/js/resetpassword.js b/module/user/js/resetpassword.js index 9f328f6445..1171ac177a 100644 --- a/module/user/js/resetpassword.js +++ b/module/user/js/resetpassword.js @@ -14,14 +14,19 @@ $(function() var password2Encrypted = false $('#password1').change(function(){password1Encrypted = false}); $('#password2').change(function(){password2Encrypted = false}); + + var passwordStrength = 0; $('#submit').click(function() { if(!password1Encrypted || !password2Encrypted) { var password1 = $('#password1').val().trim(); var password2 = $('#password2').val().trim(); - var passwordStrength = computePasswordStrength(password1); - if(!password1Encrypted) $("#passwordLength").val(password1.length); + if(!password1Encrypted) + { + passwordStrength = computePasswordStrength(password1); + $("#passwordLength").val(password1.length); + } if($("form input[name=passwordStrength]").length == 0) $('#submit').after(""); $("form input[name=passwordStrength]").val(passwordStrength); diff --git a/module/user/view/create.html.php b/module/user/view/create.html.php index 44f22cf2c7..3dfb8c9930 100644 --- a/module/user/view/create.html.php +++ b/module/user/view/create.html.php @@ -54,7 +54,7 @@ $showVisionList = count($visionList) > 1; - + diff --git a/module/user/view/edit.html.php b/module/user/view/edit.html.php index 8306b1f4c1..091daed83d 100644 --- a/module/user/view/edit.html.php +++ b/module/user/view/edit.html.php @@ -71,7 +71,7 @@ - user->placeholder->passwordStrength, $config->safe->mode, '') . "'");?> + user->placeholder->passwordStrength, $config->safe->mode, '') . "'");?> diff --git a/module/user/view/resetpassword.html.php b/module/user/view/resetpassword.html.php index 7279f8dfb6..8b5e454fc4 100644 --- a/module/user/view/resetpassword.html.php +++ b/module/user/view/resetpassword.html.php @@ -29,7 +29,7 @@ include '../../common/view/header.lite.html.php';
- user->placeholder->loginPassword, $config->safe->mode, '') . "' onmouseup='checkPassword(this.value)' onkeyup='checkPassword(this.value)'");?> + user->placeholder->loginPassword, $config->safe->mode, '') . "' onkeyup='checkPassword(this.value)'");?>
From 7629e345e5297a1304918cb82d39767d4baff9d1 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 6 Sep 2022 11:01:26 +0800 Subject: [PATCH 008/168] * Fix bug #26842. --- module/testreport/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/testreport/control.php b/module/testreport/control.php index 033ff87ffd..59862cb521 100644 --- a/module/testreport/control.php +++ b/module/testreport/control.php @@ -531,7 +531,7 @@ class testreport extends control $tasks = $report->tasks ? $this->testtask->getByList($report->tasks) : array();; $builds = $report->builds ? $this->build->getByList($report->builds) : array(); - $cases = $this->testreport->getTaskCases($tasks, $report->begin, $report->end); + $cases = $this->testreport->getTaskCases($tasks, $report->begin, $report->end, $report->cases); list($bugInfo, $bugSummary) = $this->testreport->getBug4Report($tasks, $report->product, $report->begin, $report->end, $builds); From 45269fb54b2ffe98799a345934bafcafc1c3b34b Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 6 Sep 2022 11:20:04 +0800 Subject: [PATCH 009/168] * Optimize the test report page. --- module/testreport/css/view.css | 3 --- module/testreport/model.php | 12 ++++-------- module/testreport/view/blockcases.html.php | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/module/testreport/css/view.css b/module/testreport/css/view.css index d85a4db1d1..f3c12c3194 100644 --- a/module/testreport/css/view.css +++ b/module/testreport/css/view.css @@ -5,7 +5,4 @@ .tab-pane > table {border: 1px solid #ddd;} .tab-pane > table:first-child {border-top: none;} .c-name {max-width: 100px;} - -#cases .pager {margin: 0px;} -#cases .pager li .btn.dropdown-toggle {border: 0px; padding-top: 3px;} #profile {vertical-align: unset;} diff --git a/module/testreport/model.php b/module/testreport/model.php index 002012e1f5..00c1c67b0c 100644 --- a/module/testreport/model.php +++ b/module/testreport/model.php @@ -149,7 +149,7 @@ class testreportModel extends model $severityGroups = $statusGroups = $openedByGroups = $resolvedByGroups = $resolutionGroups = $moduleGroups = $typeGroups = $stageGoups = $handleGroups = array(); /* Init stageGroups. */ - $isEmptyStage = true; + $stageGroups = array(); foreach($this->lang->bug->priList as $priKey => $priValue) { $stageGroups[$priKey]['generated'] = 0; @@ -158,7 +158,7 @@ class testreportModel extends model } /* Init handleGroups. */ - $isEmptyHandle = true; + $handleGroups = array(); $beginTimeStamp = strtotime($begin); $endTimeStamp = strtotime($end); for($i = $beginTimeStamp; $i <= $endTimeStamp; $i += 86400) @@ -220,8 +220,6 @@ class testreportModel extends model $resolvedDate = date('m-d', strtotime($bug->resolvedDate)); $stageGroups[$bug->pri]['resolved'] += 1; $handleGroups['resolved'][$resolvedDate] += 1; - $isEmptyStage = false; - $isEmptyHandle = false; } } @@ -235,8 +233,6 @@ class testreportModel extends model $foundBugs[$bug->id] = $bug; $stageGroups[$bug->pri]['generated'] += 1; $handleGroups['generated'][$openedDate] += 1; - $isEmptyStage = false; - $isEmptyHandle = false; if($bug->status == 'active' or $bug->resolvedDate > "$end 23:59:59") { @@ -279,8 +275,8 @@ class testreportModel extends model $bugSummary['countBugByTask'] = $byCaseNum; $bugSummary['bugConfirmedRate'] = empty($resolvedBugs) ? 0 : round((zget($resolutionGroups, 'fixed', 0) + zget($resolutionGroups, 'postponed', 0)) / $resolvedBugs * 100, 2); $bugSummary['bugCreateByCaseRate'] = empty($byCaseNum) ? 0 : round($byCaseNum / count($foundBugs) * 100, 2); - $bugInfo['bugStageGroups'] = $isEmptyStage ? array() : $stageGroups; - $bugInfo['bugHandleGroups'] = $isEmptyHandle ? array() : $handleGroups; + $bugInfo['bugStageGroups'] = $stageGroups; + $bugInfo['bugHandleGroups'] = $handleGroups; $this->app->loadLang('bug'); $users = $this->loadModel('user')->getPairs('noclosed|noletter|nodeleted'); diff --git a/module/testreport/view/blockcases.html.php b/module/testreport/view/blockcases.html.php index 191f6780b8..b8fb669709 100644 --- a/module/testreport/view/blockcases.html.php +++ b/module/testreport/view/blockcases.html.php @@ -1,5 +1,4 @@ session->notHead ? common::getSysURL() : '';?> - @@ -46,14 +45,17 @@ - - - - - - - +
show('right', 'pagerjs');?>
+ + + testreport->none;?> + From 562c4569cb0ac6527210495021dbf79bda440b5d Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 6 Sep 2022 13:11:29 +0800 Subject: [PATCH 010/168] * Fix bug #27007. --- module/report/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/report/control.php b/module/report/control.php index aadaaf9f13..bb22198742 100644 --- a/module/report/control.php +++ b/module/report/control.php @@ -331,7 +331,7 @@ class report extends control $depts = $this->dept->getOptionMenu(); if(!$this->app->user->admin) { - $depts = ($dept and isset($depts[$dept])) ? array($dept => $depts[$dept]) : $this->lang->dept->noDepartment; + $depts = ($dept and isset($depts[$dept])) ? array($dept => $depts[$dept]) : $noDepartment; } else { From a09269de36a208dd9b190d89423f7250fb4a949b Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 6 Sep 2022 05:59:31 +0000 Subject: [PATCH 011/168] * Fix bug #67888. --- lib/dao/dao.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/dao/dao.class.php b/lib/dao/dao.class.php index e18d52847f..f4de1d3f1b 100644 --- a/lib/dao/dao.class.php +++ b/lib/dao/dao.class.php @@ -263,12 +263,11 @@ class dao extends baseDAO continue; } - if(!isset($this->sqlobj->data->{$field->field})) $this->sqlobj->data->{$field->field} = false; - /* Check rules of fields. */ foreach($field->ruleData as $rule) { if(empty($rule)) continue; + if(!isset($this->sqlobj->data->{$field->field})) continue; if($rule->type == 'system') { From 9dedf90d270e920049fe0a21603786d6aa41ffdf Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 6 Sep 2022 14:20:39 +0800 Subject: [PATCH 012/168] * Fix bug#27276,#27280. --- module/bug/config.php | 2 +- module/story/config.php | 2 +- module/story/model.php | 2 +- module/task/config.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/bug/config.php b/module/bug/config.php index 16f0b25805..ad67ba65e3 100644 --- a/module/bug/config.php +++ b/module/bug/config.php @@ -56,7 +56,7 @@ $config->bug->custom->createFields = $config->bug->list->customCreateFields $config->bug->custom->batchCreateFields = 'project,execution,deadline,steps,type,severity,os,browser,%s'; $config->bug->custom->batchEditFields = 'type,severity,pri,assignedTo,deadline,status,resolvedBy,resolution'; -$config->bug->excludeCheckFileds = ',severities,oses,browsers,'; +$config->bug->excludeCheckFileds = ',severities,oses,browsers,lanes,regions,executions,projects,'; $config->bug->editor = new stdclass(); $config->bug->editor->create = array('id' => 'steps', 'tools' => 'bugTools'); diff --git a/module/story/config.php b/module/story/config.php index bf58c9dcd4..a494269437 100644 --- a/module/story/config.php +++ b/module/story/config.php @@ -50,7 +50,7 @@ $config->story->custom->createFields = $config->story->list->customCreateFi $config->story->custom->batchCreateFields = 'module,plan,spec,pri,estimate,review,%s'; $config->story->custom->batchEditFields = 'branch,module,plan,estimate,pri,source,stage,closedBy,closedReason'; -$config->story->excludeCheckFileds = ',uploadImage,category,reviewer,reviewDitto,'; +$config->story->excludeCheckFileds = ',uploadImage,category,reviewer,reviewDitto,lanes,regions,'; global $lang, $app; $config->story->datatable = new stdclass(); diff --git a/module/story/model.php b/module/story/model.php index 92f1bdf36a..972b30fc9f 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -498,7 +498,7 @@ class storyModel extends model $reviewers = (isset($stories->reviewDitto[$i])) ? $reviewers : $stories->reviewer[$i]; $stories->reviewer[$i] = $reviewers; $_POST['reviewer'][$i] = $reviewers; - if(empty($stories->reviewer[$i]) and $forceReview) + if(empty(array_filter($stories->reviewer[$i])) and $forceReview) { dao::$errors[] = $this->lang->story->errorEmptyReviewedBy; return false; diff --git a/module/task/config.php b/module/task/config.php index 116412e098..6a67b81f84 100644 --- a/module/task/config.php +++ b/module/task/config.php @@ -48,7 +48,7 @@ $config->task->custom->createFields = $config->task->customCreateFields; $config->task->custom->batchCreateFields = 'module,story,assignedTo,estimate,desc,pri'; $config->task->custom->batchEditFields = 'module,assignedTo,status,pri,estimate,record,left'; -$config->task->excludeCheckFileds = ',pri,estStartedDitto,deadlineDitto,parent,'; +$config->task->excludeCheckFileds = ',pri,estStartedDitto,deadlineDitto,parent,regions,lanes,'; $config->task->datatable = new stdclass(); $config->task->datatable->defaultField = array('id', 'pri', 'name', 'status', 'assignedTo', 'finishedBy', 'estimate', 'consumed', 'left', 'progress', 'deadline', 'actions'); From 9d5f645870c47890cecf438e850bec95a5ba1c2e Mon Sep 17 00:00:00 2001 From: zhaoke Date: Tue, 6 Sep 2022 14:34:20 +0800 Subject: [PATCH 013/168] * Add do not change case title when submit unit result. --- module/testtask/model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/testtask/model.php b/module/testtask/model.php index 69179e5156..ebe63c87ec 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -1726,6 +1726,7 @@ class testtaskModel extends model */ public function processAutoResult($testtaskID, $productID, $suites, $cases, $results, $suiteNames = array(), $caseTitles = array(), $auto = 'unit') { + var_dump($cases);die; if(empty($cases)) return print(js::alert($this->lang->testtask->noImportData)); /* Import cases and link task and insert result. */ @@ -2114,7 +2115,7 @@ class testtaskModel extends model $case = new stdclass(); if(!empty($caseResult->id)) $case->id = $caseResult->id; $case->product = $productID; - $case->title = $caseResult->title; + if(empty($caseResult->id)) $case->title = $caseResult->title; $case->pri = 3; $case->type = 'unit'; $case->stage = 'unittest'; From c01ea668165775cfe74ae6889b42912623cf776d Mon Sep 17 00:00:00 2001 From: zhaoke Date: Tue, 6 Sep 2022 14:36:26 +0800 Subject: [PATCH 014/168] - Remove test code. --- module/testtask/model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/testtask/model.php b/module/testtask/model.php index ebe63c87ec..2186dcedac 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -1726,7 +1726,6 @@ class testtaskModel extends model */ public function processAutoResult($testtaskID, $productID, $suites, $cases, $results, $suiteNames = array(), $caseTitles = array(), $auto = 'unit') { - var_dump($cases);die; if(empty($cases)) return print(js::alert($this->lang->testtask->noImportData)); /* Import cases and link task and insert result. */ From ea3071279be277296bd2b6f1a69757a8d0a883b8 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 6 Sep 2022 14:52:24 +0800 Subject: [PATCH 015/168] * Fix bug #27020. --- module/project/css/create.css | 6 ++++-- module/project/js/create.js | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/module/project/css/create.css b/module/project/css/create.css index fdb72ad390..d51de52fae 100644 --- a/module/project/css/create.css +++ b/module/project/css/create.css @@ -17,9 +17,11 @@ #projectName {display: inline-block; width: 32%;} #productsBox a {border-radius: 2px !important;} #productsBox .col-sm-4 {padding-right: 5px;} -#productsBox .addProduct {padding-left: 0px !important;} -#productsBox .required:after{right: -10px !important;} +#productsBox .required:after {right: -4.5px !important;} +#productsBox .addProduct {padding-left: 0px !important; padding-right: 10px;} +#productsBox .addProduct.required:after {right: -1px !important;} #productsBox .input-group-addon > div {display: inline-block !important;} +#productsBox .required + .text-danger.help-text {position: relative; left: 10px;} #plansBox .row {display: inline-table; width: 102%;} #plansBox .col-sm-4 {float: none; display: inline-block; padding-right: 5px;} #dataform th {vertical-align: top; padding-top: 13px;} diff --git a/module/project/js/create.js b/module/project/js/create.js index aa4d3746ad..b5608624bc 100644 --- a/module/project/js/create.js +++ b/module/project/js/create.js @@ -149,8 +149,17 @@ function setParentProgram(parentProgram) }); $('#parent').attr('data-lastSelected', parentProgram); - if(parentProgram != '0') $('#productsBox .row .input-group:first').addClass('required'); - if(parentProgram == '0') $('#productsBox .row .input-group').removeClass('required'); + + if($('#parent').val() != '0') + { + $('#productsBox .addProduct .input-group:first').addClass('required'); + $('#productsBox .row .input-group:first').addClass('required'); + } + else + { + $('#productsBox .addProduct .input-group').removeClass('required'); + $('#productsBox .row .input-group').removeClass('required'); + } } /** @@ -187,9 +196,6 @@ function addNewProduct(obj) $('#productName').removeAttr('disabled', true); $('#productsBox .addProduct').removeClass('hidden'); $('#productTitle').html(productName); - - if($('#parent').val() != '0') $('#productsBox .addProduct .input-group:first').addClass('required'); - if($('#parent').val() == '0') $('#productsBox .addProduct .input-group').removeClass('required'); } else { @@ -206,6 +212,7 @@ function addNewProduct(obj) $('#productTitle').html(manageProducts); } + $('#productsBox div + .text-danger.help-text').empty(); } /** From ed78e770353b9f190f84b156a0b30d7f7032daa0 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 6 Sep 2022 15:04:00 +0800 Subject: [PATCH 016/168] * Fix bug #27020. --- module/project/js/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/project/js/create.js b/module/project/js/create.js index b5608624bc..a22a714e7d 100644 --- a/module/project/js/create.js +++ b/module/project/js/create.js @@ -150,7 +150,7 @@ function setParentProgram(parentProgram) $('#parent').attr('data-lastSelected', parentProgram); - if($('#parent').val() != '0') + if(parentProgram != '0') { $('#productsBox .addProduct .input-group:first').addClass('required'); $('#productsBox .row .input-group:first').addClass('required'); From 2bf626bc9f9ba1c0da8d039bda6334eb9d35c48a Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 6 Sep 2022 15:24:07 +0800 Subject: [PATCH 017/168] * Fix bug #27004. --- module/user/view/create.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/user/view/create.html.php b/module/user/view/create.html.php index 44f22cf2c7..e0978842cf 100644 --- a/module/user/view/create.html.php +++ b/module/user/view/create.html.php @@ -13,7 +13,7 @@ -user->placeholder->password1 = zget($lang->user->placeholder->passwordStrength, $config->safe->mode, '');?> +user->placeholder->password1 = zget($lang->user->placeholder->passwordStrength, !empty($config->safe->mode) ? $config->safe->mode : 0, '');?> user->placeholder);?> Date: Tue, 6 Sep 2022 15:26:01 +0800 Subject: [PATCH 018/168] * fix bug #27292. --- module/weekly/model.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/module/weekly/model.php b/module/weekly/model.php index 54600cea55..9b0c96b94b 100755 --- a/module/weekly/model.php +++ b/module/weekly/model.php @@ -240,6 +240,7 @@ class weeklyModel extends model ->andWhere("(status='done' or closedReason= 'done')") ->andWhere('finishedDate')->ge($monday) ->andWhere('finishedDate')->le($sunday) + ->andWhere('deleted')->eq(0) ->fetchAll(); return $this->loadModel('task')->processTasks($tasks); } @@ -267,6 +268,7 @@ class weeklyModel extends model ->andWhere('status')->in('wait,doing,pause') ->andWhere('deadline')->ge($monday) ->andWhere('deadline')->le($sunday) + ->andWhere('deleted')->eq(0) ->fetchAll('id'); $postponed = $this->dao->select('*') @@ -275,6 +277,7 @@ class weeklyModel extends model ->andWhere('finishedDate')->gt($nextMonday) ->andWhere('deadline')->ge($monday) ->andWhere('deadline')->lt($nextMonday) + ->andWhere('deleted')->eq(0) ->fetchAll('id'); $tasks = array_merge($unFinished, $postponed); @@ -303,6 +306,7 @@ class weeklyModel extends model ->from(TABLE_TASK) ->where('execution')->in($executionIdList) ->andWhere("((deadline > '$nextMonday' and deadline < '$sencondMondy') or (estStarted > '$nextMonday' and estStarted < '$sencondMondy'))") + ->andWhere('deleted')->eq(0) ->fetchAll('id'); return $this->loadModel('task')->processTasks($tasks); @@ -330,6 +334,7 @@ class weeklyModel extends model return $this->dao->select('type, sum(cast(estimate as decimal(10,2))) as workload') ->from(TABLE_TASK) ->where('execution')->in($executionIdList) + ->andWhere('deleted')->eq(0) ->groupBy('type') ->fetchPairs(); } @@ -355,6 +360,7 @@ class weeklyModel extends model ->from(TABLE_TASK) ->where('execution')->in($executionIdList) ->andWhere('deadline')->ge($monday) + ->andWhere('deleted')->eq(0) ->fetchAll('id'); } @@ -385,8 +391,7 @@ class weeklyModel extends model ->where('execution')->in($executionIdList) ->andWhere("parent")->ge(0) ->andWhere("deleted")->eq(0) - ->andWhere("estStarted")->ge($monday) - ->andWhere("estStarted")->lt($nextMonday) + ->andWhere("((estStarted >= '$monday' AND estStarted < '$nextMonday') OR (deadline >= '$monday' AND deadline < '$nextMonday') OR (estStarted < '$monday' AND deadline > '$nextMonday'))") ->fetchAll('id'); $PV = 0; From 2fa3bb0892c2b7311ea1338f1aa9be65ef5401c2 Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Tue, 6 Sep 2022 15:26:21 +0800 Subject: [PATCH 019/168] * Finish task #67872. Fix bug #26826. --- module/port/model.php | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/module/port/model.php b/module/port/model.php index f93951a470..d908573ce5 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -198,6 +198,8 @@ class portModel extends model /* Get export rows and fields datas */ $exportDatas = $this->getExportDatas($fieldList, $rows); + $exportDatas['rows'] = $this->$model->processExportData($exportDatas['rows']); + $this->post->set('rows', $exportDatas['rows']); $this->post->set('fields', $exportDatas['fields']); $this->post->set('kind', $model); @@ -215,7 +217,7 @@ class portModel extends model $this->commonActions($model); $datas = fixer::input('post')->get(); $objectData = array(); - foreach ($datas as $field => $data) + foreach($datas as $field => $data) { if(is_array($data)) { @@ -251,18 +253,18 @@ class portModel extends model if(!is_array($fields)) $fields = explode(',', $fields); $fieldList = array(); /* build module fieldList. */ - foreach ($fields as $key => $field) + foreach($fields as $key => $field) { $field = trim($field); $modelFieldList = isset($this->modelFieldList[$field]) ? $this->modelFieldList[$field] : array(); - foreach ($portFieldList as $portField => $value) + foreach($portFieldList as $portField => $value) { $funcName = 'init' . ucfirst($portField); if((!isset($modelFieldList[$portField])) or $portField == 'title') { - $modelFieldList[$portField] = $this->portConfig->fieldList[$portField]; - if(strpos($this->portConfig->initFunction, $portField) !== false) $modelFieldList[$portField] = $this->$funcName($model, $field); + $modelFieldList[$portField] = $this->portConfig->fieldList[$portField]; + if(strpos($this->portConfig->initFunction, $portField) !== false) $modelFieldList[$portField] = $this->$funcName($model, $field); } } @@ -368,7 +370,7 @@ class portModel extends model if(is_array($values) and $withKey) { unset($values['']); - foreach ($values as $key => $value) + foreach($values as $key => $value) { $values[$key] = $value . "(#$key)"; } @@ -511,7 +513,7 @@ class portModel extends model if(!empty($pairs)) { $valuePairs = array(); - foreach ($values as $key => $value) + foreach($values as $key => $value) { if(is_object($value)) $value = get_object_vars($value); @@ -548,7 +550,7 @@ class portModel extends model $exportDatas = array(); $dataSourceList = array(); - foreach ($fieldList as $key => $field) + foreach($fieldList as $key => $field) { $exportDatas['fields'][$key] = $field['title']; if($field['values']) @@ -562,7 +564,7 @@ class portModel extends model $exportDatas['user'] = $this->loadModel('user')->getPairs('noclosed|nodeleted|noletter'); - foreach ($rows as $id => $values) + foreach($rows as $id => $values) { foreach($values as $field => $value) { From b7fa4bd754acf63dcef29e73c05f4f589b00fe9d Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 6 Sep 2022 15:30:21 +0800 Subject: [PATCH 020/168] * Fix bug #26193. --- module/my/control.php | 5 ++--- module/my/view/editprofile.html.php | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/module/my/control.php b/module/my/control.php index fa751be570..3c9240313d 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -1212,9 +1212,8 @@ EOF; $_POST['account'] = $this->app->user->account; $_POST['groups'] = $this->dao->select('`group`')->from(TABLE_USERGROUP)->where('account')->eq($this->post->account)->fetchPairs('group', 'group'); $this->user->update($this->app->user->id); - if(dao::isError()) helper::end(js::error(dao::getError())); - echo js::locate($this->createLink('my', 'profile'), 'parent'); - return; + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('my', 'profile'), 'closeModal' => true)); } $this->app->loadConfig('user'); diff --git a/module/my/view/editprofile.html.php b/module/my/view/editprofile.html.php index 5d286ef4e6..962686cbbc 100644 --- a/module/my/view/editprofile.html.php +++ b/module/my/view/editprofile.html.php @@ -17,7 +17,7 @@

my->editProfile;?>

-
+ From 4275f13884facb4b449099f571d185b9a3458afe Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 6 Sep 2022 15:37:55 +0800 Subject: [PATCH 021/168] * Fix bug#27006. --- 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 92f1bdf36a..cde48dc4ea 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -3071,7 +3071,7 @@ class storyModel extends model } else { - $storyQuery .= " AND `status` NOT IN ('draft', 'closed')"; + $storyQuery .= " AND `status` NOT IN ('draft', 'reviewing', 'changing', 'closed')"; } if($this->app->rawModule == 'build' and $this->app->rawMethod == 'linkstory') $storyQuery .= " AND `parent` != '-1'"; From 4f9128b9c1779cf7f312a5e52c6f361e60a906c9 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 6 Sep 2022 15:51:03 +0800 Subject: [PATCH 022/168] * Fix bug#27288. --- module/execution/css/view.de.css | 1 + module/execution/css/view.en.css | 1 + 2 files changed, 2 insertions(+) create mode 100644 module/execution/css/view.de.css create mode 100644 module/execution/css/view.en.css diff --git a/module/execution/css/view.de.css b/module/execution/css/view.de.css new file mode 100644 index 0000000000..95d2c57d06 --- /dev/null +++ b/module/execution/css/view.de.css @@ -0,0 +1 @@ +#burnLegend {width: 220px;} diff --git a/module/execution/css/view.en.css b/module/execution/css/view.en.css new file mode 100644 index 0000000000..f827b02d88 --- /dev/null +++ b/module/execution/css/view.en.css @@ -0,0 +1 @@ +#burnLegend {width: 180px;} From bb38728a5450f5e7b4deffc425f5a3bb4503e307 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 6 Sep 2022 16:01:45 +0800 Subject: [PATCH 023/168] * Add delay label. --- module/execution/view/burn.html.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/module/execution/view/burn.html.php b/module/execution/view/burn.html.php index a1d2908d99..4b4c52a5cd 100644 --- a/module/execution/view/burn.html.php +++ b/module/execution/view/burn.html.php @@ -52,7 +52,12 @@
-

lang->execution->burn . '(' . zget($lang->execution->burnByList, $burnBy) . ')';?>

+

+ lang->execution->burn . '(' . zget($lang->execution->burnByList, $burnBy) . ')';?> + delay)):?> + execution->delayed;?> + +

From 25613fe0c6341038e25e6779a7bf890f760c2a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E8=83=A1=E6=88=90?= Date: Tue, 6 Sep 2022 09:05:22 +0000 Subject: [PATCH 024/168] Update model.php --- module/port/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/port/model.php b/module/port/model.php index 16f72d1fc0..c03c16c6ab 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -861,6 +861,7 @@ class portModel extends model * @param int $model * @param int $datas * @param string $filter + * @param string $fields * @access public * @return void */ From e551fa25e8121da29470f70c19df5ec75ecee3ed Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 6 Sep 2022 17:06:26 +0800 Subject: [PATCH 025/168] * Fix bug #26648. --- module/release/model.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/module/release/model.php b/module/release/model.php index 1911a6a79f..eb45eb8b68 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -335,10 +335,13 @@ class releaseModel extends model } elseif(($notify == 'ET' or $notify == 'PT') and !empty($release->build)) { - $type = $notify == 'ET' ? 'execution' : 'project'; - $members = $this->dao->select('t2.account')->from(TABLE_BUILD)->alias('t1') - ->leftJoin(TABLE_TEAM)->alias('t2')->on('t1.' . $type . '=t2.root') - ->where('t2.type')->eq($type) + $type = $notify == 'ET' ? 'execution' : 'project'; + $table = $notify == 'ET' ? TABLE_BUILD : TABLE_RELEASE; + $objectID = $notify == 'ET' ? $release->build : $release->id; + $members = $this->dao->select('t2.account')->from($table)->alias('t1') + ->leftJoin(TABLE_TEAM)->alias('t2')->on("t1.$type=t2.root and t2.type='$type'") + ->where('t1.id')->eq($objectID) + ->andWhere('t2.type')->eq($type) ->fetchPairs(); if(empty($members)) continue; From 66f95f43ab1d51a517126362f233c21f749295e3 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 6 Sep 2022 17:11:24 +0800 Subject: [PATCH 026/168] * Optimize code for bug #26648. --- module/release/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/release/model.php b/module/release/model.php index eb45eb8b68..1215b765bd 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -339,7 +339,7 @@ class releaseModel extends model $table = $notify == 'ET' ? TABLE_BUILD : TABLE_RELEASE; $objectID = $notify == 'ET' ? $release->build : $release->id; $members = $this->dao->select('t2.account')->from($table)->alias('t1') - ->leftJoin(TABLE_TEAM)->alias('t2')->on("t1.$type=t2.root and t2.type='$type'") + ->leftJoin(TABLE_TEAM)->alias('t2')->on("t1.$type=t2.root") ->where('t1.id')->eq($objectID) ->andWhere('t2.type')->eq($type) ->fetchPairs(); From 1166c0747e817602bdf7f7e99c797300638ec222 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Wed, 7 Sep 2022 00:40:56 +0000 Subject: [PATCH 027/168] * ZUI: remove ellipsis --- www/theme/zui/css/min.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/theme/zui/css/min.css b/www/theme/zui/css/min.css index 1798d598e3..710cd2bb95 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-31 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-09-07 * 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-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}.picker>.picker-selections>.picker-selection{text-overflow:unset;white-space:unset!important}.picker>.picker-selections>.picker-selection>.picker-selection-text{word-break:break-word}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li,.picker-drop-menu>.picker-option-list>.picker-option{text-overflow:unset;white-space:unset!important}.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.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-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:unset;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}.picker>.picker-selections>.picker-selection{text-overflow:unset;white-space:unset!important}.picker>.picker-selections>.picker-selection>.picker-selection-text{word-break:break-word}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li,.picker-drop-menu>.picker-option-list>.picker-option{text-overflow:unset;white-space:unset!important}.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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:unset;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;text-overflow:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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 From aa9e733921bda5f99f7cef1060dc93a37b3677c9 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 09:20:26 +0800 Subject: [PATCH 028/168] * fix bug #27286. --- module/task/model.php | 1 + module/task/view/recordestimate.html.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/module/task/model.php b/module/task/model.php index 2018c6e3d3..b5628c937c 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -3631,6 +3631,7 @@ class taskModel extends model $effort->left = $data->left; $effort->work = isset($data->work) ? $data->work : ''; $effort->vision = $this->config->vision; + $effort->order = isset($data->order) ? $data->order : 0; $this->dao->insert(TABLE_EFFORT)->data($effort)->autoCheck()->exec(); return $this->dao->lastInsertID(); diff --git a/module/task/view/recordestimate.html.php b/module/task/view/recordestimate.html.php index 47cbb483f3..5934918eaf 100644 --- a/module/task/view/recordestimate.html.php +++ b/module/task/view/recordestimate.html.php @@ -107,12 +107,12 @@
- + From 72591c381e1f40deb6276222f65177865465ee0d Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 7 Sep 2022 09:20:35 +0800 Subject: [PATCH 029/168] * Fix bug #27186. --- module/story/view/view.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index c0dfcfe80a..09f8e1fa85 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -420,7 +420,7 @@ foreach($relation as $id => $title) { echo "
  • " . ($canViewLinkStory ? html::a($this->createLink('story', 'view', "id=$id&version=0¶m=0&storyType=$relationType", '', true), "#$id $title", '', "class='iframe' data-width='80%'") : "#$id $title"); - echo html::a($this->createLink('story', 'linkStory', "storyID=$story->id&type=remove&linkedID=$id&browseType=&queryID=0&storyType=$story->type"), '', 'hiddenwin', "class='deleter hide removeButton'"); + echo html::a($this->createLink('story', 'linkStory', "storyID=$story->id&type=remove&linkedID=$id&browseType=&queryID=0&storyType=$story->type"), '', 'hiddenwin', "class='hide removeButton'"); } ?> type == 'story') ? $lang->story->requirement : $lang->story->story;?> From 2a7d73ef559c35a5e4a45fe55113aea6db3d6eef Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 10:06:23 +0800 Subject: [PATCH 030/168] * fix for upgrade for effort order. --- module/upgrade/model.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 8cb4de35ce..2bf331ea93 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -131,7 +131,6 @@ class upgradeModel extends model /* Means open source/pro upgrade to biz or max. */ if($this->config->edition != 'open') { - if($fromEdition == 'open') $this->convertEstToEffort(); if($fromEdition == 'open' or $fromEdition == 'pro') { $this->importBuildinModules(); @@ -7247,7 +7246,7 @@ class upgradeModel extends model /** * Process feedback module - * + * * @access public * @return void */ @@ -7297,7 +7296,7 @@ class upgradeModel extends model /* Delete history module */ $this->dao->delete()->from(TABLE_MODULE)->where('type')->eq('feedback')->andWhere('root')->eq(0)->exec(); } - + /* * Convert task team to table: zt_taskteam. * @@ -7319,7 +7318,8 @@ class upgradeModel extends model $this->dao->insert(TABLE_TASKTEAM)->data($oldTeam)->exec(); - $this->dao->update(TABLE_EFFORT)->set('`order`')->eq($order)->where('objectType')->eq('task')->andWhere('objectID')->eq($oldTeam->task)->exec(); + $this->dao->update(TABLE_TASKESTIMATE)->set('`order`')->eq($order)->where('task')->($oldTeam->task)->andWhere('account')->eq($oldTeam->account)->exec(); + $this->dao->update(TABLE_EFFORT)->set('`order`')->eq($order)->where('objectType')->eq('task')->andWhere('objectID')->eq($oldTeam->task)->andWhere('account')->eq($oldTeam->account)->exec(); $order ++; } } From a2946b28af142dba0d65ddd8e0a88882f60a41ad Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Wed, 7 Sep 2022 10:11:23 +0800 Subject: [PATCH 031/168] * Finish task #67793. --- module/my/control.php | 51 +++++++++++++++++++++++++++++++++++++++++- module/my/js/common.js | 2 +- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/module/my/control.php b/module/my/control.php index 3c9240313d..3a85807391 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -189,6 +189,11 @@ class my extends control $ncList = $this->my->getNcList('assignedToMe', 'id_desc', $pager, 'active'); $ncCount = $pager->recTotal; + /* Get the number of nc assigned to me. */ + $auditplanList = $this->loadModel('auditplan')->getList(0, 'mychecking', '', 'id_desc', $pager); + $auditplanCount = $pager->recTotal; + $qaCount = $ncCount + $auditplanCount; + /* Get the number of meetings assigned to me. */ $meetings = $this->meeting->getListByUser('futureMeeting', 'id_desc', 0, $pager); $meetingCount = $pager->recTotal; @@ -215,7 +220,7 @@ if(isMax !== 0) var issueCount = $issueCount; var riskCount = $riskCount; var reviewCount = $reviewCount; - var ncCount = $ncCount; + var qaCount = $qaCount; var meetingCount = $meetingCount; } @@ -986,6 +991,50 @@ EOF; $this->display(); } + /** + * My auditplans. + * + * @param string $browseType + * @param int $param + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function auditplan($browseType = 'myChecking', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + $this->loadModel('auditplan'); + $this->loadModel('process'); + $this->loadModel('pssp'); + $this->session->set('auditplanList', $this->app->getURI(true)); + + /* Set the pager. */ + $this->app->loadClass('pager', $static = true); + if($this->app->getViewType() == 'mhtml') $recPerPage = 10; + $pager = pager::init($recTotal, $recPerPage, $pageID); + + $auditplans = $this->auditplan->getList(0, $browseType, $param, $orderBy, $pager); + + $this->view->executions = $this->loadModel('execution')->getPairs(); + $this->view->processTypeList = $this->lang->process->classify; + $this->view->processes = $this->pssp->getProcesses(); + $this->view->activities = $this->pssp->getActivityPairs(); + $this->view->outputs = $this->pssp->getOutputPairs(); + + $this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->auditplan; + $this->view->position[] = $this->lang->my->auditplan; + $this->view->browseType = $browseType; + $this->view->auditplans = $auditplans; + $this->view->users = $this->loadModel('user')->getPairs('noclosed|noletter'); + $this->view->pager = $pager; + $this->view->orderBy = $orderBy; + $this->view->param = $param; + $this->view->mode = 'auditplan'; + $this->display(); + } + /** * My ncs. * diff --git a/module/my/js/common.js b/module/my/js/common.js index 8e7bd61e3c..a99c6a1bca 100644 --- a/module/my/js/common.js +++ b/module/my/js/common.js @@ -19,7 +19,7 @@ $(function() $("#subNavbar li[data-id='issue'] a").append('' + issueCount + ''); $("#subNavbar li[data-id='risk'] a").append('' + riskCount + ''); $("#subNavbar li[data-id='audit'] a").append('' + reviewCount + ''); - $("#subNavbar li[data-id='nc'] a").append('' + ncCount + ''); + $("#subNavbar li[data-id='nc'] a").append('' + qaCount + ''); $("#subNavbar li[data-id='myMeeting'] a").append('' + meetingCount + ''); } } From a8a703bf16a9e042f4da26e71f3ddc707065a357 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 11:07:49 +0800 Subject: [PATCH 032/168] * finish task #68203. --- api/v1/entries/stories.php | 3 +- module/block/control.php | 8 ---- module/common/model.php | 2 +- module/weekly/model.php | 76 ++++++++++++++++++++++---------------- 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/api/v1/entries/stories.php b/api/v1/entries/stories.php index 87128c60b8..ec46e039eb 100644 --- a/api/v1/entries/stories.php +++ b/api/v1/entries/stories.php @@ -68,7 +68,7 @@ class storiesEntry extends entry if(!$productID and isset($this->requestBody->product)) $productID = $this->requestBody->product; if(!$productID) return $this->sendError(400, 'Need product id.'); - $fields = 'title,spec,verify,reviewer,type,parent,plan,module,moduleOptionMenu,source,sourceNote,category,pri,estimate,mailto,keywords,notifyemail,uid,URS'; + $fields = 'title,spec,verify,reviewer,type,parent,plan,module,moduleOptionMenu,source,sourceNote,category,pri,estimate,mailto,keywords,notifyemail,uid,URS,status'; $this->batchSetPost($fields); /* If reviewer is not post, set needNotReview. */ @@ -76,6 +76,7 @@ class storiesEntry extends entry if(empty($reviewer)) $this->setPost('needNotReview', 1); $this->setPost('product', $productID); $this->setPost('type', $this->param('type', 'story')); + $this->setPost('status', $this->param('status', 'draft')); $control = $this->loadController('story', 'create'); $this->requireFields('title,spec,pri,category'); diff --git a/module/block/control.php b/module/block/control.php index be5f5c87d3..c078c7a1bc 100755 --- a/module/block/control.php +++ b/module/block/control.php @@ -1198,14 +1198,6 @@ class block extends control $weeks = $this->loadModel('weekly')->getWeekPairs($begin); $current = zget($weeks, $date, ''); - $task = $this->dao->select(" - sum(consumed) as totalConsumed, - sum(if(status != 'cancel' and status != 'closed', `left`, 0)) as totalLeft") - ->from(TABLE_TASK)->where('project')->eq($this->session->project) - ->andWhere('deleted')->eq(0) - ->andWhere('parent')->lt(1) - ->fetch(); - $this->weekly->save($this->session->project, $date); $this->view->pv = (float)$this->weekly->getPV($this->session->project, $today); diff --git a/module/common/model.php b/module/common/model.php index dd56301ffd..5bcbd38c37 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2911,7 +2911,7 @@ EOD; $this->loadModel('action')->create('user', $user->id, 'login'); $this->loadModel('score')->create('user', 'login'); - if($isFreepasswd) return print(js::locate($this->config->webRoot)); + if($isFreepasswd) die(js::locate($this->config->webRoot)); $this->session->set('ENTRY_CODE', $this->get->code); $this->session->set('VALID_ENTRY', md5(md5($this->get->code) . helper::getRemoteIp())); diff --git a/module/weekly/model.php b/module/weekly/model.php index 9b0c96b94b..af01ab0d55 100755 --- a/module/weekly/model.php +++ b/module/weekly/model.php @@ -155,10 +155,12 @@ class weeklyModel extends model */ public function getThisMonday($date) { - $day = date('w', strtotime($date)); + $timestamp = strtotime($date); + + $day = date('w', $timestamp); if($day == 0) $day = 7; - $days = $day - 1; - return date('Y-m-d', strtotime("$date - $days days")); + + return date('Y-m-d', $timestamp - (($day - 1) * 24 * 3600)); } /** @@ -171,7 +173,7 @@ class weeklyModel extends model public function getThisSunday($date) { $monday = $this->getThisMonday($date); - return date('Y-m-d', strtotime("$monday +6 days")); + return date('Y-m-d', strtotime($monday) + (6 * 24 * 3600)); } /** @@ -237,7 +239,7 @@ class weeklyModel extends model $tasks = $this->dao->select('*') ->from(TABLE_TASK) ->where('execution')->in($executionIdList) - ->andWhere("(status='done' or closedReason= 'done')") + ->andWhere("(status = 'done' or closedReason = 'done')") ->andWhere('finishedDate')->ge($monday) ->andWhere('finishedDate')->le($sunday) ->andWhere('deleted')->eq(0) @@ -258,7 +260,7 @@ class weeklyModel extends model if(!$date) $date = date('Y-m-d'); $monday = $this->getThisMonday($date); $sunday = $this->getThisSunday($date); - $nextMonday = date('Y-m-d', strtotime("$sunday +1 days")); + $nextMonday = date('Y-m-d', strtotime($sunday) + 24 * 3600); $executions = $this->loadModel('execution')->getList($project, 'all', $status = 'all', $limit = 0, $productID = 0, $branch = 0); $executionIdList = array_keys($executions); @@ -296,8 +298,9 @@ class weeklyModel extends model { if(!$date) $date = date('Y-m-d'); $sunday = $this->getThisSunday($date); - $nextMonday = date('Y-m-d', strtotime("$sunday +1 days")); - $sencondMondy = date('Y-m-d', strtotime("$sunday +8 days")); + $timestamp = strtotime($sunday); + $nextMonday = date('Y-m-d', $timestamp + 24 * 3600); + $sencondMondy = date('Y-m-d', $timestamp + (8 * 24 * 3600)); $executions = $this->loadModel('execution')->getList($project, 'all', $status = 'all', $limit = 0, $productID = 0, $branch = 0); $executionIdList = array_keys($executions); @@ -305,7 +308,7 @@ class weeklyModel extends model $tasks = $this->dao->select('*') ->from(TABLE_TASK) ->where('execution')->in($executionIdList) - ->andWhere("((deadline > '$nextMonday' and deadline < '$sencondMondy') or (estStarted > '$nextMonday' and estStarted < '$sencondMondy'))") + ->andWhere("((deadline >= '$nextMonday' and deadline < '$sencondMondy') or (estStarted >= '$nextMonday' and estStarted < '$sencondMondy') or (estStarted < '$nextMonday' and deadline > '$sencondMondy'))") ->andWhere('deleted')->eq(0) ->fetchAll('id'); @@ -325,8 +328,9 @@ class weeklyModel extends model if(!$date) $date = date('Y-m-d'); $sunday = $this->getThisSunday($date); - $nextMonday = date('Y-m-d', strtotime("$sunday +1 days")); - $sencondMondy = date('Y-m-d', strtotime("$sunday +8 days")); + $timestamp = strtotime($sunday); + $nextMonday = date('Y-m-d', $timestamp + 24 * 3600); + $sencondMondy = date('Y-m-d', $timestamp + (8 * 24 * 3600)); $executions = $this->loadModel('execution')->getList($project, 'all', $status = 'all', $limit = 0, $productID = 0, $branch = 0); $executionIdList = array_keys($executions); @@ -351,7 +355,7 @@ class weeklyModel extends model { if(!$date) $date = date('Y-m-d'); $monday = $this->getThisMonday($date); - $nextMonday = date('Y-m-d', strtotime("$monday +7 days")); + $nextMonday = date('Y-m-d', strtotime($monday) + (7 * 24 * 3600)); $executions = $this->loadModel('execution')->getList($project); $executionIdList = array_keys($executions); @@ -381,14 +385,12 @@ class weeklyModel extends model $monday = $this->getThisMonday($date); $sunday = $this->getThisSunday($date); $lastDay = $this->getLastDay($date); - $nextMonday = date('Y-m-d', strtotime("$sunday +1 days")); + $nextMonday = date('Y-m-d', strtotime($sunday) + 24 * 3600); $workdays = $this->loadModel('holiday')->getActualWorkingDays($monday, $sunday); - - $executions = $this->loadModel('execution')->getList($projectID); - $executionIdList = array_keys($executions); + $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id'); $tasks = $this->dao->select('*')->from(TABLE_TASK) - ->where('execution')->in($executionIdList) + ->where('execution')->in(array_keys($executions)) ->andWhere("parent")->ge(0) ->andWhere("deleted")->eq(0) ->andWhere("((estStarted >= '$monday' AND estStarted < '$nextMonday') OR (deadline >= '$monday' AND deadline < '$nextMonday') OR (estStarted < '$monday' AND deadline > '$nextMonday'))") @@ -397,18 +399,30 @@ class weeklyModel extends model $PV = 0; foreach($tasks as $task) { - if($task->estStarted == '0000-00-00') $task->estStarted = date('Y-m-d', strtotime($task->openedDate)); - if($task->deadline < $nextMonday) + if(helper::isZeroDate($task->estStarted)) $task->estStarted = date('Y-m-d', strtotime($task->openedDate)); + if(helper::isZeroDate($task->deadline)) { - $PV += $task->estimate; - continue; + $execution = $executions[$task->execution]; + $task->deadline = helper::isZeroDate($execution->realEnd) ? $execution->end : $execution->realEnd; + if(helper::isZeroDate($task->finishedDate)) $task->deadline = date('Y-m-d', strtotime($task->finishedDate)); } - $fullDays = $this->loadModel('holiday')->getActualWorkingDays($task->estStarted, $task->deadline); - $passedDays = $this->loadModel('holiday')->getActualWorkingDays($task->estStarted, $sunday); + $fullDays = $this->loadModel('holiday')->getActualWorkingDays($task->estStarted, $task->deadline); + if($task->estStarted < $monday and $task->deadline >= $nextMonday) + { + $weekActualDays = $workdays; + } + elseif($task->estStarted >= $monday and $task->estStarted < $nextMonday) + { + $weekActualDays = $this->loadModel('holiday')->getActualWorkingDays($task->estStarted, $task->deadline >= $nextMonday ? $sunday : $task->deadline); + } + elseif($task->deadline >= $monday and $task->deadline < $nextMonday) + { + $weekActualDays = $this->loadModel('holiday')->getActualWorkingDays($monday, $task->deadline); + } - if(empty($fullDays) or empty($passedDays) or empty($task->estimate)) continue; - $PV += count($passedDays) * $task->estimate / count($fullDays); + if(empty($fullDays) or empty($weekActualDays) or empty($task->estimate)) continue; + $PV += round(count($weekActualDays) / count($fullDays) * $task->estimate, 2); } return sprintf("%.2f",$PV); @@ -434,18 +448,17 @@ class weeklyModel extends model $monday = $this->getThisMonday($date); $sunday = $this->getThisSunday($date); $lastDay = $this->getLastDay($date); - $nextMonday = date('Y-m-d', strtotime("$sunday +1 days")); + $nextMonday = date('Y-m-d', strtotime($sunday) + 24 * 3600); $tasks = $this->dao->select('*') ->from(TABLE_TASK) ->where('execution')->in($executionIdList) ->andWhere('consumed')->gt(0) - ->andWhere("estStarted")->ge($monday) - ->andWhere("estStarted")->lt($nextMonday) + ->andWhere("((estStarted >= '$monday' AND estStarted < '$nextMonday') OR (deadline >= '$monday' AND deadline < '$nextMonday') OR (estStarted < '$monday' AND deadline > '$nextMonday'))") ->andWhere("parent")->ge(0) ->andWhere("deleted")->eq(0) ->andWhere('status')->ne('cancel') - ->fetchAll('id'); + ->query(); $EV = 0; foreach($tasks as $task) @@ -480,8 +493,8 @@ class weeklyModel extends model if(!$date) $date = date('Y-m-d'); $monday = $this->getThisMonday($date); - $nextMonday = date('Y-m-d', strtotime("$monday +7 days")); - $executions = $this->loadModel('execution')->getList($project, 'all', 'all', 0, 0, 0); + $nextMonday = date('Y-m-d', strtotime($monday) + (7 * 24 * 3600)); + $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id'); $executionIdList = array_keys($executions); $taskIdList = $this->dao->select('id')->from(TABLE_TASK) ->where('execution')->in($executionIdList) @@ -493,7 +506,6 @@ class weeklyModel extends model ->from(TABLE_EFFORT) ->where('objectType')->eq('task') ->andWhere('objectID')->in($taskIdList) - ->andWhere('execution')->in($executionIdList) ->andWhere('date')->ge($monday) ->andWhere('date')->lt($nextMonday) ->andWhere('deleted')->eq('0') From d7dfd0fd3be63b7831fcc5a71996eb66ebeea6f6 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 11:55:48 +0800 Subject: [PATCH 033/168] * fix bug. --- module/weekly/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/weekly/model.php b/module/weekly/model.php index af01ab0d55..4610cdb712 100755 --- a/module/weekly/model.php +++ b/module/weekly/model.php @@ -494,7 +494,7 @@ class weeklyModel extends model $monday = $this->getThisMonday($date); $nextMonday = date('Y-m-d', strtotime($monday) + (7 * 24 * 3600)); - $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id'); + $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($project)->fetchAll('id'); $executionIdList = array_keys($executions); $taskIdList = $this->dao->select('id')->from(TABLE_TASK) ->where('execution')->in($executionIdList) From 62b51f7c9e5cdd5f7dfab3f6bf0b24fd16a1d59a Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 7 Sep 2022 14:20:33 +0800 Subject: [PATCH 034/168] * Code for task#66954,66959. --- db/update17.6.sql | 1 + db/zentao.sql | 1 + module/common/lang/de.php | 1 - module/common/lang/en.php | 1 - module/common/lang/fr.php | 1 - module/common/lang/vi.php | 1 - module/common/lang/zh-cn.php | 1 - module/file/model.php | 129 ++++++++++-------------------- module/story/control.php | 21 ++--- module/story/model.php | 87 ++++++++++---------- module/story/view/change.html.php | 2 +- module/story/view/edit.html.php | 4 +- module/upgrade/model.php | 20 ++--- 13 files changed, 100 insertions(+), 170 deletions(-) diff --git a/db/update17.6.sql b/db/update17.6.sql index 1d60b73fd5..fbf496ac27 100644 --- a/db/update17.6.sql +++ b/db/update17.6.sql @@ -13,3 +13,4 @@ CREATE TABLE `zt_taskteam` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `zt_taskestimate` ADD `order` tinyint unsigned NULL DEFAULT '0'; ALTER TABLE `zt_effort` ADD `order` tinyint unsigned NOT NULL DEFAULT '0' AFTER `end`; +ALTER TABLE `zt_storyspec` ADD `files` text NOT NULL AFTER `verify`; diff --git a/db/zentao.sql b/db/zentao.sql index 8ed0a0d092..81e7813a04 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1504,6 +1504,7 @@ CREATE TABLE IF NOT EXISTS `zt_storyspec` ( `title` varchar(255) NOT NULL, `spec` mediumtext NOT NULL, `verify` mediumtext NOT NULL, + `files` text NOT NULL, UNIQUE KEY `story` (`story`,`version`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_storystage`; diff --git a/module/common/lang/de.php b/module/common/lang/de.php index 3de060ef37..91ed8d50d1 100644 --- a/module/common/lang/de.php +++ b/module/common/lang/de.php @@ -100,7 +100,6 @@ $lang->saveSuccess = 'Gespeichert'; $lang->importSuccess = 'Gespeichert'; $lang->fail = 'Fehlgeschlagen'; $lang->addFiles = 'Hinzufügen '; -$lang->deleteFiles = 'Anhang gelöscht '; $lang->files = 'Datei '; $lang->pasteText = 'Einfügen'; $lang->uploadImages = 'Hochladen'; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index c4bba1c349..4dac83fa31 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -100,7 +100,6 @@ $lang->saveSuccess = 'Saved'; $lang->importSuccess = 'Saved'; $lang->fail = 'Fail'; $lang->addFiles = 'Added Files '; -$lang->deleteFiles = 'Deleted Files '; $lang->files = 'Files '; $lang->pasteText = 'Multi-line Paste'; $lang->uploadImages = 'Multi-image Upload'; diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php index aec37d0a92..67caf6b5fd 100644 --- a/module/common/lang/fr.php +++ b/module/common/lang/fr.php @@ -100,7 +100,6 @@ $lang->saveSuccess = 'Sauvegardé'; $lang->importSuccess = 'Sauvé'; $lang->fail = 'Echec'; $lang->addFiles = 'Fichiers ajoutés '; -$lang->deleteFiles = 'Pièce jointe supprimée '; $lang->files = 'Fichiers '; $lang->pasteText = 'Collage Multi-lignes'; $lang->uploadImages = 'Upload Multi-images'; diff --git a/module/common/lang/vi.php b/module/common/lang/vi.php index 0113ca2d00..dd4c0ef845 100644 --- a/module/common/lang/vi.php +++ b/module/common/lang/vi.php @@ -79,7 +79,6 @@ $lang->saveSuccess = 'Đã lưu'; $lang->importSuccess = 'Đã lưu'; $lang->fail = 'Thất bại'; $lang->addFiles = 'Tập tin đã thêm '; -$lang->deleteFiles = 'Tháo ảnh '; $lang->files = 'Files '; $lang->pasteText = 'Dán nhiều dòng'; $lang->uploadImages = 'Tải lên nhiều ảnh'; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 8080576b61..a27488d59e 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -100,7 +100,6 @@ $lang->saveSuccess = '保存成功'; $lang->importSuccess = '导入成功'; $lang->fail = '失败'; $lang->addFiles = '上传了附件 '; -$lang->deleteFiles = '删除了附件 '; $lang->files = '附件 '; $lang->pasteText = '多项录入'; $lang->uploadImages = '多图上传 '; diff --git a/module/file/model.php b/module/file/model.php index d664584737..1d61646733 100755 --- a/module/file/model.php +++ b/module/file/model.php @@ -46,25 +46,23 @@ class fileModel extends model ->where('objectType')->eq($objectType) ->andWhere('objectID')->eq((int)$objectID) ->andWhere('extra')->ne('editor') - ->beginIF(strpos('story,requirement', $objectType) !== false and $extra)->andWhere('extra')->like("%,$extra,%")->fi() - ->beginIF(strpos('story,requirement', $objectType) === false and $extra)->andWhere('extra')->eq($extra)->fi() + ->beginIF($extra)->andWhere('extra')->eq($extra) ->andWhere('deleted')->eq('0') ->orderBy('id') ->fetchAll('id'); foreach($files as $file) { - if($objectType != 'traincourse' and $objectType != 'traincontents') - { - $realPathName = $this->getRealPathName($file->pathname); - $file->realPath = $this->savePath . $realPathName; - $file->webPath = $this->webPath . $realPathName; - } - else + if($objectType == 'traincourse' or $objectType == 'traincontents') { $file->realPath = $this->app->getWwwRoot() . 'data/course/' . $file->pathname; $file->webPath = 'data/course/' . $file->pathname; + continue; } + + $realPathName = $this->getRealPathName($file->pathname); + $file->realPath = $this->savePath . $realPathName; + $file->webPath = $this->webPath . $realPathName; } return $files; @@ -81,33 +79,52 @@ class fileModel extends model { $file = $this->dao->findById($fileID)->from(TABLE_FILE)->fetch(); if(empty($file)) return false; - if($file->objectType != 'traincourse' and $file->objectType != 'traincontents') - { - $realPathName = $this->getRealPathName($file->pathname); - $file->realPath = $this->savePath . $realPathName; - $file->webPath = $this->webPath . $realPathName; - } - else - { - $file->realPath = $this->app->getWwwRoot() . 'data/course/' . $file->pathname; - $file->webPath = $this->app->getWebRoot() . 'data/course/' . $file->pathname; - } - if($file->objectType != 'traincourse' and $file->objectType != 'traincontents') - { - $realPathName = $this->getRealPathName($file->pathname); - $file->realPath = $this->savePath . $realPathName; - $file->webPath = $this->webPath . $realPathName; - } - else + if($file->objectType == 'traincourse' or $file->objectType == 'traincontents') { $file->realPath = $this->app->getWwwRoot() . 'data/course/' . $file->pathname; $file->webPath = 'data/course/' . $file->pathname; + + return $file; } + $realPathName = $this->getRealPathName($file->pathname); + $file->realPath = $this->savePath . $realPathName; + $file->webPath = $this->webPath . $realPathName; + return $file; } + /** + * Get files by ID list. + * + * @param int $fileIdList + * @access public + * @return array + */ + public function getByIdList($fileIdList) + { + if(empty($fileIdList)) return array(); + + $files = $this->dao->select('*')->from(TABLE_FILE)->where('id')->in($fileIdList)->orderBy('id')->fetchAll('id'); + + foreach($files as $file) + { + if($file->objectType == 'traincourse' or $file->objectType == 'traincontents') + { + $file->realPath = $this->app->getWwwRoot() . 'data/course/' . $file->pathname; + $file->webPath = 'data/course/' . $file->pathname; + continue; + } + + $realPathName = $this->getRealPathName($file->pathname); + $file->realPath = $this->savePath . $realPathName; + $file->webPath = $this->webPath . $realPathName; + } + + return $files; + } + /** * Save upload. * @@ -1119,62 +1136,4 @@ class fileModel extends model $this->dao->update(TABLE_CASE)->set('`fromCaseVersion`')->eq($fromcaseVersion)->where('`fromCaseID`')->eq($file->objectID)->exec(); } } - - /** - * Update version of story files. - * - * @param int $storyID - * @param int $storyVersion - * @param array $deleteFiles - * @access public - * @return void - */ - public function updateStoryFileVersion($storyID, $storyVersion, $deleteFiles = array()) - { - $oldStoryVersion = $storyVersion - 1; - $this->dao->update(TABLE_FILE)->set("extra = CONCAT(extra, '$storyVersion,')") - ->where('objectType')->in('story,requirement') - ->andWhere('objectID')->eq($storyID) - ->andWhere('extra')->like("%,$oldStoryVersion,%") - ->beginIF(!empty($deleteFiles))->andWhere('id')->notin($deleteFiles)->fi() - ->exec(); - } - - /** - * Delete story file. - * - * @param int $storyID - * @param int $storyVersion - * @param array $deleteFiles - * @access public - * @return void - */ - public function deleteStoryFile($storyID, $storyVersion, $deleteFiles = array()) - { - $deleteFileList = $this->dao->select('*')->from(TABLE_FILE) - ->where('objectType')->in('story,requirement') - ->andWhere('objectID')->eq($storyID) - ->andWhere('extra')->eq(",$storyVersion,") - ->beginIF(!empty($deleteFiles))->andWhere('id')->in($deleteFiles)->fi() - ->fetchAll('id'); - - if(!empty($deleteFileList)) - { - $this->dao->delete()->from(TABLE_FILE)->where('id')->in(array_keys($deleteFileList))->exec(); - - foreach($deleteFileList as $file) - { - $realPathName = $this->getRealPathName($file->pathname); - @unlink($realPathName); - } - } - - /* When the file is in multiple story versions, 'extra' need delete the version to be deleted. */ - $this->dao->update(TABLE_FILE)->set("extra = REPLACE(extra, '$storyVersion,', '')") - ->where('objectType')->in('story,requirement') - ->andWhere('objectID')->eq($storyID) - ->andWhere('extra')->like("%,$storyVersion,%") - ->beginIF(!empty($deleteFiles))->andWhere('id')->in($deleteFiles)->fi() - ->exec(); - } } diff --git a/module/story/control.php b/module/story/control.php index 9153b27453..b29572e3e1 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -863,7 +863,6 @@ class story extends control $this->view->reviewers = array_keys($reviewerList); $this->view->reviewedReviewer = $reviewedReviewer; $this->view->productReviewers = $this->user->getPairs('noclosed|nodeleted', array_keys($reviewerList), 0, $productReviewers); - $this->view->files = $this->file->getByObject($story->type, $storyID, $story->version); $this->display(); } @@ -1080,25 +1079,17 @@ class story extends control $this->loadModel('file'); if(!empty($_POST)) { - $deleteFiles = isset($_POST['deleteFiles']) ? $this->file->getPairs($_POST['deleteFiles'], 'title') : array(); - $changes = $this->story->change($storyID); + $changes = $this->story->change($storyID); if(dao::isError()) { if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'message' => dao::getError())); return print(js::error(dao::getError())); } - $story = $this->story->getByID($storyID); - $version = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch('version'); - $files = $this->file->saveUpload($story->type, $storyID, ",$version,"); - if(empty($files) and $this->post->uid != '' and isset($_SESSION['album']['used'][$this->post->uid])) $files = $this->file->getPairs($_SESSION['album']['used'][$this->post->uid]); - - if($this->post->comment != '' or !empty($changes) or !empty($files) or !empty($deleteFiles)) + if($this->post->comment != '' or !empty($changes)) { - $action = (!empty($changes) or !empty($files)) ? 'Changed' : 'Commented'; - $fileAction = empty($files) ? '' : $this->lang->addFiles . join(',', $files) . "\n" ; - $fileAction .= empty($deleteFiles) ? '' : $this->lang->deleteFiles . join(',', $deleteFiles) . "\n"; - $actionID = $this->action->create('story', $storyID, $action, $fileAction . $this->post->comment); + $action = !empty($changes) ? 'Changed' : 'Commented'; + $actionID = $this->action->create('story', $storyID, $action, $this->post->comment); $this->action->logHistory($actionID, $changes); } @@ -1148,7 +1139,7 @@ class story extends control $this->app->loadLang('testcase'); $this->app->loadLang('execution'); - $story = $this->story->getById($storyID); + $story = $this->view->story; $reviewer = $this->story->getReviewerPairs($storyID, $story->version); $product = $this->loadModel('product')->getByID($story->product); @@ -1163,7 +1154,6 @@ class story extends control $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->file->getByObject($story->type, $storyID, $story->version); $this->display(); } @@ -1250,7 +1240,6 @@ class story extends control $this->story->replaceURLang($story->type); - $story->files = $this->loadModel('file')->getByObject($story->type, $storyID, $version); $product = $this->dao->findById($story->product)->from(TABLE_PRODUCT)->fields('name, id, type, status')->fetch(); $plan = $this->dao->findById($story->plan)->from(TABLE_PRODUCTPLAN)->fetch('title'); $bugs = $this->dao->select('id,title,status,pri,severity')->from(TABLE_BUG)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll(); diff --git a/module/story/model.php b/module/story/model.php index 93040402d1..f75bae1f01 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -30,18 +30,20 @@ class storyModel extends model ->fetch(); if(!$story) return false; + $this->loadModel('file'); if(helper::isZeroDate($story->closedDate)) $story->closedDate = ''; if($version == 0) $version = $story->version; - $spec = $this->dao->select('title,spec,verify')->from(TABLE_STORYSPEC)->where('story')->eq($storyID)->andWhere('version')->eq($version)->fetch(); + $spec = $this->dao->select('title,spec,verify,files')->from(TABLE_STORYSPEC)->where('story')->eq($storyID)->andWhere('version')->eq($version)->fetch(); $story->title = isset($spec->title) ? $spec->title : ''; $story->spec = isset($spec->spec) ? $spec->spec : ''; $story->verify = isset($spec->verify) ? $spec->verify : ''; + $story->files = isset($spec->files) ? $this->file->getByIdList($spec->files) : ''; if(!empty($story->fromStory)) $story->sourceName = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($story->fromStory)->fetch('title'); /* Check parent story. */ if($story->parent > 0) $story->parentName = $this->dao->findById($story->parent)->from(TABLE_STORY)->fetch('title'); - $story = $this->loadModel('file')->replaceImgURL($story, 'spec,verify'); + $story = $this->file->replaceImgURL($story, 'spec,verify'); if($setImgSize) $story->spec = $this->file->setImgSize($story->spec); if($setImgSize) $story->verify = $this->file->setImgSize($story->verify); @@ -264,21 +266,22 @@ class storyModel extends model $this->subdivide($story->parent, $stories); } - $this->file->updateObjectID($this->post->uid, $storyID, $story->type); - $this->file->saveUpload($story->type, $storyID, ',1,'); - if(!empty($story->plan)) { $this->updateStoryOrderOfPlan($storyID, $story->plan); // Set story order in this plan. $this->loadModel('action')->create('productplan', $story->plan, 'linkstory', '', $storyID); } + $this->file->updateObjectID($this->post->uid, $storyID, $story->type); + $files = $this->file->saveUpload($story->type, $storyID, 1); + $data = new stdclass(); $data->story = $storyID; $data->version = 1; $data->title = $story->title; $data->spec = $story->spec; $data->verify = $story->verify; + $data->files = join(',', array_keys($files)); $this->dao->insert(TABLE_STORYSPEC)->data($data)->exec(); /* Save the story reviewer to storyreview table. */ @@ -658,11 +661,7 @@ class storyModel extends model public function change($storyID) { $specChanged = false; - $oldStory = $this->dao->findById((int)$storyID)->from(TABLE_STORY)->fetch(); - $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 : ''; + $oldStory = $this->getById($storyID); if(!empty($_POST['lastEditedDate']) and $oldStory->lastEditedDate != $this->post->lastEditedDate) { @@ -688,12 +687,13 @@ class storyModel extends model $oldStoryReviewers = $this->getReviewerPairs($storyID, $oldStory->version); $_POST['reviewer'] = isset($_POST['reviewer']) ? $_POST['reviewer'] : array(); $reviewerHasChanged = (array_diff(array_keys($oldStoryReviewers), $_POST['reviewer']) or array_diff($_POST['reviewer'], array_keys($oldStoryReviewers))); - if($story->spec != $oldStory->spec or $story->verify != $oldStory->verify or $story->title != $oldStory->title or $this->loadModel('file')->getCount() or $reviewerHasChanged or isset($_POST['deleteFiles'])) $specChanged = true; + if($story->spec != $oldStory->spec or $story->verify != $oldStory->verify or $story->title != $oldStory->title or $this->loadModel('file')->getCount() or $reviewerHasChanged or isset($story->deleteFiles)) $specChanged = true; $now = helper::now(); $story = fixer::input('post') ->callFunc('title', 'trim') ->setDefault('lastEditedBy', $this->app->user->account) + ->setDefault('deleteFiles', array()) ->add('id', $storyID) ->add('lastEditedDate', $now) ->setIF($specChanged, 'version', $oldStory->version + 1) @@ -706,11 +706,11 @@ class storyModel extends model ->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,deleteFiles') + ->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') + $story = $this->file->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid); + $this->dao->update(TABLE_STORY)->data($story, 'spec,verify,deleteFiles') ->autoCheck() ->batchCheck($this->config->story->change->requiredFields, 'notempty') ->checkFlow() @@ -720,15 +720,23 @@ class storyModel extends model { if($specChanged) { + $this->file->updateObjectID($this->post->uid, $storyID, 'story'); + $addedFiles = $this->file->saveUpload($oldStory->type, $storyID, $story->version); + $addedFiles = empty($addedFiles) ? '' : join(',', array_keys($addedFiles)) . ','; + $storyFiles = $oldStory->files = join(',', array_keys($oldStory->files)); + foreach($story->deleteFiles as $fileID) $storyFiles = str_replace(",$fileID,", ',', ",$storyFiles,"); + + $story = $this->getById($storyID); + $data = new stdclass(); $data->story = $storyID; - $data->version = $oldStory->version + 1; + $data->version = $story->version; $data->title = $story->title; $data->spec = $story->spec; $data->verify = $story->verify; + $data->files = $story->files = $addedFiles . trim($storyFiles, ','); $this->dao->insert(TABLE_STORYSPEC)->data($data)->exec(); - $story = $this->getById($storyID); /* IF is story and has changed, update its relation version to new. */ if($oldStory->type == 'story') { @@ -763,13 +771,8 @@ class storyModel extends model $oldStory->reviewers = implode(',', array_keys($oldStoryReviewers)); $story->reviewers = implode(',', $_POST['reviewer']); } - - $deleteFiles = isset($_POST['deleteFiles']) ? $_POST['deleteFiles'] : array(); - if(!empty($deleteFiles)) $this->file->deleteStoryFile($story->id, $story->version, $deleteFiles); - $this->file->updateStoryFileVersion($story->id, $story->version, $deleteFiles); } - $this->file->updateObjectID($this->post->uid, $storyID, 'story'); return common::createChanges($oldStory, $story); } } @@ -784,7 +787,7 @@ class storyModel extends model public function update($storyID) { $now = helper::now(); - $oldStory = $this->dao->select('*')->from(TABLE_STORY)->where('id')->eq($storyID)->fetch(); + $oldStory = $this->getById($storyID); if(!empty($_POST['lastEditedDate']) and $oldStory->lastEditedDate != $this->post->lastEditedDate) { dao::$errors[] = $this->lang->error->editedByOther; @@ -797,11 +800,6 @@ 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') @@ -812,6 +810,7 @@ class storyModel extends model ->setDefault('spec', $oldStory->spec) ->setDefault('verify', $oldStory->verify) ->setDefault('mailto', '') + ->setDefault('deleteFiles', array()) ->add('id', $storyID) ->add('lastEditedDate', $now) ->setDefault('plan,notifyEmail', '') @@ -831,7 +830,7 @@ class storyModel extends model ->join('linkStories', ',') ->join('linkRequirements', ',') ->join('childStories', ',') - ->remove('files,labels,comment,contactListMenu,stages,reviewer,needNotReview,deleteFiles') + ->remove('files,labels,comment,contactListMenu,stages,reviewer,needNotReview') ->get(); if($oldStory->type == 'story' and !isset($story->linkStories)) $story->linkStories = ''; @@ -904,7 +903,7 @@ class storyModel extends model } $this->dao->update(TABLE_STORY) - ->data($story, 'reviewers,spec,verify,finalResult') + ->data($story, 'reviewers,spec,verify,finalResult,deleteFiles') ->autoCheck() ->checkIF(isset($story->closedBy), 'closedReason', 'notempty') ->checkIF(isset($story->closedReason) and $story->closedReason == 'done', 'stage', 'notempty') @@ -916,12 +915,20 @@ class storyModel extends model if(!dao::isError()) { - if($story->spec != $oldStory->spec or $story->verify != $oldStory->verify or $story->title != $oldStory->title) + $this->file->updateObjectID($this->post->uid, $storyID, 'story'); + $addedFiles = $this->file->saveUpload($oldStory->type, $storyID, $oldStory->version); + + if($story->spec != $oldStory->spec or $story->verify != $oldStory->verify or $story->title != $oldStory->title or !empty($story->deleteFiles) or !empty($addedFiles)) { + $addedFiles = empty($addedFiles) ? '' : join(',', array_keys($addedFiles)) . ','; + $storyFiles = $oldStory->files = join(',', array_keys($oldStory->files)); + foreach($story->deleteFiles as $fileID) $storyFiles = str_replace(",$fileID,", ',', ",$storyFiles,"); + $data = new stdclass(); $data->title = $story->title; $data->spec = $story->spec; $data->verify = $story->verify; + $data->files = $story->files = $addedFiles . trim($storyFiles, ','); $this->dao->update(TABLE_STORYSPEC)->data($data)->where('story')->eq((int)$storyID)->andWhere('version')->eq($oldStory->version)->exec(); } @@ -1040,21 +1047,13 @@ class storyModel extends model } } - $changes = common::createChanges($oldStory, $story); - $deleteFiles = isset($_POST['deleteFiles']) ? $this->file->getPairs($_POST['deleteFiles'], 'title') : array(); - - if(isset($_POST['deleteFiles'])) $this->file->deleteStoryFile($storyID, $oldStory->version, $_POST['deleteFiles']); - $this->file->updateObjectID($this->post->uid, $storyID, 'story'); - - $files = $this->file->saveUpload($oldStory->type, $storyID, ",$oldStory->version,"); + $changes = common::createChanges($oldStory, $story); if(empty($files) and $this->post->uid != '' and isset($_SESSION['album']['used'][$this->post->uid])) $files = $this->file->getPairs($_SESSION['album']['used'][$this->post->uid]); - if($this->post->comment != '' or !empty($changes) or !empty($files) or !empty($deleteFiles)) + if($this->post->comment != '' or !empty($changes)) { - $action = (!empty($changes) or !empty($files)) ? 'Edited' : 'Commented'; - $fileAction = empty($files) ? '' : $this->lang->addFiles . join(',', $files) . "\n" ; - $fileAction .= empty($deleteFiles) ? '' : $this->lang->deleteFiles . join(',', $deleteFiles) . "\n"; - $actionID = $this->action->create('story', $storyID, $action, $fileAction . $this->post->comment); + $action = !empty($changes) ? 'Edited' : 'Commented'; + $actionID = $this->action->create('story', $storyID, $action, $this->post->comment); $this->action->logHistory($actionID, $changes); if(isset($story->finalResult)) $this->recordReviewAction($story); @@ -1609,8 +1608,6 @@ class storyModel extends model /* 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->loadModel('file')->deleteStoryFile($storyID, $story->version); } /** @@ -5620,8 +5617,6 @@ class storyModel extends model /* Delete versions that is after this version. */ $this->dao->delete()->from(TABLE_STORYSPEC)->where('story')->eq($story->id)->andWHere('version')->in($oldStory->version)->exec(); $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($story->id)->andWhere('version')->in($oldStory->version)->exec(); - - $this->file->deleteStoryFile($story->id, $oldStory->version); } if($result == 'reject') diff --git a/module/story/view/change.html.php b/module/story/view/change.html.php index 157e16aed3..af6fcf4670 100644 --- a/module/story/view/change.html.php +++ b/module/story/view/change.html.php @@ -68,7 +68,7 @@
  • diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php index 62528e92cd..9ee361c6cb 100644 --- a/module/story/view/edit.html.php +++ b/module/story/view/edit.html.php @@ -85,13 +85,13 @@ status) !== false ? html::textarea('verify', htmlSpecialString($story->verify), "rows='5' class='form-control'") : $story->verify;?> - status) === false and empty($files)) ? false : true;?> + status) === false and empty($story->files)) ? false : true;?>
    attatch;?>
    status) !== false ? true : false;?> - fetch('file', 'printFiles', array('files' => $files, 'fieldset' => 'false', 'object' => $story, 'method' => 'edit', 'showDelete' => $canChangeFile));?> + fetch('file', 'printFiles', array('files' => $story->files, 'fieldset' => 'false', 'object' => $story, 'method' => 'edit', 'showDelete' => $canChangeFile));?> fetch('file', 'buildform') : '';?>
    diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 2bf331ea93..e837f56d03 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -7220,27 +7220,18 @@ class upgradeModel extends model { $storyFileList = $this->dao->select('*')->from(TABLE_FILE)->where('objectType')->in('story,requirement')->andWhere('extra')->ne('editor')->fetchAll('id'); - /* Get story version. */ - $storyIDList = array(); - foreach($storyFileList as $file) $storyIDList[$file->objectID] = $file->objectID; - $storyVersionList = $this->dao->select('id,version')->from(TABLE_STORY)->where('id')->in($storyIDList)->fetchPairs(); - + $storyFiles = array(); foreach($storyFileList as $file) { if(!is_numeric($file->extra)) continue; - $fileExtra = ''; - $storyVersion = $storyVersionList[$file->objectID]; - if($file->extra != $storyVersion) - { - for($i = $file->extra; $i <= $storyVersion; $i ++) $fileExtra .= ",$i"; - $fileExtra .= ','; - } - if(empty($fileExtra)) $fileExtra = ",$file->extra,"; + if(!isset($storyFiles[$file->objectID])) $storyFiles[$file->objectID] = ''; - $this->dao->update(TABLE_FILE)->set('extra')->eq($fileExtra)->where('id')->eq($file->id)->exec(); + $storyFiles[$file->objectID] .= "$file->id,"; } + foreach($storyFiles as $storyID => $files) $this->dao->update(TABLE_STORYSPEC)->set('files')->eq($files)->where('story')->eq($storyID)->exec(); + return true; } @@ -7252,7 +7243,6 @@ class upgradeModel extends model */ public function processFeedbackModule() { - $products = $this->dao->select('id, name')->from(TABLE_PRODUCT)->fetchAll(); $modules = $this->dao->select('*')->from(TABLE_MODULE)->where('type')->eq('feedback')->andWhere('root')->eq(0)->fetchAll('id'); $feedbacks = $this->dao->select('*')->from(TABLE_FEEDBACK)->fetchAll(); From 334ecb79831ddd2a565ef113838c939bf859dda3 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 7 Sep 2022 14:41:48 +0800 Subject: [PATCH 035/168] * Fix bug. --- module/story/model.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index f75bae1f01..115e81a7e9 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -709,7 +709,7 @@ class storyModel extends model ->remove('files,labels,reviewer,comment,needNotReview,uid') ->get(); - $story = $this->file->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid); + $story = $this->loadModel('file')->processImgURL($story, $this->config->story->editor->change['id'], $this->post->uid); $this->dao->update(TABLE_STORY)->data($story, 'spec,verify,deleteFiles') ->autoCheck() ->batchCheck($this->config->story->change->requiredFields, 'notempty') @@ -726,8 +726,6 @@ class storyModel extends model $storyFiles = $oldStory->files = join(',', array_keys($oldStory->files)); foreach($story->deleteFiles as $fileID) $storyFiles = str_replace(",$fileID,", ',', ",$storyFiles,"); - $story = $this->getById($storyID); - $data = new stdclass(); $data->story = $storyID; $data->version = $story->version; @@ -740,8 +738,9 @@ class storyModel extends model /* IF is story and has changed, update its relation version to new. */ if($oldStory->type == 'story') { + $newStory = $this->getById($storyID); $this->dao->update(TABLE_STORY)->set('URChanged')->eq(0)->where('id')->eq($oldStory->id)->exec(); - $this->updateStoryVersion($story); + $this->updateStoryVersion($newStory); } else { @@ -750,7 +749,7 @@ class storyModel extends model ->where('AType')->eq('requirement') ->andWhere('BType')->eq('story') ->andWhere('relation')->eq('subdivideinto') - ->andWhere('AID')->eq($story->id) + ->andWhere('AID')->eq($storyID) ->fetchPairs(); foreach($relations as $relationID) $this->dao->update(TABLE_STORY)->set('URChanged')->eq(1)->where('id')->eq($relationID)->exec(); From e4d8ca86ad628b0308fe72ac021acc5e4094f16e Mon Sep 17 00:00:00 2001 From: liuyongkai Date: Wed, 7 Sep 2022 06:42:51 +0000 Subject: [PATCH 036/168] * Fix bug #27318. --- module/testreport/lang/fr.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/testreport/lang/fr.php b/module/testreport/lang/fr.php index 6cfc35a5b9..af4294d07a 100644 --- a/module/testreport/lang/fr.php +++ b/module/testreport/lang/fr.php @@ -49,7 +49,7 @@ $lang->testreport->legendCase = 'CasTests associés'; $lang->testreport->legendLegacyBugs = 'Bugs Restants'; $lang->testreport->legendReport = 'Rapport'; $lang->testreport->legendComment = 'Résumé'; -$lang->testreport->legendMore = 'Plus...'; +$lang->testreport->legendMore = 'Plus'; $lang->testreport->date = 'Date'; $lang->testreport->bugSeverityGroups = 'Distribution Sévérité de Bug'; From 4092d95876b64b10d67fc0c7cae1f60aacd68eb3 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 15:01:27 +0800 Subject: [PATCH 037/168] * code for task #68204. --- db/update17.6.sql | 1 + db/zentao.sql | 2 +- module/block/control.php | 32 +++++++- module/block/model.php | 15 +++- .../view/waterfallgeneralreportblock.html.php | 54 ++++++++++++ module/project/model.php | 49 +++++++++++ module/weekly/control.php | 5 +- module/weekly/model.php | 82 +++++-------------- 8 files changed, 170 insertions(+), 70 deletions(-) create mode 100644 module/block/view/waterfallgeneralreportblock.html.php diff --git a/db/update17.6.sql b/db/update17.6.sql index 1d60b73fd5..9d9d37cf92 100644 --- a/db/update17.6.sql +++ b/db/update17.6.sql @@ -13,3 +13,4 @@ CREATE TABLE `zt_taskteam` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `zt_taskestimate` ADD `order` tinyint unsigned NULL DEFAULT '0'; ALTER TABLE `zt_effort` ADD `order` tinyint unsigned NOT NULL DEFAULT '0' AFTER `end`; +ALTER TABLE `zt_block` CHANGE `block` `block` varchar(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `source`; diff --git a/db/zentao.sql b/db/zentao.sql index 8ed0a0d092..9cc580a01d 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -218,7 +218,7 @@ CREATE TABLE IF NOT EXISTS `zt_block` ( `type` char(30) NOT NULL, `title` varchar(100) NOT NULL, `source` varchar(20) NOT NULL, - `block` varchar(20) NOT NULL, + `block` varchar(30) NOT NULL, `params` text NOT NULL, `order` tinyint(3) unsigned NOT NULL DEFAULT '0', `grid` tinyint(3) unsigned NOT NULL DEFAULT '0', diff --git a/module/block/control.php b/module/block/control.php index c078c7a1bc..94d29d0eb6 100755 --- a/module/block/control.php +++ b/module/block/control.php @@ -935,8 +935,9 @@ class block extends control $current = zget($weeks, $monday, ''); $current = substr($current, 0, -11) . substr($current, -6); - $project->pv = $this->weekly->getPV($projectID, $today); - $project->ev = $this->weekly->getEV($projectID, $today); + $PVEV = $this->weekly->getPVEV($projectID, $today); + $project->pv = $PVEV['PV']; + $project->ev = $PVEV['EV']; $project->ac = $this->weekly->getAC($projectID, $today); $project->sv = $this->weekly->getSV($project->ev, $project->pv); $project->cv = $this->weekly->getCV($project->ev, $project->ac); @@ -1200,8 +1201,9 @@ class block extends control $this->weekly->save($this->session->project, $date); - $this->view->pv = (float)$this->weekly->getPV($this->session->project, $today); - $this->view->ev = (float)$this->weekly->getEV($this->session->project, $today); + $PVEV = $this->weekly->getPVEV($this->session->project, $today); + $this->view->pv = (float)$PVEV['PV']; + $this->view->ev = (float)$PVEV['EV']; $this->view->ac = (float)$this->weekly->getAC($this->session->project, $today); $this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv); $this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac); @@ -1210,6 +1212,28 @@ class block extends control $this->view->progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0; } + /** + * Print waterfall general report block. + * + * @access public + * @return void + */ + public function printWaterfallGeneralReportBlock() + { + $this->loadModel('programplan'); + $this->loadModel('project'); + $this->loadModel('weekly'); + + $PVEV = $this->project->getWaterfallPVEV($this->session->project); + $this->view->pv = (float)$PVEV['PV']; + $this->view->ev = (float)$PVEV['EV']; + $this->view->ac = (float)$this->project->getWaterfallAC($this->session->project); + $this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv); + $this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac); + + $this->view->progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0; + } + /** * Print waterfall gantt block. * diff --git a/module/block/model.php b/module/block/model.php index 3086c24bfb..97d52b15b3 100644 --- a/module/block/model.php +++ b/module/block/model.php @@ -656,18 +656,29 @@ class blockModel extends model * Get waterfall project report pararms. * * @access public - * @return string + * @return bool */ public function getWaterfallReportParams() { return false; } + /** + * Get waterfall general report params. + * + * @access public + * @return bool + */ + public function getWaterfallGeneralReportParams() + { + return false; + } + /** * Get project estimate pararms. * * @access public - * @return string + * @return bool */ public function getWaterfallEstimateParams() { diff --git a/module/block/view/waterfallgeneralreportblock.html.php b/module/block/view/waterfallgeneralreportblock.html.php new file mode 100644 index 0000000000..4989d3373f --- /dev/null +++ b/module/block/view/waterfallgeneralreportblock.html.php @@ -0,0 +1,54 @@ + + +
    +
    +
    +

    project->progress;?>

    + +
    +
    +
    +
    +
    +
    +
    +
    +
    programplan->end . ')';?>
    +
    +
    +
    +
    programplan->realEnd . ')';?>
    +
    +
    +
    +
    programplan->ac . ')';?>
    +
    +
    +
    +
    programplan->sv . ')';?>
    +
    +
    +
    +
    programplan->cv . ')';?>
    +
    +
    +
    +
    +
    +
    diff --git a/module/project/model.php b/module/project/model.php index 33ff71ccf4..733c154410 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -415,6 +415,55 @@ class projectModel extends model return is_numeric($projectIDList) ? (empty($progressList) ? 0 : $progressList[$projectIDList]) : $progressList; } + /** + * Get waterfall general PV and EV. + * + * @param int $projectID + * @access public + * @return array + */ + public function getWaterfallPVEV($projectID) + { + $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id'); + $stmt = $this->dao->select('id,status,estimate,consumed,`left`,closedReason')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->query(); + + $PV = 0; + $EV = 0; + while($task = $stmt->fetch()) + { + $PV += $task->estimate; + if($task->status == 'done' or $task->closedReason == 'done') + { + $EV += $this->estimate; + } + else + { + $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; + $EV += round($task->estimate * $task->progress / 100, 2); + } + } + + return array('PV' => sprintf("%.2f", $PV), 'EV' => sprintf("%.2f", $EV)); + } + + /** + * Get waterfall general AC + * + * @param int $projectID + * @access public + * @return string + */ + public function getWaterfallAC($projectID) + { + $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id'); + $taskIdList = $this->dao->select('id')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->fetchPairs('id', 'id'); + + $AC = $this->dao->select('sum(consumed) as consumed')->from(TABLE_EFFORT)->where('objectType')->eq('task')->andWhere('objectID')->in($taskIdList)->andWhere('deleted')->eq('0')->fetch('consumed'); + if(is_null($AC)) $AC = 0; + + return sprintf("%.2f", $AC); + } + /** * Get project workhour info. * diff --git a/module/weekly/control.php b/module/weekly/control.php index 9407cece01..1222aaf804 100755 --- a/module/weekly/control.php +++ b/module/weekly/control.php @@ -54,8 +54,9 @@ class weekly extends control $this->view->title = $this->lang->weekly->common; - $this->view->pv = $this->weekly->getPV($projectID, $date); - $this->view->ev = $this->weekly->getEV($projectID, $date); + $PVEV = $this->weekly->getPVEV($projectID, $date); + $this->view->pv = $PVEV['PV']; + $this->view->ev = $PVEV['EV']; $this->view->ac = $this->weekly->getAC($projectID, $date); $this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv); $this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac); diff --git a/module/weekly/model.php b/module/weekly/model.php index 4610cdb712..3eeb0de923 100755 --- a/module/weekly/model.php +++ b/module/weekly/model.php @@ -121,8 +121,9 @@ class weeklyModel extends model ->exec(); $report = new stdclass; - $report->pv = $this->getPV($project, $date); - $report->ev = $this->getEV($project, $date); + $PVEV = $this->getPVEV($project, $date); + $report->pv = $PVEV['PV']; + $report->ev = $PVEV['EV']; $report->ac = $this->getAC($project, $date); $report->sv = $this->getSV($report->ev, $report->pv); $report->cv = $this->getCV($report->ev, $report->ac); @@ -369,17 +370,17 @@ class weeklyModel extends model } /** - * GetPV + * Get PV and EV * * @param int $project * @param string $date * @access public - * @return int + * @return array */ - public function getPV($projectID, $date = '') + public function getPVEV($projectID, $date = '') { $report = $this->getFromDB($projectID, $date); - if(!empty($report)) return $report->pv; + if(!empty($report)) return array('PV' => $report->pv, 'EV' => $report->ev); if(!$date) $date = date('Y-m-d'); $monday = $this->getThisMonday($date); @@ -397,6 +398,8 @@ class weeklyModel extends model ->fetchAll('id'); $PV = 0; + $EV = 0; + $this->loadModel('holiday'); foreach($tasks as $task) { if(helper::isZeroDate($task->estStarted)) $task->estStarted = date('Y-m-d', strtotime($task->openedDate)); @@ -407,74 +410,36 @@ class weeklyModel extends model if(helper::isZeroDate($task->finishedDate)) $task->deadline = date('Y-m-d', strtotime($task->finishedDate)); } - $fullDays = $this->loadModel('holiday')->getActualWorkingDays($task->estStarted, $task->deadline); + $fullDays = $this->holiday->getActualWorkingDays($task->estStarted, $task->deadline); if($task->estStarted < $monday and $task->deadline >= $nextMonday) { $weekActualDays = $workdays; } elseif($task->estStarted >= $monday and $task->estStarted < $nextMonday) { - $weekActualDays = $this->loadModel('holiday')->getActualWorkingDays($task->estStarted, $task->deadline >= $nextMonday ? $sunday : $task->deadline); + $weekActualDays = $this->holiday->getActualWorkingDays($task->estStarted, $task->deadline >= $nextMonday ? $sunday : $task->deadline); } elseif($task->deadline >= $monday and $task->deadline < $nextMonday) { - $weekActualDays = $this->loadModel('holiday')->getActualWorkingDays($monday, $task->deadline); + $weekActualDays = $this->holiday->getActualWorkingDays($monday, $task->deadline); } if(empty($fullDays) or empty($weekActualDays) or empty($task->estimate)) continue; - $PV += round(count($weekActualDays) / count($fullDays) * $task->estimate, 2); - } + $thisPV = round(count($weekActualDays) / count($fullDays) * $task->estimate, 2); - return sprintf("%.2f",$PV); - } - - /** - * Get EV data. - * - * @param int $projectID - * @param string $date - * @access public - * @return int - */ - public function getEV($projectID, $date = '') - { - $report = $this->getFromDB($projectID, $date); - if(!empty($report)) return $report->ev; - - $executions = $this->loadModel('execution')->getList($projectID); - $executionIdList = array_keys($executions); - - if(!$date) $date = date('Y-m-d'); - $monday = $this->getThisMonday($date); - $sunday = $this->getThisSunday($date); - $lastDay = $this->getLastDay($date); - $nextMonday = date('Y-m-d', strtotime($sunday) + 24 * 3600); - - $tasks = $this->dao->select('*') - ->from(TABLE_TASK) - ->where('execution')->in($executionIdList) - ->andWhere('consumed')->gt(0) - ->andWhere("((estStarted >= '$monday' AND estStarted < '$nextMonday') OR (deadline >= '$monday' AND deadline < '$nextMonday') OR (estStarted < '$monday' AND deadline > '$nextMonday'))") - ->andWhere("parent")->ge(0) - ->andWhere("deleted")->eq(0) - ->andWhere('status')->ne('cancel') - ->query(); - - $EV = 0; - foreach($tasks as $task) - { if($task->status == 'done' or $task->closedReason == 'done') { - $EV += $task->estimate; + $EV += $thisPV; } else { $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; - $EV += $task->estimate * $task->progress / 100; + $EV += round($thisPV * $task->progress / 100, 2); } + $PV += $thisPV; } - return sprintf("%.2f", $EV); + return array('PV' => sprintf("%.2f", $PV), 'EV' => sprintf("%.2f", $EV)); } /** @@ -492,15 +457,10 @@ class weeklyModel extends model if(!$date) $date = date('Y-m-d'); - $monday = $this->getThisMonday($date); - $nextMonday = date('Y-m-d', strtotime($monday) + (7 * 24 * 3600)); - $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($project)->fetchAll('id'); - $executionIdList = array_keys($executions); - $taskIdList = $this->dao->select('id')->from(TABLE_TASK) - ->where('execution')->in($executionIdList) - ->andWhere("parent")->ge(0) - ->andWhere("deleted")->eq(0) - ->fetchPairs(); + $monday = $this->getThisMonday($date); + $nextMonday = date('Y-m-d', strtotime($monday) + (7 * 24 * 3600)); + $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($project)->fetchAll('id'); + $taskIdList = $this->dao->select('id')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->fetchPairs(); $AC = $this->dao->select('sum(consumed) as consumed') ->from(TABLE_EFFORT) From 6a6a04917098a749ed254a3eb94366ee51c2c941 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 15:50:23 +0800 Subject: [PATCH 038/168] * fix bug. --- module/project/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/project/model.php b/module/project/model.php index 733c154410..7cf9c98e2d 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -434,7 +434,7 @@ class projectModel extends model $PV += $task->estimate; if($task->status == 'done' or $task->closedReason == 'done') { - $EV += $this->estimate; + $EV += $task->estimate; } else { From e0248af2a4d6fdc148ba0f55cc6c13eb43dd0fc1 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 15:57:20 +0800 Subject: [PATCH 039/168] * adjust code. --- module/block/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/block/control.php b/module/block/control.php index 94d29d0eb6..eac467486a 100755 --- a/module/block/control.php +++ b/module/block/control.php @@ -1220,7 +1220,7 @@ class block extends control */ public function printWaterfallGeneralReportBlock() { - $this->loadModel('programplan'); + $this->app->loadLang('programplan'); $this->loadModel('project'); $this->loadModel('weekly'); From 79ac6a6ecfb5b7650645ba4533396229747f3ef0 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 7 Sep 2022 16:56:12 +0800 Subject: [PATCH 040/168] * Fix bug #25904. --- module/product/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/product/config.php b/module/product/config.php index bb08427abd..c42c6ce6bd 100644 --- a/module/product/config.php +++ b/module/product/config.php @@ -109,7 +109,7 @@ $config->product->all->search['fields']['createdDate'] = $lang->product->created $config->product->all->search['fields']['createdBy'] = $lang->product->createdBy; $config->product->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); -$config->product->all->search['params']['code'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +if(!isset($config->setCode) or $config->setCode == 1) $config->product->all->search['params']['code'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); $config->product->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => ''); if($config->systemMode == 'new') $config->product->all->search['params']['program'] = array('operator' => '=', 'control' => 'select', 'values' => ''); $config->product->all->search['params']['line'] = array('operator' => '=', 'control' => 'select', 'values' => ''); From 80ff723165826921189cf9f310d46210ebf2ff3d Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Wed, 7 Sep 2022 16:58:54 +0800 Subject: [PATCH 041/168] * Code for task#67691. --- module/task/control.php | 10 +++------- module/task/model.php | 22 +++++++++++++++++++--- module/task/view/edit.html.php | 5 ++++- module/task/view/view.html.php | 2 +- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index 6349caefa5..c847bc4a05 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -537,20 +537,16 @@ class task extends control { $this->loadModel('action'); $changes = array(); - $files = array(); if($comment == false) { $changes = $this->task->update($taskID); if(dao::isError()) return print(js::error(dao::getError())); - $files = $this->loadModel('file')->saveUpload('task', $taskID); - if(empty($files) and $this->post->uid != '' and isset($_SESSION['album']['used'][$this->post->uid])) $files = $this->file->getPairs($_SESSION['album']['used'][$this->post->uid]); } - if($this->post->comment != '' or !empty($changes) or !empty($files)) + if($this->post->comment != '' or !empty($changes)) { - $action = (!empty($changes) or !empty($files)) ? 'Edited' : 'Commented'; - $fileAction = !empty($files) ? $this->lang->addFiles . join(',', $files) . "\n" : ''; - $actionID = $this->action->create('task', $taskID, $action, $fileAction . $this->post->comment); + $action = !empty($changes) ? 'Edited' : 'Commented'; + $actionID = $this->action->create('task', $taskID, $action, $this->post->comment); if(!empty($changes)) $this->action->logHistory($actionID, $changes); } diff --git a/module/task/model.php b/module/task/model.php index b5628c937c..ee67294584 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1075,6 +1075,7 @@ class taskModel extends model ->setDefault('story, estimate, left, consumed', 0) ->setDefault('realStarted', '0000-00-00 00:00:00') ->setDefault('mailto', '') + ->setDefault('deleteFiles', array()) ->setIF(is_numeric($this->post->estimate), 'estimate', (float)$this->post->estimate) ->setIF(is_numeric($this->post->consumed), 'consumed', (float)$this->post->consumed) ->setIF(is_numeric($this->post->left), 'left', (float)$this->post->left) @@ -1158,7 +1159,7 @@ class taskModel extends model $requiredFields = trim($requiredFields, ','); - $this->dao->update(TABLE_TASK)->data($task) + $this->dao->update(TABLE_TASK)->data($task, 'deleteFiles') ->autoCheck() ->batchCheckIF($task->status != 'cancel', $requiredFields, 'notempty') ->checkIF(!helper::isZeroDate($task->deadline), 'deadline', 'ge', $task->estStarted) @@ -1247,12 +1248,10 @@ class taskModel extends model if(!empty($changes)) $this->action->logHistory($actionID, $changes); } } - $this->file->updateObjectID($this->post->uid, $taskID, 'task'); unset($oldTask->parent); unset($task->parent); - if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldTask->feedback) $this->loadModel('feedback')->updateStatus('task', $oldTask->feedback, $task->status, $oldTask->status); if(isset($oldTask->team)) @@ -1269,6 +1268,23 @@ class taskModel extends model } } + $oldTaskFiles = empty($oldTask->files) ? '' : join(',', array_keys($oldTask->files)); + if(!empty($task->deleteFiles)) + { + $this->dao->delete()->from(TABLE_FILE)->where('id')->in($task->deleteFiles)->exec(); + foreach($task->deleteFiles as $fileID) + { + @unlink($oldTask->files[$fileID]->realPath); + $oldTaskFiles = empty($oldTaskFiles) ? '' : str_replace(",$fileID,", ',', ",$oldTaskFiles,"); + } + } + + $this->file->updateObjectID($this->post->uid, $taskID, 'task'); + $addedFiles = $this->loadModel('file')->saveUpload('task', $taskID); + $addedFiles = empty($addedFiles) ? '' : ',' . join(',', array_keys($addedFiles)); + $task->files = trim($oldTaskFiles . $addedFiles, ','); + $oldTask->files = join(',', array_keys($oldTask->files)); + return common::createChanges($oldTask, $task); } } diff --git a/module/task/view/edit.html.php b/module/task/view/edit.html.php index fb56d27a51..bbbc880e28 100644 --- a/module/task/view/edit.html.php +++ b/module/task/view/edit.html.php @@ -88,7 +88,10 @@ foreach(explode(',', $config->task->edit->requiredFields) as $field) printExtendFields($task, 'div', 'position=left');?>
    files;?>
    -
    fetch('file', 'buildform');?>
    +
    + fetch('file', 'printFiles', array('files' => $task->files, 'fieldset' => 'false', 'object' => $task, 'method' => 'edit'));?> + fetch('file', 'buildform');?> +
    lastEditedDate);?> diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index a6e677e952..5caec05056 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -147,7 +147,7 @@
    fetch('file', 'printFiles', array('files' => $task->files, 'fieldset' => 'true', 'object' => $task)); + echo $this->fetch('file', 'printFiles', array('files' => $task->files, 'fieldset' => 'true', 'object' => $task, 'method' => 'view', 'showDelete' => false)); $canBeChanged = common::canBeChanged('task', $task); if($canBeChanged) $actionFormLink = $this->createLink('action', 'comment', "objectType=task&objectID=$task->id"); From 548c24ba42797d1c83fbb654b3a1882dbc712259 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 17:11:12 +0800 Subject: [PATCH 042/168] * fix bug. --- 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 2bf331ea93..cea27ce07e 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -7318,7 +7318,7 @@ class upgradeModel extends model $this->dao->insert(TABLE_TASKTEAM)->data($oldTeam)->exec(); - $this->dao->update(TABLE_TASKESTIMATE)->set('`order`')->eq($order)->where('task')->($oldTeam->task)->andWhere('account')->eq($oldTeam->account)->exec(); + $this->dao->update(TABLE_TASKESTIMATE)->set('`order`')->eq($order)->where('task')->eq($oldTeam->task)->andWhere('account')->eq($oldTeam->account)->exec(); $this->dao->update(TABLE_EFFORT)->set('`order`')->eq($order)->where('objectType')->eq('task')->andWhere('objectID')->eq($oldTeam->task)->andWhere('account')->eq($oldTeam->account)->exec(); $order ++; } From a370daf00f4c85a08c78163a01bf8b29282d437c Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 17:16:30 +0800 Subject: [PATCH 043/168] * fix bug #27307. --- module/task/view/lineareffort.html.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/task/view/lineareffort.html.php b/module/task/view/lineareffort.html.php index caff269195..64314fa1df 100644 --- a/module/task/view/lineareffort.html.php +++ b/module/task/view/lineareffort.html.php @@ -48,6 +48,7 @@ foreach($efforts as $effort)
    + account != $this->app->user->account) continue;?> From 438c2b2524ce6de7df617080e7503699755fa086 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 7 Sep 2022 17:21:01 +0800 Subject: [PATCH 044/168] * fix bug #27310. --- module/task/view/recordestimate.html.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/task/view/recordestimate.html.php b/module/task/view/recordestimate.html.php index 5934918eaf..ca4d0151b8 100644 --- a/module/task/view/recordestimate.html.php +++ b/module/task/view/recordestimate.html.php @@ -74,10 +74,10 @@
    - assignedTo != $app->user->account and $task->mode == 'linear'):?> -

    task->deniedNotice, '' . $task->assignedToRealName . '', $lang->task->logEfforts);?>

    - members[$app->user->account])):?> + members[$app->user->account])):?>

    task->deniedNotice, '' . $lang->task->teamMember . '', $lang->task->logEfforts);?>

    + assignedTo != $app->user->account and $task->mode == 'linear'):?> +

    task->deniedNotice, '' . $task->assignedToRealName . '', $lang->task->logEfforts);?>

    From b32e9247bfdef481d16ac8d17f87eb672ffe2266 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Thu, 8 Sep 2022 08:34:27 +0800 Subject: [PATCH 045/168] * Fix bug for my work auditplan. --- module/my/control.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/my/control.php b/module/my/control.php index 3a85807391..203b6f9933 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -153,6 +153,7 @@ class my extends control $riskCount = 0; $reviewCount = 0; $ncCount = 0; + $qaCount = 0; $meetingCount = 0; $isMax = $this->config->edition == 'max' ? 1 : 0; From 592a109bed7993c923ff38fd9d2bd782f77f9d3c Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 09:09:03 +0800 Subject: [PATCH 046/168] * Code for task#67691. --- module/bug/control.php | 12 +++++------- module/bug/model.php | 21 +++++++++++++++++++-- module/bug/view/edit.html.php | 5 ++++- module/bug/view/view.html.php | 2 +- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index 2ed87d9010..66a0585929 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -969,17 +969,15 @@ class bug extends control return print(js::error(dao::getError())); } } - $files = $this->loadModel('file')->saveUpload('bug', $bugID); - if(empty($files) and $this->post->uid != '' and isset($_SESSION['album']['used'][$this->post->uid])) $files = $this->file->getPairs($_SESSION['album']['used'][$this->post->uid]); } - if($this->post->comment != '' or !empty($changes) or !empty($files)) + + if($this->post->comment != '' or !empty($changes)) { - $action = (!empty($changes) or !empty($files)) ? 'Edited' : 'Commented'; - $fileAction = ''; - if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ; - $actionID = $this->action->create('bug', $bugID, $action, $fileAction . $this->post->comment); + $action = !empty($changes) ? 'Edited' : 'Commented'; + $actionID = $this->action->create('bug', $bugID, $action, $this->post->comment); $this->action->logHistory($actionID, $changes); } + if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'success', 'data' => $bugID)); $bug = $this->bug->getById($bugID); diff --git a/module/bug/model.php b/module/bug/model.php index 276cffcb02..b7f1c4718a 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -687,7 +687,7 @@ class bugModel extends model */ public function update($bugID) { - $oldBug = $this->dao->select('*')->from(TABLE_BUG)->where('id')->eq((int)$bugID)->fetch(); + $oldBug = $this->getById($bugID); if(!empty($_POST['lastEditedDate']) and $oldBug->lastEditedDate != $this->post->lastEditedDate) { dao::$errors[] = $this->lang->error->editedByOther; @@ -707,6 +707,7 @@ class bugModel extends model ->setDefault('resolvedDate', '0000-00-00 00:00:00') ->setDefault('lastEditedBy', $this->app->user->account) ->setDefault('mailto', '') + ->setDefault('deleteFiles', array()) ->add('lastEditedDate', $now) ->setIF(strpos($this->config->bug->edit->requiredFields, 'deadline') !== false, 'deadline', $this->post->deadline) ->join('openedBuild', ',') @@ -736,7 +737,7 @@ class bugModel extends model ->get(); $bug = $this->loadModel('file')->processImgURL($bug, $this->config->bug->editor->edit['id'], $this->post->uid); - $this->dao->update(TABLE_BUG)->data($bug) + $this->dao->update(TABLE_BUG)->data($bug, 'deleteFiles') ->autoCheck() ->batchCheck($this->config->bug->edit->requiredFields, 'notempty') ->checkIF($bug->resolvedBy, 'resolution', 'notempty') @@ -783,7 +784,23 @@ class bugModel extends model } if(!empty($bug->resolvedBy)) $this->loadModel('score')->create('bug', 'resolve', $bugID); + + $oldBugFiles = empty($oldBug->files) ? '' : join(',', array_keys($oldBug->files)); + if(!empty($bug->deleteFiles)) + { + $this->dao->delete()->from(TABLE_FILE)->where('id')->in($bug->deleteFiles)->exec(); + foreach($bug->deleteFiles as $fileID) + { + @unlink($oldBug->files[$fileID]->realPath); + $oldBugFiles = empty($oldBugFiles) ? '' : str_replace(",$fileID,", ',', ",$oldBugFiles,"); + } + } + $this->file->updateObjectID($this->post->uid, $bugID, 'bug'); + $addedFiles = $this->loadModel('file')->saveUpload('bug', $bugID); + $addedFiles = empty($addedFiles) ? '' : ',' . join(',', array_keys($addedFiles)); + $bug->files = trim($oldBugFiles . $addedFiles, ','); + $oldBug->files = join(',', array_keys($oldBug->files)); if($bug->execution and $bug->status != $oldBug->status) $this->loadModel('kanban')->updateLane($bug->execution, 'bug'); diff --git a/module/bug/view/edit.html.php b/module/bug/view/edit.html.php index d2462c3443..1b662bb77e 100644 --- a/module/bug/view/edit.html.php +++ b/module/bug/view/edit.html.php @@ -72,7 +72,10 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project); printExtendFields($bug, 'div', 'position=left');?>
    files;?>
    -
    fetch('file', 'buildform');?>
    +
    + fetch('file', 'printFiles', array('files' => $bug->files, 'fieldset' => 'false', 'object' => $bug, 'method' => 'edit'));?> + fetch('file', 'buildform');?> +
    diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index 9be88c271a..d0a7ad32fd 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -73,7 +73,7 @@ ?>
    - fetch('file', 'printFiles', array('files' => $bug->files, 'fieldset' => 'true', 'object' => $bug));?> + fetch('file', 'printFiles', array('files' => $bug->files, 'fieldset' => 'true', 'object' => $bug, 'method' => 'view', 'showDelete' => false));?> createLink('action', 'comment', "objectType=bug&objectID=$bug->id"); From 00b0aa0ba07730bffe35cb778b3b33ef73e4b4b7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 8 Sep 2022 09:47:56 +0800 Subject: [PATCH 047/168] * adjust for create effort. --- module/task/view/recordestimate.html.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/task/view/recordestimate.html.php b/module/task/view/recordestimate.html.php index ca4d0151b8..3734ead79c 100644 --- a/module/task/view/recordestimate.html.php +++ b/module/task/view/recordestimate.html.php @@ -107,7 +107,8 @@
    - + + - + - + diff --git a/module/testtask/view/view.html.php b/module/testtask/view/view.html.php index 8af9387443..aa5acd4049 100644 --- a/module/testtask/view/view.html.php +++ b/module/testtask/view/view.html.php @@ -33,7 +33,7 @@
    testtask->desc;?>
    desc) ? $task->desc : $lang->noData;?>
    - fetch('file', 'printFiles', array('files' => $task->files, 'fieldset' => 'true', 'object' => $task));?> + fetch('file', 'printFiles', array('files' => $task->files, 'fieldset' => 'true', 'object' => $task, 'method' => 'view', 'showDelete' => false));?> report):?>
    testtask->report;?>
    From 5c3ff64ce70c6029f1d943bca2225855e43a9e25 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 11:14:53 +0800 Subject: [PATCH 051/168] * Code for task#67691. --- module/bug/model.php | 2 +- module/file/model.php | 4 ++-- module/release/lang/de.php | 1 + module/release/lang/en.php | 1 + module/release/lang/fr.php | 1 + module/release/lang/vi.php | 1 + module/release/lang/zh-cn.php | 1 + module/release/lang/zh-tw.php | 1 + module/release/model.php | 2 +- module/task/model.php | 2 +- module/testcase/model.php | 2 +- module/testtask/model.php | 2 +- 12 files changed, 13 insertions(+), 7 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index 5c0f974751..593bd21324 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -789,7 +789,7 @@ class bugModel extends model if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status); - $this->file->addFile4Object('bug', $oldBug, $bug); + $this->file->processFile4Object('bug', $oldBug, $bug); return common::createChanges($oldBug, $bug); } } diff --git a/module/file/model.php b/module/file/model.php index 8919843e09..accec7aa25 100755 --- a/module/file/model.php +++ b/module/file/model.php @@ -1138,7 +1138,7 @@ class fileModel extends model } /** - * Add file info for object. + * Process file info for object. * * @param string $objectType * @param object $oldObject @@ -1146,7 +1146,7 @@ class fileModel extends model * @access public * @return void */ - public function addFile4Object($objectType, $oldObject, $newObject) + public function processFile4Object($objectType, $oldObject, $newObject) { $oldFiles = empty($oldObject->files) ? '' : join(',', array_keys($oldObject->files)); $deleteFiles = $newObject->deleteFiles; diff --git a/module/release/lang/de.php b/module/release/lang/de.php index 73612af094..d2e7ef5f37 100644 --- a/module/release/lang/de.php +++ b/module/release/lang/de.php @@ -42,6 +42,7 @@ $lang->release->name = 'Name'; $lang->release->marker = 'Meilensteine'; $lang->release->date = 'Datum'; $lang->release->desc = 'Beschreibung'; +$lang->release->files = 'Gehäuse'; $lang->release->status = 'Status'; $lang->release->subStatus = 'Sub Status'; $lang->release->last = 'Letztes Release'; diff --git a/module/release/lang/en.php b/module/release/lang/en.php index 37f90fe6da..51bda2c5e6 100644 --- a/module/release/lang/en.php +++ b/module/release/lang/en.php @@ -42,6 +42,7 @@ $lang->release->name = 'Name'; $lang->release->marker = 'Milestone'; $lang->release->date = 'Release Date'; $lang->release->desc = 'Description'; +$lang->release->files = 'Files'; $lang->release->status = 'Status'; $lang->release->subStatus = 'Sub Status'; $lang->release->last = 'Last Release'; diff --git a/module/release/lang/fr.php b/module/release/lang/fr.php index d469898251..ec8a2860ef 100644 --- a/module/release/lang/fr.php +++ b/module/release/lang/fr.php @@ -42,6 +42,7 @@ $lang->release->name = 'Nom'; $lang->release->marker = 'Etape Importante'; $lang->release->date = 'Date Release'; $lang->release->desc = 'Description'; +$lang->release->files = 'Files'; $lang->release->status = 'Statut'; $lang->release->subStatus = 'Sous-statut'; $lang->release->last = 'Dernière Release'; diff --git a/module/release/lang/vi.php b/module/release/lang/vi.php index 4861c32caf..8bd7166e75 100644 --- a/module/release/lang/vi.php +++ b/module/release/lang/vi.php @@ -41,6 +41,7 @@ $lang->release->name = 'Tên'; $lang->release->marker = 'Cột mốc'; $lang->release->date = 'Ngày'; $lang->release->desc = 'Mô tả'; +$lang->release->files = 'Chung'; $lang->release->status = 'Tình trạng'; $lang->release->subStatus = 'Tình trạng con'; $lang->release->last = 'Phát hành gần nhất'; diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index 1a5366da43..e40eddf76f 100644 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -42,6 +42,7 @@ $lang->release->name = '发布名称'; $lang->release->marker = '里程碑'; $lang->release->date = '发布日期'; $lang->release->desc = '描述'; +$lang->release->files = '附件'; $lang->release->status = '状态'; $lang->release->subStatus = '子状态'; $lang->release->last = '上次发布'; diff --git a/module/release/lang/zh-tw.php b/module/release/lang/zh-tw.php index 686384c602..fd50308593 100644 --- a/module/release/lang/zh-tw.php +++ b/module/release/lang/zh-tw.php @@ -42,6 +42,7 @@ $lang->release->name = '發佈名稱'; $lang->release->marker = '里程碑'; $lang->release->date = '發佈日期'; $lang->release->desc = '描述'; +$lang->release->files = '附件'; $lang->release->status = '狀態'; $lang->release->subStatus = '子狀態'; $lang->release->last = '上次發佈'; diff --git a/module/release/model.php b/module/release/model.php index d7c2bc774c..212bf022e7 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -296,7 +296,7 @@ class releaseModel extends model ->exec(); if(!dao::isError()) { - $this->file->addFile4Object('release', $oldRelease, $release); + $this->file->processFile4Object('release', $oldRelease, $release); return common::createChanges($oldRelease, $release); } } diff --git a/module/task/model.php b/module/task/model.php index 494c082114..262a8dd087 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1268,7 +1268,7 @@ class taskModel extends model } } - $this->file->addFile4Object('task', $oldTask, $task); + $this->file->processFile4Object('task', $oldTask, $task); return common::createChanges($oldTask, $task); } } diff --git a/module/testcase/model.php b/module/testcase/model.php index e31a44cf58..ca01f5dca2 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -929,7 +929,7 @@ class testcaseModel extends model } } - $this->file->addFile4Object('testcase', $oldCase, $case); + $this->file->processFile4Object('testcase', $oldCase, $case); return common::createChanges($oldCase, $case); } } diff --git a/module/testtask/model.php b/module/testtask/model.php index 1b1ac51be6..7468f426b1 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -773,7 +773,7 @@ class testtaskModel extends model if(!dao::isError()) { - $this->file->addFile4Object('testtask', $oldTask, $task); + $this->file->processFile4Object('testtask', $oldTask, $task); return common::createChanges($oldTask, $task); } } From 052556f9086e1a5e88d192f4454e746aefb4b7cb Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 11:28:18 +0800 Subject: [PATCH 052/168] * Fix bug#27354. --- extension/lite/story/ext/view/edit.html.php | 2 +- extension/lite/story/ext/view/view.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/lite/story/ext/view/edit.html.php b/extension/lite/story/ext/view/edit.html.php index 9f850c9087..aea99f0771 100644 --- a/extension/lite/story/ext/view/edit.html.php +++ b/extension/lite/story/ext/view/edit.html.php @@ -86,7 +86,7 @@
    attatch;?>
    status) !== false ? true : false;?> - fetch('file', 'printFiles', array('files' => $files, 'fieldset' => 'false', 'object' => $story, 'method' => 'edit', 'showDelete' => $canChangeFile));?> + fetch('file', 'printFiles', array('files' => $story->files, 'fieldset' => 'false', 'object' => $story, 'method' => 'edit', 'showDelete' => $canChangeFile));?> fetch('file', 'buildform') : '';?>
    diff --git a/extension/lite/story/ext/view/view.html.php b/extension/lite/story/ext/view/view.html.php index c002b4c445..fb971c4d9f 100644 --- a/extension/lite/story/ext/view/view.html.php +++ b/extension/lite/story/ext/view/view.html.php @@ -69,7 +69,7 @@
    story->legendSpec;?>
    spec;?>
    - fetch('file', 'printFiles', array('files' => $story->files, 'fieldset' => 'true', 'object' => $story));?> + fetch('file', 'printFiles', array('files' => $story->files, 'fieldset' => 'true', 'object' => $story, 'method' => 'view', 'showDelete' => false));?> createLink('action', 'comment', "objectType=story&objectID=$story->id"); From cf1399e0f65486e8ee5301cad6b3084d0439cda0 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 8 Sep 2022 11:34:59 +0800 Subject: [PATCH 053/168] * adjust for unit test. --- module/block/control.php | 8 +++--- module/project/model.php | 24 +++------------- module/weekly/model.php | 4 +-- test/class/weekly.class.php | 25 +++-------------- test/model/project/getwaterfallpvevac.php | 28 +++++++++++++++++++ test/model/weekly/getev.php | 31 --------------------- test/model/weekly/getpvev.php | 34 +++++++++++++++++++++++ 7 files changed, 76 insertions(+), 78 deletions(-) create mode 100755 test/model/project/getwaterfallpvevac.php delete mode 100755 test/model/weekly/getev.php create mode 100755 test/model/weekly/getpvev.php diff --git a/module/block/control.php b/module/block/control.php index eac467486a..e8959d13c7 100755 --- a/module/block/control.php +++ b/module/block/control.php @@ -1224,10 +1224,10 @@ class block extends control $this->loadModel('project'); $this->loadModel('weekly'); - $PVEV = $this->project->getWaterfallPVEV($this->session->project); - $this->view->pv = (float)$PVEV['PV']; - $this->view->ev = (float)$PVEV['EV']; - $this->view->ac = (float)$this->project->getWaterfallAC($this->session->project); + $data = $this->project->getWaterfallPVEVAC($this->session->project); + $this->view->pv = (float)$data['PV']; + $this->view->ev = (float)$data['EV']; + $this->view->ac = (float)$data['AC']; $this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv); $this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac); diff --git a/module/project/model.php b/module/project/model.php index 7cf9c98e2d..72733bd399 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -422,16 +422,18 @@ class projectModel extends model * @access public * @return array */ - public function getWaterfallPVEV($projectID) + public function getWaterfallPVEVAC($projectID) { $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id'); $stmt = $this->dao->select('id,status,estimate,consumed,`left`,closedReason')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->query(); $PV = 0; $EV = 0; + $AC = 0; while($task = $stmt->fetch()) { $PV += $task->estimate; + $AC += $task->consumed; if($task->status == 'done' or $task->closedReason == 'done') { $EV += $task->estimate; @@ -443,25 +445,7 @@ class projectModel extends model } } - return array('PV' => sprintf("%.2f", $PV), 'EV' => sprintf("%.2f", $EV)); - } - - /** - * Get waterfall general AC - * - * @param int $projectID - * @access public - * @return string - */ - public function getWaterfallAC($projectID) - { - $executions = $this->dao->select('id,begin,end,realEnd,status')->from(TABLE_EXECUTION)->where('deleted')->eq(0)->andWhere('vision')->eq($this->config->vision)->andWhere('project')->eq($projectID)->fetchAll('id'); - $taskIdList = $this->dao->select('id')->from(TABLE_TASK)->where('execution')->in(array_keys($executions))->andWhere("parent")->ge(0)->andWhere("deleted")->eq(0)->fetchPairs('id', 'id'); - - $AC = $this->dao->select('sum(consumed) as consumed')->from(TABLE_EFFORT)->where('objectType')->eq('task')->andWhere('objectID')->in($taskIdList)->andWhere('deleted')->eq('0')->fetch('consumed'); - if(is_null($AC)) $AC = 0; - - return sprintf("%.2f", $AC); + return array('PV' => sprintf("%.2f", $PV), 'EV' => sprintf("%.2f", $EV), 'AC' => sprintf("%.2f", $AC)); } /** diff --git a/module/weekly/model.php b/module/weekly/model.php index 3eeb0de923..961c336ea8 100755 --- a/module/weekly/model.php +++ b/module/weekly/model.php @@ -402,10 +402,10 @@ class weeklyModel extends model $this->loadModel('holiday'); foreach($tasks as $task) { - if(helper::isZeroDate($task->estStarted)) $task->estStarted = date('Y-m-d', strtotime($task->openedDate)); + $execution = $executions[$task->execution]; + if(helper::isZeroDate($task->estStarted)) $task->estStarted = helper::isZeroDate($task->openedDate) ? $execution->begin : date('Y-m-d', strtotime($task->openedDate)); if(helper::isZeroDate($task->deadline)) { - $execution = $executions[$task->execution]; $task->deadline = helper::isZeroDate($execution->realEnd) ? $execution->end : $execution->realEnd; if(helper::isZeroDate($task->finishedDate)) $task->deadline = date('Y-m-d', strtotime($task->finishedDate)); } diff --git a/test/class/weekly.class.php b/test/class/weekly.class.php index a183c45b6d..e9c826e959 100644 --- a/test/class/weekly.class.php +++ b/test/class/weekly.class.php @@ -290,37 +290,20 @@ class weeklyTest } /** - * Test getPV + * Test getPVEV * * @param int $project * @param string $date * @access public * @return int */ - public function getPVTest($projectID, $date = '') + public function getPVEVTest($projectID, $date = '') { - $objects = $this->objectModel->getPV($projectID, $date); + $objects = $this->objectModel->getPVEV($projectID, $date); if(dao::isError()) return dao::getError(); - return $objects; - } - - /** - * Test get EV data. - * - * @param int $projectID - * @param string $date - * @access public - * @return int - */ - public function getEVTest($projectID, $date = '') - { - $objects = $this->objectModel->getEV($projectID, $date); - - if(dao::isError()) return dao::getError(); - - return $objects; + return $objects['PV'] . ',' . $objects['EV']; } /** diff --git a/test/model/project/getwaterfallpvevac.php b/test/model/project/getwaterfallpvevac.php new file mode 100755 index 0000000000..62c48e1475 --- /dev/null +++ b/test/model/project/getwaterfallpvevac.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +switchDB(); +su('admin'); + +/** + +title=测试 projectModel->getWaterfallPVEVAC(); +cid=1 +pid=1 + +测试projectID值为0 >> 0.00,0.00,0.00 +测试projectID值为11 >> 97.00,53.94,108.00 +测试projectID值为41 >> 52.00,19.87,33.00 + +*/ + +$projectIDList = array(0, 11, 41); + +global $tester; +$tester->loadModel('project'); + +r($tester->project->getWaterfallPVEVAC($projectIDList[0])) && p('PV,EV,AC') && e('0.00,0.00,0.00'); //测试projectID值为0 +r($tester->project->getWaterfallPVEVAC($projectIDList[1])) && p('PV,EV,AC') && e('97.00,53.94,108.00'); //测试projectID值为11 +r($tester->project->getWaterfallPVEVAC($projectIDList[2])) && p('PV,EV,AC') && e('52.00,19.87,33.00'); //测试projectID值为41 + +$db->restoreDB(); diff --git a/test/model/weekly/getev.php b/test/model/weekly/getev.php deleted file mode 100755 index 1963961d65..0000000000 --- a/test/model/weekly/getev.php +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env php -getEV(); -cid=1 -pid=1 - -测试projectID值为0,date值为2022-05-01 >> 768.75 -测试projectID值为0,date值为空 >> 2347.38 -测试projectID值为11,date值为2022-05-01 >> 12.5 -测试projectID值为11,date值为空 >> 53.63 -测试projectID值为41,date值为2022-05-01 >> 6.91 -测试projectID值为41,date值为空 >> 19.87 - -*/ -$projectIDList = array(0, 11, 41); -$dateList = array('2022-05-01', ''); - -$weekly = new weeklyTest(); - -r($weekly->getEVTest($projectIDList[0], $dateList[0])) && p() && e('768.75'); //测试projectID值为0,date值为2022-05-01 -r($weekly->getEVTest($projectIDList[0], $dateList[1])) && p() && e('2347.38'); //测试projectID值为0,date值为空 -r($weekly->getEVTest($projectIDList[1], $dateList[0])) && p() && e('12.5'); //测试projectID值为11,date值为2022-05-01 -r($weekly->getEVTest($projectIDList[1], $dateList[1])) && p() && e('53.63'); //测试projectID值为11,date值为空 -r($weekly->getEVTest($projectIDList[2], $dateList[0])) && p() && e('6.91'); //测试projectID值为41,date值为2022-05-01 -r($weekly->getEVTest($projectIDList[2], $dateList[1])) && p() && e('19.87'); //测试projectID值为41,date值为空 \ No newline at end of file diff --git a/test/model/weekly/getpvev.php b/test/model/weekly/getpvev.php new file mode 100755 index 0000000000..83af41b2fd --- /dev/null +++ b/test/model/weekly/getpvev.php @@ -0,0 +1,34 @@ +#!/usr/bin/env php +switchDB(); +su('admin'); + +/** + +title=测试 weeklyModel->getPVEV(); +cid=1 +pid=1 + +测试projectID值为0,date值为2022-05-01 >> 0.00,0.00 +测试projectID值为0,date值为空 >> 0.00,0.00 +测试projectID值为11,date值为2022-05-01 >> 0.00,0.00 +测试projectID值为11,date值为空 >> 6.00,1.98 +测试projectID值为41,date值为2022-05-01 >> 0.00,0.00 +测试projectID值为41,date值为空 >> 14.50,3.43 + +*/ + +$projectIDList = array(0, 11, 41); +$dateList = array('2022-05-01', ''); + +$weekly = new weeklyTest(); + +r($weekly->getPVEVTest($projectIDList[0], $dateList[0])) && p() && e('0.00,0.00'); //测试projectID值为0,date值为2022-05-01 +r($weekly->getPVEVTest($projectIDList[0], $dateList[1])) && p() && e('0.00,0.00'); //测试projectID值为0,date值为空 +r($weekly->getPVEVTest($projectIDList[1], $dateList[0])) && p() && e('0.00,0.00'); //测试projectID值为11,date值为2022-05-01 +r($weekly->getPVEVTest($projectIDList[1], $dateList[1])) && p() && e('6.00,1.98'); //测试projectID值为11,date值为空 +r($weekly->getPVEVTest($projectIDList[2], $dateList[0])) && p() && e('0.00,0.00'); //测试projectID值为41,date值为2022-05-01 +r($weekly->getPVEVTest($projectIDList[2], $dateList[1])) && p() && e('14.50,3.43'); //测试projectID值为41,date值为空 +$db->restoreDB(); From 51e32c717944c5c908203eb87004621812ed2b87 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 13:17:13 +0800 Subject: [PATCH 054/168] * Modify lang of task. --- module/task/lang/zh-cn.php | 2 +- module/task/lang/zh-tw.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 51f66f1741..3478a6e044 100755 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -166,7 +166,7 @@ $lang->task->recordEstimateAction = '添加工时'; $lang->task->ditto = '同上'; $lang->task->dittoNotice = "该任务与上一任务不属于同一%s!"; -$lang->task->selectTestStory = "选择测试{$lang->SRCommon}"; +$lang->task->selectTestStory = "选择{$lang->SRCommon}"; $lang->task->selectAllUser = '全部'; $lang->task->noStory = "无{$lang->SRCommon}"; $lang->task->noAssigned = '未指派'; diff --git a/module/task/lang/zh-tw.php b/module/task/lang/zh-tw.php index a54b405789..c9c423564a 100644 --- a/module/task/lang/zh-tw.php +++ b/module/task/lang/zh-tw.php @@ -152,7 +152,7 @@ $lang->task->recordEstimateAction = '添加工時'; $lang->task->ditto = '同上'; $lang->task->dittoNotice = "該任務與上一任務不屬於同一%s!"; -$lang->task->selectTestStory = "選擇測試需求"; +$lang->task->selectTestStory = "選擇{$lang->SRCommon}"; $lang->task->selectAllUser = '全部'; $lang->task->noStory = "無{$lang->SRCommon}"; $lang->task->noAssigned = '未指派'; From 5f427364c7923ba5c1d835c593a5f21e552df56a Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 13:47:57 +0800 Subject: [PATCH 055/168] * Fix bug#27346. --- module/action/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/action/model.php b/module/action/model.php index a78014d11e..45153af3df 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -1687,6 +1687,7 @@ class actionModel extends model $fieldName = $history->field; $history->fieldLabel = (isset($this->lang->$objectType) && isset($this->lang->$objectType->$fieldName)) ? $this->lang->$objectType->$fieldName : $fieldName; if($objectType == 'module') $history->fieldLabel = $this->lang->tree->$fieldName; + if($fieldName == 'fileName') $history->fieldLabel = $this->lang->file->$fieldName; if(($length = strlen($history->fieldLabel)) > $maxLength) $maxLength = $length; $history->diff ? $historiesWithDiff[] = $history : $historiesWithoutDiff[] = $history; } From 3304ee781bf8d4f86b2049346ecc652d6b304ef0 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 8 Sep 2022 14:57:34 +0800 Subject: [PATCH 056/168] * Fix bug #24318. --- module/task/css/view.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/module/task/css/view.css b/module/task/css/view.css index ff734be84e..5cba220f03 100644 --- a/module/task/css/view.css +++ b/module/task/css/view.css @@ -18,3 +18,6 @@ .c-actions {width: 175px;} [lang^='de'] #mainContent .main-actions .btn-toolbar .btn {padding-left: 3px; padding-right: 3px;} + +#childrenTable .c-id {width: 60px;} +#childrenTable .c-lblPri {width: 50px;} From 55ce88445bdf7b6bb2081745d9decd41cd367e93 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Thu, 8 Sep 2022 15:17:06 +0800 Subject: [PATCH 057/168] * Add the new version. --- VERSION | 2 +- config/config.php | 2 +- db/standard/zentao17.6.1.sql | 4002 +++++++++++++++++++++++++++++++ db/standard/zentao17.6.sql | 3986 ++++++++++++++++++++++++++++++ db/update17.6.sql | 4 +- doc/CHANGELOG | 127 + module/misc/lang/de.php | 2 + module/misc/lang/en.php | 2 + module/misc/lang/fr.php | 2 + module/misc/lang/zh-cn.php | 2 + module/upgrade/config.php | 2 + module/upgrade/lang/version.php | 3 + module/upgrade/model.php | 139 ++ xuanxuan/XUANVERSION | 2 +- xuanxuan/XVERSION | 2 +- 15 files changed, 8273 insertions(+), 6 deletions(-) create mode 100644 db/standard/zentao17.6.1.sql create mode 100644 db/standard/zentao17.6.sql diff --git a/VERSION b/VERSION index c9333734bd..473655ef25 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -17.6 +17.6.1 diff --git a/config/config.php b/config/config.php index e8d0dbd010..b76acef41e 100644 --- a/config/config.php +++ b/config/config.php @@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}} if(!function_exists('getWebRoot')){function getWebRoot(){}} /* 基本设置。Basic settings. */ -$config->version = '17.6'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. +$config->version = '17.6.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. $config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite. $config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP. $config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time. diff --git a/db/standard/zentao17.6.1.sql b/db/standard/zentao17.6.1.sql new file mode 100644 index 0000000000..5c68d56987 --- /dev/null +++ b/db/standard/zentao17.6.1.sql @@ -0,0 +1,4002 @@ +CREATE TABLE `zt_account` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `provider` varchar(255) NOT NULL, + `adminURI` varchar(255) NOT NULL, + `account` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `mobile` varchar(255) NOT NULL, + `extra` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `status` varchar(30) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `provider` (`provider`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_acl` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` mediumint(9) NOT NULL DEFAULT '0', + `type` char(40) NOT NULL DEFAULT 'whitelist', + `source` char(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_action` ( + `id` int(9) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT '0', + `product` text NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `actor` varchar(100) NOT NULL DEFAULT '', + `action` varchar(80) NOT NULL DEFAULT '', + `date` datetime NOT NULL, + `comment` text NOT NULL, + `extra` text, + `read` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `efforted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `actor` (`actor`), + KEY `project` (`project`), + KEY `action` (`action`), + KEY `objectID` (`objectID`) +) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_activity` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `process` mediumint(9) NOT NULL, + `name` varchar(255) NOT NULL, + `optional` varchar(255) NOT NULL, + `tailorNorm` varchar(255) NOT NULL, + `content` mediumtext NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `order` mediumint(8) DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_api` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `product` varchar(255) NOT NULL DEFAULT '', + `lib` int(10) unsigned NOT NULL DEFAULT '0', + `module` int(10) unsigned NOT NULL DEFAULT '0', + `title` varchar(100) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `protocol` varchar(10) NOT NULL DEFAULT '', + `method` varchar(10) NOT NULL DEFAULT '', + `requestType` varchar(100) NOT NULL DEFAULT '', + `responseType` varchar(100) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '0', + `desc` mediumtext NULL, + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `params` text, + `paramsExample` text, + `responseExample` text, + `response` text, + `commonParams` text, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '0', + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_api_lib_release` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `lib` int(10) unsigned NOT NULL DEFAULT '0', + `desc` varchar(255) NOT NULL DEFAULT '', + `version` varchar(255) NOT NULL DEFAULT '', + `snap` mediumtext NOT NULL, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_apispec` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `doc` int(10) unsigned NOT NULL DEFAULT '0', + `module` int(10) unsigned NOT NULL DEFAULT '0', + `title` varchar(100) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `protocol` varchar(10) NOT NULL DEFAULT '', + `method` varchar(10) NOT NULL DEFAULT '', + `requestType` varchar(100) NOT NULL DEFAULT '', + `responseType` varchar(100) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT '', + `owner` varchar(255) NOT NULL DEFAULT '0', + `desc` mediumtext NULL, + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `params` text, + `paramsExample` text, + `responseExample` text, + `response` text, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=176 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_apistruct` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `lib` int(10) unsigned NOT NULL DEFAULT '0', + `name` varchar(30) NOT NULL DEFAULT '', + `type` varchar(50) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL DEFAULT '', + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `attribute` text, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '0', + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_apistruct_spec` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(50) NOT NULL DEFAULT '', + `desc` varchar(255) NOT NULL DEFAULT '', + `attribute` text, + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approval` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `flow` mediumint(8) NOT NULL, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `nodes` mediumtext NOT NULL, + `version` mediumint(9) NOT NULL, + `status` varchar(20) NOT NULL DEFAULT 'doing', + `result` varchar(20) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalflow` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `code` varchar(100) NOT NULL, + `desc` mediumtext NOT NULL, + `version` mediumint(8) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `type` varchar(30) NOT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalflowobject` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `root` int(8) NOT NULL, + `flow` int(8) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `extra` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalflowspec` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `flow` mediumint(8) NOT NULL, + `version` mediumint(8) NOT NULL, + `nodes` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalnode` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `approval` mediumint(8) NOT NULL, + `type` enum('review','cc') NOT NULL, + `title` varchar(255) NOT NULL, + `account` char(30) NOT NULL, + `node` varchar(100) NOT NULL, + `reviewType` varchar(100) NOT NULL DEFAULT 'manual', + `multipleType` enum('and','or') NOT NULL DEFAULT 'and', + `prev` mediumtext NOT NULL, + `next` mediumtext NOT NULL, + `status` varchar(20) NOT NULL DEFAULT 'wait', + `result` varchar(10) NOT NULL, + `date` date NOT NULL, + `opinion` mediumtext NOT NULL, + `extra` mediumtext NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_reviewed_date` (`reviewedDate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalobject` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `approval` int(8) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` mediumint(8) NOT NULL, + `extra` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalrole` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `code` char(30) NOT NULL, + `name` varchar(255) NOT NULL, + `desc` text NOT NULL, + `users` longtext NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_asset` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL, + `type` varchar(30) NOT NULL, + `group` varchar(128) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_assetlib` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `order` SMALLINT UNSIGNED NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_attend` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `date` date NOT NULL, + `signIn` time NOT NULL, + `signOut` time NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `ip` varchar(15) NOT NULL, + `device` varchar(30) NOT NULL, + `client` varchar(20) NOT NULL, + `manualIn` time NOT NULL, + `manualOut` time NOT NULL, + `reason` varchar(30) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `reviewStatus` varchar(30) NOT NULL DEFAULT '', + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `attend` (`date`,`account`), + KEY `account` (`account`), + KEY `date` (`date`), + KEY `status` (`status`), + KEY `reason` (`reason`), + KEY `reviewStatus` (`reviewStatus`), + KEY `reviewedBy` (`reviewedBy`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_attendstat` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `month` char(10) NOT NULL DEFAULT '', + `normal` decimal(12,2) NOT NULL DEFAULT '0.00', + `late` decimal(12,2) NOT NULL DEFAULT '0.00', + `early` decimal(12,2) NOT NULL DEFAULT '0.00', + `absent` decimal(12,2) NOT NULL DEFAULT '0.00', + `trip` decimal(12,2) NOT NULL DEFAULT '0.00', + `egress` decimal(12,2) NOT NULL DEFAULT '0.00', + `lieu` decimal(12,2) NOT NULL DEFAULT '0.00', + `paidLeave` decimal(12,2) NOT NULL DEFAULT '0.00', + `unpaidLeave` decimal(12,2) NOT NULL DEFAULT '0.00', + `timeOvertime` decimal(12,2) NOT NULL DEFAULT '0.00', + `restOvertime` decimal(12,2) NOT NULL DEFAULT '0.00', + `holidayOvertime` decimal(12,2) NOT NULL DEFAULT '0.00', + `deserve` decimal(12,2) NOT NULL DEFAULT '0.00', + `actual` decimal(12,2) NOT NULL DEFAULT '0.00', + `status` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `attend` (`month`,`account`), + KEY `account` (`account`), + KEY `month` (`month`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_auditcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL DEFAULT 'waterfall', + `practiceArea` char(30) NOT NULL, + `type` char(30) NOT NULL, + `title` varchar(255) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` int(10) DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_auditplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `dateType` char(30) DEFAULT NULL, + `config` text, + `objectID` mediumint(9) NOT NULL, + `objectType` char(30) NOT NULL, + `process` mediumint(9) NOT NULL, + `processType` char(30) NOT NULL, + `checkDate` date NOT NULL, + `checkedBy` varchar(30) NOT NULL, + `realCheckDate` date NOT NULL, + `result` char(30) NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `checkBy` varchar(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_auditresult` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `auditplan` mediumint(8) NOT NULL, + `listID` mediumint(8) NOT NULL, + `result` char(30) NOT NULL, + `checkedBy` varchar(30) NOT NULL, + `checkedDate` date NOT NULL, + `comment` text NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_baseimage` ( + `id` smallint(7) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `osType` varchar(50) NOT NULL DEFAULT '', + `os` varchar(50) NOT NULL DEFAULT '', + `osCategory` varchar(50) NOT NULL DEFAULT '', + `osArch` varchar(50) NOT NULL DEFAULT '', + `osLang` varchar(50) NOT NULL DEFAULT '', + `suggestCore` tinyint(1) unsigned NOT NULL DEFAULT '0', + `suggestMemory` mediumint(6) unsigned NOT NULL DEFAULT '0', + `suggestVolume` mediumint(6) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_baseimagebrowser` ( + `vmBackingID` int(10) NOT NULL, + `browserID` int(10) NOT NULL, + PRIMARY KEY (`vmBackingID`,`browserID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_basicmeas` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `purpose` varchar(50) NOT NULL, + `scope` char(30) NOT NULL, + `object` char(30) NOT NULL, + `name` varchar(90) NOT NULL, + `code` char(30) NOT NULL, + `unit` varchar(10) NOT NULL, + `configure` text, + `params` text, + `definition` text, + `source` varchar(255) DEFAULT NULL, + `collectType` varchar(30) NOT NULL, + `collectConf` text NOT NULL, + `execTime` varchar(30) NOT NULL, + `collectedBy` varchar(10) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `order` mediumint(8) unsigned NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_block` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `module` varchar(20) NOT NULL, + `type` char(30) NOT NULL, + `title` varchar(100) NOT NULL, + `source` varchar(20) NOT NULL, + `block` varchar(30) NOT NULL, + `params` text NOT NULL, + `order` tinyint(3) unsigned NOT NULL DEFAULT '0', + `grid` tinyint(3) unsigned NOT NULL DEFAULT '0', + `height` smallint(5) unsigned NOT NULL DEFAULT '0', + `hidden` tinyint(1) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `account_vision_module_type_order` (`account`,`vision`,`module`,`type`,`order`), + KEY `account` (`account`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_branch` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `default` enum('0','1') NOT NULL DEFAULT '0', + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `desc` varchar(255) NOT NULL, + `createdDate` date NOT NULL, + `closedDate` date NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_browser` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT '', + `version` varchar(255) NOT NULL DEFAULT '', + `lang` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_budget` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `stage` char(30) NOT NULL, + `subject` mediumint(8) NOT NULL, + `amount` char(30) NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_bug` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `injection` mediumint(8) unsigned NOT NULL, + `identify` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `plan` mediumint(8) unsigned NOT NULL DEFAULT '0', + `story` mediumint(8) unsigned NOT NULL DEFAULT '0', + `storyVersion` smallint(6) NOT NULL DEFAULT '1', + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `toTask` mediumint(8) unsigned NOT NULL DEFAULT '0', + `toStory` mediumint(8) NOT NULL DEFAULT '0', + `title` varchar(255) NOT NULL, + `keywords` varchar(255) NOT NULL, + `severity` tinyint(4) NOT NULL DEFAULT '0', + `pri` tinyint(3) unsigned NOT NULL, + `type` varchar(30) NOT NULL DEFAULT '', + `os` varchar(255) NOT NULL DEFAULT '', + `browser` varchar(255) NOT NULL DEFAULT '', + `hardware` varchar(30) NOT NULL, + `found` varchar(30) NOT NULL DEFAULT '', + `steps` mediumtext NOT NULL, + `status` enum('active','resolved','closed') NOT NULL DEFAULT 'active', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL, + `confirmed` tinyint(1) NOT NULL DEFAULT '0', + `activatedCount` smallint(6) NOT NULL, + `activatedDate` datetime NOT NULL, + `feedbackBy` varchar(100) NOT NULL, + `notifyEmail` varchar(100) NOT NULL, + `mailto` text, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `openedBuild` varchar(255) NOT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime NOT NULL, + `deadline` date NOT NULL, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `resolution` varchar(30) NOT NULL DEFAULT '', + `resolvedBuild` varchar(30) NOT NULL DEFAULT '', + `resolvedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `duplicateBug` mediumint(8) unsigned NOT NULL, + `linkBug` varchar(255) NOT NULL, + `case` mediumint(8) unsigned NOT NULL, + `caseVersion` smallint(6) NOT NULL DEFAULT '1', + `feedback` mediumint(8) unsigned NOT NULL DEFAULT '0', + `result` mediumint(8) unsigned NOT NULL, + `repo` mediumint(8) unsigned NOT NULL, + `mr` mediumint(8) unsigned NOT NULL, + `entry` text NOT NULL, + `lines` varchar(10) NOT NULL, + `v1` varchar(40) NOT NULL, + `v2` varchar(40) NOT NULL, + `repoType` varchar(30) NOT NULL DEFAULT '', + `issueKey` varchar(50) NOT NULL DEFAULT '', + `testtask` mediumint(8) unsigned NOT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`), + KEY `status` (`status`), + KEY `plan` (`plan`), + KEY `story` (`story`), + KEY `case` (`case`), + KEY `toStory` (`toStory`), + KEY `result` (`result`), + KEY `assignedTo` (`assignedTo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_build` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` char(150) NOT NULL, + `scmPath` char(255) NOT NULL, + `filePath` char(255) NOT NULL, + `date` date NOT NULL, + `stories` text NOT NULL, + `bugs` text NOT NULL, + `builder` char(30) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_burn` ( + `execution` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `date` date NOT NULL, + `estimate` float NOT NULL, + `left` float NOT NULL, + `consumed` float NOT NULL, + `storyPoint` float NOT NULL, + PRIMARY KEY (`execution`,`date`,`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_case` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` mediumint(8) unsigned NOT NULL DEFAULT '0', + `story` mediumint(30) unsigned NOT NULL DEFAULT '0', + `storyVersion` smallint(6) NOT NULL DEFAULT '1', + `title` varchar(255) NOT NULL, + `precondition` text NOT NULL, + `keywords` varchar(255) NOT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT '3', + `type` char(30) NOT NULL DEFAULT '1', + `auto` varchar(10) NOT NULL DEFAULT 'no', + `frame` varchar(10) NOT NULL, + `stage` varchar(255) NOT NULL, + `howRun` varchar(30) NOT NULL, + `scriptedBy` varchar(30) NOT NULL, + `scriptedDate` date NOT NULL, + `scriptStatus` varchar(30) NOT NULL, + `scriptLocation` varchar(255) NOT NULL, + `status` char(30) NOT NULL DEFAULT '1', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL, + `frequency` enum('1','2','3') NOT NULL DEFAULT '1', + `order` tinyint(30) unsigned NOT NULL DEFAULT '0', + `openedBy` char(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `reviewedDate` date NOT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `version` tinyint(3) unsigned NOT NULL DEFAULT '0', + `linkCase` varchar(255) NOT NULL, + `fromBug` mediumint(8) unsigned NOT NULL, + `fromCaseID` mediumint(8) unsigned NOT NULL, + `fromCaseVersion` mediumint(8) unsigned NOT NULL DEFAULT '1', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `lastRunner` varchar(30) NOT NULL, + `lastRunDate` datetime NOT NULL, + `lastRunResult` char(30) NOT NULL, + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `story` (`story`), + KEY `fromBug` (`fromBug`), + KEY `module` (`module`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_casestep` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `case` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(3) unsigned NOT NULL DEFAULT '0', + `type` varchar(10) NOT NULL DEFAULT 'step', + `desc` text NOT NULL, + `expect` text NOT NULL, + PRIMARY KEY (`id`), + KEY `case` (`case`), + KEY `version` (`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_cfd` ( + `id` int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `execution` int(8) NOT NULL, + `type` char(30) NOT NULL, + `name` char(30) NOT NULL, + `count` smallint NOT NULL, + `date` date NOT NULL, + UNIQUE KEY `execution_type_name_date` (`execution`,`type`,`name`,`date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_cmcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL, + `title` int(11) NOT NULL, + `contents` text NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `order` int(11) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_company` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(120) DEFAULT NULL, + `phone` char(20) DEFAULT NULL, + `fax` char(20) DEFAULT NULL, + `address` char(120) DEFAULT NULL, + `zipcode` char(10) DEFAULT NULL, + `website` char(120) DEFAULT NULL, + `backyard` char(120) DEFAULT NULL, + `guest` enum('1','0') NOT NULL DEFAULT '0', + `admins` char(255) DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_compile` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `job` mediumint(8) unsigned NOT NULL, + `queue` mediumint(8) NOT NULL, + `status` varchar(255) NOT NULL, + `logs` text, + `atTime` varchar(10) NOT NULL, + `testtask` mediumint(8) unsigned NOT NULL, + `tag` varchar(255) NOT NULL, + `times` tinyint(3) unsigned NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `updateDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_config` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `owner` char(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL, + `section` char(30) NOT NULL DEFAULT '', + `key` char(30) NOT NULL DEFAULT '', + `value` longtext NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`vision`,`owner`,`module`,`section`,`key`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_cron` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `m` varchar(20) NOT NULL, + `h` varchar(20) NOT NULL, + `dom` varchar(20) NOT NULL, + `mon` varchar(20) NOT NULL, + `dow` varchar(20) NOT NULL, + `command` text NOT NULL, + `remark` varchar(255) NOT NULL, + `type` varchar(20) NOT NULL, + `buildin` tinyint(1) NOT NULL DEFAULT '0', + `status` varchar(20) NOT NULL, + `lastTime` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `lastTime` (`lastTime`) +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deploy` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `status` varchar(20) NOT NULL, + `owner` char(30) NOT NULL, + `members` text NOT NULL, + `notify` text NOT NULL, + `cases` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `result` varchar(20) NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_chart` ( + `id` mediumint NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL, + `dataset` varchar(30) NOT NULL, + `desc` mediumtext NOT NULL, + `settings` mediumtext NOT NULL, + `filters` mediumtext NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_dashboard` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `module` mediumint NOT NULL, + `desc` mediumtext NOT NULL, + `layout` mediumtext NOT NULL, + `filters` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_dataset` ( + `id` mediumint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(155) NOT NULL, + `sql` text NOT NULL, + `fields` mediumtext NOT NULL, + `objects` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deployproduct` ( + `deploy` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `release` mediumint(8) unsigned NOT NULL, + `package` varchar(255) NOT NULL, + UNIQUE KEY `deploy_product_release` (`deploy`,`product`,`release`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deployscope` ( + `deploy` mediumint(8) unsigned NOT NULL, + `service` mediumint(8) unsigned NOT NULL, + `hosts` text NOT NULL, + `remove` text NOT NULL, + `add` text NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deploystep` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `deploy` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `stage` varchar(30) NOT NULL, + `content` text NOT NULL, + `status` varchar(30) NOT NULL, + `assignedTo` char(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `finishedBy` char(30) NOT NULL, + `finishedDate` datetime NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_dept` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(60) NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(4) unsigned NOT NULL DEFAULT '0', + `position` char(30) NOT NULL DEFAULT '', + `function` char(255) NOT NULL DEFAULT '', + `manager` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_design` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` varchar(255) NOT NULL, + `product` varchar(255) NOT NULL, + `commit` text NOT NULL, + `commitedBy` varchar(30) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `story` char(30) NOT NULL, + `desc` mediumtext NOT NULL, + `version` smallint(6) NOT NULL, + `type` char(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_designspec` ( + `design` mediumint(8) NOT NULL, + `version` smallint(6) NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `files` varchar(255) NOT NULL, + UNIQUE KEY `design` (`design`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_doc` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `lib` varchar(30) NOT NULL, + `template` varchar(30) NOT NULL, + `templateType` varchar(30) NOT NULL, + `chapterType` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL, + `title` varchar(255) NOT NULL, + `keywords` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `parent` smallint(5) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `views` smallint(5) unsigned NOT NULL, + `assetLib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `assetLibType` varchar(30) NOT NULL DEFAULT '', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromVersion` smallint(6) NOT NULL DEFAULT '1', + `draft` longtext NOT NULL, + `collector` text NOT NULL, + `addedBy` varchar(30) NOT NULL, + `addedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `approvedDate` date NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `mailto` text, + `acl` varchar(10) NOT NULL DEFAULT 'open', + `groups` varchar(255) NOT NULL, + `users` text NOT NULL, + `version` smallint(5) unsigned NOT NULL DEFAULT '1', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`), + KEY `lib` (`lib`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_doccontent` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `doc` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `digest` varchar(255) NOT NULL, + `content` longtext NOT NULL, + `files` text NOT NULL, + `type` varchar(10) NOT NULL, + `version` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `doc_version` (`doc`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_doclib` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `product` mediumint(8) unsigned NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `name` varchar(60) NOT NULL, + `baseUrl` varchar(255) NOT NULL DEFAULT '', + `acl` varchar(10) NOT NULL DEFAULT 'open', + `groups` varchar(255) NOT NULL, + `users` text NOT NULL, + `main` enum('0','1') NOT NULL DEFAULT '0', + `collector` text NOT NULL, + `desc` mediumtext NOT NULL, + `order` tinyint(5) unsigned NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_domain` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `domain` varchar(255) NOT NULL, + `adminURI` varchar(255) NOT NULL, + `resolverURI` varchar(255) NOT NULL, + `register` varchar(255) NOT NULL, + `expiredDate` datetime NOT NULL, + `renew` varchar(255) NOT NULL, + `account` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `domain` (`domain`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_durationestimation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `stage` mediumint(9) NOT NULL, + `workload` varchar(255) NOT NULL, + `worktimeRate` varchar(255) NOT NULL, + `people` varchar(255) NOT NULL, + `startDate` date NOT NULL, + `endDate` date NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_effort` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `product` text NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `account` varchar(30) NOT NULL, + `work` text, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `date` date NOT NULL, + `left` float NOT NULL, + `consumed` float NOT NULL, + `begin` smallint(4) unsigned zerofill NOT NULL, + `end` smallint(4) unsigned zerofill NOT NULL, + `order` tinyint unsigned NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `execution` (`execution`), + KEY `objectID` (`objectID`), + KEY `date` (`date`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_entry` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `account` varchar(30) NOT NULL DEFAULT '', + `code` varchar(20) NOT NULL, + `key` varchar(32) NOT NULL, + `freePasswd` enum('0','1') NOT NULL DEFAULT '0', + `ip` varchar(100) NOT NULL, + `desc` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `calledTime` int(10) unsigned NOT NULL DEFAULT '0', + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_expect` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `userID` mediumint(8) NOT NULL, + `project` mediumint(8) NOT NULL DEFAULT '0', + `expect` text NOT NULL, + `progress` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_extension` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + `code` varchar(30) NOT NULL, + `version` varchar(50) NOT NULL, + `author` varchar(100) NOT NULL, + `desc` mediumtext NOT NULL, + `license` text NOT NULL, + `type` varchar(20) NOT NULL DEFAULT 'extension', + `site` varchar(150) NOT NULL, + `zentaoCompatible` varchar(100) NOT NULL, + `installedTime` datetime NOT NULL, + `depends` varchar(100) NOT NULL, + `dirs` mediumtext NOT NULL, + `files` mediumtext NOT NULL, + `status` varchar(20) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`), + KEY `name` (`name`), + KEY `installedTime` (`installedTime`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_faq` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `module` mediumint(9) NOT NULL, + `product` mediumint(9) NOT NULL, + `question` varchar(255) NOT NULL, + `answer` text NOT NULL, + `addedtime` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_feedback` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL, + `module` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `type` char(30) NOT NULL, + `solution` char(30) NOT NULL, + `desc` text NOT NULL, + `status` varchar(30) NOT NULL, + `subStatus` varchar(30) NOT NULL DEFAULT '', + `public` enum('0','1') NOT NULL DEFAULT '0', + `notify` enum('0','1') NOT NULL DEFAULT '0', + `notifyEmail` varchar(100) NOT NULL, + `likes` text NOT NULL, + `result` mediumint(8) unsigned NOT NULL, + `faq` mediumint(8) unsigned NOT NULL, + `openedBy` char(30) NOT NULL, + `openedDate` datetime NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `reviewedDate` datetime NOT NULL, + `processedBy` char(30) NOT NULL, + `processedDate` datetime NOT NULL, + `closedBy` char(30) NOT NULL, + `closedDate` datetime NOT NULL, + `closedReason` varchar(30) NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedTo` varchar(255) NOT NULL, + `assignedDate` datetime NOT NULL, + `feedbackBy` varchar(100) NOT NULL, + `repeatFeedback` mediumint(8) NOT NULL DEFAULT 0, + `mailto` varchar(255) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_feedbackview` ( + `account` char(30) NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + UNIQUE KEY `account_product` (`account`,`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_file` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `pathname` char(100) NOT NULL, + `title` varchar(255) NOT NULL, + `extension` char(30) NOT NULL, + `size` int(10) unsigned NOT NULL DEFAULT '0', + `objectType` char(30) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `addedBy` char(30) NOT NULL DEFAULT '', + `addedDate` datetime NOT NULL, + `downloads` mediumint(8) unsigned NOT NULL DEFAULT '0', + `extra` varchar(255) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `objectType` (`objectType`), + KEY `objectID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_gapanalysis` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `account` varchar(30) NOT NULL, + `role` varchar(20) NOT NULL, + `analysis` mediumtext NOT NULL, + `needTrain` enum('no','yes') NOT NULL DEFAULT 'no', + `createdBy` char(30) DEFAULT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `project_account` (`project`,`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_group` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `name` char(30) NOT NULL, + `role` char(30) NOT NULL DEFAULT '', + `desc` char(255) NOT NULL DEFAULT '', + `acl` text, + `developer` enum('0','1') NOT NULL DEFAULT '1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_grouppriv` ( + `group` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` char(30) NOT NULL DEFAULT '', + `method` char(30) NOT NULL DEFAULT '', + UNIQUE KEY `group` (`group`,`module`,`method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_history` ( + `id` int(9) unsigned NOT NULL AUTO_INCREMENT, + `action` mediumint(8) unsigned NOT NULL DEFAULT '0', + `field` varchar(30) NOT NULL DEFAULT '', + `old` text NOT NULL, + `new` text NOT NULL, + `diff` mediumtext NOT NULL, + PRIMARY KEY (`id`), + KEY `action` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_holiday` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) NOT NULL DEFAULT '', + `type` enum('holiday','working') NOT NULL DEFAULT 'holiday', + `desc` mediumtext NOT NULL, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_host` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `assetID` mediumint(8) unsigned NOT NULL, + `admin` smallint(5) unsigned NOT NULL DEFAULT '0', + `serverRoom` mediumint(8) unsigned NOT NULL, + `cabinet` varchar(128) NOT NULL, + `serverModel` varchar(256) NOT NULL, + `hardwareType` varchar(64) NOT NULL, + `hostType` enum('physical','virtual') NOT NULL, + `cpuBrand` varchar(128) NOT NULL, + `cpuModel` varchar(128) NOT NULL, + `cpuNumber` varchar(16) NOT NULL, + `cpuCores` varchar(30) NOT NULL, + `cpuRate` varchar(30) NOT NULL, + `memory` varchar(30) NOT NULL, + `diskType` varchar(30) NOT NULL, + `diskSize` varchar(30) NOT NULL, + `unit` enum('GB','TB') NOT NULL DEFAULT 'GB', + `privateIP` varchar(128) NOT NULL, + `publicIP` varchar(128) NOT NULL, + `nic` varchar(128) NOT NULL, + `mac` varchar(128) NOT NULL, + `osName` varchar(64) NOT NULL, + `osVersion` varchar(64) NOT NULL, + `webserver` varchar(128) NOT NULL, + `database` varchar(128) NOT NULL, + `language` varchar(16) NOT NULL, + `status` varchar(50) NOT NULL, + `agentPort` varchar(10) NOT NULL, + `instanceNum` tinyint(4) NOT NULL DEFAULT '0', + `pri` smallint(5) unsigned NOT NULL DEFAULT '0', + `heartbeatTime` datetime NOT NULL, + `tags` varchar(50) NOT NULL DEFAULT '', + `provider` varchar(255) NOT NULL DEFAULT '', + `bridgeID` varchar(255) NOT NULL DEFAULT '', + `cloudKey` varchar(255) NOT NULL DEFAULT '', + `cloudSecret` varchar(255) NOT NULL DEFAULT '', + `cloudRegion` varchar(255) NOT NULL DEFAULT '', + `cloudNamespace` varchar(255) NOT NULL DEFAULT '', + `cloudUser` varchar(255) NOT NULL DEFAULT '', + `cloudAccount` varchar(255) NOT NULL DEFAULT '', + `cloudPassword` varchar(255) NOT NULL DEFAULT '', + `couldVPC` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_chat` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `gid` char(40) NOT NULL DEFAULT '', + `name` varchar(60) NOT NULL DEFAULT '', + `type` varchar(20) NOT NULL DEFAULT 'group', + `admins` varchar(255) NOT NULL DEFAULT '', + `committers` varchar(255) NOT NULL DEFAULT '', + `subject` mediumint(8) unsigned NOT NULL DEFAULT '0', + `public` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ownedBy` varchar(30) NOT NULL DEFAULT '', + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `mergedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastActiveTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastMessage` int(11) unsigned NOT NULL DEFAULT '0', + `lastMessageIndex` int(11) unsigned NOT NULL DEFAULT 0, + `dismissDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `pinnedMessages` text NOT NULL, + `mergedChats` text NOT NULL DEFAULT '', + `adminInvite` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `gid` (`gid`), + KEY `name` (`name`), + KEY `type` (`type`), + KEY `public` (`public`), + KEY `createdBy` (`createdBy`), + KEY `editedBy` (`editedBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_chat_message_index` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `gid` char(40) NOT NULL, + `tableName` char(64) NOT NULL, + `start` int(11) unsigned NOT NULL, + `end` int(11) unsigned NOT NULL, + `startIndex` int(11) unsigned NOT NULL, + `endIndex` int(11) unsigned NOT NULL, + `startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `count` mediumint(8) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `chattable` (`gid`,`tableName`), + KEY `start` (`start`), + KEY `end` (`end`), + KEY `startDate` (`startDate`), + KEY `endDate` (`endDate`), + KEY `chatstartindex` (`gid`,`startIndex`), + KEY `chatendindex` (`gid`,`endIndex`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_chatuser` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `cgid` char(40) NOT NULL DEFAULT '', + `user` mediumint(8) NOT NULL DEFAULT '0', + `order` smallint(5) NOT NULL DEFAULT '0', + `star` enum('0','1') NOT NULL DEFAULT '0', + `hide` enum('0','1') NOT NULL DEFAULT '0', + `mute` enum('0','1') NOT NULL DEFAULT '0', + `freeze` enum('0','1') NOT NULL DEFAULT '0', + `join` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `quit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `category` varchar(40) NOT NULL DEFAULT '', + `lastReadMessage` int(11) unsigned NOT NULL DEFAULT '0', + `lastReadMessageIndex` int(11) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `chatuser` (`cgid`,`user`), + KEY `cgid` (`cgid`), + KEY `user` (`user`), + KEY `order` (`order`), + KEY `star` (`star`), + KEY `hide` (`hide`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_client` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `version` char(30) NOT NULL DEFAULT '', + `desc` varchar(100) NOT NULL DEFAULT '', + `changeLog` text NOT NULL, + `strategy` varchar(10) NOT NULL DEFAULT '', + `downloads` text NOT NULL, + `createdDate` datetime NOT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `status` enum('released','wait') NOT NULL DEFAULT 'wait', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_conference` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `rid` char(40) NOT NULL DEFAULT '', + `cgid` char(40) NOT NULL DEFAULT '', + `status` enum('closed','open') NOT NULL DEFAULT 'closed', + `participants` text NOT NULL, + `invitee` text NOT NULL, + `openedBy` mediumint(8) NOT NULL DEFAULT '0', + `openedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_conferenceaction` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `rid` char(40) NOT NULL DEFAULT '', + `type` enum('create','invite','join','leave','close','publish') NOT NULL DEFAULT 'create', + `data` text NOT NULL, + `user` mediumint(8) NOT NULL DEFAULT '0', + `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `device` char(40) NOT NULL DEFAULT 'default', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_message` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `gid` char(40) NOT NULL DEFAULT '', + `cgid` char(40) NOT NULL DEFAULT '', + `user` varchar(30) NOT NULL DEFAULT '', + `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `index` int(11) unsigned NOT NULL DEFAULT 0, + `type` enum('normal','broadcast','notify','bulletin') NOT NULL DEFAULT 'normal', + `content` text NOT NULL, + `contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text', + `data` text NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `mgid` (`gid`), + KEY `mcgid` (`cgid`), + KEY `muser` (`user`), + KEY `mtype` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_message_backup` ( + `id` int(11) unsigned NOT NULL, + `gid` char(40) NOT NULL DEFAULT '', + `cgid` char(40) NOT NULL DEFAULT '', + `user` varchar(30) NOT NULL DEFAULT '', + `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `index` int(11) unsigned NOT NULL DEFAULT 0, + `type` enum('normal','broadcast','notify') NOT NULL DEFAULT 'normal', + `content` text NOT NULL, + `contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text', + `data` text NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_message_index` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `tableName` char(64) NOT NULL, + `start` int(11) unsigned NOT NULL, + `end` int(11) unsigned NOT NULL, + `startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `chats` text NOT NULL, + PRIMARY KEY (`id`), + KEY `tableName` (`tableName`), + KEY `start` (`start`), + KEY `end` (`end`), + KEY `startDate` (`startDate`), + KEY `endDate` (`endDate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_messagestatus` ( + `user` mediumint(8) NOT NULL DEFAULT '0', + `message` int(11) unsigned NOT NULL, + `status` enum('waiting','sent','readed','deleted') NOT NULL DEFAULT 'waiting', + UNIQUE KEY `user` (`user`,`message`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_queue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL, + `content` text NOT NULL, + `addDate` datetime NOT NULL, + `processDate` datetime NOT NULL, + `result` text NOT NULL, + `status` char(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_userdevice` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `user` mediumint(8) NOT NULL DEFAULT '0', + `device` char(40) NOT NULL DEFAULT 'default', + `deviceID` char(40) NOT NULL DEFAULT '', + `token` char(64) NOT NULL DEFAULT '', + `validUntil` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastLogin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastLogout` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE KEY `userdevice` (`user`,`device`), + KEY `user` (`user`), + KEY `lastLogin` (`lastLogin`), + KEY `lastLogout` (`lastLogout`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_intervention` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `activity` mediumint(8) NOT NULL, + `status` char(30) NOT NULL, + `partake` text NOT NULL, + `begin` date NOT NULL, + `realBegin` date NOT NULL, + `situation` varchar(255) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `project` (`project`,`activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_issue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `resolvedBy` varchar(30) NOT NULL, + `project` varchar(255) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `pri` char(30) NOT NULL, + `severity` char(30) NOT NULL, + `type` char(30) NOT NULL, + `activity` varchar(255) NOT NULL, + `deadline` date NOT NULL, + `resolution` char(30) NOT NULL, + `resolutionComment` text NOT NULL, + `objectID` varchar(255) NOT NULL, + `resolvedDate` date NOT NULL, + `status` varchar(30) NOT NULL, + `owner` varchar(255) NOT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `activateBy` varchar(30) NOT NULL, + `activateDate` date NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` date NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `approvedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_job` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `repo` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `frame` varchar(20) NOT NULL, + `engine` varchar(20) NOT NULL, + `server` mediumint(8) unsigned NOT NULL, + `pipeline` varchar(500) NOT NULL, + `triggerType` varchar(255) NOT NULL, + `sonarqubeServer` mediumint(8) unsigned NOT NULL, + `projectKey` varchar(255) NOT NULL, + `svnDir` varchar(255) NOT NULL, + `atDay` varchar(255) DEFAULT NULL, + `atTime` varchar(10) DEFAULT NULL, + `customParam` text NOT NULL, + `comment` varchar(255) DEFAULT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `lastExec` datetime DEFAULT NULL, + `lastStatus` varchar(255) DEFAULT NULL, + `lastTag` varchar(255) DEFAULT NULL, + `lastSyncDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanban` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `space` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `owner` varchar(30) NOT NULL, + `team` text NOT NULL, + `desc` mediumtext NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `archived` enum('0','1') NOT NULL DEFAULT '1', + `performable` enum('0','1') NOT NULL DEFAULT '0', + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `order` mediumint(8) NOT NULL DEFAULT '0', + `displayCards` smallint(6) NOT NULL DEFAULT '0', + `showWIP` enum('0','1') NOT NULL DEFAULT '1', + `fluidBoard` enum('0','1') NOT NULL DEFAULT '0', + `object` varchar(255) NOT NULL, + `alignment` varchar(10) NOT NULL DEFAULT 'center', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `closedBy` char(30) NOT NULL, + `closedDate` datetime NOT NULL, + `activatedBy` char(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbancard` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) unsigned NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `group` mediumint(8) unsigned NOT NULL, + `fromID` mediumint(8) unsigned NOT NULL, + `fromType` varchar(30) NOT NULL, + `name` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'doing', + `pri` mediumint(8) unsigned NOT NULL, + `assignedTo` text NOT NULL, + `desc` mediumtext NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `estimate` float unsigned NOT NULL, + `progress` float unsigned NOT NULL DEFAULT '0', + `color` char(7) NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `order` mediumint(8) NOT NULL DEFAULT '0', + `archived` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `archivedBy` char(30) NOT NULL, + `archivedDate` datetime NOT NULL, + `assignedBy` char(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbancell` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) NOT NULL, + `lane` mediumint(8) NOT NULL, + `column` mediumint(8) NOT NULL, + `type` char(30) NOT NULL, + `cards` text NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `card_group` (`kanban`,`type`,`lane`,`column`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbancolumn` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `parent` mediumint(8) NOT NULL DEFAULT '0', + `type` char(30) NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `group` mediumint(8) NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `color` char(30) NOT NULL, + `limit` smallint(6) NOT NULL DEFAULT '-1', + `order` mediumint(8) NOT NULL DEFAULT '0', + `archived` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbangroup` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) unsigned NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `order` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbanlane` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `execution` mediumint(8) NOT NULL DEFAULT '0', + `type` char(30) NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `group` mediumint(8) unsigned NOT NULL, + `groupby` char(30) NOT NULL, + `extra` char(30) NOT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `color` char(30) NOT NULL, + `order` smallint(6) NOT NULL DEFAULT '0', + `lastEditedTime` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbanregion` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `space` mediumint(8) unsigned NOT NULL, + `kanban` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `order` mediumint(8) NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbanspace` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(50) NOT NULL, + `owner` varchar(30) NOT NULL, + `team` text NOT NULL, + `desc` mediumtext NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `order` mediumint(8) NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `closedBy` char(30) NOT NULL, + `closedDate` datetime NOT NULL, + `activatedBy` char(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_lang` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `lang` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL, + `section` varchar(30) NOT NULL, + `key` varchar(60) NOT NULL, + `value` text NOT NULL, + `system` enum('0','1') NOT NULL DEFAULT '1', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`,`vision`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_leave` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT '0.0', + `backDate` datetime NOT NULL, + `type` varchar(30) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + `level` tinyint(3) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `reviewers` text NOT NULL, + `backReviewers` text NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `type` (`type`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_lieu` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT '0.0', + `overtime` char(255) NOT NULL, + `trip` char(255) NOT NULL, + `desc` text NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + `level` tinyint(3) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `reviewers` text NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_log` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `action` mediumint(8) unsigned NOT NULL, + `date` datetime NOT NULL, + `url` varchar(255) NOT NULL, + `contentType` varchar(30) NOT NULL, + `data` text NOT NULL, + `result` text NOT NULL, + PRIMARY KEY (`id`), + KEY `objectType` (`objectType`), + KEY `obejctID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_measqueue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL, + `mid` mediumint(8) unsigned NOT NULL, + `status` varchar(255) NOT NULL, + `logs` text, + `execTime` varchar(10) NOT NULL, + `params` text, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `updateDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_measrecords` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL, + `mid` mediumint(8) NOT NULL, + `measCode` char(50) NOT NULL DEFAULT '', + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `params` text NOT NULL, + `year` char(4) NOT NULL, + `month` char(6) NOT NULL, + `week` char(8) NOT NULL, + `day` char(8) NOT NULL, + `value` varchar(255) NOT NULL, + `date` date NOT NULL, + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `project` (`project`), + KEY `time` (`year`,`month`,`day`,`week`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_meastemplate` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL, + `name` varchar(255) NOT NULL, + `content` mediumtext NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_meeting` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL, + `execution` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `begin` time NOT NULL, + `end` time NOT NULL, + `dept` mediumint(8) NOT NULL, + `mode` varchar(255) NOT NULL, + `host` varchar(30) NOT NULL, + `participant` text NOT NULL, + `date` date NOT NULL, + `room` int(11) NOT NULL, + `minutes` text NOT NULL, + `minutedBy` varchar(30) NOT NULL, + `minutedDate` datetime NOT NULL, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_meetingroom` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `position` varchar(30) NOT NULL, + `seats` int(11) NOT NULL, + `equipment` varchar(255) NOT NULL, + `openTime` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_module` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `root` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` char(60) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `type` char(30) NOT NULL, + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `owner` varchar(30) NOT NULL, + `collector` text NOT NULL, + `short` varchar(30) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `root` (`root`), + KEY `type` (`type`), + KEY `path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_mr` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `hostID` mediumint(8) unsigned NOT NULL, + `sourceProject` varchar(50) NOT NULL, + `sourceBranch` varchar(100) NOT NULL, + `targetProject` varchar(50) NOT NULL, + `targetBranch` varchar(100) NOT NULL, + `mriid` int(10) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `description` text NOT NULL, + `assignee` varchar(255) NOT NULL, + `reviewer` varchar(255) NOT NULL, + `approver` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `status` char(30) NOT NULL, + `mergeStatus` char(30) NOT NULL, + `approvalStatus` char(30) NOT NULL, + `needApproved` enum('0','1') NOT NULL DEFAULT '0', + `needCI` enum('0','1') NOT NULL DEFAULT '0', + `repoID` mediumint(8) unsigned NOT NULL, + `jobID` mediumint(8) unsigned NOT NULL, + `compileID` mediumint(8) unsigned NOT NULL, + `compileStatus` char(30) NOT NULL, + `removeSourceBranch` enum('0','1') NOT NULL DEFAULT '0', + `synced` enum('0','1') NOT NULL DEFAULT '1', + `syncError` varchar(255) NOT NULL, + `hasNoConflict` enum('0','1') NOT NULL DEFAULT '0', + `diffs` longtext, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_mrapproval` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `mrID` mediumint(8) unsigned NOT NULL, + `account` varchar(255) NOT NULL, + `date` datetime NOT NULL, + `action` char(30) NOT NULL, + `comment` text NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_nc` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `auditplan` mediumint(8) NOT NULL, + `listID` mediumint(8) NOT NULL, + `title` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `type` char(30) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'active', + `severity` char(30) NOT NULL, + `deadline` date NOT NULL, + `resolvedBy` varchar(30) NOT NULL, + `resolution` char(30) NOT NULL, + `resolvedDate` date NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` date NOT NULL, + `parent` mediumint(8) unsigned NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` date NOT NULL, + `activateDate` date NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_notify` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(50) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `action` mediumint(9) NOT NULL, + `toList` varchar(255) NOT NULL, + `ccList` text NOT NULL, + `subject` varchar(255) NOT NULL, + `data` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `sendTime` datetime NOT NULL, + `status` varchar(10) NOT NULL DEFAULT 'wait', + `failReason` text NOT NULL, + PRIMARY KEY (`id`), + KEY `objectType_toList_status` (`objectType`,`toList`,`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_oauth` ( + `account` varchar(30) NOT NULL, + `openID` varchar(255) NOT NULL, + `providerType` varchar(30) NOT NULL, + `providerID` mediumint(8) unsigned NOT NULL, + KEY `account` (`account`), + KEY `providerType` (`providerType`), + KEY `providerID` (`providerID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_object` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) NOT NULL, + `from` mediumint(8) NOT NULL, + `title` varchar(255) NOT NULL, + `category` char(30) NOT NULL, + `version` varchar(255) NOT NULL, + `type` enum('reviewed','taged') NOT NULL, + `range` text NOT NULL, + `data` text NOT NULL, + `storyEst` char(30) NOT NULL, + `taskEst` char(30) NOT NULL, + `requestEst` char(30) NOT NULL, + `testEst` char(30) NOT NULL, + `devEst` char(30) NOT NULL, + `designEst` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_opportunity` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `source` char(30) NOT NULL, + `type` char(30) NOT NULL, + `strategy` char(30) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'active', + `impact` mediumint(8) NOT NULL, + `chance` mediumint(8) NOT NULL, + `ratio` mediumint(8) NOT NULL, + `pri` char(30) NOT NULL, + `identifiedDate` date NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` date NOT NULL, + `approvedDate` date NOT NULL, + `prevention` mediumtext NOT NULL, + `plannedClosedDate` date NOT NULL, + `actualClosedDate` date NOT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `activatedBy` varchar(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` datetime NOT NULL, + `canceledBy` varchar(30) NOT NULL, + `canceledDate` datetime NOT NULL, + `cancelReason` char(30) NOT NULL, + `hangupedBy` varchar(30) NOT NULL, + `hangupedDate` datetime NOT NULL, + `resolution` mediumtext NOT NULL, + `resolvedBy` varchar(30) NOT NULL, + `resolvedDate` datetime NOT NULL, + `lastCheckedBy` varchar(30) NOT NULL, + `lastCheckedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_overtime` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT '0.0', + `leave` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `rejectReason` varchar(100) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + `level` tinyint(3) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `reviewers` text NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `type` (`type`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_pipeline` ( + `id` smallint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL, + `name` varchar(50) NOT NULL, + `url` varchar(255) DEFAULT NULL, + `account` varchar(30) DEFAULT NULL, + `password` varchar(255) NOT NULL, + `token` varchar(255) DEFAULT NULL, + `private` char(32) DEFAULT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_planstory` ( + `plan` mediumint(8) unsigned NOT NULL, + `story` mediumint(8) unsigned NOT NULL, + `order` mediumint(9) NOT NULL, + UNIQUE KEY `plan_story` (`plan`,`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_process` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL DEFAULT 'waterfall', + `name` varchar(255) NOT NULL, + `type` char(30) NOT NULL, + `abbr` char(30) NOT NULL, + `desc` mediumtext NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `order` mediumint(9) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_product` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `program` mediumint(8) unsigned NOT NULL, + `name` varchar(90) NOT NULL, + `code` varchar(45) NOT NULL, + `bind` enum('0','1') NOT NULL DEFAULT '0', + `line` mediumint(8) NOT NULL, + `type` varchar(30) NOT NULL DEFAULT 'normal', + `status` varchar(30) NOT NULL DEFAULT '', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL, + `PO` varchar(30) NOT NULL, + `QD` varchar(30) NOT NULL, + `RD` varchar(30) NOT NULL, + `feedback` varchar(30) NOT NULL, + `acl` enum('open','private','custom') NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `reviewer` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `createdVersion` varchar(20) NOT NULL, + `order` mediumint(8) unsigned NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `acl` (`acl`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_productplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `parent` mediumint(9) NOT NULL DEFAULT '0', + `title` varchar(90) NOT NULL, + `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait', + `desc` mediumtext NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `order` text NOT NULL, + `closedReason` varchar(20) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `end` (`end`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programactivity` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `process` mediumint(8) NOT NULL, + `activity` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `content` text NOT NULL, + `reason` varchar(255) NOT NULL, + `result` char(30) NOT NULL, + `linkedBy` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programoutput` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `process` mediumint(8) NOT NULL, + `activity` mediumint(8) NOT NULL, + `output` mediumint(8) NOT NULL, + `content` text NOT NULL, + `name` varchar(255) NOT NULL, + `reason` varchar(255) NOT NULL, + `result` char(30) NOT NULL, + `linkedBy` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programprocess` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `process` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `type` char(30) NOT NULL, + `abbr` char(30) NOT NULL, + `desc` text NOT NULL, + `reason` varchar(255) NOT NULL, + `linkedBy` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programreport` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `template` mediumint(8) NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `params` text NOT NULL, + `content` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_project` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL DEFAULT '0', + `model` char(30) NOT NULL, + `type` char(30) NOT NULL DEFAULT 'sprint', + `lifetime` char(30) NOT NULL DEFAULT '', + `budget` varchar(30) NOT NULL DEFAULT '0', + `budgetUnit` char(30) NOT NULL DEFAULT 'CNY', + `attribute` varchar(30) NOT NULL DEFAULT '', + `percent` float unsigned NOT NULL DEFAULT '0', + `milestone` enum('0','1') NOT NULL DEFAULT '0', + `output` text NOT NULL, + `auth` char(30) NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` varchar(255) NOT NULL, + `grade` tinyint(3) unsigned NOT NULL, + `name` varchar(90) NOT NULL, + `code` varchar(45) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `realBegan` date NOT NULL, + `realEnd` date NOT NULL, + `days` smallint(5) unsigned NOT NULL, + `status` varchar(10) NOT NULL, + `subStatus` varchar(30) NOT NULL DEFAULT '', + `pri` enum('1','2','3','4') NOT NULL DEFAULT '1', + `desc` mediumtext NOT NULL, + `version` smallint(6) NOT NULL, + `parentVersion` smallint(6) NOT NULL, + `planDuration` int(11) NOT NULL, + `realDuration` int(11) NOT NULL, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `openedVersion` varchar(20) NOT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `canceledBy` varchar(30) NOT NULL DEFAULT '', + `canceledDate` datetime NOT NULL, + `suspendedDate` date NOT NULL, + `PO` varchar(30) NOT NULL DEFAULT '', + `PM` varchar(30) NOT NULL DEFAULT '', + `QD` varchar(30) NOT NULL DEFAULT '', + `RD` varchar(30) NOT NULL DEFAULT '', + `team` varchar(90) NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `order` mediumint(8) unsigned NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `displayCards` smallint(6) NOT NULL DEFAULT '0', + `fluidBoard` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `begin` (`begin`), + KEY `end` (`end`), + KEY `status` (`status`), + KEY `acl` (`acl`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectadmin` ( + `group` smallint(6) NOT NULL, + `account` char(30) NOT NULL, + `programs` text NOT NULL, + `projects` text NOT NULL, + `products` text NOT NULL, + `executions` text NOT NULL, + UNIQUE KEY `group_account` (`group`, `account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectcase` ( + `project` mediumint(8) unsigned NOT NULL DEFAULT '0', + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `case` mediumint(8) unsigned NOT NULL DEFAULT '0', + `count` mediumint(8) unsigned NOT NULL DEFAULT '1', + `version` smallint(6) NOT NULL DEFAULT '1', + `order` smallint(6) unsigned NOT NULL, + UNIQUE KEY `project` (`project`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectproduct` ( + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `plan` varchar(255) NOT NULL, + PRIMARY KEY (`project`,`product`,`branch`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectspec` ( + `project` mediumint(8) NOT NULL, + `version` smallint(6) NOT NULL, + `name` varchar(255) NOT NULL, + `milestone` enum('0','1') NOT NULL DEFAULT '0', + `begin` date NOT NULL, + `end` date NOT NULL, + UNIQUE KEY `project` (`project`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectstory` ( + `project` mediumint(8) unsigned NOT NULL DEFAULT '0', + `product` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `story` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `order` smallint(6) unsigned NOT NULL, + UNIQUE KEY `project` (`project`,`story`), + KEY `story` (`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_relation` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL, + `product` mediumint(8) NOT NULL, + `execution` mediumint(8) NOT NULL, + `AType` char(30) NOT NULL, + `AID` mediumint(8) NOT NULL, + `AVersion` char(30) NOT NULL, + `relation` char(30) NOT NULL, + `BType` char(30) NOT NULL, + `BID` mediumint(8) NOT NULL, + `BVersion` char(30) NOT NULL, + `extra` char(30) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `relation` (`product`,`relation`,`AType`,`BType`,`AID`,`BID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_relationoftasks` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `execution` mediumint(8) unsigned NOT NULL, + `pretask` mediumint(8) unsigned NOT NULL, + `condition` enum('begin','end') NOT NULL, + `task` mediumint(8) unsigned NOT NULL, + `action` enum('begin','end') NOT NULL, + PRIMARY KEY (`id`), + KEY `relationoftasks` (`execution`,`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_release` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `build` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `marker` enum('0','1') NOT NULL DEFAULT '0', + `date` date NOT NULL, + `stories` text NOT NULL, + `bugs` text NOT NULL, + `leftBugs` text NOT NULL, + `desc` mediumtext NOT NULL, + `mailto` text, + `notify` varchar(255) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'normal', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `build` (`build`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repo` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `product` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `path` varchar(255) NOT NULL, + `prefix` varchar(100) NOT NULL, + `encoding` varchar(20) NOT NULL, + `SCM` varchar(10) NOT NULL, + `client` varchar(100) NOT NULL, + `serviceHost` varchar(50) NOT NULL, + `serviceProject` varchar(100) NOT NULL, + `commits` mediumint(8) unsigned NOT NULL, + `account` varchar(30) NOT NULL, + `password` varchar(30) NOT NULL, + `encrypt` varchar(30) NOT NULL DEFAULT 'plain', + `acl` text NOT NULL, + `synced` tinyint(1) NOT NULL DEFAULT '0', + `lastSync` datetime NOT NULL, + `desc` text NOT NULL, + `extra` char(30) NOT NULL, + `preMerge` enum('0','1') NOT NULL DEFAULT '0', + `job` mediumint(8) unsigned NOT NULL, + `fileServerUrl` text, + `fileServerAccount` varchar(40) NOT NULL DEFAULT '', + `fileServerPassword` varchar(100) NOT NULL DEFAULT '', + `deleted` tinyint(1) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repobranch` ( + `repo` mediumint(8) unsigned NOT NULL, + `revision` mediumint(8) unsigned NOT NULL, + `branch` varchar(255) NOT NULL, + UNIQUE KEY `repo_revision_branch` (`repo`,`revision`,`branch`), + KEY `branch` (`branch`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repofiles` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repo` mediumint(8) unsigned NOT NULL, + `revision` mediumint(8) unsigned NOT NULL, + `path` varchar(255) NOT NULL, + `parent` varchar(255) NOT NULL, + `type` varchar(20) NOT NULL, + `action` char(1) NOT NULL, + PRIMARY KEY (`id`), + KEY `path` (`path`), + KEY `parent` (`parent`), + KEY `repo` (`repo`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repohistory` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `repo` mediumint(9) NOT NULL, + `revision` varchar(40) NOT NULL, + `commit` mediumint(8) unsigned NOT NULL, + `comment` text NOT NULL, + `committer` varchar(100) NOT NULL, + `time` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `repo` (`repo`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_report` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `code` varchar(100) NOT NULL, + `name` text NOT NULL, + `module` varchar(100) NOT NULL, + `sql` text NOT NULL, + `vars` text NOT NULL, + `langs` text NOT NULL, + `params` text NOT NULL, + `step` tinyint(1) NOT NULL DEFAULT '2', + `desc` text NOT NULL, + `addedBy` char(30) NOT NULL, + `addedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_researchplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `customer` varchar(255) NOT NULL, + `stakeholder` varchar(255) NOT NULL, + `objective` varchar(255) NOT NULL, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `location` varchar(255) NOT NULL, + `team` varchar(255) NOT NULL, + `method` enum('','videoConference','interview','questionnaire','telephoneInterview') NOT NULL, + `outline` mediumtext NOT NULL, + `schedule` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_researchreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `relatedPlan` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `author` varchar(30) NOT NULL, + `content` mediumtext NOT NULL, + `customer` varchar(255) NOT NULL, + `researchObjects` varchar(255) NOT NULL, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `location` varchar(255) NOT NULL, + `method` enum('','videoConference','interview','questionnaire','telephoneInterview') NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_review` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `object` mediumint(8) NOT NULL, + `template` mediumint(8) NOT NULL, + `doc` mediumint(8) DEFAULT NULL, + `docVersion` smallint(6) NOT NULL, + `status` char(30) NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `auditedBy` varchar(255) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deadline` date NOT NULL, + `lastReviewedBy` varchar(255) DEFAULT NULL, + `lastReviewedDate` date NOT NULL, + `lastAuditedBy` varchar(255) NOT NULL, + `lastAuditedDate` date NOT NULL, + `lastEditedBy` varchar(255) NOT NULL, + `lastEditedDate` date NOT NULL, + `result` char(30) NOT NULL, + `auditResult` char(30) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `object` char(30) NOT NULL, + `category` char(30) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `order` mediumint(8) DEFAULT '0', + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewissue` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `review` mediumint(8) NOT NULL, + `approval` mediumint(8) NOT NULL, + `injection` mediumint(8) NOT NULL, + `identify` mediumint(8) NOT NULL, + `type` char(30) NOT NULL DEFAULT 'review', + `listID` mediumint(8) NOT NULL, + `title` varchar(255) NOT NULL, + `opinion` varchar(255) NOT NULL, + `opinionDate` date NOT NULL, + `status` char(30) NOT NULL, + `resolution` char(30) NOT NULL, + `resolutionBy` char(30) NOT NULL, + `resolutionDate` date NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewlist` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `object` char(30) NOT NULL, + `category` char(30) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewresult` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `review` mediumint(8) NOT NULL, + `type` char(30) NOT NULL DEFAULT 'review', + `result` char(30) NOT NULL, + `opinion` text NOT NULL, + `reviewer` char(30) NOT NULL, + `remainIssue` char(30) NOT NULL, + `createdDate` date NOT NULL, + `consumed` float NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `reviewer` (`review`,`reviewer`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_risk` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` varchar(255) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `source` char(30) NOT NULL, + `category` char(30) NOT NULL, + `strategy` char(30) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'active', + `impact` char(30) NOT NULL, + `probability` char(30) NOT NULL, + `rate` char(30) NOT NULL, + `pri` char(30) NOT NULL, + `identifiedDate` date NOT NULL, + `prevention` mediumtext NOT NULL, + `remedy` mediumtext NOT NULL, + `plannedClosedDate` date NOT NULL, + `actualClosedDate` date NOT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `resolution` mediumtext NOT NULL, + `resolvedBy` varchar(30) NOT NULL, + `activateBy` varchar(30) NOT NULL, + `activateDate` date NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` date NOT NULL, + `cancelBy` varchar(30) NOT NULL, + `cancelDate` date NOT NULL, + `cancelReason` char(30) NOT NULL, + `hangupBy` varchar(30) NOT NULL, + `hangupDate` date NOT NULL, + `trackedBy` varchar(30) NOT NULL, + `trackedDate` date NOT NULL, + `assignedDate` date NOT NULL, + `approvedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_riskissue` ( + `risk` mediumint(8) unsigned NOT NULL, + `issue` mediumint(8) unsigned NOT NULL, + UNIQUE KEY `risk_issue` (`risk`,`issue`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_score` ( + `id` bigint(12) unsigned NOT NULL AUTO_INCREMENT, + `account` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL DEFAULT '', + `method` varchar(30) NOT NULL, + `desc` varchar(250) NOT NULL DEFAULT '', + `before` int(11) NOT NULL DEFAULT '0', + `score` int(11) NOT NULL DEFAULT '0', + `after` int(11) NOT NULL DEFAULT '0', + `time` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `model` (`module`), + KEY `method` (`method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_searchdict` ( + `key` smallint(5) unsigned NOT NULL, + `value` char(3) NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_searchindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `objectType` char(20) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `title` text NOT NULL, + `content` text NOT NULL, + `addedDate` datetime NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `object` (`objectType`,`objectID`), + KEY `addedDate` (`addedDate`), + FULLTEXT KEY `content` (`content`), + FULLTEXT KEY `title` (`title`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_serverroom` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `city` varchar(128) NOT NULL, + `line` varchar(20) NOT NULL, + `bandwidth` varchar(128) NOT NULL, + `provider` varchar(128) NOT NULL, + `owner` varchar(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_service` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `external` enum('0','1') NOT NULL DEFAULT '0', + `port` smallint(5) unsigned NOT NULL, + `entry` varchar(255) NOT NULL, + `deploy` varchar(255) NOT NULL, + `version` varchar(64) NOT NULL, + `color` char(7) NOT NULL, + `desc` mediumtext, + `dept` varchar(128) NOT NULL, + `devel` varchar(30) NOT NULL, + `qa` varchar(30) NOT NULL, + `ops` varchar(30) NOT NULL, + `hosts` text, + `softName` varchar(128) NOT NULL, + `softVersion` varchar(128) NOT NULL, + `type` varchar(20) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_solutions` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `contents` text NOT NULL COMMENT '问题描述', + `support` text NOT NULL COMMENT '是否需要高层支持', + `measures` text NOT NULL COMMENT '解决建议', + `type` char(30) NOT NULL, + `addedBy` varchar(30) NOT NULL, + `addedDate` date NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_sqlview` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(90) NOT NULL, + `code` varchar(45) NOT NULL, + `sql` text NOT NULL, + `desc` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_stage` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `percent` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_stakeholder` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `objectID` mediumint(8) NOT NULL, + `objectType` char(30) NOT NULL, + `user` char(30) NOT NULL, + `type` char(30) NOT NULL, + `key` enum('0','1') NOT NULL, + `from` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL, + KEY `objectID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_story` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `parent` mediumint(9) NOT NULL DEFAULT '0', + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `plan` text, + `source` varchar(20) NOT NULL, + `sourceNote` varchar(255) NOT NULL, + `fromBug` mediumint(8) unsigned NOT NULL DEFAULT '0', + `feedback` mediumint(8) unsigned NOT NULL DEFAULT '0', + `title` varchar(255) NOT NULL, + `keywords` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL DEFAULT 'story', + `category` varchar(30) NOT NULL DEFAULT 'feature', + `pri` tinyint(3) unsigned NOT NULL DEFAULT '3', + `estimate` float unsigned NOT NULL, + `status` enum('','changing','active','draft','closed','reviewing') 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', + `stagedBy` char(30) NOT NULL, + `mailto` text, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromStory` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromVersion` smallint(6) NOT NULL DEFAULT '1', + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime NOT NULL, + `approvedDate` date NOT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `changedBy` VARCHAR(30) NOT NULL, + `changedDate` DATETIME NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `reviewedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `closedReason` varchar(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `toBug` mediumint(8) unsigned NOT NULL, + `childStories` varchar(255) NOT NULL, + `linkStories` varchar(255) NOT NULL, + `linkRequirements` varchar(255) NOT NULL, + `duplicateStory` mediumint(8) unsigned NOT NULL, + `version` smallint(6) NOT NULL DEFAULT '1', + `storyChanged` enum('0','1') NOT NULL DEFAULT '0', + `feedbackBy` varchar(100) NOT NULL, + `notifyEmail` varchar(100) NOT NULL, + `URChanged` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `status` (`status`), + KEY `assignedTo` (`assignedTo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storyestimate` ( + `story` mediumint(9) NOT NULL, + `round` smallint(6) NOT NULL, + `estimate` text NOT NULL, + `average` float NOT NULL, + `openedBy` varchar(30) NOT NULL, + `openedDate` datetime NOT NULL, + UNIQUE KEY `story` (`story`,`round`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storyreview` ( + `story` mediumint(9) NOT NULL, + `version` smallint(6) NOT NULL, + `reviewer` varchar(30) NOT NULL, + `result` varchar(30) NOT NULL, + `reviewDate` datetime NOT NULL, + UNIQUE KEY `story` (`story`,`version`,`reviewer`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storyspec` ( + `story` mediumint(9) NOT NULL, + `version` smallint(6) NOT NULL, + `title` varchar(255) NOT NULL, + `spec` mediumtext NOT NULL, + `verify` mediumtext NOT NULL, + `files` text NOT NULL, + UNIQUE KEY `story` (`story`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storystage` ( + `story` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `stage` varchar(50) NOT NULL, + `stagedBy` char(30) NOT NULL, + UNIQUE KEY `story_branch` (`story`,`branch`), + KEY `story` (`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_suitecase` ( + `suite` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `case` mediumint(8) unsigned NOT NULL, + `version` smallint(5) unsigned NOT NULL, + UNIQUE KEY `suitecase` (`suite`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_task` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `parent` mediumint(8) NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `design` mediumint(8) unsigned NOT NULL, + `story` mediumint(8) unsigned NOT NULL DEFAULT '0', + `storyVersion` smallint(6) NOT NULL DEFAULT '1', + `designVersion` smallint(6) unsigned NOT NULL, + `fromBug` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromIssue` mediumint(8) unsigned NOT NULL DEFAULT '0', + `feedback` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `type` varchar(20) NOT NULL, + `mode` varchar(10) NOT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT '0', + `estimate` float unsigned NOT NULL, + `consumed` float unsigned NOT NULL, + `left` float unsigned NOT NULL, + `deadline` date NOT NULL, + `status` enum('wait','doing','done','pause','cancel','closed') NOT NULL DEFAULT 'wait', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL, + `mailto` text, + `desc` mediumtext NOT NULL, + `version` smallint(6) NOT NULL, + `openedBy` varchar(30) NOT NULL, + `openedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `estStarted` date NOT NULL, + `realStarted` datetime NOT NULL, + `finishedBy` varchar(30) NOT NULL, + `finishedDate` datetime NOT NULL, + `finishedList` text NOT NULL, + `canceledBy` varchar(30) NOT NULL, + `canceledDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` datetime NOT NULL, + `planDuration` int(11) NOT NULL, + `realDuration` int(11) NOT NULL, + `closedReason` varchar(30) NOT NULL, + `lastEditedBy` varchar(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `activatedDate` datetime NOT NULL, + `order` mediumint(8) NOT NULL DEFAULT 0, + `repo` mediumint(8) unsigned NOT NULL, + `mr` mediumint(8) unsigned NOT NULL, + `entry` varchar(255) NOT NULL, + `lines` varchar(10) NOT NULL, + `v1` varchar(40) NOT NULL, + `v2` varchar(40) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + KEY `execution` (`execution`), + KEY `story` (`story`), + KEY `parent` (`parent`), + KEY `assignedTo` (`assignedTo`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_taskestimate` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `date` date NOT NULL, + `left` float unsigned NOT NULL DEFAULT '0', + `consumed` float unsigned NOT NULL, + `account` char(30) NOT NULL DEFAULT '', + `work` text, + `order` tinyint unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `task` (`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_taskspec` ( + `task` mediumint(8) NOT NULL, + `version` smallint(6) NOT NULL, + `name` varchar(255) NOT NULL, + `estStarted` date NOT NULL, + `deadline` date NOT NULL, + UNIQUE KEY `task` (`task`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_taskteam` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL, + `account` char(30) NOT NULL, + `estimate` decimal(12,2) NOT NULL, + `consumed` decimal(12,2) NOT NULL, + `left` decimal(12,2) NOT NULL, + `transfer` char(30) NOT NULL, + `status` enum('wait','doing','done') NOT NULL DEFAULT 'wait', + `order` tinyint(3) NOT NULL, + PRIMARY KEY (`id`), + KEY `task` (`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_team` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `root` mediumint(8) unsigned NOT NULL DEFAULT '0', + `type` enum('project','task','execution') NOT NULL DEFAULT 'project', + `account` char(30) NOT NULL DEFAULT '', + `role` char(30) NOT NULL DEFAULT '', + `position` varchar(30) NOT NULL, + `limited` char(8) NOT NULL DEFAULT 'no', + `join` date NOT NULL DEFAULT '0000-00-00', + `days` smallint(5) unsigned NOT NULL, + `hours` float(3,1) unsigned NOT NULL DEFAULT '0.0', + `estimate` decimal(12,2) unsigned NOT NULL DEFAULT '0.00', + `consumed` decimal(12,2) unsigned NOT NULL DEFAULT '0.00', + `left` decimal(12,2) unsigned NOT NULL DEFAULT '0.00', + `order` tinyint(3) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `team` (`root`,`type`,`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `tasks` varchar(255) NOT NULL, + `builds` varchar(255) NOT NULL, + `title` varchar(255) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `owner` char(30) NOT NULL, + `members` text NOT NULL, + `stories` text NOT NULL, + `bugs` text NOT NULL, + `cases` text NOT NULL, + `report` text NOT NULL, + `objectType` varchar(20) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testresult` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `run` mediumint(8) unsigned NOT NULL, + `case` mediumint(8) unsigned NOT NULL, + `version` smallint(5) unsigned NOT NULL, + `job` mediumint(8) unsigned NOT NULL, + `compile` mediumint(8) unsigned NOT NULL, + `caseResult` char(30) NOT NULL, + `stepResults` text NOT NULL, + `lastRunner` varchar(30) NOT NULL, + `date` datetime NOT NULL, + `duration` float NOT NULL, + `xml` text NOT NULL, + `deploy` mediumint(8) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `case` (`case`), + KEY `version` (`version`), + KEY `run` (`run`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testrun` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `case` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` tinyint(3) unsigned NOT NULL DEFAULT '0', + `assignedTo` char(30) NOT NULL DEFAULT '', + `lastRunner` varchar(30) NOT NULL, + `lastRunDate` datetime NOT NULL, + `lastRunResult` char(30) NOT NULL, + `status` char(30) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `task` (`task`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testsuite` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `type` varchar(20) NOT NULL, + `order` SMALLINT UNSIGNED NOT NULL DEFAULT '0', + `addedBy` char(30) NOT NULL, + `addedDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`), + KEY `product` (`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testtask` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `name` char(90) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `build` char(30) NOT NULL, + `type` varchar(255) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT '0', + `begin` date NOT NULL, + `end` date NOT NULL, + `realFinishedDate` datetime NOT NULL, + `mailto` text, + `desc` mediumtext NOT NULL, + `report` text NOT NULL, + `status` enum('blocked','doing','wait','done') NOT NULL DEFAULT 'wait', + `testreport` mediumint(8) unsigned NOT NULL, + `auto` varchar(10) NOT NULL DEFAULT 'no', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `build` (`build`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_todo` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `date` date NOT NULL, + `begin` smallint(4) unsigned zerofill NOT NULL, + `end` smallint(4) unsigned zerofill NOT NULL, + `feedback` mediumint(8) unsigned NOT NULL, + `type` char(15) NOT NULL, + `cycle` tinyint(3) unsigned NOT NULL DEFAULT '0', + `idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0', + `pri` tinyint(3) unsigned NOT NULL, + `name` char(150) NOT NULL, + `desc` mediumtext NOT NULL, + `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait', + `private` tinyint(1) NOT NULL, + `config` varchar(255) NOT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime NOT NULL, + `finishedBy` varchar(30) NOT NULL DEFAULT '', + `finishedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `assignedTo` (`assignedTo`), + KEY `finishedBy` (`finishedBy`), + KEY `date` (`date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_traincategory` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(30) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) NOT NULL, + `order` mediumint(8) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_traincontents` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `code` varchar(50) NOT NULL, + `course` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `order` mediumint(8) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` tinyint(1) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_traincourse` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `code` varchar(50) NOT NULL, + `category` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `status` varchar(10) NOT NULL, + `teacher` varchar(30) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL, + `createdBy` varchar(255) NOT NULL, + `createdDate` date NOT NULL, + `editedBy` varchar(255) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_trainplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `place` varchar(255) NOT NULL, + `trainee` text NOT NULL, + `lecturer` varchar(20) NOT NULL, + `type` enum('inside','outside') NOT NULL DEFAULT 'inside', + `status` varchar(20) NOT NULL, + `summary` mediumtext NOT NULL, + `createdBy` char(30) DEFAULT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_trainrecords` ( + `user` char(30) NOT NULL, + `objectId` mediumint(8) unsigned NOT NULL, + `objectType` varchar(10) NOT NULL, + `status` varchar(10) NOT NULL, + PRIMARY KEY (`user`,`objectId`,`objectType`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_trip` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('trip','egress') NOT NULL DEFAULT 'trip', + `customers` varchar(20) NOT NULL, + `name` char(30) NOT NULL, + `desc` text NOT NULL, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `from` char(50) NOT NULL, + `to` char(50) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_user` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `company` mediumint(8) unsigned NOT NULL, + `type` char(30) NOT NULL DEFAULT 'inside', + `dept` mediumint(8) unsigned NOT NULL DEFAULT '0', + `account` char(30) NOT NULL DEFAULT '', + `password` char(32) NOT NULL DEFAULT '', + `role` char(10) NOT NULL DEFAULT '', + `realname` varchar(100) NOT NULL DEFAULT '', + `pinyin` varchar(255) NOT NULL DEFAULT '', + `nickname` char(60) NOT NULL DEFAULT '', + `commiter` varchar(100) NOT NULL, + `avatar` text NOT NULL, + `birthday` date NOT NULL DEFAULT '0000-00-00', + `gender` enum('f','m') NOT NULL DEFAULT 'f', + `email` char(90) NOT NULL DEFAULT '', + `skype` char(90) NOT NULL DEFAULT '', + `qq` char(20) NOT NULL DEFAULT '', + `mobile` char(11) NOT NULL DEFAULT '', + `phone` char(20) NOT NULL DEFAULT '', + `weixin` varchar(90) NOT NULL DEFAULT '', + `dingding` varchar(90) NOT NULL DEFAULT '', + `slack` varchar(90) NOT NULL DEFAULT '', + `whatsapp` varchar(90) NOT NULL DEFAULT '', + `address` char(120) NOT NULL DEFAULT '', + `zipcode` char(10) NOT NULL DEFAULT '', + `nature` text NOT NULL, + `analysis` text NOT NULL, + `strategy` text NOT NULL, + `join` date NOT NULL DEFAULT '0000-00-00', + `visits` mediumint(8) unsigned NOT NULL DEFAULT '0', + `visions` varchar(20) NOT NULL DEFAULT 'rnd,lite', + `ip` char(15) NOT NULL DEFAULT '', + `last` int(10) unsigned NOT NULL DEFAULT '0', + `fails` tinyint(5) NOT NULL DEFAULT '0', + `locked` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `feedback` enum('0','1') NOT NULL DEFAULT '0', + `ranzhi` char(30) NOT NULL DEFAULT '', + `ldap` char(30) NOT NULL, + `score` int(11) NOT NULL DEFAULT '0', + `scoreLevel` int(11) NOT NULL DEFAULT '0', + `resetToken` varchar(50) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `clientStatus` enum('online','away','busy','offline','meeting') NOT NULL DEFAULT 'offline', + `clientLang` varchar(10) NOT NULL DEFAULT 'zh-cn', + PRIMARY KEY (`id`), + UNIQUE KEY `account` (`account`), + KEY `dept` (`dept`), + KEY `email` (`email`), + KEY `commiter` (`commiter`), + KEY `deleted` (`deleted`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_usercontact` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `listName` varchar(60) NOT NULL, + `userList` text NOT NULL, + PRIMARY KEY (`id`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_usergroup` ( + `account` char(30) NOT NULL DEFAULT '', + `group` mediumint(8) unsigned NOT NULL DEFAULT '0', + `project` text NOT NULL, + UNIQUE KEY `account` (`account`,`group`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_userquery` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `module` varchar(30) NOT NULL, + `title` varchar(90) NOT NULL, + `form` text NOT NULL, + `sql` text NOT NULL, + `shortcut` enum('0','1') NOT NULL DEFAULT '0', + `common` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `module` (`module`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_usertpl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `type` char(30) NOT NULL, + `title` varchar(150) NOT NULL, + `content` text NOT NULL, + `public` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_userview` ( + `account` char(30) NOT NULL, + `programs` mediumtext NOT NULL, + `products` mediumtext NOT NULL, + `projects` mediumtext NOT NULL, + `sprints` mediumtext NOT NULL, + UNIQUE KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_vm` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `hostID` int(10) unsigned NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `osCategory` varchar(50) NOT NULL DEFAULT '', + `osType` varchar(50) NOT NULL DEFAULT '', + `osArch` varchar(50) NOT NULL DEFAULT '', + `osLang` varchar(50) NOT NULL DEFAULT '', + `osCpu` tinyint(2) NOT NULL DEFAULT 0, + `osMemory` smallint(6) NOT NULL DEFAULT 0, + `osDisk` smallint(6) NOT NULL DEFAULT 0, + `status` varchar(50) NOT NULL DEFAULT '', + `destroyAt` datetime DEFAULT NULL, + `macAddress` varchar(255) NOT NULL DEFAULT '', + `workspace` varchar(255) NOT NULL DEFAULT '', + `templateID` int(10) unsigned NOT NULL DEFAULT '0', + `baseImageID` int(10) unsigned NOT NULL DEFAULT '0', + `baseImagePath` varchar(255) NOT NULL DEFAULT '', + `desc` varchar(255) NOT NULL DEFAULT '', + `heatbeat` datetime DEFAULT NULL, + `vncPort` int(10) NOT NULL DEFAULT 0, + `instance` varchar(255) NOT NULL DEFAULT '', + `eip` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `public` varchar(50) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_vmtemplate` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `hostID` int(10) unsigned NOT NULL DEFAULT '0', + `templateName` varchar(255) NOT NULL DEFAULT '', + `osType` varchar(50) NOT NULL DEFAULT '', + `osCategory` varchar(50) NOT NULL DEFAULT '', + `osVersion` varchar(50) NOT NULL DEFAULT '', + `osLang` varchar(50) NOT NULL, + `cpuCoreNum` smallint(4) NOT NULL DEFAULT 0, + `memorySize` int NOT NULL DEFAULT 0, + `diskSize` int NOT NULL DEFAULT 0, + `osArch` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_webhook` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(15) NOT NULL DEFAULT 'default', + `name` varchar(50) NOT NULL, + `url` varchar(255) NOT NULL, + `domain` varchar(255) NOT NULL, + `secret` varchar(255) NOT NULL, + `contentType` varchar(30) NOT NULL DEFAULT 'application/json', + `sendType` enum('sync','async') NOT NULL DEFAULT 'sync', + `products` text NOT NULL, + `executions` text NOT NULL, + `params` varchar(100) NOT NULL, + `actions` text NOT NULL, + `desc` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_weeklyreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `weekStart` date NOT NULL, + `pv` float(9,2) NOT NULL, + `ev` float(9,2) NOT NULL, + `ac` float(9,2) NOT NULL, + `sv` float(9,2) NOT NULL, + `cv` float(9,2) NOT NULL, + `staff` smallint(5) unsigned NOT NULL, + `progress` varchar(255) NOT NULL, + `workload` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `week` (`project`,`weekStart`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workestimation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `scale` decimal(10,2) unsigned NOT NULL, + `productivity` decimal(10,2) unsigned NOT NULL, + `duration` decimal(10,2) unsigned NOT NULL, + `unitLaborCost` decimal(10,2) unsigned NOT NULL, + `totalLaborCost` decimal(10,2) unsigned NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `dayHour` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflow` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `parent` varchar(30) NOT NULL, + `child` varchar(30) NOT NULL, + `type` varchar(10) NOT NULL DEFAULT 'flow', + `navigator` varchar(10) NOT NULL, + `app` varchar(20) NOT NULL, + `position` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL, + `table` varchar(50) NOT NULL, + `name` varchar(30) NOT NULL, + `titleField` varchar(30) NOT NULL, + `contentField` text NOT NULL, + `flowchart` text NOT NULL, + `js` text NOT NULL, + `css` text NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `administrator` text NOT NULL, + `desc` text NOT NULL, + `version` varchar(10) NOT NULL DEFAULT '1.0', + `status` varchar(10) NOT NULL DEFAULT 'wait', + `approval` enum('enabled', 'disabled') NOT NULL DEFAULT 'disabled', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`app`,`module`,`vision`), + KEY `type` (`type`), + KEY `app` (`app`), + KEY `module` (`module`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowaction` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `action` varchar(50) NOT NULL, + `method` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `type` enum('single','batch') NOT NULL DEFAULT 'single', + `batchMode` enum('same','different') NOT NULL DEFAULT 'different', + `extensionType` varchar(10) NOT NULL DEFAULT 'override' COMMENT 'none | extend | override', + `open` varchar(20) NOT NULL, + `position` enum('menu','browseandview','browse','view') NOT NULL DEFAULT 'browseandview', + `layout` char(20) NOT NULL, + `show` enum('dropdownlist','direct') NOT NULL DEFAULT 'dropdownlist', + `order` smallint(5) unsigned NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `virtual` tinyint(1) unsigned NOT NULL, + `conditions` text NOT NULL, + `verifications` text NOT NULL, + `hooks` text NOT NULL, + `linkages` text NOT NULL, + `js` text NOT NULL, + `css` text NOT NULL, + `toList` char(255) NOT NULL, + `blocks` text NOT NULL, + `desc` text NOT NULL, + `status` varchar(10) NOT NULL DEFAULT 'enable', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`module`,`action`,`vision`), + KEY `module` (`module`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=190 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowdatasource` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('system','sql','func','option','lang','category') NOT NULL DEFAULT 'option', + `name` varchar(30) NOT NULL, + `code` varchar(30) NOT NULL, + `datasource` text NOT NULL, + `view` varchar(20) NOT NULL, + `keyField` varchar(50) NOT NULL, + `valueField` varchar(50) NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowfield` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `field` varchar(50) NOT NULL, + `type` varchar(20) NOT NULL DEFAULT 'varchar', + `length` varchar(10) NOT NULL, + `name` varchar(50) NOT NULL, + `control` varchar(20) NOT NULL, + `expression` text NOT NULL, + `options` text NOT NULL, + `default` varchar(100) NOT NULL, + `rules` varchar(255) NOT NULL, + `placeholder` varchar(100) NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `searchOrder` smallint(5) unsigned NOT NULL DEFAULT '0', + `exportOrder` smallint(5) unsigned NOT NULL DEFAULT '0', + `canExport` enum('0','1') NOT NULL DEFAULT '0', + `canSearch` enum('0','1') NOT NULL DEFAULT '0', + `isValue` enum('0','1') NOT NULL DEFAULT '0', + `readonly` enum('0','1') NOT NULL DEFAULT '0', + `buildin` tinyint(1) unsigned NOT NULL, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `desc` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`module`,`field`), + KEY `module` (`module`), + KEY `field` (`field`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=360 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowlabel` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `action` varchar(30) NOT NULL DEFAULT 'browse', + `code` varchar(30) NOT NULL, + `label` varchar(255) NOT NULL, + `params` text NOT NULL, + `orderBy` text NOT NULL, + `order` tinyint(3) NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `module` (`module`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowlayout` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `action` varchar(50) NOT NULL, + `field` varchar(50) NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `width` smallint(5) NOT NULL, + `position` text NOT NULL, + `readonly` enum('0','1') NOT NULL DEFAULT '0', + `mobileShow` enum('0','1') NOT NULL DEFAULT '1', + `summary` varchar(20) NOT NULL, + `defaultValue` text NOT NULL, + `layoutRules` varchar(255) NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`module`,`action`,`field`,`vision`), + KEY `module` (`module`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=138 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowlinkdata` ( + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `linkedType` varchar(30) NOT NULL, + `linkedID` mediumint(8) unsigned NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + UNIQUE KEY `unique` (`objectType`,`objectID`,`linkedType`,`linkedID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowrelation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `prev` varchar(30) NOT NULL, + `next` varchar(30) NOT NULL, + `field` varchar(50) NOT NULL, + `actions` varchar(20) NOT NULL, + `actionCodes` text NOT NULL, + `buildin` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowrelationlayout` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `prev` varchar(30) NOT NULL, + `next` varchar(30) NOT NULL, + `action` varchar(50) NOT NULL, + `field` varchar(50) NOT NULL, + `order` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`prev`,`next`,`action`,`field`), + KEY `prev` (`prev`), + KEY `next` (`next`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL COMMENT 'module name', + `name` varchar(100) NOT NULL COMMENT 'report name', + `type` enum('pie','line','bar') NOT NULL DEFAULT 'pie' COMMENT 'report type', + `countType` enum('sum','count') NOT NULL DEFAULT 'sum' COMMENT 'report count method', + `displayType` enum('value','percent') NOT NULL DEFAULT 'value' COMMENT 'report display method', + `dimension` varchar(130) NOT NULL COMMENT 'dimension field code of zt_workflowfield', + `fields` text NOT NULL COMMENT 'count fileds code of zt_workflowfield,use comma split', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowrule` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('system','regex','func') NOT NULL DEFAULT 'regex', + `name` varchar(30) NOT NULL, + `rule` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowsql` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `field` varchar(50) NOT NULL, + `action` varchar(50) NOT NULL, + `sql` text NOT NULL, + `vars` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `module` (`module`), + KEY `field` (`field`), + KEY `action` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowversion` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `version` varchar(10) NOT NULL, + `fields` text NOT NULL, + `actions` text NOT NULL, + `layouts` text NOT NULL, + `sqls` text NOT NULL, + `labels` text NOT NULL, + `table` text NOT NULL, + `datas` text NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `moduleversion` (`module`,`version`), + KEY `module` (`module`), + KEY `version` (`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_zoutput` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `activity` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `content` mediumtext NOT NULL, + `optional` char(20) NOT NULL, + `tailorNorm` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `order` mediumint(8) DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=130 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_dayactions` AS SELECT + 1 AS `actions`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daybugopen` AS SELECT + 1 AS `bugopen`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daybugresolve` AS SELECT + 1 AS `bugresolve`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_dayeffort` AS SELECT + 1 AS `consumed`, + 1 AS `date`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daystoryclose` AS SELECT + 1 AS `storyclose`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daystoryopen` AS SELECT + 1 AS `storyopen`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daytaskfinish` AS SELECT + 1 AS `taskfinish`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daytaskopen` AS SELECT + 1 AS `taskopen`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_dayuserlogin` AS SELECT + 1 AS `userlogin`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_executionsummary` AS SELECT + 1 AS `execution`, + 1 AS `estimate`, + 1 AS `consumed`, + 1 AS `left`, + 1 AS `number`, + 1 AS `undone`, + 1 AS `totalReal`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_productbugs` AS SELECT + 1 AS `product`, + 1 AS `bugs`, + 1 AS `resolutions`, + 1 AS `seriousBugs`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_productstories` AS SELECT + 1 AS `product`, + 1 AS `stories`, + 1 AS `undone`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectbugs` AS SELECT + 1 AS `execution`, + 1 AS `bugs`, + 1 AS `resolutions`, + 1 AS `seriousBugs`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectstories` AS SELECT + 1 AS `execution`, + 1 AS `stories`, + 1 AS `undone`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectsummary` AS SELECT + 1 AS `project`, + 1 AS `estimate`, + 1 AS `consumed`, + 1 AS `left`, + 1 AS `number`, + 1 AS `undone`, + 1 AS `totalReal`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectteams` AS SELECT + 1 AS `execution`, + 1 AS `teams`*/; +SET character_set_client = @saved_cs_client; +/*!50001 DROP VIEW IF EXISTS `view_datasource_10`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_10` AS select `zt_build`.`id` AS `id`,`zt_build`.`name` AS `name` from `zt_build` where (`zt_build`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_11`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_11` AS select `zt_module`.`id` AS `id`,`zt_module`.`name` AS `name` from `zt_module` where (`zt_module`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_12`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_12` AS select `zt_productplan`.`id` AS `id`,`zt_productplan`.`title` AS `title` from `zt_productplan` where (`zt_productplan`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_4`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_4` AS select `zt_story`.`id` AS `id`,`zt_story`.`title` AS `title` from `zt_story` where (`zt_story`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_41`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_41` AS select `zt_case`.`id` AS `id`,`zt_case`.`title` AS `title` from `zt_case` where (`zt_case`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_46`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_46` AS select `zt_task`.`id` AS `id`,`zt_task`.`name` AS `name` from `zt_task` where ((`zt_task`.`deleted` = '0') and (`zt_task`.`vision` = 'lite')) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_5`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_5` AS select `zt_task`.`id` AS `id`,`zt_task`.`name` AS `name` from `zt_task` where ((`zt_task`.`deleted` = '0') and (`zt_task`.`vision` = 'rnd')) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_6`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_6` AS select `zt_bug`.`id` AS `id`,`zt_bug`.`title` AS `title` from `zt_bug` where (`zt_bug`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_dayactions`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_dayactions` AS select count(0) AS `actions`,left(`zt_action`.`date`,10) AS `day` from `zt_action` group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daybugopen`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daybugopen` AS select count(0) AS `bugopen`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'bug') and (`zt_action`.`action` = 'opened')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daybugresolve`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daybugresolve` AS select count(0) AS `bugresolve`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'bug') and (`zt_action`.`action` = 'resolved')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_dayeffort`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_dayeffort` AS select round(sum(`zt_effort`.`consumed`),1) AS `consumed`,`zt_effort`.`date` AS `date` from `zt_effort` group by `zt_effort`.`date` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daystoryclose`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daystoryclose` AS select count(0) AS `storyclose`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'story') and (`zt_action`.`action` = 'closed')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daystoryopen`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daystoryopen` AS select count(0) AS `storyopen`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'story') and (`zt_action`.`action` = 'opened')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daytaskfinish`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daytaskfinish` AS select count(0) AS `taskfinish`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'task') and (`zt_action`.`action` = 'finished')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daytaskopen`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daytaskopen` AS select count(0) AS `taskopen`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'task') and (`zt_action`.`action` = 'opened')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_dayuserlogin`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_dayuserlogin` AS select count(0) AS `userlogin`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'user') and (`zt_action`.`action` = 'login')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_executionsummary`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_executionsummary` AS select `zt_task`.`execution` AS `execution`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`estimate`,0)) AS `estimate`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0)) AS `consumed`,sum(if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0)) AS `left`,count(0) AS `number`,sum(if(((`zt_task`.`status` <> 'done') and (`zt_task`.`status` <> 'closed')),1,0)) AS `undone`,sum((if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0) + if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0))) AS `totalReal` from `zt_task` where (`zt_task`.`deleted` = '0') group by `zt_task`.`execution` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_productbugs`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_productbugs` AS select `zt_bug`.`product` AS `product`,count(0) AS `bugs`,sum(if((`zt_bug`.`resolution` = ''),0,1)) AS `resolutions`,sum(if((`zt_bug`.`severity` <= 2),1,0)) AS `seriousBugs` from `zt_bug` where (`zt_bug`.`deleted` = '0') group by `zt_bug`.`product` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_productstories`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_productstories` AS select `zt_story`.`product` AS `product`,count('*') AS `stories`,sum(if((`zt_story`.`status` = 'closed'),0,1)) AS `undone` from `zt_story` where (`zt_story`.`deleted` = '0') group by `zt_story`.`product` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectbugs`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectbugs` AS select `zt_bug`.`execution` AS `execution`,count(0) AS `bugs`,sum(if((`zt_bug`.`resolution` = ''),0,1)) AS `resolutions`,sum(if((`zt_bug`.`severity` <= 2),1,0)) AS `seriousBugs` from `zt_bug` where (`zt_bug`.`deleted` = '0') group by `zt_bug`.`execution` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectstories`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectstories` AS select `t1`.`project` AS `execution`,count('*') AS `stories`,sum(if((`t2`.`status` = 'closed'),0,1)) AS `undone` from ((`zt_projectstory` `t1` left join `zt_story` `t2` on((`t1`.`story` = `t2`.`id`))) left join `zt_project` `t3` on((`t1`.`project` = `t3`.`id`))) where ((`t2`.`deleted` = '0') and (`t3`.`type` in ('sprint','stage'))) group by `t1`.`project` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectsummary`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectsummary` AS select `zt_task`.`project` AS `project`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`estimate`,0)) AS `estimate`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0)) AS `consumed`,sum(if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0)) AS `left`,count(0) AS `number`,sum(if(((`zt_task`.`status` <> 'done') and (`zt_task`.`status` <> 'closed')),1,0)) AS `undone`,sum((if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0) + if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0))) AS `totalReal` from `zt_task` where (`zt_task`.`deleted` = '0') group by `zt_task`.`project` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectteams`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectteams` AS select `zt_team`.`root` AS `execution`,count('*') AS `teams` from `zt_team` where (`zt_team`.`type` = 'execution') group by `zt_team`.`root` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; diff --git a/db/standard/zentao17.6.sql b/db/standard/zentao17.6.sql new file mode 100644 index 0000000000..8efefe0f88 --- /dev/null +++ b/db/standard/zentao17.6.sql @@ -0,0 +1,3986 @@ +CREATE TABLE `zt_account` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `provider` varchar(255) NOT NULL, + `adminURI` varchar(255) NOT NULL, + `account` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `mobile` varchar(255) NOT NULL, + `extra` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `status` varchar(30) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `name` (`name`), + KEY `provider` (`provider`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_acl` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` mediumint(9) NOT NULL DEFAULT '0', + `type` char(40) NOT NULL DEFAULT 'whitelist', + `source` char(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_action` ( + `id` int(9) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT '0', + `product` text NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `actor` varchar(100) NOT NULL DEFAULT '', + `action` varchar(80) NOT NULL DEFAULT '', + `date` datetime NOT NULL, + `comment` text NOT NULL, + `extra` text, + `read` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `efforted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `actor` (`actor`), + KEY `project` (`project`), + KEY `action` (`action`), + KEY `objectID` (`objectID`) +) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_activity` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `process` mediumint(9) NOT NULL, + `name` varchar(255) NOT NULL, + `optional` varchar(255) NOT NULL, + `tailorNorm` varchar(255) NOT NULL, + `content` mediumtext NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `order` mediumint(8) DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_api` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `product` varchar(255) NOT NULL DEFAULT '', + `lib` int(10) unsigned NOT NULL DEFAULT '0', + `module` int(10) unsigned NOT NULL DEFAULT '0', + `title` varchar(100) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `protocol` varchar(10) NOT NULL DEFAULT '', + `method` varchar(10) NOT NULL DEFAULT '', + `requestType` varchar(100) NOT NULL DEFAULT '', + `responseType` varchar(100) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '0', + `desc` mediumtext NULL, + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `params` text, + `paramsExample` text, + `responseExample` text, + `response` text, + `commonParams` text, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '0', + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_api_lib_release` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `lib` int(10) unsigned NOT NULL DEFAULT '0', + `desc` varchar(255) NOT NULL DEFAULT '', + `version` varchar(255) NOT NULL DEFAULT '', + `snap` mediumtext NOT NULL, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_apispec` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `doc` int(10) unsigned NOT NULL DEFAULT '0', + `module` int(10) unsigned NOT NULL DEFAULT '0', + `title` varchar(100) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `protocol` varchar(10) NOT NULL DEFAULT '', + `method` varchar(10) NOT NULL DEFAULT '', + `requestType` varchar(100) NOT NULL DEFAULT '', + `responseType` varchar(100) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT '', + `owner` varchar(255) NOT NULL DEFAULT '0', + `desc` mediumtext NULL, + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `params` text, + `paramsExample` text, + `responseExample` text, + `response` text, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=176 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_apistruct` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `lib` int(10) unsigned NOT NULL DEFAULT '0', + `name` varchar(30) NOT NULL DEFAULT '', + `type` varchar(50) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL DEFAULT '', + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `attribute` text, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '0', + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_apistruct_spec` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(50) NOT NULL DEFAULT '', + `desc` varchar(255) NOT NULL DEFAULT '', + `attribute` text, + `version` smallint(5) unsigned NOT NULL DEFAULT '0', + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approval` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `flow` mediumint(8) NOT NULL, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `nodes` mediumtext NOT NULL, + `version` mediumint(9) NOT NULL, + `status` varchar(20) NOT NULL DEFAULT 'doing', + `result` varchar(20) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalflow` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `code` varchar(100) NOT NULL, + `desc` mediumtext NOT NULL, + `version` mediumint(8) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `type` varchar(30) NOT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalflowobject` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `root` int(8) NOT NULL, + `flow` int(8) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `extra` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalflowspec` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `flow` mediumint(8) NOT NULL, + `version` mediumint(8) NOT NULL, + `nodes` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalnode` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `approval` mediumint(8) NOT NULL, + `type` enum('review','cc') NOT NULL, + `title` varchar(255) NOT NULL, + `account` char(30) NOT NULL, + `node` varchar(100) NOT NULL, + `reviewType` varchar(100) NOT NULL DEFAULT 'manual', + `multipleType` enum('and','or') NOT NULL DEFAULT 'and', + `prev` mediumtext NOT NULL, + `next` mediumtext NOT NULL, + `status` varchar(20) NOT NULL DEFAULT 'wait', + `result` varchar(10) NOT NULL, + `date` date NOT NULL, + `opinion` mediumtext NOT NULL, + `extra` mediumtext NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_reviewed_date` (`reviewedDate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalobject` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `approval` int(8) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` mediumint(8) NOT NULL, + `extra` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_approvalrole` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `code` char(30) NOT NULL, + `name` varchar(255) NOT NULL, + `desc` text NOT NULL, + `users` longtext NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_asset` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL, + `type` varchar(30) NOT NULL, + `group` varchar(128) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_assetlib` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `order` SMALLINT UNSIGNED NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_attend` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `date` date NOT NULL, + `signIn` time NOT NULL, + `signOut` time NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `ip` varchar(15) NOT NULL, + `device` varchar(30) NOT NULL, + `client` varchar(20) NOT NULL, + `manualIn` time NOT NULL, + `manualOut` time NOT NULL, + `reason` varchar(30) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `reviewStatus` varchar(30) NOT NULL DEFAULT '', + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `attend` (`date`,`account`), + KEY `account` (`account`), + KEY `date` (`date`), + KEY `status` (`status`), + KEY `reason` (`reason`), + KEY `reviewStatus` (`reviewStatus`), + KEY `reviewedBy` (`reviewedBy`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_attendstat` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `month` char(10) NOT NULL DEFAULT '', + `normal` decimal(12,2) NOT NULL DEFAULT '0.00', + `late` decimal(12,2) NOT NULL DEFAULT '0.00', + `early` decimal(12,2) NOT NULL DEFAULT '0.00', + `absent` decimal(12,2) NOT NULL DEFAULT '0.00', + `trip` decimal(12,2) NOT NULL DEFAULT '0.00', + `egress` decimal(12,2) NOT NULL DEFAULT '0.00', + `lieu` decimal(12,2) NOT NULL DEFAULT '0.00', + `paidLeave` decimal(12,2) NOT NULL DEFAULT '0.00', + `unpaidLeave` decimal(12,2) NOT NULL DEFAULT '0.00', + `timeOvertime` decimal(12,2) NOT NULL DEFAULT '0.00', + `restOvertime` decimal(12,2) NOT NULL DEFAULT '0.00', + `holidayOvertime` decimal(12,2) NOT NULL DEFAULT '0.00', + `deserve` decimal(12,2) NOT NULL DEFAULT '0.00', + `actual` decimal(12,2) NOT NULL DEFAULT '0.00', + `status` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `attend` (`month`,`account`), + KEY `account` (`account`), + KEY `month` (`month`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_auditcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL DEFAULT 'waterfall', + `practiceArea` char(30) NOT NULL, + `type` char(30) NOT NULL, + `title` varchar(255) NOT NULL, + `objectType` char(30) NOT NULL, + `objectID` int(10) DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_auditplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `dateType` char(30) DEFAULT NULL, + `config` text, + `objectID` mediumint(9) NOT NULL, + `objectType` char(30) NOT NULL, + `process` mediumint(9) NOT NULL, + `processType` char(30) NOT NULL, + `checkDate` date NOT NULL, + `checkedBy` varchar(30) NOT NULL, + `realCheckDate` date NOT NULL, + `result` char(30) NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `checkBy` varchar(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_auditresult` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `auditplan` mediumint(8) NOT NULL, + `listID` mediumint(8) NOT NULL, + `result` char(30) NOT NULL, + `checkedBy` varchar(30) NOT NULL, + `checkedDate` date NOT NULL, + `comment` text NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_baseimage` ( + `id` smallint(7) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `osType` varchar(50) NOT NULL DEFAULT '', + `os` varchar(50) NOT NULL DEFAULT '', + `osCategory` varchar(50) NOT NULL DEFAULT '', + `osArch` varchar(50) NOT NULL DEFAULT '', + `osLang` varchar(50) NOT NULL DEFAULT '', + `suggestCore` tinyint(1) unsigned NOT NULL DEFAULT '0', + `suggestMemory` mediumint(6) unsigned NOT NULL DEFAULT '0', + `suggestVolume` mediumint(6) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_baseimagebrowser` ( + `vmBackingID` int(10) NOT NULL, + `browserID` int(10) NOT NULL, + PRIMARY KEY (`vmBackingID`,`browserID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_basicmeas` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `purpose` varchar(50) NOT NULL, + `scope` char(30) NOT NULL, + `object` char(30) NOT NULL, + `name` varchar(90) NOT NULL, + `code` char(30) NOT NULL, + `unit` varchar(10) NOT NULL, + `configure` text, + `params` text, + `definition` text, + `source` varchar(255) DEFAULT NULL, + `collectType` varchar(30) NOT NULL, + `collectConf` text NOT NULL, + `execTime` varchar(30) NOT NULL, + `collectedBy` varchar(10) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `order` mediumint(8) unsigned NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_block` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `module` varchar(20) NOT NULL, + `type` char(30) NOT NULL, + `title` varchar(100) NOT NULL, + `source` varchar(20) NOT NULL, + `block` varchar(20) NOT NULL, + `params` text NOT NULL, + `order` tinyint(3) unsigned NOT NULL DEFAULT '0', + `grid` tinyint(3) unsigned NOT NULL DEFAULT '0', + `height` smallint(5) unsigned NOT NULL DEFAULT '0', + `hidden` tinyint(1) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `account_vision_module_type_order` (`account`,`vision`,`module`,`type`,`order`), + KEY `account` (`account`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_branch` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `default` enum('0','1') NOT NULL DEFAULT '0', + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `desc` varchar(255) NOT NULL, + `createdDate` date NOT NULL, + `closedDate` date NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_browser` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT '', + `version` varchar(255) NOT NULL DEFAULT '', + `lang` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_budget` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `stage` char(30) NOT NULL, + `subject` mediumint(8) NOT NULL, + `amount` char(30) NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_bug` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `injection` mediumint(8) unsigned NOT NULL, + `identify` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `plan` mediumint(8) unsigned NOT NULL DEFAULT '0', + `story` mediumint(8) unsigned NOT NULL DEFAULT '0', + `storyVersion` smallint(6) NOT NULL DEFAULT '1', + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `toTask` mediumint(8) unsigned NOT NULL DEFAULT '0', + `toStory` mediumint(8) NOT NULL DEFAULT '0', + `title` varchar(255) NOT NULL, + `keywords` varchar(255) NOT NULL, + `severity` tinyint(4) NOT NULL DEFAULT '0', + `pri` tinyint(3) unsigned NOT NULL, + `type` varchar(30) NOT NULL DEFAULT '', + `os` varchar(255) NOT NULL DEFAULT '', + `browser` varchar(255) NOT NULL DEFAULT '', + `hardware` varchar(30) NOT NULL, + `found` varchar(30) NOT NULL DEFAULT '', + `steps` mediumtext NOT NULL, + `status` enum('active','resolved','closed') NOT NULL DEFAULT 'active', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL, + `confirmed` tinyint(1) NOT NULL DEFAULT '0', + `activatedCount` smallint(6) NOT NULL, + `activatedDate` datetime NOT NULL, + `feedbackBy` varchar(100) NOT NULL, + `notifyEmail` varchar(100) NOT NULL, + `mailto` text, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `openedBuild` varchar(255) NOT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime NOT NULL, + `deadline` date NOT NULL, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `resolution` varchar(30) NOT NULL DEFAULT '', + `resolvedBuild` varchar(30) NOT NULL DEFAULT '', + `resolvedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `duplicateBug` mediumint(8) unsigned NOT NULL, + `linkBug` varchar(255) NOT NULL, + `case` mediumint(8) unsigned NOT NULL, + `caseVersion` smallint(6) NOT NULL DEFAULT '1', + `feedback` mediumint(8) unsigned NOT NULL DEFAULT '0', + `result` mediumint(8) unsigned NOT NULL, + `repo` mediumint(8) unsigned NOT NULL, + `mr` mediumint(8) unsigned NOT NULL, + `entry` text NOT NULL, + `lines` varchar(10) NOT NULL, + `v1` varchar(40) NOT NULL, + `v2` varchar(40) NOT NULL, + `repoType` varchar(30) NOT NULL DEFAULT '', + `issueKey` varchar(50) NOT NULL DEFAULT '', + `testtask` mediumint(8) unsigned NOT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`), + KEY `status` (`status`), + KEY `plan` (`plan`), + KEY `story` (`story`), + KEY `case` (`case`), + KEY `toStory` (`toStory`), + KEY `result` (`result`), + KEY `assignedTo` (`assignedTo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_build` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` char(150) NOT NULL, + `scmPath` char(255) NOT NULL, + `filePath` char(255) NOT NULL, + `date` date NOT NULL, + `stories` text NOT NULL, + `bugs` text NOT NULL, + `builder` char(30) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_burn` ( + `execution` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `date` date NOT NULL, + `estimate` float NOT NULL, + `left` float NOT NULL, + `consumed` float NOT NULL, + `storyPoint` float NOT NULL, + PRIMARY KEY (`execution`,`date`,`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_case` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` mediumint(8) unsigned NOT NULL DEFAULT '0', + `story` mediumint(30) unsigned NOT NULL DEFAULT '0', + `storyVersion` smallint(6) NOT NULL DEFAULT '1', + `title` varchar(255) NOT NULL, + `precondition` text NOT NULL, + `keywords` varchar(255) NOT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT '3', + `type` char(30) NOT NULL DEFAULT '1', + `auto` varchar(10) NOT NULL DEFAULT 'no', + `frame` varchar(10) NOT NULL, + `stage` varchar(255) NOT NULL, + `howRun` varchar(30) NOT NULL, + `scriptedBy` varchar(30) NOT NULL, + `scriptedDate` date NOT NULL, + `scriptStatus` varchar(30) NOT NULL, + `scriptLocation` varchar(255) NOT NULL, + `status` char(30) NOT NULL DEFAULT '1', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL, + `frequency` enum('1','2','3') NOT NULL DEFAULT '1', + `order` tinyint(30) unsigned NOT NULL DEFAULT '0', + `openedBy` char(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `reviewedDate` date NOT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `version` tinyint(3) unsigned NOT NULL DEFAULT '0', + `linkCase` varchar(255) NOT NULL, + `fromBug` mediumint(8) unsigned NOT NULL, + `fromCaseID` mediumint(8) unsigned NOT NULL, + `fromCaseVersion` mediumint(8) unsigned NOT NULL DEFAULT '1', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `lastRunner` varchar(30) NOT NULL, + `lastRunDate` datetime NOT NULL, + `lastRunResult` char(30) NOT NULL, + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `story` (`story`), + KEY `fromBug` (`fromBug`), + KEY `module` (`module`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_casestep` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `case` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(3) unsigned NOT NULL DEFAULT '0', + `type` varchar(10) NOT NULL DEFAULT 'step', + `desc` text NOT NULL, + `expect` text NOT NULL, + PRIMARY KEY (`id`), + KEY `case` (`case`), + KEY `version` (`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_cfd` ( + `id` int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `execution` int(8) NOT NULL, + `type` char(30) NOT NULL, + `name` char(30) NOT NULL, + `count` smallint NOT NULL, + `date` date NOT NULL, + UNIQUE KEY `execution_type_name_date` (`execution`,`type`,`name`,`date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_cmcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL, + `title` int(11) NOT NULL, + `contents` text NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `order` int(11) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_company` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(120) DEFAULT NULL, + `phone` char(20) DEFAULT NULL, + `fax` char(20) DEFAULT NULL, + `address` char(120) DEFAULT NULL, + `zipcode` char(10) DEFAULT NULL, + `website` char(120) DEFAULT NULL, + `backyard` char(120) DEFAULT NULL, + `guest` enum('1','0') NOT NULL DEFAULT '0', + `admins` char(255) DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_compile` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `job` mediumint(8) unsigned NOT NULL, + `queue` mediumint(8) NOT NULL, + `status` varchar(255) NOT NULL, + `logs` text, + `atTime` varchar(10) NOT NULL, + `testtask` mediumint(8) unsigned NOT NULL, + `tag` varchar(255) NOT NULL, + `times` tinyint(3) unsigned NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `updateDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_config` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `owner` char(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL, + `section` char(30) NOT NULL DEFAULT '', + `key` char(30) NOT NULL DEFAULT '', + `value` longtext NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`vision`,`owner`,`module`,`section`,`key`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_cron` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `m` varchar(20) NOT NULL, + `h` varchar(20) NOT NULL, + `dom` varchar(20) NOT NULL, + `mon` varchar(20) NOT NULL, + `dow` varchar(20) NOT NULL, + `command` text NOT NULL, + `remark` varchar(255) NOT NULL, + `type` varchar(20) NOT NULL, + `buildin` tinyint(1) NOT NULL DEFAULT '0', + `status` varchar(20) NOT NULL, + `lastTime` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `lastTime` (`lastTime`) +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deploy` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `status` varchar(20) NOT NULL, + `owner` char(30) NOT NULL, + `members` text NOT NULL, + `notify` text NOT NULL, + `cases` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `result` varchar(20) NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_chart` ( + `id` mediumint NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL, + `dataset` varchar(30) NOT NULL, + `desc` mediumtext NOT NULL, + `settings` mediumtext NOT NULL, + `filters` mediumtext NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_dashboard` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `module` mediumint NOT NULL, + `desc` mediumtext NOT NULL, + `layout` mediumtext NOT NULL, + `filters` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_dataset` ( + `id` mediumint unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(155) NOT NULL, + `sql` text NOT NULL, + `fields` mediumtext NOT NULL, + `objects` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deployproduct` ( + `deploy` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `release` mediumint(8) unsigned NOT NULL, + `package` varchar(255) NOT NULL, + UNIQUE KEY `deploy_product_release` (`deploy`,`product`,`release`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deployscope` ( + `deploy` mediumint(8) unsigned NOT NULL, + `service` mediumint(8) unsigned NOT NULL, + `hosts` text NOT NULL, + `remove` text NOT NULL, + `add` text NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_deploystep` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `deploy` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `stage` varchar(30) NOT NULL, + `content` text NOT NULL, + `status` varchar(30) NOT NULL, + `assignedTo` char(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `finishedBy` char(30) NOT NULL, + `finishedDate` datetime NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_dept` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(60) NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(4) unsigned NOT NULL DEFAULT '0', + `position` char(30) NOT NULL DEFAULT '', + `function` char(255) NOT NULL DEFAULT '', + `manager` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_design` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` varchar(255) NOT NULL, + `product` varchar(255) NOT NULL, + `commit` text NOT NULL, + `commitedBy` varchar(30) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `story` char(30) NOT NULL, + `desc` mediumtext NOT NULL, + `version` smallint(6) NOT NULL, + `type` char(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_designspec` ( + `design` mediumint(8) NOT NULL, + `version` smallint(6) NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `files` varchar(255) NOT NULL, + UNIQUE KEY `design` (`design`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_doc` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `lib` varchar(30) NOT NULL, + `template` varchar(30) NOT NULL, + `templateType` varchar(30) NOT NULL, + `chapterType` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL, + `title` varchar(255) NOT NULL, + `keywords` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `parent` smallint(5) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `views` smallint(5) unsigned NOT NULL, + `assetLib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `assetLibType` varchar(30) NOT NULL DEFAULT '', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromVersion` smallint(6) NOT NULL DEFAULT '1', + `draft` longtext NOT NULL, + `collector` text NOT NULL, + `addedBy` varchar(30) NOT NULL, + `addedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `approvedDate` date NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `mailto` text, + `acl` varchar(10) NOT NULL DEFAULT 'open', + `groups` varchar(255) NOT NULL, + `users` text NOT NULL, + `version` smallint(5) unsigned NOT NULL DEFAULT '1', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`), + KEY `lib` (`lib`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_doccontent` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `doc` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `digest` varchar(255) NOT NULL, + `content` longtext NOT NULL, + `files` text NOT NULL, + `type` varchar(10) NOT NULL, + `version` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `doc_version` (`doc`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_doclib` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `product` mediumint(8) unsigned NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `name` varchar(60) NOT NULL, + `baseUrl` varchar(255) NOT NULL DEFAULT '', + `acl` varchar(10) NOT NULL DEFAULT 'open', + `groups` varchar(255) NOT NULL, + `users` text NOT NULL, + `main` enum('0','1') NOT NULL DEFAULT '0', + `collector` text NOT NULL, + `desc` mediumtext NOT NULL, + `order` tinyint(5) unsigned NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_domain` ( + `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, + `domain` varchar(255) NOT NULL, + `adminURI` varchar(255) NOT NULL, + `resolverURI` varchar(255) NOT NULL, + `register` varchar(255) NOT NULL, + `expiredDate` datetime NOT NULL, + `renew` varchar(255) NOT NULL, + `account` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `domain` (`domain`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_durationestimation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `stage` mediumint(9) NOT NULL, + `workload` varchar(255) NOT NULL, + `worktimeRate` varchar(255) NOT NULL, + `people` varchar(255) NOT NULL, + `startDate` date NOT NULL, + `endDate` date NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_effort` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `product` text NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `account` varchar(30) NOT NULL, + `work` text, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `date` date NOT NULL, + `left` float NOT NULL, + `consumed` float NOT NULL, + `begin` smallint(4) unsigned zerofill NOT NULL, + `end` smallint(4) unsigned zerofill NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `execution` (`execution`), + KEY `objectID` (`objectID`), + KEY `date` (`date`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_entry` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `account` varchar(30) NOT NULL DEFAULT '', + `code` varchar(20) NOT NULL, + `key` varchar(32) NOT NULL, + `freePasswd` enum('0','1') NOT NULL DEFAULT '0', + `ip` varchar(100) NOT NULL, + `desc` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `calledTime` int(10) unsigned NOT NULL DEFAULT '0', + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_expect` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `userID` mediumint(8) NOT NULL, + `project` mediumint(8) NOT NULL DEFAULT '0', + `expect` text NOT NULL, + `progress` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_extension` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + `code` varchar(30) NOT NULL, + `version` varchar(50) NOT NULL, + `author` varchar(100) NOT NULL, + `desc` mediumtext NOT NULL, + `license` text NOT NULL, + `type` varchar(20) NOT NULL DEFAULT 'extension', + `site` varchar(150) NOT NULL, + `zentaoCompatible` varchar(100) NOT NULL, + `installedTime` datetime NOT NULL, + `depends` varchar(100) NOT NULL, + `dirs` mediumtext NOT NULL, + `files` mediumtext NOT NULL, + `status` varchar(20) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`), + KEY `name` (`name`), + KEY `installedTime` (`installedTime`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_faq` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `module` mediumint(9) NOT NULL, + `product` mediumint(9) NOT NULL, + `question` varchar(255) NOT NULL, + `answer` text NOT NULL, + `addedtime` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_feedback` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL, + `module` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `type` char(30) NOT NULL, + `solution` char(30) NOT NULL, + `desc` text NOT NULL, + `status` varchar(30) NOT NULL, + `subStatus` varchar(30) NOT NULL DEFAULT '', + `public` enum('0','1') NOT NULL DEFAULT '0', + `notify` enum('0','1') NOT NULL DEFAULT '0', + `notifyEmail` varchar(100) NOT NULL, + `likes` text NOT NULL, + `result` mediumint(8) unsigned NOT NULL, + `faq` mediumint(8) unsigned NOT NULL, + `openedBy` char(30) NOT NULL, + `openedDate` datetime NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `reviewedDate` datetime NOT NULL, + `processedBy` char(30) NOT NULL, + `processedDate` datetime NOT NULL, + `closedBy` char(30) NOT NULL, + `closedDate` datetime NOT NULL, + `closedReason` varchar(30) NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedTo` varchar(255) NOT NULL, + `assignedDate` datetime NOT NULL, + `feedbackBy` varchar(100) NOT NULL, + `repeatFeedback` mediumint(8) NOT NULL DEFAULT 0, + `mailto` varchar(255) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_feedbackview` ( + `account` char(30) NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + UNIQUE KEY `account_product` (`account`,`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_file` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `pathname` char(100) NOT NULL, + `title` varchar(255) NOT NULL, + `extension` char(30) NOT NULL, + `size` int(10) unsigned NOT NULL DEFAULT '0', + `objectType` char(30) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `addedBy` char(30) NOT NULL DEFAULT '', + `addedDate` datetime NOT NULL, + `downloads` mediumint(8) unsigned NOT NULL DEFAULT '0', + `extra` varchar(255) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `objectType` (`objectType`), + KEY `objectID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_gapanalysis` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `account` varchar(30) NOT NULL, + `role` varchar(20) NOT NULL, + `analysis` mediumtext NOT NULL, + `needTrain` enum('no','yes') NOT NULL DEFAULT 'no', + `createdBy` char(30) DEFAULT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `project_account` (`project`,`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_group` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `name` char(30) NOT NULL, + `role` char(30) NOT NULL DEFAULT '', + `desc` char(255) NOT NULL DEFAULT '', + `acl` text, + `developer` enum('0','1') NOT NULL DEFAULT '1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_grouppriv` ( + `group` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` char(30) NOT NULL DEFAULT '', + `method` char(30) NOT NULL DEFAULT '', + UNIQUE KEY `group` (`group`,`module`,`method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_history` ( + `id` int(9) unsigned NOT NULL AUTO_INCREMENT, + `action` mediumint(8) unsigned NOT NULL DEFAULT '0', + `field` varchar(30) NOT NULL DEFAULT '', + `old` text NOT NULL, + `new` text NOT NULL, + `diff` mediumtext NOT NULL, + PRIMARY KEY (`id`), + KEY `action` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_holiday` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) NOT NULL DEFAULT '', + `type` enum('holiday','working') NOT NULL DEFAULT 'holiday', + `desc` mediumtext NOT NULL, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_host` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `assetID` mediumint(8) unsigned NOT NULL, + `admin` smallint(5) unsigned NOT NULL DEFAULT '0', + `serverRoom` mediumint(8) unsigned NOT NULL, + `cabinet` varchar(128) NOT NULL, + `serverModel` varchar(256) NOT NULL, + `hardwareType` varchar(64) NOT NULL, + `hostType` enum('physical','virtual') NOT NULL, + `cpuBrand` varchar(128) NOT NULL, + `cpuModel` varchar(128) NOT NULL, + `cpuNumber` varchar(16) NOT NULL, + `cpuCores` varchar(30) NOT NULL, + `cpuRate` varchar(30) NOT NULL, + `memory` varchar(30) NOT NULL, + `diskType` varchar(30) NOT NULL, + `diskSize` varchar(30) NOT NULL, + `unit` enum('GB','TB') NOT NULL DEFAULT 'GB', + `privateIP` varchar(128) NOT NULL, + `publicIP` varchar(128) NOT NULL, + `nic` varchar(128) NOT NULL, + `mac` varchar(128) NOT NULL, + `osName` varchar(64) NOT NULL, + `osVersion` varchar(64) NOT NULL, + `webserver` varchar(128) NOT NULL, + `database` varchar(128) NOT NULL, + `language` varchar(16) NOT NULL, + `status` varchar(50) NOT NULL, + `agentPort` varchar(10) NOT NULL, + `instanceNum` tinyint(4) NOT NULL DEFAULT '0', + `pri` smallint(5) unsigned NOT NULL DEFAULT '0', + `heartbeatTime` datetime NOT NULL, + `tags` varchar(50) NOT NULL DEFAULT '', + `provider` varchar(255) NOT NULL DEFAULT '', + `bridgeID` varchar(255) NOT NULL DEFAULT '', + `cloudKey` varchar(255) NOT NULL DEFAULT '', + `cloudSecret` varchar(255) NOT NULL DEFAULT '', + `cloudRegion` varchar(255) NOT NULL DEFAULT '', + `cloudNamespace` varchar(255) NOT NULL DEFAULT '', + `cloudUser` varchar(255) NOT NULL DEFAULT '', + `cloudAccount` varchar(255) NOT NULL DEFAULT '', + `cloudPassword` varchar(255) NOT NULL DEFAULT '', + `couldVPC` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_chat` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `gid` char(40) NOT NULL DEFAULT '', + `name` varchar(60) NOT NULL DEFAULT '', + `type` varchar(20) NOT NULL DEFAULT 'group', + `admins` varchar(255) NOT NULL DEFAULT '', + `committers` varchar(255) NOT NULL DEFAULT '', + `subject` mediumint(8) unsigned NOT NULL DEFAULT '0', + `public` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ownedBy` varchar(30) NOT NULL DEFAULT '', + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `mergedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastActiveTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastMessage` int(11) unsigned NOT NULL DEFAULT '0', + `lastMessageIndex` int(11) unsigned NOT NULL DEFAULT 0, + `dismissDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `pinnedMessages` text NOT NULL, + `mergedChats` text NOT NULL DEFAULT '', + `adminInvite` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `gid` (`gid`), + KEY `name` (`name`), + KEY `type` (`type`), + KEY `public` (`public`), + KEY `createdBy` (`createdBy`), + KEY `editedBy` (`editedBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_chat_message_index` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `gid` char(40) NOT NULL, + `tableName` char(64) NOT NULL, + `start` int(11) unsigned NOT NULL, + `end` int(11) unsigned NOT NULL, + `startIndex` int(11) unsigned NOT NULL, + `endIndex` int(11) unsigned NOT NULL, + `startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `count` mediumint(8) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `chattable` (`gid`,`tableName`), + KEY `start` (`start`), + KEY `end` (`end`), + KEY `startDate` (`startDate`), + KEY `endDate` (`endDate`), + KEY `chatstartindex` (`gid`,`startIndex`), + KEY `chatendindex` (`gid`,`endIndex`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_chatuser` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `cgid` char(40) NOT NULL DEFAULT '', + `user` mediumint(8) NOT NULL DEFAULT '0', + `order` smallint(5) NOT NULL DEFAULT '0', + `star` enum('0','1') NOT NULL DEFAULT '0', + `hide` enum('0','1') NOT NULL DEFAULT '0', + `mute` enum('0','1') NOT NULL DEFAULT '0', + `freeze` enum('0','1') NOT NULL DEFAULT '0', + `join` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `quit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `category` varchar(40) NOT NULL DEFAULT '', + `lastReadMessage` int(11) unsigned NOT NULL DEFAULT '0', + `lastReadMessageIndex` int(11) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `chatuser` (`cgid`,`user`), + KEY `cgid` (`cgid`), + KEY `user` (`user`), + KEY `order` (`order`), + KEY `star` (`star`), + KEY `hide` (`hide`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_client` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `version` char(30) NOT NULL DEFAULT '', + `desc` varchar(100) NOT NULL DEFAULT '', + `changeLog` text NOT NULL, + `strategy` varchar(10) NOT NULL DEFAULT '', + `downloads` text NOT NULL, + `createdDate` datetime NOT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `status` enum('released','wait') NOT NULL DEFAULT 'wait', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_conference` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `rid` char(40) NOT NULL DEFAULT '', + `cgid` char(40) NOT NULL DEFAULT '', + `status` enum('closed','open') NOT NULL DEFAULT 'closed', + `participants` text NOT NULL, + `invitee` text NOT NULL, + `openedBy` mediumint(8) NOT NULL DEFAULT '0', + `openedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_conferenceaction` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `rid` char(40) NOT NULL DEFAULT '', + `type` enum('create','invite','join','leave','close','publish') NOT NULL DEFAULT 'create', + `data` text NOT NULL, + `user` mediumint(8) NOT NULL DEFAULT '0', + `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `device` char(40) NOT NULL DEFAULT 'default', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_message` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `gid` char(40) NOT NULL DEFAULT '', + `cgid` char(40) NOT NULL DEFAULT '', + `user` varchar(30) NOT NULL DEFAULT '', + `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `index` int(11) unsigned NOT NULL DEFAULT 0, + `type` enum('normal','broadcast','notify','bulletin') NOT NULL DEFAULT 'normal', + `content` text NOT NULL, + `contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text', + `data` text NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `mgid` (`gid`), + KEY `mcgid` (`cgid`), + KEY `muser` (`user`), + KEY `mtype` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_message_backup` ( + `id` int(11) unsigned NOT NULL, + `gid` char(40) NOT NULL DEFAULT '', + `cgid` char(40) NOT NULL DEFAULT '', + `user` varchar(30) NOT NULL DEFAULT '', + `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `index` int(11) unsigned NOT NULL DEFAULT 0, + `type` enum('normal','broadcast','notify') NOT NULL DEFAULT 'normal', + `content` text NOT NULL, + `contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text', + `data` text NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_message_index` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `tableName` char(64) NOT NULL, + `start` int(11) unsigned NOT NULL, + `end` int(11) unsigned NOT NULL, + `startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `chats` text NOT NULL, + PRIMARY KEY (`id`), + KEY `tableName` (`tableName`), + KEY `start` (`start`), + KEY `end` (`end`), + KEY `startDate` (`startDate`), + KEY `endDate` (`endDate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_messagestatus` ( + `user` mediumint(8) NOT NULL DEFAULT '0', + `message` int(11) unsigned NOT NULL, + `status` enum('waiting','sent','readed','deleted') NOT NULL DEFAULT 'waiting', + UNIQUE KEY `user` (`user`,`message`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_queue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL, + `content` text NOT NULL, + `addDate` datetime NOT NULL, + `processDate` datetime NOT NULL, + `result` text NOT NULL, + `status` char(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_im_userdevice` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `user` mediumint(8) NOT NULL DEFAULT '0', + `device` char(40) NOT NULL DEFAULT 'default', + `deviceID` char(40) NOT NULL DEFAULT '', + `token` char(64) NOT NULL DEFAULT '', + `validUntil` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastLogin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastLogout` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE KEY `userdevice` (`user`,`device`), + KEY `user` (`user`), + KEY `lastLogin` (`lastLogin`), + KEY `lastLogout` (`lastLogout`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_intervention` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `activity` mediumint(8) NOT NULL, + `status` char(30) NOT NULL, + `partake` text NOT NULL, + `begin` date NOT NULL, + `realBegin` date NOT NULL, + `situation` varchar(255) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `project` (`project`,`activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_issue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `resolvedBy` varchar(30) NOT NULL, + `project` varchar(255) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `pri` char(30) NOT NULL, + `severity` char(30) NOT NULL, + `type` char(30) NOT NULL, + `activity` varchar(255) NOT NULL, + `deadline` date NOT NULL, + `resolution` char(30) NOT NULL, + `resolutionComment` text NOT NULL, + `objectID` varchar(255) NOT NULL, + `resolvedDate` date NOT NULL, + `status` varchar(30) NOT NULL, + `owner` varchar(255) NOT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `activateBy` varchar(30) NOT NULL, + `activateDate` date NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` date NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `approvedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_job` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `repo` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `frame` varchar(20) NOT NULL, + `engine` varchar(20) NOT NULL, + `server` mediumint(8) unsigned NOT NULL, + `pipeline` varchar(500) NOT NULL, + `triggerType` varchar(255) NOT NULL, + `sonarqubeServer` mediumint(8) unsigned NOT NULL, + `projectKey` varchar(255) NOT NULL, + `svnDir` varchar(255) NOT NULL, + `atDay` varchar(255) DEFAULT NULL, + `atTime` varchar(10) DEFAULT NULL, + `customParam` text NOT NULL, + `comment` varchar(255) DEFAULT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `lastExec` datetime DEFAULT NULL, + `lastStatus` varchar(255) DEFAULT NULL, + `lastTag` varchar(255) DEFAULT NULL, + `lastSyncDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanban` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `space` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `owner` varchar(30) NOT NULL, + `team` text NOT NULL, + `desc` mediumtext NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `archived` enum('0','1') NOT NULL DEFAULT '1', + `performable` enum('0','1') NOT NULL DEFAULT '0', + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `order` mediumint(8) NOT NULL DEFAULT '0', + `displayCards` smallint(6) NOT NULL DEFAULT '0', + `showWIP` enum('0','1') NOT NULL DEFAULT '1', + `fluidBoard` enum('0','1') NOT NULL DEFAULT '0', + `object` varchar(255) NOT NULL, + `alignment` varchar(10) NOT NULL DEFAULT 'center', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `closedBy` char(30) NOT NULL, + `closedDate` datetime NOT NULL, + `activatedBy` char(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbancard` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) unsigned NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `group` mediumint(8) unsigned NOT NULL, + `fromID` mediumint(8) unsigned NOT NULL, + `fromType` varchar(30) NOT NULL, + `name` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'doing', + `pri` mediumint(8) unsigned NOT NULL, + `assignedTo` text NOT NULL, + `desc` mediumtext NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `estimate` float unsigned NOT NULL, + `progress` float unsigned NOT NULL DEFAULT '0', + `color` char(7) NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `order` mediumint(8) NOT NULL DEFAULT '0', + `archived` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `archivedBy` char(30) NOT NULL, + `archivedDate` datetime NOT NULL, + `assignedBy` char(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbancell` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) NOT NULL, + `lane` mediumint(8) NOT NULL, + `column` mediumint(8) NOT NULL, + `type` char(30) NOT NULL, + `cards` text NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `card_group` (`kanban`,`type`,`lane`,`column`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbancolumn` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `parent` mediumint(8) NOT NULL DEFAULT '0', + `type` char(30) NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `group` mediumint(8) NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `color` char(30) NOT NULL, + `limit` smallint(6) NOT NULL DEFAULT '-1', + `order` mediumint(8) NOT NULL DEFAULT '0', + `archived` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbangroup` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) unsigned NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `order` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbanlane` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `execution` mediumint(8) NOT NULL DEFAULT '0', + `type` char(30) NOT NULL, + `region` mediumint(8) unsigned NOT NULL, + `group` mediumint(8) unsigned NOT NULL, + `groupby` char(30) NOT NULL, + `extra` char(30) NOT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `color` char(30) NOT NULL, + `order` smallint(6) NOT NULL DEFAULT '0', + `lastEditedTime` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbanregion` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `space` mediumint(8) unsigned NOT NULL, + `kanban` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `order` mediumint(8) NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_kanbanspace` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(50) NOT NULL, + `owner` varchar(30) NOT NULL, + `team` text NOT NULL, + `desc` mediumtext NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `order` mediumint(8) NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `closedBy` char(30) NOT NULL, + `closedDate` datetime NOT NULL, + `activatedBy` char(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_lang` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `lang` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL, + `section` varchar(30) NOT NULL, + `key` varchar(60) NOT NULL, + `value` text NOT NULL, + `system` enum('0','1') NOT NULL DEFAULT '1', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`,`vision`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_leave` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT '0.0', + `backDate` datetime NOT NULL, + `type` varchar(30) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + `level` tinyint(3) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `reviewers` text NOT NULL, + `backReviewers` text NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `type` (`type`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_lieu` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT '0.0', + `overtime` char(255) NOT NULL, + `trip` char(255) NOT NULL, + `desc` text NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + `level` tinyint(3) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `reviewers` text NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_log` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `action` mediumint(8) unsigned NOT NULL, + `date` datetime NOT NULL, + `url` varchar(255) NOT NULL, + `contentType` varchar(30) NOT NULL, + `data` text NOT NULL, + `result` text NOT NULL, + PRIMARY KEY (`id`), + KEY `objectType` (`objectType`), + KEY `obejctID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_measqueue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL, + `mid` mediumint(8) unsigned NOT NULL, + `status` varchar(255) NOT NULL, + `logs` text, + `execTime` varchar(10) NOT NULL, + `params` text, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `updateDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_measrecords` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL, + `mid` mediumint(8) NOT NULL, + `measCode` char(50) NOT NULL DEFAULT '', + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `params` text NOT NULL, + `year` char(4) NOT NULL, + `month` char(6) NOT NULL, + `week` char(8) NOT NULL, + `day` char(8) NOT NULL, + `value` varchar(255) NOT NULL, + `date` date NOT NULL, + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `project` (`project`), + KEY `time` (`year`,`month`,`day`,`week`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_meastemplate` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL, + `name` varchar(255) NOT NULL, + `content` mediumtext NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_meeting` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL, + `execution` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `begin` time NOT NULL, + `end` time NOT NULL, + `dept` mediumint(8) NOT NULL, + `mode` varchar(255) NOT NULL, + `host` varchar(30) NOT NULL, + `participant` text NOT NULL, + `date` date NOT NULL, + `room` int(11) NOT NULL, + `minutes` text NOT NULL, + `minutedBy` varchar(30) NOT NULL, + `minutedDate` datetime NOT NULL, + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_meetingroom` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `position` varchar(30) NOT NULL, + `seats` int(11) NOT NULL, + `equipment` varchar(255) NOT NULL, + `openTime` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_module` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `root` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` char(60) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `type` char(30) NOT NULL, + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `owner` varchar(30) NOT NULL, + `collector` text NOT NULL, + `short` varchar(30) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `root` (`root`), + KEY `type` (`type`), + KEY `path` (`path`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_mr` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `hostID` mediumint(8) unsigned NOT NULL, + `sourceProject` varchar(50) NOT NULL, + `sourceBranch` varchar(100) NOT NULL, + `targetProject` varchar(50) NOT NULL, + `targetBranch` varchar(100) NOT NULL, + `mriid` int(10) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `description` text NOT NULL, + `assignee` varchar(255) NOT NULL, + `reviewer` varchar(255) NOT NULL, + `approver` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `status` char(30) NOT NULL, + `mergeStatus` char(30) NOT NULL, + `approvalStatus` char(30) NOT NULL, + `needApproved` enum('0','1') NOT NULL DEFAULT '0', + `needCI` enum('0','1') NOT NULL DEFAULT '0', + `repoID` mediumint(8) unsigned NOT NULL, + `jobID` mediumint(8) unsigned NOT NULL, + `compileID` mediumint(8) unsigned NOT NULL, + `compileStatus` char(30) NOT NULL, + `removeSourceBranch` enum('0','1') NOT NULL DEFAULT '0', + `synced` enum('0','1') NOT NULL DEFAULT '1', + `syncError` varchar(255) NOT NULL, + `hasNoConflict` enum('0','1') NOT NULL DEFAULT '0', + `diffs` longtext, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_mrapproval` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `mrID` mediumint(8) unsigned NOT NULL, + `account` varchar(255) NOT NULL, + `date` datetime NOT NULL, + `action` char(30) NOT NULL, + `comment` text NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_nc` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `auditplan` mediumint(8) NOT NULL, + `listID` mediumint(8) NOT NULL, + `title` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `type` char(30) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'active', + `severity` char(30) NOT NULL, + `deadline` date NOT NULL, + `resolvedBy` varchar(30) NOT NULL, + `resolution` char(30) NOT NULL, + `resolvedDate` date NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` date NOT NULL, + `parent` mediumint(8) unsigned NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` date NOT NULL, + `activateDate` date NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_notify` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(50) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `action` mediumint(9) NOT NULL, + `toList` varchar(255) NOT NULL, + `ccList` text NOT NULL, + `subject` varchar(255) NOT NULL, + `data` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `sendTime` datetime NOT NULL, + `status` varchar(10) NOT NULL DEFAULT 'wait', + `failReason` text NOT NULL, + PRIMARY KEY (`id`), + KEY `objectType_toList_status` (`objectType`,`toList`,`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_oauth` ( + `account` varchar(30) NOT NULL, + `openID` varchar(255) NOT NULL, + `providerType` varchar(30) NOT NULL, + `providerID` mediumint(8) unsigned NOT NULL, + KEY `account` (`account`), + KEY `providerType` (`providerType`), + KEY `providerID` (`providerID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_object` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) NOT NULL, + `from` mediumint(8) NOT NULL, + `title` varchar(255) NOT NULL, + `category` char(30) NOT NULL, + `version` varchar(255) NOT NULL, + `type` enum('reviewed','taged') NOT NULL, + `range` text NOT NULL, + `data` text NOT NULL, + `storyEst` char(30) NOT NULL, + `taskEst` char(30) NOT NULL, + `requestEst` char(30) NOT NULL, + `testEst` char(30) NOT NULL, + `devEst` char(30) NOT NULL, + `designEst` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_opportunity` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `source` char(30) NOT NULL, + `type` char(30) NOT NULL, + `strategy` char(30) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'active', + `impact` mediumint(8) NOT NULL, + `chance` mediumint(8) NOT NULL, + `ratio` mediumint(8) NOT NULL, + `pri` char(30) NOT NULL, + `identifiedDate` date NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` date NOT NULL, + `approvedDate` date NOT NULL, + `prevention` mediumtext NOT NULL, + `plannedClosedDate` date NOT NULL, + `actualClosedDate` date NOT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `activatedBy` varchar(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` datetime NOT NULL, + `canceledBy` varchar(30) NOT NULL, + `canceledDate` datetime NOT NULL, + `cancelReason` char(30) NOT NULL, + `hangupedBy` varchar(30) NOT NULL, + `hangupedDate` datetime NOT NULL, + `resolution` mediumtext NOT NULL, + `resolvedBy` varchar(30) NOT NULL, + `resolvedDate` datetime NOT NULL, + `lastCheckedBy` varchar(30) NOT NULL, + `lastCheckedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_overtime` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT '0.0', + `leave` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `rejectReason` varchar(100) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `reviewedBy` char(30) NOT NULL, + `reviewedDate` datetime NOT NULL, + `level` tinyint(3) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `reviewers` text NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `type` (`type`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_pipeline` ( + `id` smallint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL, + `name` varchar(50) NOT NULL, + `url` varchar(255) DEFAULT NULL, + `account` varchar(30) DEFAULT NULL, + `password` varchar(255) NOT NULL, + `token` varchar(255) DEFAULT NULL, + `private` char(32) DEFAULT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_planstory` ( + `plan` mediumint(8) unsigned NOT NULL, + `story` mediumint(8) unsigned NOT NULL, + `order` mediumint(9) NOT NULL, + UNIQUE KEY `plan_story` (`plan`,`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_process` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL DEFAULT 'waterfall', + `name` varchar(255) NOT NULL, + `type` char(30) NOT NULL, + `abbr` char(30) NOT NULL, + `desc` mediumtext NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `order` mediumint(9) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_product` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `program` mediumint(8) unsigned NOT NULL, + `name` varchar(90) NOT NULL, + `code` varchar(45) NOT NULL, + `bind` enum('0','1') NOT NULL DEFAULT '0', + `line` mediumint(8) NOT NULL, + `type` varchar(30) NOT NULL DEFAULT 'normal', + `status` varchar(30) NOT NULL DEFAULT '', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL, + `PO` varchar(30) NOT NULL, + `QD` varchar(30) NOT NULL, + `RD` varchar(30) NOT NULL, + `feedback` varchar(30) NOT NULL, + `acl` enum('open','private','custom') NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `reviewer` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `createdVersion` varchar(20) NOT NULL, + `order` mediumint(8) unsigned NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `acl` (`acl`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_productplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `parent` mediumint(9) NOT NULL DEFAULT '0', + `title` varchar(90) NOT NULL, + `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait', + `desc` mediumtext NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `order` text NOT NULL, + `closedReason` varchar(20) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `end` (`end`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programactivity` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `process` mediumint(8) NOT NULL, + `activity` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `content` text NOT NULL, + `reason` varchar(255) NOT NULL, + `result` char(30) NOT NULL, + `linkedBy` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programoutput` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `process` mediumint(8) NOT NULL, + `activity` mediumint(8) NOT NULL, + `output` mediumint(8) NOT NULL, + `content` text NOT NULL, + `name` varchar(255) NOT NULL, + `reason` varchar(255) NOT NULL, + `result` char(30) NOT NULL, + `linkedBy` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programprocess` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `process` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `type` char(30) NOT NULL, + `abbr` char(30) NOT NULL, + `desc` text NOT NULL, + `reason` varchar(255) NOT NULL, + `linkedBy` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_programreport` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `template` mediumint(8) NOT NULL, + `project` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `params` text NOT NULL, + `content` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_project` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL DEFAULT '0', + `model` char(30) NOT NULL, + `type` char(30) NOT NULL DEFAULT 'sprint', + `lifetime` char(30) NOT NULL DEFAULT '', + `budget` varchar(30) NOT NULL DEFAULT '0', + `budgetUnit` char(30) NOT NULL DEFAULT 'CNY', + `attribute` varchar(30) NOT NULL DEFAULT '', + `percent` float unsigned NOT NULL DEFAULT '0', + `milestone` enum('0','1') NOT NULL DEFAULT '0', + `output` text NOT NULL, + `auth` char(30) NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` varchar(255) NOT NULL, + `grade` tinyint(3) unsigned NOT NULL, + `name` varchar(90) NOT NULL, + `code` varchar(45) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `realBegan` date NOT NULL, + `realEnd` date NOT NULL, + `days` smallint(5) unsigned NOT NULL, + `status` varchar(10) NOT NULL, + `subStatus` varchar(30) NOT NULL DEFAULT '', + `pri` enum('1','2','3','4') NOT NULL DEFAULT '1', + `desc` mediumtext NOT NULL, + `version` smallint(6) NOT NULL, + `parentVersion` smallint(6) NOT NULL, + `planDuration` int(11) NOT NULL, + `realDuration` int(11) NOT NULL, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `openedVersion` varchar(20) NOT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `canceledBy` varchar(30) NOT NULL DEFAULT '', + `canceledDate` datetime NOT NULL, + `suspendedDate` date NOT NULL, + `PO` varchar(30) NOT NULL DEFAULT '', + `PM` varchar(30) NOT NULL DEFAULT '', + `QD` varchar(30) NOT NULL DEFAULT '', + `RD` varchar(30) NOT NULL DEFAULT '', + `team` varchar(90) NOT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text NOT NULL, + `order` mediumint(8) unsigned NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `displayCards` smallint(6) NOT NULL DEFAULT '0', + `fluidBoard` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `begin` (`begin`), + KEY `end` (`end`), + KEY `status` (`status`), + KEY `acl` (`acl`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectadmin` ( + `group` smallint(6) NOT NULL, + `account` char(30) NOT NULL, + `programs` text NOT NULL, + `projects` text NOT NULL, + `products` text NOT NULL, + `executions` text NOT NULL, + UNIQUE KEY `group_account` (`group`, `account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectcase` ( + `project` mediumint(8) unsigned NOT NULL DEFAULT '0', + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `case` mediumint(8) unsigned NOT NULL DEFAULT '0', + `count` mediumint(8) unsigned NOT NULL DEFAULT '1', + `version` smallint(6) NOT NULL DEFAULT '1', + `order` smallint(6) unsigned NOT NULL, + UNIQUE KEY `project` (`project`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectproduct` ( + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `plan` varchar(255) NOT NULL, + PRIMARY KEY (`project`,`product`,`branch`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectspec` ( + `project` mediumint(8) NOT NULL, + `version` smallint(6) NOT NULL, + `name` varchar(255) NOT NULL, + `milestone` enum('0','1') NOT NULL DEFAULT '0', + `begin` date NOT NULL, + `end` date NOT NULL, + UNIQUE KEY `project` (`project`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_projectstory` ( + `project` mediumint(8) unsigned NOT NULL DEFAULT '0', + `product` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `story` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `order` smallint(6) unsigned NOT NULL, + UNIQUE KEY `project` (`project`,`story`), + KEY `story` (`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_relation` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL, + `product` mediumint(8) NOT NULL, + `execution` mediumint(8) NOT NULL, + `AType` char(30) NOT NULL, + `AID` mediumint(8) NOT NULL, + `AVersion` char(30) NOT NULL, + `relation` char(30) NOT NULL, + `BType` char(30) NOT NULL, + `BID` mediumint(8) NOT NULL, + `BVersion` char(30) NOT NULL, + `extra` char(30) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `relation` (`product`,`relation`,`AType`,`BType`,`AID`,`BID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_relationoftasks` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `execution` mediumint(8) unsigned NOT NULL, + `pretask` mediumint(8) unsigned NOT NULL, + `condition` enum('begin','end') NOT NULL, + `task` mediumint(8) unsigned NOT NULL, + `action` enum('begin','end') NOT NULL, + PRIMARY KEY (`id`), + KEY `relationoftasks` (`execution`,`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_release` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `build` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `marker` enum('0','1') NOT NULL DEFAULT '0', + `date` date NOT NULL, + `stories` text NOT NULL, + `bugs` text NOT NULL, + `leftBugs` text NOT NULL, + `desc` mediumtext NOT NULL, + `mailto` text, + `notify` varchar(255) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'normal', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `build` (`build`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repo` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `product` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `path` varchar(255) NOT NULL, + `prefix` varchar(100) NOT NULL, + `encoding` varchar(20) NOT NULL, + `SCM` varchar(10) NOT NULL, + `client` varchar(100) NOT NULL, + `serviceHost` varchar(50) NOT NULL, + `serviceProject` varchar(100) NOT NULL, + `commits` mediumint(8) unsigned NOT NULL, + `account` varchar(30) NOT NULL, + `password` varchar(30) NOT NULL, + `encrypt` varchar(30) NOT NULL DEFAULT 'plain', + `acl` text NOT NULL, + `synced` tinyint(1) NOT NULL DEFAULT '0', + `lastSync` datetime NOT NULL, + `desc` text NOT NULL, + `extra` char(30) NOT NULL, + `preMerge` enum('0','1') NOT NULL DEFAULT '0', + `job` mediumint(8) unsigned NOT NULL, + `fileServerUrl` text, + `fileServerAccount` varchar(40) NOT NULL DEFAULT '', + `fileServerPassword` varchar(100) NOT NULL DEFAULT '', + `deleted` tinyint(1) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repobranch` ( + `repo` mediumint(8) unsigned NOT NULL, + `revision` mediumint(8) unsigned NOT NULL, + `branch` varchar(255) NOT NULL, + UNIQUE KEY `repo_revision_branch` (`repo`,`revision`,`branch`), + KEY `branch` (`branch`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repofiles` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repo` mediumint(8) unsigned NOT NULL, + `revision` mediumint(8) unsigned NOT NULL, + `path` varchar(255) NOT NULL, + `parent` varchar(255) NOT NULL, + `type` varchar(20) NOT NULL, + `action` char(1) NOT NULL, + PRIMARY KEY (`id`), + KEY `path` (`path`), + KEY `parent` (`parent`), + KEY `repo` (`repo`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_repohistory` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `repo` mediumint(9) NOT NULL, + `revision` varchar(40) NOT NULL, + `commit` mediumint(8) unsigned NOT NULL, + `comment` text NOT NULL, + `committer` varchar(100) NOT NULL, + `time` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `repo` (`repo`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_report` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `code` varchar(100) NOT NULL, + `name` text NOT NULL, + `module` varchar(100) NOT NULL, + `sql` text NOT NULL, + `vars` text NOT NULL, + `langs` text NOT NULL, + `params` text NOT NULL, + `step` tinyint(1) NOT NULL DEFAULT '2', + `desc` text NOT NULL, + `addedBy` char(30) NOT NULL, + `addedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_researchplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `customer` varchar(255) NOT NULL, + `stakeholder` varchar(255) NOT NULL, + `objective` varchar(255) NOT NULL, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `location` varchar(255) NOT NULL, + `team` varchar(255) NOT NULL, + `method` enum('','videoConference','interview','questionnaire','telephoneInterview') NOT NULL, + `outline` mediumtext NOT NULL, + `schedule` mediumtext NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_researchreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `relatedPlan` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `author` varchar(30) NOT NULL, + `content` mediumtext NOT NULL, + `customer` varchar(255) NOT NULL, + `researchObjects` varchar(255) NOT NULL, + `begin` datetime NOT NULL, + `end` datetime NOT NULL, + `location` varchar(255) NOT NULL, + `method` enum('','videoConference','interview','questionnaire','telephoneInterview') NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_review` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `object` mediumint(8) NOT NULL, + `template` mediumint(8) NOT NULL, + `doc` mediumint(8) DEFAULT NULL, + `docVersion` smallint(6) NOT NULL, + `status` char(30) NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `auditedBy` varchar(255) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deadline` date NOT NULL, + `lastReviewedBy` varchar(255) DEFAULT NULL, + `lastReviewedDate` date NOT NULL, + `lastAuditedBy` varchar(255) NOT NULL, + `lastAuditedDate` date NOT NULL, + `lastEditedBy` varchar(255) NOT NULL, + `lastEditedDate` date NOT NULL, + `result` char(30) NOT NULL, + `auditResult` char(30) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `object` char(30) NOT NULL, + `category` char(30) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `order` mediumint(8) DEFAULT '0', + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewissue` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `review` mediumint(8) NOT NULL, + `approval` mediumint(8) NOT NULL, + `injection` mediumint(8) NOT NULL, + `identify` mediumint(8) NOT NULL, + `type` char(30) NOT NULL DEFAULT 'review', + `listID` mediumint(8) NOT NULL, + `title` varchar(255) NOT NULL, + `opinion` varchar(255) NOT NULL, + `opinionDate` date NOT NULL, + `status` char(30) NOT NULL, + `resolution` char(30) NOT NULL, + `resolutionBy` char(30) NOT NULL, + `resolutionDate` date NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewlist` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `object` char(30) NOT NULL, + `category` char(30) NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedBy` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_reviewresult` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `review` mediumint(8) NOT NULL, + `type` char(30) NOT NULL DEFAULT 'review', + `result` char(30) NOT NULL, + `opinion` text NOT NULL, + `reviewer` char(30) NOT NULL, + `remainIssue` char(30) NOT NULL, + `createdDate` date NOT NULL, + `consumed` float NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `reviewer` (`review`,`reviewer`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_risk` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` varchar(255) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `source` char(30) NOT NULL, + `category` char(30) NOT NULL, + `strategy` char(30) NOT NULL, + `status` varchar(30) NOT NULL DEFAULT 'active', + `impact` char(30) NOT NULL, + `probability` char(30) NOT NULL, + `rate` char(30) NOT NULL, + `pri` char(30) NOT NULL, + `identifiedDate` date NOT NULL, + `prevention` mediumtext NOT NULL, + `remedy` mediumtext NOT NULL, + `plannedClosedDate` date NOT NULL, + `actualClosedDate` date NOT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `from` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` smallint(6) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `resolution` mediumtext NOT NULL, + `resolvedBy` varchar(30) NOT NULL, + `activateBy` varchar(30) NOT NULL, + `activateDate` date NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` date NOT NULL, + `cancelBy` varchar(30) NOT NULL, + `cancelDate` date NOT NULL, + `cancelReason` char(30) NOT NULL, + `hangupBy` varchar(30) NOT NULL, + `hangupDate` date NOT NULL, + `trackedBy` varchar(30) NOT NULL, + `trackedDate` date NOT NULL, + `assignedDate` date NOT NULL, + `approvedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_riskissue` ( + `risk` mediumint(8) unsigned NOT NULL, + `issue` mediumint(8) unsigned NOT NULL, + UNIQUE KEY `risk_issue` (`risk`,`issue`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_score` ( + `id` bigint(12) unsigned NOT NULL AUTO_INCREMENT, + `account` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL DEFAULT '', + `method` varchar(30) NOT NULL, + `desc` varchar(250) NOT NULL DEFAULT '', + `before` int(11) NOT NULL DEFAULT '0', + `score` int(11) NOT NULL DEFAULT '0', + `after` int(11) NOT NULL DEFAULT '0', + `time` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `model` (`module`), + KEY `method` (`method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_searchdict` ( + `key` smallint(5) unsigned NOT NULL, + `value` char(3) NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_searchindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `objectType` char(20) NOT NULL, + `objectID` mediumint(9) NOT NULL, + `title` text NOT NULL, + `content` text NOT NULL, + `addedDate` datetime NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `object` (`objectType`,`objectID`), + KEY `addedDate` (`addedDate`), + FULLTEXT KEY `content` (`content`), + FULLTEXT KEY `title` (`title`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_serverroom` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL, + `city` varchar(128) NOT NULL, + `line` varchar(20) NOT NULL, + `bandwidth` varchar(128) NOT NULL, + `provider` varchar(128) NOT NULL, + `owner` varchar(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_service` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `external` enum('0','1') NOT NULL DEFAULT '0', + `port` smallint(5) unsigned NOT NULL, + `entry` varchar(255) NOT NULL, + `deploy` varchar(255) NOT NULL, + `version` varchar(64) NOT NULL, + `color` char(7) NOT NULL, + `desc` mediumtext, + `dept` varchar(128) NOT NULL, + `devel` varchar(30) NOT NULL, + `qa` varchar(30) NOT NULL, + `ops` varchar(30) NOT NULL, + `hosts` text, + `softName` varchar(128) NOT NULL, + `softVersion` varchar(128) NOT NULL, + `type` varchar(20) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT '0', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_solutions` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `contents` text NOT NULL COMMENT '问题描述', + `support` text NOT NULL COMMENT '是否需要高层支持', + `measures` text NOT NULL COMMENT '解决建议', + `type` char(30) NOT NULL, + `addedBy` varchar(30) NOT NULL, + `addedDate` date NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_sqlview` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(90) NOT NULL, + `code` varchar(45) NOT NULL, + `sql` text NOT NULL, + `desc` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_stage` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `percent` varchar(255) NOT NULL, + `type` varchar(255) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_stakeholder` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `objectID` mediumint(8) NOT NULL, + `objectType` char(30) NOT NULL, + `user` char(30) NOT NULL, + `type` char(30) NOT NULL, + `key` enum('0','1') NOT NULL, + `from` char(30) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` date NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL, + KEY `objectID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_story` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `parent` mediumint(9) NOT NULL DEFAULT '0', + `product` mediumint(8) unsigned NOT NULL DEFAULT '0', + `branch` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `plan` text, + `source` varchar(20) NOT NULL, + `sourceNote` varchar(255) NOT NULL, + `fromBug` mediumint(8) unsigned NOT NULL DEFAULT '0', + `feedback` mediumint(8) unsigned NOT NULL DEFAULT '0', + `title` varchar(255) NOT NULL, + `keywords` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL DEFAULT 'story', + `category` varchar(30) NOT NULL DEFAULT 'feature', + `pri` tinyint(3) unsigned NOT NULL DEFAULT '3', + `estimate` float unsigned NOT NULL, + `status` enum('','changing','active','draft','closed','reviewing') 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', + `stagedBy` char(30) NOT NULL, + `mailto` text, + `lib` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromStory` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromVersion` smallint(6) NOT NULL DEFAULT '1', + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime NOT NULL, + `approvedDate` date NOT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime NOT NULL, + `changedBy` VARCHAR(30) NOT NULL, + `changedDate` DATETIME NOT NULL, + `reviewedBy` varchar(255) NOT NULL, + `reviewedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `closedReason` varchar(30) NOT NULL, + `activatedDate` datetime NOT NULL, + `toBug` mediumint(8) unsigned NOT NULL, + `childStories` varchar(255) NOT NULL, + `linkStories` varchar(255) NOT NULL, + `linkRequirements` varchar(255) NOT NULL, + `duplicateStory` mediumint(8) unsigned NOT NULL, + `version` smallint(6) NOT NULL DEFAULT '1', + `storyChanged` enum('0','1') NOT NULL DEFAULT '0', + `feedbackBy` varchar(100) NOT NULL, + `notifyEmail` varchar(100) NOT NULL, + `URChanged` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `status` (`status`), + KEY `assignedTo` (`assignedTo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storyestimate` ( + `story` mediumint(9) NOT NULL, + `round` smallint(6) NOT NULL, + `estimate` text NOT NULL, + `average` float NOT NULL, + `openedBy` varchar(30) NOT NULL, + `openedDate` datetime NOT NULL, + UNIQUE KEY `story` (`story`,`round`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storyreview` ( + `story` mediumint(9) NOT NULL, + `version` smallint(6) NOT NULL, + `reviewer` varchar(30) NOT NULL, + `result` varchar(30) NOT NULL, + `reviewDate` datetime NOT NULL, + UNIQUE KEY `story` (`story`,`version`,`reviewer`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storyspec` ( + `story` mediumint(9) NOT NULL, + `version` smallint(6) NOT NULL, + `title` varchar(255) NOT NULL, + `spec` mediumtext NOT NULL, + `verify` mediumtext NOT NULL, + UNIQUE KEY `story` (`story`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_storystage` ( + `story` mediumint(8) unsigned NOT NULL, + `branch` mediumint(8) unsigned NOT NULL, + `stage` varchar(50) NOT NULL, + `stagedBy` char(30) NOT NULL, + UNIQUE KEY `story_branch` (`story`,`branch`), + KEY `story` (`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_suitecase` ( + `suite` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `case` mediumint(8) unsigned NOT NULL, + `version` smallint(5) unsigned NOT NULL, + UNIQUE KEY `suitecase` (`suite`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_task` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `parent` mediumint(8) NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `module` mediumint(8) unsigned NOT NULL DEFAULT '0', + `design` mediumint(8) unsigned NOT NULL, + `story` mediumint(8) unsigned NOT NULL DEFAULT '0', + `storyVersion` smallint(6) NOT NULL DEFAULT '1', + `designVersion` smallint(6) unsigned NOT NULL, + `fromBug` mediumint(8) unsigned NOT NULL DEFAULT '0', + `fromIssue` mediumint(8) unsigned NOT NULL DEFAULT '0', + `feedback` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `type` varchar(20) NOT NULL, + `mode` varchar(10) NOT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT '0', + `estimate` float unsigned NOT NULL, + `consumed` float unsigned NOT NULL, + `left` float unsigned NOT NULL, + `deadline` date NOT NULL, + `status` enum('wait','doing','done','pause','cancel','closed') NOT NULL DEFAULT 'wait', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL, + `mailto` text, + `desc` mediumtext NOT NULL, + `version` smallint(6) NOT NULL, + `openedBy` varchar(30) NOT NULL, + `openedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `estStarted` date NOT NULL, + `realStarted` datetime NOT NULL, + `finishedBy` varchar(30) NOT NULL, + `finishedDate` datetime NOT NULL, + `finishedList` text NOT NULL, + `canceledBy` varchar(30) NOT NULL, + `canceledDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL, + `closedDate` datetime NOT NULL, + `planDuration` int(11) NOT NULL, + `realDuration` int(11) NOT NULL, + `closedReason` varchar(30) NOT NULL, + `lastEditedBy` varchar(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `activatedDate` datetime NOT NULL, + `order` mediumint(8) NOT NULL DEFAULT 0, + `repo` mediumint(8) unsigned NOT NULL, + `mr` mediumint(8) unsigned NOT NULL, + `entry` varchar(255) NOT NULL, + `lines` varchar(10) NOT NULL, + `v1` varchar(40) NOT NULL, + `v2` varchar(40) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + KEY `execution` (`execution`), + KEY `story` (`story`), + KEY `parent` (`parent`), + KEY `assignedTo` (`assignedTo`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_taskestimate` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `date` date NOT NULL, + `left` float unsigned NOT NULL DEFAULT '0', + `consumed` float unsigned NOT NULL, + `account` char(30) NOT NULL DEFAULT '', + `work` text, + PRIMARY KEY (`id`), + KEY `task` (`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_taskspec` ( + `task` mediumint(8) NOT NULL, + `version` smallint(6) NOT NULL, + `name` varchar(255) NOT NULL, + `estStarted` date NOT NULL, + `deadline` date NOT NULL, + UNIQUE KEY `task` (`task`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_team` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `root` mediumint(8) unsigned NOT NULL DEFAULT '0', + `type` enum('project','task','execution') NOT NULL DEFAULT 'project', + `account` char(30) NOT NULL DEFAULT '', + `role` char(30) NOT NULL DEFAULT '', + `position` varchar(30) NOT NULL, + `limited` char(8) NOT NULL DEFAULT 'no', + `join` date NOT NULL DEFAULT '0000-00-00', + `days` smallint(5) unsigned NOT NULL, + `hours` float(3,1) unsigned NOT NULL DEFAULT '0.0', + `estimate` decimal(12,2) unsigned NOT NULL DEFAULT '0.00', + `consumed` decimal(12,2) unsigned NOT NULL DEFAULT '0.00', + `left` decimal(12,2) unsigned NOT NULL DEFAULT '0.00', + `order` tinyint(3) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `team` (`root`,`type`,`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `execution` mediumint(8) unsigned NOT NULL, + `tasks` varchar(255) NOT NULL, + `builds` varchar(255) NOT NULL, + `title` varchar(255) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `owner` char(30) NOT NULL, + `members` text NOT NULL, + `stories` text NOT NULL, + `bugs` text NOT NULL, + `cases` text NOT NULL, + `report` text NOT NULL, + `objectType` varchar(20) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testresult` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `run` mediumint(8) unsigned NOT NULL, + `case` mediumint(8) unsigned NOT NULL, + `version` smallint(5) unsigned NOT NULL, + `job` mediumint(8) unsigned NOT NULL, + `compile` mediumint(8) unsigned NOT NULL, + `caseResult` char(30) NOT NULL, + `stepResults` text NOT NULL, + `lastRunner` varchar(30) NOT NULL, + `date` datetime NOT NULL, + `duration` float NOT NULL, + `xml` text NOT NULL, + `deploy` mediumint(8) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `case` (`case`), + KEY `version` (`version`), + KEY `run` (`run`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testrun` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL DEFAULT '0', + `case` mediumint(8) unsigned NOT NULL DEFAULT '0', + `version` tinyint(3) unsigned NOT NULL DEFAULT '0', + `assignedTo` char(30) NOT NULL DEFAULT '', + `lastRunner` varchar(30) NOT NULL, + `lastRunDate` datetime NOT NULL, + `lastRunResult` char(30) NOT NULL, + `status` char(30) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `task` (`task`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testsuite` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `desc` mediumtext NOT NULL, + `type` varchar(20) NOT NULL, + `order` SMALLINT UNSIGNED NOT NULL DEFAULT '0', + `addedBy` char(30) NOT NULL, + `addedDate` datetime NOT NULL, + `lastEditedBy` char(30) NOT NULL, + `lastEditedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL, + PRIMARY KEY (`id`), + KEY `product` (`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_testtask` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `product` mediumint(8) unsigned NOT NULL, + `name` char(90) NOT NULL, + `execution` mediumint(8) unsigned NOT NULL DEFAULT '0', + `build` char(30) NOT NULL, + `type` varchar(255) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT '0', + `begin` date NOT NULL, + `end` date NOT NULL, + `realFinishedDate` datetime NOT NULL, + `mailto` text, + `desc` mediumtext NOT NULL, + `report` text NOT NULL, + `status` enum('blocked','doing','wait','done') NOT NULL DEFAULT 'wait', + `testreport` mediumint(8) unsigned NOT NULL, + `auto` varchar(10) NOT NULL DEFAULT 'no', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `build` (`build`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_todo` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `date` date NOT NULL, + `begin` smallint(4) unsigned zerofill NOT NULL, + `end` smallint(4) unsigned zerofill NOT NULL, + `feedback` mediumint(8) unsigned NOT NULL, + `type` char(15) NOT NULL, + `cycle` tinyint(3) unsigned NOT NULL DEFAULT '0', + `idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0', + `pri` tinyint(3) unsigned NOT NULL, + `name` char(150) NOT NULL, + `desc` mediumtext NOT NULL, + `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait', + `private` tinyint(1) NOT NULL, + `config` varchar(255) NOT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime NOT NULL, + `finishedBy` varchar(30) NOT NULL DEFAULT '', + `finishedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `assignedTo` (`assignedTo`), + KEY `finishedBy` (`finishedBy`), + KEY `date` (`date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_traincategory` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(30) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) NOT NULL, + `order` mediumint(8) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_traincontents` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `code` varchar(50) NOT NULL, + `course` mediumint(8) unsigned NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL, + `type` varchar(30) NOT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT '0', + `path` char(255) NOT NULL DEFAULT '', + `desc` text NOT NULL, + `order` mediumint(8) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` tinyint(1) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_traincourse` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `code` varchar(50) NOT NULL, + `category` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `status` varchar(10) NOT NULL, + `teacher` varchar(30) NOT NULL DEFAULT '', + `desc` mediumtext NOT NULL, + `createdBy` varchar(255) NOT NULL, + `createdDate` date NOT NULL, + `editedBy` varchar(255) NOT NULL, + `editedDate` date NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_trainplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `place` varchar(255) NOT NULL, + `trainee` text NOT NULL, + `lecturer` varchar(20) NOT NULL, + `type` enum('inside','outside') NOT NULL DEFAULT 'inside', + `status` varchar(20) NOT NULL, + `summary` mediumtext NOT NULL, + `createdBy` char(30) DEFAULT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_trainrecords` ( + `user` char(30) NOT NULL, + `objectId` mediumint(8) unsigned NOT NULL, + `objectType` varchar(10) NOT NULL, + `status` varchar(10) NOT NULL, + PRIMARY KEY (`user`,`objectId`,`objectType`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_trip` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('trip','egress') NOT NULL DEFAULT 'trip', + `customers` varchar(20) NOT NULL, + `name` char(30) NOT NULL, + `desc` text NOT NULL, + `year` char(4) NOT NULL, + `begin` date NOT NULL, + `end` date NOT NULL, + `start` time NOT NULL, + `finish` time NOT NULL, + `from` char(50) NOT NULL, + `to` char(50) NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_user` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `company` mediumint(8) unsigned NOT NULL, + `type` char(30) NOT NULL DEFAULT 'inside', + `dept` mediumint(8) unsigned NOT NULL DEFAULT '0', + `account` char(30) NOT NULL DEFAULT '', + `password` char(32) NOT NULL DEFAULT '', + `role` char(10) NOT NULL DEFAULT '', + `realname` varchar(100) NOT NULL DEFAULT '', + `pinyin` varchar(255) NOT NULL DEFAULT '', + `nickname` char(60) NOT NULL DEFAULT '', + `commiter` varchar(100) NOT NULL, + `avatar` text NOT NULL, + `birthday` date NOT NULL DEFAULT '0000-00-00', + `gender` enum('f','m') NOT NULL DEFAULT 'f', + `email` char(90) NOT NULL DEFAULT '', + `skype` char(90) NOT NULL DEFAULT '', + `qq` char(20) NOT NULL DEFAULT '', + `mobile` char(11) NOT NULL DEFAULT '', + `phone` char(20) NOT NULL DEFAULT '', + `weixin` varchar(90) NOT NULL DEFAULT '', + `dingding` varchar(90) NOT NULL DEFAULT '', + `slack` varchar(90) NOT NULL DEFAULT '', + `whatsapp` varchar(90) NOT NULL DEFAULT '', + `address` char(120) NOT NULL DEFAULT '', + `zipcode` char(10) NOT NULL DEFAULT '', + `nature` text NOT NULL, + `analysis` text NOT NULL, + `strategy` text NOT NULL, + `join` date NOT NULL DEFAULT '0000-00-00', + `visits` mediumint(8) unsigned NOT NULL DEFAULT '0', + `visions` varchar(20) NOT NULL DEFAULT 'rnd,lite', + `ip` char(15) NOT NULL DEFAULT '', + `last` int(10) unsigned NOT NULL DEFAULT '0', + `fails` tinyint(5) NOT NULL DEFAULT '0', + `locked` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `feedback` enum('0','1') NOT NULL DEFAULT '0', + `ranzhi` char(30) NOT NULL DEFAULT '', + `ldap` char(30) NOT NULL, + `score` int(11) NOT NULL DEFAULT '0', + `scoreLevel` int(11) NOT NULL DEFAULT '0', + `resetToken` varchar(50) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `clientStatus` enum('online','away','busy','offline','meeting') NOT NULL DEFAULT 'offline', + `clientLang` varchar(10) NOT NULL DEFAULT 'zh-cn', + PRIMARY KEY (`id`), + UNIQUE KEY `account` (`account`), + KEY `dept` (`dept`), + KEY `email` (`email`), + KEY `commiter` (`commiter`), + KEY `deleted` (`deleted`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_usercontact` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `listName` varchar(60) NOT NULL, + `userList` text NOT NULL, + PRIMARY KEY (`id`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_usergroup` ( + `account` char(30) NOT NULL DEFAULT '', + `group` mediumint(8) unsigned NOT NULL DEFAULT '0', + `project` text NOT NULL, + UNIQUE KEY `account` (`account`,`group`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_userquery` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `module` varchar(30) NOT NULL, + `title` varchar(90) NOT NULL, + `form` text NOT NULL, + `sql` text NOT NULL, + `shortcut` enum('0','1') NOT NULL DEFAULT '0', + `common` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `module` (`module`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_usertpl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL, + `type` char(30) NOT NULL, + `title` varchar(150) NOT NULL, + `content` text NOT NULL, + `public` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_userview` ( + `account` char(30) NOT NULL, + `programs` mediumtext NOT NULL, + `products` mediumtext NOT NULL, + `projects` mediumtext NOT NULL, + `sprints` mediumtext NOT NULL, + UNIQUE KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_vm` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `hostID` int(10) unsigned NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `osCategory` varchar(50) NOT NULL DEFAULT '', + `osType` varchar(50) NOT NULL DEFAULT '', + `osArch` varchar(50) NOT NULL DEFAULT '', + `osLang` varchar(50) NOT NULL DEFAULT '', + `osCpu` tinyint(2) NOT NULL DEFAULT 0, + `osMemory` smallint(6) NOT NULL DEFAULT 0, + `osDisk` smallint(6) NOT NULL DEFAULT 0, + `status` varchar(50) NOT NULL DEFAULT '', + `destroyAt` datetime DEFAULT NULL, + `macAddress` varchar(255) NOT NULL DEFAULT '', + `workspace` varchar(255) NOT NULL DEFAULT '', + `templateID` int(10) unsigned NOT NULL DEFAULT '0', + `baseImageID` int(10) unsigned NOT NULL DEFAULT '0', + `baseImagePath` varchar(255) NOT NULL DEFAULT '', + `desc` varchar(255) NOT NULL DEFAULT '', + `heatbeat` datetime DEFAULT NULL, + `vncPort` int(10) NOT NULL DEFAULT 0, + `instance` varchar(255) NOT NULL DEFAULT '', + `eip` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `public` varchar(50) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_vmtemplate` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `hostID` int(10) unsigned NOT NULL DEFAULT '0', + `templateName` varchar(255) NOT NULL DEFAULT '', + `osType` varchar(50) NOT NULL DEFAULT '', + `osCategory` varchar(50) NOT NULL DEFAULT '', + `osVersion` varchar(50) NOT NULL DEFAULT '', + `osLang` varchar(50) NOT NULL, + `cpuCoreNum` smallint(4) NOT NULL DEFAULT 0, + `memorySize` int NOT NULL DEFAULT 0, + `diskSize` int NOT NULL DEFAULT 0, + `osArch` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_webhook` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(15) NOT NULL DEFAULT 'default', + `name` varchar(50) NOT NULL, + `url` varchar(255) NOT NULL, + `domain` varchar(255) NOT NULL, + `secret` varchar(255) NOT NULL, + `contentType` varchar(30) NOT NULL DEFAULT 'application/json', + `sendType` enum('sync','async') NOT NULL DEFAULT 'sync', + `products` text NOT NULL, + `executions` text NOT NULL, + `params` varchar(100) NOT NULL, + `actions` text NOT NULL, + `desc` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_weeklyreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `weekStart` date NOT NULL, + `pv` float(9,2) NOT NULL, + `ev` float(9,2) NOT NULL, + `ac` float(9,2) NOT NULL, + `sv` float(9,2) NOT NULL, + `cv` float(9,2) NOT NULL, + `staff` smallint(5) unsigned NOT NULL, + `progress` varchar(255) NOT NULL, + `workload` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `week` (`project`,`weekStart`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workestimation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL, + `scale` decimal(10,2) unsigned NOT NULL, + `productivity` decimal(10,2) unsigned NOT NULL, + `duration` decimal(10,2) unsigned NOT NULL, + `unitLaborCost` decimal(10,2) unsigned NOT NULL, + `totalLaborCost` decimal(10,2) unsigned NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `assignedTo` varchar(30) NOT NULL, + `assignedDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `dayHour` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflow` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `parent` varchar(30) NOT NULL, + `child` varchar(30) NOT NULL, + `type` varchar(10) NOT NULL DEFAULT 'flow', + `navigator` varchar(10) NOT NULL, + `app` varchar(20) NOT NULL, + `position` varchar(30) NOT NULL, + `module` varchar(30) NOT NULL, + `table` varchar(50) NOT NULL, + `name` varchar(30) NOT NULL, + `titleField` varchar(30) NOT NULL, + `contentField` text NOT NULL, + `flowchart` text NOT NULL, + `js` text NOT NULL, + `css` text NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `administrator` text NOT NULL, + `desc` text NOT NULL, + `version` varchar(10) NOT NULL DEFAULT '1.0', + `status` varchar(10) NOT NULL DEFAULT 'wait', + `approval` enum('enabled', 'disabled') NOT NULL DEFAULT 'disabled', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`app`,`module`,`vision`), + KEY `type` (`type`), + KEY `app` (`app`), + KEY `module` (`module`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowaction` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `action` varchar(50) NOT NULL, + `method` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `type` enum('single','batch') NOT NULL DEFAULT 'single', + `batchMode` enum('same','different') NOT NULL DEFAULT 'different', + `extensionType` varchar(10) NOT NULL DEFAULT 'override' COMMENT 'none | extend | override', + `open` varchar(20) NOT NULL, + `position` enum('menu','browseandview','browse','view') NOT NULL DEFAULT 'browseandview', + `layout` char(20) NOT NULL, + `show` enum('dropdownlist','direct') NOT NULL DEFAULT 'dropdownlist', + `order` smallint(5) unsigned NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `virtual` tinyint(1) unsigned NOT NULL, + `conditions` text NOT NULL, + `verifications` text NOT NULL, + `hooks` text NOT NULL, + `linkages` text NOT NULL, + `js` text NOT NULL, + `css` text NOT NULL, + `toList` char(255) NOT NULL, + `blocks` text NOT NULL, + `desc` text NOT NULL, + `status` varchar(10) NOT NULL DEFAULT 'enable', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`module`,`action`,`vision`), + KEY `module` (`module`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=190 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowdatasource` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('system','sql','func','option','lang','category') NOT NULL DEFAULT 'option', + `name` varchar(30) NOT NULL, + `code` varchar(30) NOT NULL, + `datasource` text NOT NULL, + `view` varchar(20) NOT NULL, + `keyField` varchar(50) NOT NULL, + `valueField` varchar(50) NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowfield` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `field` varchar(50) NOT NULL, + `type` varchar(20) NOT NULL DEFAULT 'varchar', + `length` varchar(10) NOT NULL, + `name` varchar(50) NOT NULL, + `control` varchar(20) NOT NULL, + `expression` text NOT NULL, + `options` text NOT NULL, + `default` varchar(100) NOT NULL, + `rules` varchar(255) NOT NULL, + `placeholder` varchar(100) NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `searchOrder` smallint(5) unsigned NOT NULL DEFAULT '0', + `exportOrder` smallint(5) unsigned NOT NULL DEFAULT '0', + `canExport` enum('0','1') NOT NULL DEFAULT '0', + `canSearch` enum('0','1') NOT NULL DEFAULT '0', + `isValue` enum('0','1') NOT NULL DEFAULT '0', + `readonly` enum('0','1') NOT NULL DEFAULT '0', + `buildin` tinyint(1) unsigned NOT NULL, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `desc` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`module`,`field`), + KEY `module` (`module`), + KEY `field` (`field`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=360 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowlabel` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `action` varchar(30) NOT NULL DEFAULT 'browse', + `code` varchar(30) NOT NULL, + `label` varchar(255) NOT NULL, + `params` text NOT NULL, + `orderBy` text NOT NULL, + `order` tinyint(3) NOT NULL, + `buildin` tinyint(1) unsigned NOT NULL, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `module` (`module`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowlayout` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `action` varchar(50) NOT NULL, + `field` varchar(50) NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `width` smallint(5) NOT NULL, + `position` text NOT NULL, + `readonly` enum('0','1') NOT NULL DEFAULT '0', + `mobileShow` enum('0','1') NOT NULL DEFAULT '1', + `summary` varchar(20) NOT NULL, + `defaultValue` text NOT NULL, + `layoutRules` varchar(255) NOT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`module`,`action`,`field`,`vision`), + KEY `module` (`module`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB AUTO_INCREMENT=138 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowlinkdata` ( + `objectType` varchar(30) NOT NULL, + `objectID` mediumint(8) unsigned NOT NULL, + `linkedType` varchar(30) NOT NULL, + `linkedID` mediumint(8) unsigned NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + UNIQUE KEY `unique` (`objectType`,`objectID`,`linkedType`,`linkedID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowrelation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `prev` varchar(30) NOT NULL, + `next` varchar(30) NOT NULL, + `field` varchar(50) NOT NULL, + `actions` varchar(20) NOT NULL, + `actionCodes` text NOT NULL, + `buildin` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowrelationlayout` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `prev` varchar(30) NOT NULL, + `next` varchar(30) NOT NULL, + `action` varchar(50) NOT NULL, + `field` varchar(50) NOT NULL, + `order` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`prev`,`next`,`action`,`field`), + KEY `prev` (`prev`), + KEY `next` (`next`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL COMMENT 'module name', + `name` varchar(100) NOT NULL COMMENT 'report name', + `type` enum('pie','line','bar') NOT NULL DEFAULT 'pie' COMMENT 'report type', + `countType` enum('sum','count') NOT NULL DEFAULT 'sum' COMMENT 'report count method', + `displayType` enum('value','percent') NOT NULL DEFAULT 'value' COMMENT 'report display method', + `dimension` varchar(130) NOT NULL COMMENT 'dimension field code of zt_workflowfield', + `fields` text NOT NULL COMMENT 'count fileds code of zt_workflowfield,use comma split', + `order` smallint(5) unsigned NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowrule` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('system','regex','func') NOT NULL DEFAULT 'regex', + `name` varchar(30) NOT NULL, + `rule` text NOT NULL, + `createdBy` char(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` char(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowsql` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `field` varchar(50) NOT NULL, + `action` varchar(50) NOT NULL, + `sql` text NOT NULL, + `vars` text NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `module` (`module`), + KEY `field` (`field`), + KEY `action` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_workflowversion` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `version` varchar(10) NOT NULL, + `fields` text NOT NULL, + `actions` text NOT NULL, + `layouts` text NOT NULL, + `sqls` text NOT NULL, + `labels` text NOT NULL, + `table` text NOT NULL, + `datas` text NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `moduleversion` (`module`,`version`), + KEY `module` (`module`), + KEY `version` (`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `zt_zoutput` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `activity` mediumint(8) NOT NULL, + `name` varchar(255) NOT NULL, + `content` mediumtext NOT NULL, + `optional` char(20) NOT NULL, + `tailorNorm` varchar(255) NOT NULL, + `status` varchar(30) NOT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `order` mediumint(8) DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=130 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_dayactions` AS SELECT + 1 AS `actions`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daybugopen` AS SELECT + 1 AS `bugopen`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daybugresolve` AS SELECT + 1 AS `bugresolve`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_dayeffort` AS SELECT + 1 AS `consumed`, + 1 AS `date`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daystoryclose` AS SELECT + 1 AS `storyclose`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daystoryopen` AS SELECT + 1 AS `storyopen`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daytaskfinish` AS SELECT + 1 AS `taskfinish`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_daytaskopen` AS SELECT + 1 AS `taskopen`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_dayuserlogin` AS SELECT + 1 AS `userlogin`, + 1 AS `day`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_executionsummary` AS SELECT + 1 AS `execution`, + 1 AS `estimate`, + 1 AS `consumed`, + 1 AS `left`, + 1 AS `number`, + 1 AS `undone`, + 1 AS `totalReal`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_productbugs` AS SELECT + 1 AS `product`, + 1 AS `bugs`, + 1 AS `resolutions`, + 1 AS `seriousBugs`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_productstories` AS SELECT + 1 AS `product`, + 1 AS `stories`, + 1 AS `undone`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectbugs` AS SELECT + 1 AS `execution`, + 1 AS `bugs`, + 1 AS `resolutions`, + 1 AS `seriousBugs`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectstories` AS SELECT + 1 AS `execution`, + 1 AS `stories`, + 1 AS `undone`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectsummary` AS SELECT + 1 AS `project`, + 1 AS `estimate`, + 1 AS `consumed`, + 1 AS `left`, + 1 AS `number`, + 1 AS `undone`, + 1 AS `totalReal`*/; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `ztv_projectteams` AS SELECT + 1 AS `execution`, + 1 AS `teams`*/; +SET character_set_client = @saved_cs_client; +/*!50001 DROP VIEW IF EXISTS `view_datasource_10`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_10` AS select `zt_build`.`id` AS `id`,`zt_build`.`name` AS `name` from `zt_build` where (`zt_build`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_11`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_11` AS select `zt_module`.`id` AS `id`,`zt_module`.`name` AS `name` from `zt_module` where (`zt_module`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_12`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_12` AS select `zt_productplan`.`id` AS `id`,`zt_productplan`.`title` AS `title` from `zt_productplan` where (`zt_productplan`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_4`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_4` AS select `zt_story`.`id` AS `id`,`zt_story`.`title` AS `title` from `zt_story` where (`zt_story`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_41`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_41` AS select `zt_case`.`id` AS `id`,`zt_case`.`title` AS `title` from `zt_case` where (`zt_case`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_46`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_46` AS select `zt_task`.`id` AS `id`,`zt_task`.`name` AS `name` from `zt_task` where ((`zt_task`.`deleted` = '0') and (`zt_task`.`vision` = 'lite')) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_5`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_5` AS select `zt_task`.`id` AS `id`,`zt_task`.`name` AS `name` from `zt_task` where ((`zt_task`.`deleted` = '0') and (`zt_task`.`vision` = 'rnd')) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `view_datasource_6`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `view_datasource_6` AS select `zt_bug`.`id` AS `id`,`zt_bug`.`title` AS `title` from `zt_bug` where (`zt_bug`.`deleted` = '0') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_dayactions`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_dayactions` AS select count(0) AS `actions`,left(`zt_action`.`date`,10) AS `day` from `zt_action` group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daybugopen`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daybugopen` AS select count(0) AS `bugopen`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'bug') and (`zt_action`.`action` = 'opened')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daybugresolve`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daybugresolve` AS select count(0) AS `bugresolve`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'bug') and (`zt_action`.`action` = 'resolved')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_dayeffort`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_dayeffort` AS select round(sum(`zt_effort`.`consumed`),1) AS `consumed`,`zt_effort`.`date` AS `date` from `zt_effort` group by `zt_effort`.`date` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daystoryclose`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daystoryclose` AS select count(0) AS `storyclose`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'story') and (`zt_action`.`action` = 'closed')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daystoryopen`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daystoryopen` AS select count(0) AS `storyopen`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'story') and (`zt_action`.`action` = 'opened')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daytaskfinish`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daytaskfinish` AS select count(0) AS `taskfinish`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'task') and (`zt_action`.`action` = 'finished')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_daytaskopen`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_daytaskopen` AS select count(0) AS `taskopen`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'task') and (`zt_action`.`action` = 'opened')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_dayuserlogin`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_dayuserlogin` AS select count(0) AS `userlogin`,left(`zt_action`.`date`,10) AS `day` from `zt_action` where ((`zt_action`.`objectType` = 'user') and (`zt_action`.`action` = 'login')) group by left(`zt_action`.`date`,10) */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_executionsummary`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_executionsummary` AS select `zt_task`.`execution` AS `execution`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`estimate`,0)) AS `estimate`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0)) AS `consumed`,sum(if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0)) AS `left`,count(0) AS `number`,sum(if(((`zt_task`.`status` <> 'done') and (`zt_task`.`status` <> 'closed')),1,0)) AS `undone`,sum((if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0) + if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0))) AS `totalReal` from `zt_task` where (`zt_task`.`deleted` = '0') group by `zt_task`.`execution` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_productbugs`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_productbugs` AS select `zt_bug`.`product` AS `product`,count(0) AS `bugs`,sum(if((`zt_bug`.`resolution` = ''),0,1)) AS `resolutions`,sum(if((`zt_bug`.`severity` <= 2),1,0)) AS `seriousBugs` from `zt_bug` where (`zt_bug`.`deleted` = '0') group by `zt_bug`.`product` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_productstories`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_productstories` AS select `zt_story`.`product` AS `product`,count('*') AS `stories`,sum(if((`zt_story`.`status` = 'closed'),0,1)) AS `undone` from `zt_story` where (`zt_story`.`deleted` = '0') group by `zt_story`.`product` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectbugs`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectbugs` AS select `zt_bug`.`execution` AS `execution`,count(0) AS `bugs`,sum(if((`zt_bug`.`resolution` = ''),0,1)) AS `resolutions`,sum(if((`zt_bug`.`severity` <= 2),1,0)) AS `seriousBugs` from `zt_bug` where (`zt_bug`.`deleted` = '0') group by `zt_bug`.`execution` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectstories`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectstories` AS select `t1`.`project` AS `execution`,count('*') AS `stories`,sum(if((`t2`.`status` = 'closed'),0,1)) AS `undone` from ((`zt_projectstory` `t1` left join `zt_story` `t2` on((`t1`.`story` = `t2`.`id`))) left join `zt_project` `t3` on((`t1`.`project` = `t3`.`id`))) where ((`t2`.`deleted` = '0') and (`t3`.`type` in ('sprint','stage'))) group by `t1`.`project` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectsummary`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectsummary` AS select `zt_task`.`project` AS `project`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`estimate`,0)) AS `estimate`,sum(if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0)) AS `consumed`,sum(if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0)) AS `left`,count(0) AS `number`,sum(if(((`zt_task`.`status` <> 'done') and (`zt_task`.`status` <> 'closed')),1,0)) AS `undone`,sum((if((`zt_task`.`parent` >= '0'),`zt_task`.`consumed`,0) + if(((`zt_task`.`status` <> 'cancel') and (`zt_task`.`status` <> 'closed') and (`zt_task`.`parent` >= '0')),`zt_task`.`left`,0))) AS `totalReal` from `zt_task` where (`zt_task`.`deleted` = '0') group by `zt_task`.`project` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `ztv_projectteams`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `ztv_projectteams` AS select `zt_team`.`root` AS `execution`,count('*') AS `teams` from `zt_team` where (`zt_team`.`type` = 'execution') group by `zt_team`.`root` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; diff --git a/db/update17.6.sql b/db/update17.6.sql index 68e4b95191..5f0cbf39ea 100644 --- a/db/update17.6.sql +++ b/db/update17.6.sql @@ -11,7 +11,7 @@ CREATE TABLE `zt_taskteam` ( PRIMARY KEY (`id`), KEY `task` (`task`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -ALTER TABLE `zt_taskestimate` ADD `order` tinyint unsigned NULL DEFAULT '0'; +ALTER TABLE `zt_taskestimate` ADD `order` tinyint unsigned NOT NULL DEFAULT '0'; ALTER TABLE `zt_effort` ADD `order` tinyint unsigned NOT NULL DEFAULT '0' AFTER `end`; ALTER TABLE `zt_storyspec` ADD `files` text NOT NULL AFTER `verify`; -ALTER TABLE `zt_block` CHANGE `block` `block` varchar(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `source`; \ No newline at end of file +ALTER TABLE `zt_block` CHANGE `block` `block` varchar(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `source`; diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 8b74a93caf..c65209733b 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,3 +1,130 @@ +2022-09-08 17.6.1 +完成的需求 +开源版: +31896 Scrum看板列中动态加载卡片数据 +34361 需求编辑页面增加附件信息的显示 +35317 禅道可以支持腾讯云和阿里云数据库 +35436 批量创建和编辑页面保存时,增加名称必填项校验 +35475 并行多人任务完成后重新激活无法再完成 +35909 通用看板增加区域的检索标签 +36259 需求详情中的附件去掉删除操作 +36444 多人串行任务,状态为“未开始”时,可以维护自己的工时日志 +36445 多人串行任务,只有指派人可以开始任务或完成任务 +36448 多人串行任务,状态为“进行中”时,可以新增工序和成员 +36451 多人串行任务,状态为“进行中”时,可以修改工序和成员 +36452 多人串行任务,状态为“进行中”时,可以删除工序和成员 +36453 多人串行任务,状态为“已完成”时,不可以编辑工序和团队成员 +36454 多人任务,只有编辑人可以修改自己的日志 +36455 多人串行任务的状态为“进行中”,且指派人为自己时,可以编辑当前工序的工时日志 +36457 多人串行任务的状态为“已完成”,可以修改自己已经填写的工时 +36458 多人串行任务状态为已关闭或已完成时,可以激活 +36459 多人串行任务,状态为“未开始”时,可以维护工序和团队成员 +36460 多人并行任务,状态为“未开始”时,可以维护团队成员 +36461 创建和编辑多人任务团队时,预计剩余不为0 +36462 多人并行任务,状态为“进行中”时,可以修改团队成员 +36463 多人并行任务,状态为“进行中”时,可以添加团队成员 +36464 多人并行任务,状态为“进行中”时,可以删除团队成员 +36465 多人并行任务,状态为“已完成”时,不能维护团队成员 +36466 多人并行任务中,自己可以维护自己创建的日志 +36467 多人串行任务状态为“已取消”时,激活后选择继续或重新开始 +36468 多人串行任务状态为已关闭、已暂停、已取消时不能维护团队和日志 +36469 多人并行任务状态为已关闭、已暂停、已取消时不能维护团队 +36470 多人并行任务状态为已关闭、已暂停、已取消时可以维护日志 +36471 多人并行任务状态为已关闭或已完成时,可以激活 +36663 任务日志列表展示”最初预计“和”累积耗时“ +36664 多人串行任务的日志,根据团队成员的状态展示我的日志和所有日志 +36666 维护多人串行任务日志时,根据团队成员的状态判断是新增日志还是追加日志 +36678 单人任务和多人并行任务,日志页展示历史的日志和新增日志入口 +36720 通过面板二维码下载移动端时,可以自动判断当前版本匹配的移动端版本 +36723 测试单列表增加搜索功能 +36730 需求变更评审时,系统根据需求不同评审结果进行后续处理 +36783 变更需求时,附件删除操作记录版本号 +36784 需求的附件跟随版本变化 +36785 变更需求时,附件删除操作保存后再生效 +36795 权限分组的视野维护中,项目集下拉菜单支持按树状结构进行显示和选择 +36998 执行概况的燃尽图中增加延期状态的标签 +企业版: +30912 地盘日志列表新建日志时对象与执行的展示顺序修改 +旗舰版: +36984 实现瀑布项目总体进展统计区块 +36989 项目周报中将进度调整为本周进度 +34731 瀑布项目里评审下的基线评审列表增加删除功能 +36744 复制项目的执行的时间填写后,自动计算可用工作日 +36813 瀑布项目评审下的问题列表增加删除权限 +36839 QA质量保证计划可以在地盘待处理显示 +禅道客户端: +35987 群成员管理列表点击成员头像或名称显示成员名片的功能 +35878 实现群成员管理列表的搜索功能 +35875 实现群管理列表的搜索功能 +35873 实现群成员管理列表中设置群主功能 +35853 实现群成员管理列表中单个移除成员的功能 +35852 实现群成员管理列表中添加成员功能 +35976 实现讨论组成员管理列表的右键菜单及功能 +35850 实现群成员管理列表 +35974 实现群管理列表的右键菜单及功能 +35848 实现群管理列表 +35986 客户端应用中增加讨论组管理的应用入口 +36496 系统默认讨论组分组不支持重命名 +36447 扩展API应用分组、排序功能优化 +36446 扩展API应用搜索功能优化 +36443 扩展API应用界面优化 +36425 扩展API应用增加介绍模块 +36090 重新规划扩展API应用分组维度 +36426 新建讨论组时可以将其增加到分组 +21476 讨论组的分组功能可以有明确的添加入口 +36030 实现在线编辑喧喧文件的功能(word文件/excel文件) +36037 实现群管理列表按表头排序的功能 +36039 实现群成员管理列表按表头排序的功能 +修复的Bug +23401 经典模式项目树状图下点击模块后导航错乱,点击报错 +23957 批量创建用例超过10条相关需求不显示 +24830 创建Bug页面进入维护模块页面再关闭维护模块页面后所属产品变了 +24894 待办名称过长时会将整个页面撑开 +25409 在“待处理”中添加待办后“我的待办”的保存按钮置灰 +25515 组织日志页面数据较多下滑到最下时出现2个滚动条 +25695 英文下,复选框文案没有根据个性化设置动态变化 +25904 代号关闭后,已保存的搜索条件代号被填充到了第一个搜索框中 +25942 创建项目集页面预算右侧边框样式问题 +26122 日志信息在任务列表和日志详情中不一致 +26181 产品发布下关联需求页面点击返回后二级导航缺失 +26193 输入两次不同密码后强度校验了md5值 +26235 展开收起模块树会导致Bug标题显示不出来 +26298 项目集日期超出父项目集起止日期时提示信息优化 +26412 选择某个研发需求点击移除已选项数量仍然是一项 +26466 经典模式升级全新模式弱密码设置仍跳转重置密码界面 +26469 项目下的执行列表没有显示已延期 +26551 产品下未完成的项目列表表统计错误 +26619 创建测试任务时第2条软件需求的日程规划未显示“同上” +26622 创建任务选择日期后,同上没有隐藏掉 +26632 专业研发看板/scrum看板下创建测试任务页面样式问题 +26646 删除附件时页面全局刷新了 +26648 发布时选了项目团队成员,不在这个项目的人也能收到通知 +26659 点击动态中的设计名称,在设计详情页返回后提示无项目权限 +26660 项目列表中人数统计与团队人数不一致 +26670 编辑项目页面选择计划起止日期时页面抖动 +26681 批量编辑用户页面密码输入位置问题 +26687 创建测试任务时,删除需求列表的第一行仍显示同上复选框 +26715 新建项目时切换顶级项目集预算未刷新 +26724 未关闭标签下无数据 +26725 编辑任务时仍能选到已关闭的迭代 +26758 编辑任务中相关研发需求下拉框显示不友好 +26842 测试单再关联新的用例后,已生成的测试报告中的统计信息被影响 +26936 项目列表无法根据状态搜索 +26963 执行看板中的需求无法拖动 +26971 权限分组视野中维护可访问项目集后不生效 +26994 多分支产品,在列表批量修改计划,数据库存储有逗号,导致按计划排序有问题 +27007 年度统计没有所有用户选项 +27020 在选择项目集创建项目时“关联产品”项没有添加必填项标识 +27034 点击执行树状图下的相关用例后,二级导航不显示了 +27068 编辑用例时,所属模块和相关研发需求的判断问题 +27135 点击卡片更多操作已归档卡片展示未收起 +27186 研发需求或者用户需求中点击取消相关用户需求或相关研发需求后页面显示“删除中” +27192 创建测试类型任务页面截止时间小于预计开始时没有校验 +27258 编辑模块点击保存时希望不要弹出新窗口提醒 +26082 勾选设置的初始化会议状态账号一直处于会议状态 +26085 LDAP配置不对时,提示需要优化 +26207 修复了会话新建分组时无法输入中文的问题 + 2022-08-25 17.6 完成的需求 开源版: diff --git a/module/misc/lang/de.php b/module/misc/lang/de.php index 65bdeaadaa..bb82e5a9d2 100644 --- a/module/misc/lang/de.php +++ b/module/misc/lang/de.php @@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '

    ZenTao 15.0+ a new "Youth Blue" theme $lang->misc->feature->visionsDesc = "

    The concept of interface has been added since 16.5. Users can deal with R & D affairs in [R&D] and daily office affairs in [Lite].

    You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.

    "; $lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png'; +$lang->misc->releaseDate['17.6.1'] = '2022-09-08'; $lang->misc->releaseDate['17.6'] = '2022-08-26'; $lang->misc->releaseDate['17.5'] = '2022-08-11'; $lang->misc->releaseDate['17.4'] = '2022-07-27'; @@ -188,6 +189,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => ''); diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index c7162f833d..78ccf22fe1 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '

    ZenTao 15.0+ a new "Youth Blue" theme $lang->misc->feature->visionsDesc = "

    The concept of interface has been added since 16.5. Users can deal with R & D affairs in [R&D] and daily office affairs in [Lite].

    You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.

    "; $lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png'; +$lang->misc->releaseDate['17.6.1'] = '2022-09-08'; $lang->misc->releaseDate['17.6'] = '2022-08-26'; $lang->misc->releaseDate['17.5'] = '2022-08-11'; $lang->misc->releaseDate['17.4'] = '2022-07-27'; @@ -188,6 +189,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => ''); diff --git a/module/misc/lang/fr.php b/module/misc/lang/fr.php index 42b4ec297c..9c538829d4 100644 --- a/module/misc/lang/fr.php +++ b/module/misc/lang/fr.php @@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '

    ZenTao 15.0+ a new "Youth Blue" theme $lang->misc->feature->visionsDesc = "

    The concept of interface has been added since 16.5. Users can deal with R & D affairs in [R&D] and daily office affairs in [Lite].

    You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.

    "; $lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png'; +$lang->misc->releaseDate['17.6.1'] = '2022-09-08'; $lang->misc->releaseDate['17.6'] = '2022-08-26'; $lang->misc->releaseDate['17.5'] = '2022-08-11'; $lang->misc->releaseDate['17.4'] = '2022-07-27'; @@ -188,6 +189,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.5'][] = array('title' => "Provide efficient visual statistical tools. Optimize ZenTao performance, the database engine is adjusted from MyISAM to InnoDB. Gantt chart is optimized and upgraded, and the Copy items of the Max version can replicate more information. Fix bugs.", 'desc' => ''); $lang->misc->feature->all['17.4'][] = array('title' => "Optimization of details Page visualization and jumping page logic. Improvement of Kanban function. Optimization of document creating and editing pages. Fix bugs.", 'desc' => ''); diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index 48fbcff978..e0beccf40e 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = "

    禅道15系列上线了全新的“ $lang->misc->feature->visionsDesc = "

    从16.5开始增加了界面概念,用户可以在[研发综合界面]中处理研发事务、在[迅捷界面]处理日常办公事务。

    在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。

    "; $lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png'; +$lang->misc->releaseDate['17.6.1'] = '2022-09-08'; $lang->misc->releaseDate['17.6'] = '2022-08-26'; $lang->misc->releaseDate['17.5'] = '2022-08-11'; $lang->misc->releaseDate['17.4'] = '2022-07-27'; @@ -188,6 +189,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22'; $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; +$lang->misc->feature->all['17.6.1'][] = array('title' => '优化了多人任务的处理逻辑,修复Bug。', 'desc' => ''); $lang->misc->feature->all['17.6'][] = array('title' => '优化了需求的处理逻辑,拆分了用需和软需的权限。甘特图支持手动拖拽维护任务关系。修复Bug。', 'desc' => ''); $lang->misc->feature->all['17.5'][] = array('title' => '提供高效的可视化统计工具。优化禅道性能,数据库引擎从MyISAM调整为InnoDB。甘特图优化升级,旗舰版的复制项目可以复制任务等更多信息。修复Bug。', 'desc' => ''); $lang->misc->feature->all['17.4'][] = array('title' => '详情页面的视觉优化和部分页面跳转逻辑优化。看板功能完善。文档创建和编辑页面优化。修复Bug。', 'desc' => ''); diff --git a/module/upgrade/config.php b/module/upgrade/config.php index c60d898753..09b8555339 100644 --- a/module/upgrade/config.php +++ b/module/upgrade/config.php @@ -24,6 +24,7 @@ $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_6_1'] = '17_6'; +$config->upgrade->maxVersion['max3_6_2'] = '17_6_1'; $config->upgrade->bizVersion = array(); $config->upgrade->bizVersion['biz1_0'] = '9_5_1'; @@ -86,6 +87,7 @@ $config->upgrade->bizVersion['biz7_3'] = '17_3'; $config->upgrade->bizVersion['biz7_4'] = '17_4'; $config->upgrade->bizVersion['biz7_5'] = '17_5'; $config->upgrade->bizVersion['biz7_6'] = '17_6'; +$config->upgrade->bizVersion['biz7_6_1'] = '17_6_1'; $config->upgrade->proVersion = array(); $config->upgrade->proVersion['pro1_0'] = '3_1'; diff --git a/module/upgrade/lang/version.php b/module/upgrade/lang/version.php index b48aec0eec..e973f8448a 100644 --- a/module/upgrade/lang/version.php +++ b/module/upgrade/lang/version.php @@ -165,6 +165,7 @@ $lang->upgrade->fromVersions['17_3'] = '17.3'; $lang->upgrade->fromVersions['17_4'] = '17.4'; $lang->upgrade->fromVersions['17_5'] = '17.5'; $lang->upgrade->fromVersions['17_6'] = '17.6'; +$lang->upgrade->fromVersions['17_6_1'] = '17.6.1'; global $config; /* Lite. */ @@ -334,6 +335,7 @@ $lang->upgrade->fromVersions['biz7_3'] = 'Biz7.3'; $lang->upgrade->fromVersions['biz7_4'] = 'Biz7.4'; $lang->upgrade->fromVersions['biz7_5'] = 'Biz7.5'; $lang->upgrade->fromVersions['biz7_6'] = 'Biz7.6'; +$lang->upgrade->fromVersions['biz7_6_1'] = 'Biz7.6.1'; /* Max. */ $lang->upgrade->fromVersions['max2_0_beta4'] = 'Max2.0.beta4'; @@ -359,3 +361,4 @@ $lang->upgrade->fromVersions['max3_3'] = 'Max3.3'; $lang->upgrade->fromVersions['max3_4'] = 'Max3.4'; $lang->upgrade->fromVersions['max3_5'] = 'Max3.5'; $lang->upgrade->fromVersions['max3_6'] = 'Max3.6'; +$lang->upgrade->fromVersions['max3_6_1'] = 'Max3.6.1'; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 246e45a258..e575fd583b 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -552,6 +552,9 @@ class upgradeModel extends model $this->updateStoryFile(); $this->convertTaskteam(); $this->convertEstToEffort(); + $this->xuanSetOwnedByForGroups(); + $this->xuanRecoverCreatedDates(); + $this->xuanSetPartitionedMessageIndex(); break; } @@ -1018,6 +1021,8 @@ class upgradeModel extends model $confirmContent .= file_get_contents($this->getUpgradeFile('17.4')); case '17_5': $confirmContent .= file_get_contents($this->getUpgradeFile('17.5')); + case '17_6': + $confirmContent .= file_get_contents($this->getUpgradeFile('17.6')); } return $confirmContent; @@ -7350,4 +7355,138 @@ class upgradeModel extends model } return true; } + + /** + * Xuan: Set ownedBy for group chats without it. + * + * @access public + * @return bool + */ + public function xuanSetOwnedByForGroups() + { + $this->dao->update(TABLE_IM_CHAT)->set('ownedBy = createdBy')->where('ownedBy')->eq('')->exec(); + + return !dao::isError(); + } + + /** + * Xuan: Recover created date for chats. + * + * @access public + * @return bool + */ + public function xuanRecoverCreatedDates() + { + $chats = $this->dao->select('gid, id')->from(TABLE_IM_CHAT) + ->where('createdDate')->eq('0000-00-00 00:00:00') + ->fetchPairs('gid'); + + $createdDateData = array(); + + /* Try query earliest message date indexed. */ + $indexedMinDates = $this->dao->select('gid, MIN(startDate)')->from(TABLE_IM_CHAT_MESSAGE_INDEX) + ->where('gid')->in(array_keys($chats)) + ->groupBy('gid') + ->fetchPairs('gid'); + + /* Then try query earliest message date non-indexed from master table. */ + $queryChats = array_diff(array_keys($chats), array_keys($indexedMinDates)); + $minDates = $this->dao->select('cgid, MIN(date)')->from(TABLE_IM_MESSAGE) + ->where('cgid')->in($queryChats) + ->groupBy('cgid') + ->fetchPairs('cgid'); + + $knownMinDates = array_merge($indexedMinDates, $minDates); + + $remainingChats = $chats; + foreach($chats as $cgid => $cid) + { + if(isset($knownMinDates[$cgid])) + { + $createdDateData[$cid] = $knownMinDates[$cgid]; + unset($remainingChats[$cgid]); + } + } + + /* Use other dates for chats without messages. */ + $chatDates = $this->dao->select('id, gid, editedDate, lastActiveTime, dismissDate')->from(TABLE_IM_CHAT) + ->where('gid')->in(array_keys($remainingChats)) + ->fetchAll('gid'); + $chatDates = array_map(function($chatDate) + { + $dates = array_filter(array($chatDate->editedDate, $chatDate->lastActiveTime, $chatDate->dismissDate), function($date) + { + return $date != '0000-00-00 00:00:00'; + }); + $minDate = min($dates); + return $minDate; + }, $chatDates); + + $knownMinDates = array_merge($knownMinDates, $chatDates); + + $queryData = array(); + foreach($knownMinDates as $gid => $date) $queryData[] = "WHEN {$chats[$gid]} THEN '{$date}'"; + + $query = "UPDATE " . TABLE_IM_CHAT . " SET `createdDate` = (CASE `id` " . join(' ', $queryData) . " END) WHERE `id` IN(" . join(",", array_values($chats)) . ");"; + $this->dao->query($query); + + return !dao::isError(); + } + + /** + * Xuan: Set index range for chats in chat partition index table. + * + * @access public + * @return bool + */ + public function xuanSetPartitionedMessageIndex() + { + ini_set('memory_limit', '1024M'); + set_time_limit(0); + + /* Fetch chat and message partition table associations with message range. */ + $chatTableData = $this->dao->select('gid, tableName, start, end')->from(TABLE_IM_CHAT_MESSAGE_INDEX) + ->where('startIndex')->eq(0) + ->orWhere('endIndex')->eq(0) + ->orderBy('id_asc') + ->fetchAll(); + + /* Sort ranges by table. */ + $tableRanges = array(); + foreach($chatTableData as $chatTable) + { + if(isset($tableRanges[$chatTable->tableName])) + { + $tableRanges[$chatTable->tableName]->start[] = $chatTable->start; + $tableRanges[$chatTable->tableName]->end[] = $chatTable->end; + continue; + } + $tableRanges[$chatTable->tableName] = (object)array('start' => array($chatTable->start), 'end' => array($chatTable->end)); + } + + /* Query corresponding message indice. */ + foreach($tableRanges as $tableName => $tableRange) + { + $ids = array_merge($tableRange->start, $tableRange->end); + $ids = array_unique($ids); + $indexPairs = $this->dao->select('id, `index`')->from("`$tableName`") + ->where('id')->in($ids) + ->fetchPairs('id'); + $tableRanges[$tableName]->indexPairs = $indexPairs; + } + + /* Set startIndice and endIndice. */ + foreach($tableRanges as $tableRange) + { + $queryData = array(); + foreach($tableRange->start as $id) $queryData[] = "WHEN $id THEN {$tableRange->indexPairs[$id]}"; + $query = "UPDATE " . TABLE_IM_CHAT_MESSAGE_INDEX . " SET `startIndex` = (CASE `start` " . join(' ', $queryData) . " END) WHERE `start` IN(" . join(',', $tableRange->start) . ");"; + $this->dao->query($query); + + $queryData = array(); + foreach($tableRange->end as $id) $queryData[] = "WHEN $id THEN {$tableRange->indexPairs[$id]}"; + $query = "UPDATE " . TABLE_IM_CHAT_MESSAGE_INDEX . " SET `endIndex` = (CASE `end` " . join(' ', $queryData) . " END) WHERE `end` IN(" . join(',', $tableRange->end) . ");"; + $this->dao->query($query); + } + } } diff --git a/xuanxuan/XUANVERSION b/xuanxuan/XUANVERSION index dffc266d6a..914ed93851 100644 --- a/xuanxuan/XUANVERSION +++ b/xuanxuan/XUANVERSION @@ -1 +1 @@ -v6.3.0 +v6.4.0 diff --git a/xuanxuan/XVERSION b/xuanxuan/XVERSION index 0faee7d968..c596943a9f 100644 --- a/xuanxuan/XVERSION +++ b/xuanxuan/XVERSION @@ -1 +1 @@ -6.3 +6.4 From b82ca41f3d5c9231dca1bdd7e6fd3a5f3d31282c Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 15:24:20 +0800 Subject: [PATCH 058/168] * Fix bug#27298. --- module/story/model.php | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 115e81a7e9..2a0827c32a 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -875,28 +875,28 @@ class storyModel extends model { $_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'])) + + /* Update story reviewer. */ + $this->dao->delete()->from(TABLE_STORYREVIEW) + ->where('story')->eq($storyID) + ->andWhere('version')->eq($oldStory->version) + ->beginIF($oldStory->status == 'reviewing')->andWhere('reviewer')->notin(implode(',', $_POST['reviewer'])) + ->exec(); + + foreach($_POST['reviewer'] as $reviewer) { - /* Update story reviewer. */ - $this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($oldStory->version)->andWhere('reviewer')->notin(implode(',', $_POST['reviewer']))->exec(); - foreach($_POST['reviewer'] as $reviewer) - { - if(in_array($reviewer, array_keys($oldReviewer))) continue; + if($oldStory->status == 'reviewing' and in_array($reviewer, array_keys($oldReviewer))) continue; - $reviewData = new stdclass(); - $reviewData->story = $storyID; - $reviewData->version = $oldStory->version; - $reviewData->reviewer = $reviewer; - $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); - } - - if($story->status == 'reviewing') - { - $story->reviewedBy = $oldStory->reviewedBy; - $story = $this->updateStoryByReview($storyID, $oldStory, $story); - } + $reviewData = new stdclass(); + $reviewData->story = $storyID; + $reviewData->version = $oldStory->version; + $reviewData->reviewer = $reviewer; + $this->dao->insert(TABLE_STORYREVIEW)->data($reviewData)->exec(); } + if($oldStory->status == 'reviewing') $story = $this->updateStoryByReview($storyID, $oldStory, $story); + if(strpos('draft,changing', $oldStory->status) != false) $story->reviewedBy = ''; + $oldStory->reviewers = implode(',', array_keys($oldReviewer)); $story->reviewers = implode(',', array_keys($this->getReviewerPairs($storyID, $oldStory->version))); } From 29cc8f3ec1ef31919e7ba62bd77d74aa7d0152e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=BB=B6=E4=B9=89?= Date: Thu, 8 Sep 2022 07:54:24 +0000 Subject: [PATCH 059/168] * Modify report api error. --- api/v1/entries/bugresolve.php | 6 +++--- api/v1/entries/reports.php | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/api/v1/entries/bugresolve.php b/api/v1/entries/bugresolve.php index 09243a2163..e6ede3c696 100644 --- a/api/v1/entries/bugresolve.php +++ b/api/v1/entries/bugresolve.php @@ -11,7 +11,7 @@ **/ class bugResolveEntry extends Entry { - /** + /** * POST method. * * @param int $bugID @@ -19,7 +19,7 @@ class bugResolveEntry extends Entry * @return void */ public function post($bugID) - { + { $fields = 'resolution,resolvedBuild,resolvedDate,duplicateBug,assignedTo,uid,comment'; $this->batchSetPost($fields); @@ -33,6 +33,6 @@ class bugResolveEntry extends Entry $bug = $this->loadModel('bug')->getByID($bugID); $this->send(200, $this->format($bug, 'openedBy:user,openedDate:time,assignedTo:user,assignedDate:time,reviewedBy:user,reviewedDate:time,resolvedDate:time,lastEditedBy:user,lastEditedDate:time,closedBy:user,closedDate:time,deleted:bool,mailto:userList')); - } + } } diff --git a/api/v1/entries/reports.php b/api/v1/entries/reports.php index fbd15ecaf7..1f79dec801 100644 --- a/api/v1/entries/reports.php +++ b/api/v1/entries/reports.php @@ -176,7 +176,7 @@ class reportsEntry extends entry foreach(array_keys($statusList) as $status) { $statusName = zget($this->lang->project->statusList, $status); - if($status == 'all') $statusName = $this->lang->project->featureBar['all']; + if($status == 'all') $statusName = $this->lang->project->featureBar['browse']['all']; $statusList[$status]['code'] = $status; $statusList[$status]['name'] = $statusName; @@ -193,8 +193,7 @@ class reportsEntry extends entry */ public function executionProgress() { - $executions = $this->loadModel('project')->getStats(0, 'all', 0, 0, 30, 'id_desc'); - $this->app->loadLang('execution'); + $executions = $this->loadModel('execution')->getStatData(0, 'all', 0, 0, false, '', 'id_desc'); $processedExecutions = array(); $statusList['all']['total'] = 0; From e828862deb7b8284d3023ae0fa6eff5a5cbb827d Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Thu, 8 Sep 2022 16:04:41 +0800 Subject: [PATCH 060/168] * Fix error for xuan. --- module/upgrade/model.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index e575fd583b..54727dfcda 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -7381,6 +7381,8 @@ class upgradeModel extends model ->where('createdDate')->eq('0000-00-00 00:00:00') ->fetchPairs('gid'); + if(empty($chats)) return true; + $createdDateData = array(); /* Try query earliest message date indexed. */ @@ -7427,6 +7429,8 @@ class upgradeModel extends model $queryData = array(); foreach($knownMinDates as $gid => $date) $queryData[] = "WHEN {$chats[$gid]} THEN '{$date}'"; + if(empty($queryData)) return true; + $query = "UPDATE " . TABLE_IM_CHAT . " SET `createdDate` = (CASE `id` " . join(' ', $queryData) . " END) WHERE `id` IN(" . join(",", array_values($chats)) . ");"; $this->dao->query($query); @@ -7451,6 +7455,8 @@ class upgradeModel extends model ->orderBy('id_asc') ->fetchAll(); + if(empty($chatTableData)) return true; + /* Sort ranges by table. */ $tableRanges = array(); foreach($chatTableData as $chatTable) From fdc9b93d82337aef0549dce33125e544cbc9653a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 8 Sep 2022 16:08:03 +0800 Subject: [PATCH 061/168] * adjust for upgrade and holiday. --- module/holiday/model.php | 43 +++++++++++++++++--------------------- module/project/model.php | 5 ++++- module/task/lang/de.php | 1 + module/task/lang/en.php | 1 + module/task/lang/fr.php | 1 + module/task/lang/zh-cn.php | 1 + module/upgrade/model.php | 6 +++++- module/weekly/model.php | 3 ++- 8 files changed, 34 insertions(+), 27 deletions(-) diff --git a/module/holiday/model.php b/module/holiday/model.php index ca538c2936..e43442f049 100644 --- a/module/holiday/model.php +++ b/module/holiday/model.php @@ -205,21 +205,19 @@ class holidayModel extends model $workingDays = $this->getWorkingDays($begin, $end); $weekend = isset($this->config->project->weekend) ? $this->config->project->weekend : 2; + $holidaysFlip = array_flip($holidays); + $workingDaysFlip = array_flip($workingDays); + /* When the start date and end date are the same. */ + $beginTimestamp = strtotime($begin); if($begin == $end) { - if(in_array($begin, $workingDays)) return $actualDays[] = $begin; - if(in_array($begin, $holidays)) return $actualDays; + if(isset($workingDaysFlip[$begin])) return $actualDays[] = $begin; + if(isset($holidaysFlip[$begin])) return $actualDays; - $w = date('w', strtotime($begin)); - if($weekend == 2) - { - if($w == 0 or $w == 6) return $actualDays; - } - else - { - if($w == 0) return $actualDays; - } + $w = date('w', $beginTimestamp); + if($weekend == 2 and ($w == 0 or $w == 6)) return $actualDays; + if($weekend != 2 and $w == 0) return $actualDays; $actualDays[] = $begin; return $actualDays; @@ -227,24 +225,21 @@ class holidayModel extends model for($i = 0; $currentDay < $end; $i ++) { - $currentDay = date('Y-m-d', strtotime("$begin + $i days")); - $w = date('w', strtotime($currentDay)); + $currentTimestamp = $beginTimestamp + ($i * 24 * 3600); + $currentDay = date('Y-m-d', $currentTimestamp); - if(in_array($currentDay, $workingDays)) + if(isset($workingDaysFlip[$currentDay])) { $actualDays[] = $currentDay; continue; } - if(in_array($currentDay, $holidays)) continue; - if($weekend == 2) - { - if($w == 0 or $w == 6) continue; - } - else - { - if($w == 0) continue; - } + if(isset($holidaysFlip[$currentDay])) continue; + + $w = date('w', $currentTimestamp); + if($weekend == 2 and ($w == 0 or $w == 6)) continue; + if($weekend != 2 and $w == 0) continue; + $actualDays[] = $currentDay; } @@ -266,7 +261,7 @@ class holidayModel extends model $days = ($endTime - $beginTime) / 86400; $dateList = array(); - for($i = 0; $i <= $days; $i ++) $dateList[] = date('Y-m-d', strtotime("+$i days", $beginTime)); + for($i = 0; $i <= $days; $i ++) $dateList[] = date('Y-m-d', $beginTime + ($i *24 *3600)); return $dateList; } diff --git a/module/project/model.php b/module/project/model.php index 72733bd399..42d8d4d869 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -432,6 +432,8 @@ class projectModel extends model $AC = 0; while($task = $stmt->fetch()) { + if(empty($task->estimate)) continue; + $PV += $task->estimate; $AC += $task->consumed; if($task->status == 'done' or $task->closedReason == 'done') @@ -440,7 +442,8 @@ class projectModel extends model } else { - $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; + $task->progress = 0; + if(($task->consumed + $task->left) > 0) $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; $EV += round($task->estimate * $task->progress / 100, 2); } } diff --git a/module/task/lang/de.php b/module/task/lang/de.php index ae446ab049..7102e3a512 100644 --- a/module/task/lang/de.php +++ b/module/task/lang/de.php @@ -47,6 +47,7 @@ $lang->task->exportAction = "Export Task"; $lang->task->reportChart = "Bericht Chart"; $lang->task->fromBug = 'Von Bug'; $lang->task->case = 'Fall'; +$lang->task->process = 'Process Task'; $lang->task->confirmStoryChange = "Storyäanderung bestätigen"; $lang->task->storyChange = "Story Changed"; $lang->task->progress = 'Fortschritt'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index db1d23cd9a..f025152247 100755 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -47,6 +47,7 @@ $lang->task->exportAction = "Export Task"; $lang->task->reportChart = "Report Chart"; $lang->task->fromBug = 'From Bug'; $lang->task->case = 'Linked Case'; +$lang->task->process = 'Process Task'; $lang->task->confirmStoryChange = "Confirm Change"; $lang->task->storyChange = "Story Changed"; $lang->task->progress = 'Progress'; diff --git a/module/task/lang/fr.php b/module/task/lang/fr.php index c741e93de7..fb699093ed 100644 --- a/module/task/lang/fr.php +++ b/module/task/lang/fr.php @@ -47,6 +47,7 @@ $lang->task->exportAction = "Exporter Tâche"; $lang->task->reportChart = "Rapport Graphique"; $lang->task->fromBug = 'à partir Bug'; $lang->task->case = 'Associée CasTest'; +$lang->task->process = 'Process Task'; $lang->task->confirmStoryChange = "Confirmer Changement"; $lang->task->storyChange = "Story Changée"; $lang->task->progress = 'Progression'; diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 3478a6e044..b875f0168f 100755 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -47,6 +47,7 @@ $lang->task->exportAction = "导出任务"; $lang->task->reportChart = "报表统计"; $lang->task->fromBug = '来源Bug'; $lang->task->case = '相关用例'; +$lang->task->process = '处理任务'; $lang->task->confirmStoryChange = "确认{$lang->SRCommon}变动"; $lang->task->storyChange = "{$lang->SRCommon}变更"; $lang->task->progress = '进度'; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index e575fd583b..a85f188266 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -7332,6 +7332,7 @@ class upgradeModel extends model { $estimates = $this->dao->select('*')->from(TABLE_TASKESTIMATE)->orderBy('id')->fetchAll(); + $this->app->loadLang('task'); $this->loadModel('action'); foreach($estimates as $estimate) { @@ -7343,7 +7344,7 @@ class upgradeModel extends model $effort->product = $relation['product']; $effort->project = (int)$relation['project']; $effort->account = $estimate->account; - $effort->work = empty($estimate->work) ? $this->lang->effort->handleTask : $estimate->work; + $effort->work = empty($estimate->work) ? $this->lang->task->process : $estimate->work; $effort->date = $estimate->date; $effort->left = $estimate->left; $effort->consumed = $estimate->consumed; @@ -7380,6 +7381,7 @@ class upgradeModel extends model $chats = $this->dao->select('gid, id')->from(TABLE_IM_CHAT) ->where('createdDate')->eq('0000-00-00 00:00:00') ->fetchPairs('gid'); + if(empty($chats)) return true; $createdDateData = array(); @@ -7423,6 +7425,7 @@ class upgradeModel extends model }, $chatDates); $knownMinDates = array_merge($knownMinDates, $chatDates); + if(empty($knownMinDates)) return true; $queryData = array(); foreach($knownMinDates as $gid => $date) $queryData[] = "WHEN {$chats[$gid]} THEN '{$date}'"; @@ -7450,6 +7453,7 @@ class upgradeModel extends model ->orWhere('endIndex')->eq(0) ->orderBy('id_asc') ->fetchAll(); + if(empty($chatTableData)) return true; /* Sort ranges by table. */ $tableRanges = array(); diff --git a/module/weekly/model.php b/module/weekly/model.php index 961c336ea8..666d8f8ff1 100755 --- a/module/weekly/model.php +++ b/module/weekly/model.php @@ -433,7 +433,8 @@ class weeklyModel extends model } else { - $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; + $task->progress = 0; + if(($task->consumed + $task->left) > 0) $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; $EV += round($thisPV * $task->progress / 100, 2); } $PV += $thisPV; From 8fef2d91660cae60937a85a213b8624621317f43 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Thu, 8 Sep 2022 16:12:27 +0800 Subject: [PATCH 062/168] * Remove the unsed code. --- module/upgrade/model.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 54727dfcda..c217ec5990 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -7381,8 +7381,6 @@ class upgradeModel extends model ->where('createdDate')->eq('0000-00-00 00:00:00') ->fetchPairs('gid'); - if(empty($chats)) return true; - $createdDateData = array(); /* Try query earliest message date indexed. */ @@ -7455,8 +7453,6 @@ class upgradeModel extends model ->orderBy('id_asc') ->fetchAll(); - if(empty($chatTableData)) return true; - /* Sort ranges by table. */ $tableRanges = array(); foreach($chatTableData as $chatTable) From 924f288ed5c154b9986d528f9f6f05a07b3e6321 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 16:55:57 +0800 Subject: [PATCH 063/168] * Fix bug#27406,#27235. --- module/action/model.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/module/action/model.php b/module/action/model.php index 45153af3df..0239ec5dc0 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -330,12 +330,20 @@ class actionModel extends model ->where("objectType IN('project', 'testtask', 'build')") ->andWhere('project')->eq((int)$objectID) ->fi() + ->beginIF($objectType == 'story') + ->where('objectType')->in('story,requirement') + ->andWhere('objectID')->eq((int)$objectID) + ->fi() + ->beginIF($objectType == 'case') + ->where('objectType')->in('case,testcase') + ->andWhere('objectID')->eq((int)$objectID) + ->fi() ->beginIF($objectType == 'module') ->where('objectType')->eq($objectType) ->andWhere('((action')->ne('deleted')->andWhere('objectID')->eq((int)$objectID)->markRight(1) ->orWhere('(action')->eq('deleted')->andWhere('objectID')->in($modules)->markRight(1)->markRight(1) ->fi() - ->beginIF($objectType != 'project' and $objectType != 'module') + ->beginIF(strpos('project,case,story,module', $objectType) === false) ->where('objectType')->eq($objectType) ->andWhere('objectID')->eq((int)$objectID) ->fi() From 8ff5cc1f258e3b99e9d6962d39f2d407f0e2ee80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=BB=B6=E4=B9=89?= Date: Thu, 8 Sep 2022 08:57:47 +0000 Subject: [PATCH 064/168] * Fix bug 27149. --- api/v1/entries/feedbacks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/entries/feedbacks.php b/api/v1/entries/feedbacks.php index 7e7e3195d5..71d442bd30 100644 --- a/api/v1/entries/feedbacks.php +++ b/api/v1/entries/feedbacks.php @@ -22,7 +22,7 @@ class feedbacksEntry extends entry if(strpos(strtolower($this->param('fields')), 'moduleandproduct') !== false) return $this->getModuleAndProduct(); $control = $this->loadController('feedback', 'admin'); - $control->admin($this->param('solution', 'unclosed'), 0, $this->param('orderBy', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1)); + $control->admin($this->param('status', 'unclosed'), 0, $this->param('orderBy', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1)); $data = $this->getData(); if(!$data or !isset($data->status)) return $this->sendError(400, 'error'); From 2a8eacad9c8c4af565ec9a9a665eb5f15ce7507e Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 8 Sep 2022 17:22:22 +0800 Subject: [PATCH 065/168] * Fix weekly report. --- module/upgrade/model.php | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 8a88d7e2cb..c0fd3dd323 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -552,6 +552,7 @@ class upgradeModel extends model $this->updateStoryFile(); $this->convertTaskteam(); $this->convertEstToEffort(); + $this->fixWeeklyReport(); $this->xuanSetOwnedByForGroups(); $this->xuanRecoverCreatedDates(); $this->xuanSetPartitionedMessageIndex(); @@ -7495,4 +7496,36 @@ class upgradeModel extends model $this->dao->query($query); } } + + /** + * Fix weekly report. + * + * @access public + * @return bool + */ + public function fixWeeklyReport() + { + $this->loadModel('weekly'); + $projects = $this->dao->select('id,begin,end')->from(TABLE_PROJECT)->where('deleted')->eq('0')->andWhere('model')->eq('waterfall')->fetchAll('id'); + + $today = helper::today(); + foreach($projects as $projectID => $project) + { + if(helper::isZeroDate($project->begin) or helper::isZeroDate($project->end)) continue; + + $begin = $project->begin; + $end = $today > $project->end ? $project->end : $today; + + $beginTimestame = strtotime($begin); + $endTimestame = strtotime($end); + while($beginTimestame <= $endTimestame) + { + $this->weekly->save($projectID, $begin); + + $beginTimestame += 7 * 24 * 3600; + $begin = date('Y-m-d', $beginTimestame); + } + } + return true; + } } From ce91c9945eee96cd77218d453ae9a7aa1ba5e747 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 8 Sep 2022 17:30:29 +0800 Subject: [PATCH 066/168] * adjust for show linear effort. --- module/task/lang/de.php | 2 +- module/task/lang/en.php | 2 +- module/task/lang/fr.php | 2 +- module/task/lang/zh-cn.php | 2 +- module/task/view/lineareffort.html.php | 36 ++++++++++++++++---------- 5 files changed, 26 insertions(+), 18 deletions(-) diff --git a/module/task/lang/de.php b/module/task/lang/de.php index 7102e3a512..a7e3f74b7b 100644 --- a/module/task/lang/de.php +++ b/module/task/lang/de.php @@ -58,7 +58,7 @@ $lang->task->waitTask = 'Waiting Task'; $lang->task->allModule = 'All Module'; $lang->task->replace = 'Replace'; $lang->task->myEffort = 'My Effort'; -$lang->task->allEffort = 'All Effort'; +$lang->task->allEffort = 'Team Effort'; $lang->task->teamOrder = 'Order'; $lang->task->common = 'Aufgabe'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index f025152247..5238ca4189 100755 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -58,7 +58,7 @@ $lang->task->waitTask = 'Waiting Task'; $lang->task->allModule = 'All Module'; $lang->task->replace = 'Replace'; $lang->task->myEffort = 'My Effort'; -$lang->task->allEffort = 'All Effort'; +$lang->task->allEffort = 'Team Effort'; $lang->task->teamOrder = 'Order'; $lang->task->common = 'Task'; diff --git a/module/task/lang/fr.php b/module/task/lang/fr.php index fb699093ed..2a5669d128 100644 --- a/module/task/lang/fr.php +++ b/module/task/lang/fr.php @@ -58,7 +58,7 @@ $lang->task->waitTask = 'Tâche en attente'; $lang->task->allModule = 'Tous Modules'; $lang->task->replace = 'Replace'; $lang->task->myEffort = 'My Effort'; -$lang->task->allEffort = 'All Effort'; +$lang->task->allEffort = 'Team Effort'; $lang->task->teamOrder = 'Order'; $lang->task->common = 'Tâche'; diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index b875f0168f..c58afaeb99 100755 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -58,7 +58,7 @@ $lang->task->waitTask = '未开始的任务'; $lang->task->allModule = '所有模块'; $lang->task->replace = '替换'; $lang->task->myEffort = '我的日志'; -$lang->task->allEffort = '所有日志'; +$lang->task->allEffort = '团队日志'; $lang->task->teamOrder = '工序'; $lang->task->common = '任务'; diff --git a/module/task/view/lineareffort.html.php b/module/task/view/lineareffort.html.php index 64314fa1df..fd9d26160c 100644 --- a/module/task/view/lineareffort.html.php +++ b/module/task/view/lineareffort.html.php @@ -18,7 +18,11 @@ foreach($efforts as $effort) $account = $effort->account; $allEfforts[$order][] = $effort; $recorders[$order][$account] = $account; - if($app->user->account == $account) $myOrders[$order] = $order; + if($app->user->account == $account) + { + if(!isset($myOrders[$order])) $myOrders[$order] = 0; + $myOrders[$order] += 1; + } } ?>
    @@ -30,26 +34,28 @@ foreach($efforts as $effort)
    - -
    - - -
    my->form->lblBasic;?>
    - - + +
    attatch;?> - fetch('file', 'printFiles', array('files' => $files, 'fieldset' => 'false', 'object' => $story, 'method' => 'edit'));?> + fetch('file', 'printFiles', array('files' => $story->files, 'fieldset' => 'false', 'object' => $story, 'method' => 'edit'));?> fetch('file', 'buildform');?>
    date;?> account);?>
    From a195088ba3770cf4a323dd2c6ea60d97c22d4852 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 8 Sep 2022 10:07:45 +0800 Subject: [PATCH 048/168] * fix for edit team. --- module/task/js/activate.js | 9 +++++---- module/task/js/edit.js | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/module/task/js/activate.js b/module/task/js/activate.js index c4aacfa326..bbaa94f90e 100644 --- a/module/task/js/activate.js +++ b/module/task/js/activate.js @@ -14,7 +14,7 @@ $('#confirmButton').click(function() var $tr = $(this).closest('tr'); var account = $(this).find('option:selected').text(); - estimate = parseFloat($tr.find('[name^=teamEstimate]').val()); + var estimate = parseFloat($tr.find('[name^=teamEstimate]').val()); if(!isNaN(estimate)) totalEstimate += estimate; if(isNaN(estimate) || estimate == 0) { @@ -23,12 +23,13 @@ $('#confirmButton').click(function() return false; } - consumed = parseFloat($tr.find('[name^=teamConsumed]').val()); + var consumed = parseFloat($tr.find('[name^=teamConsumed]').val()); if(!isNaN(consumed)) totalConsumed += consumed; - left = parseFloat($tr.find('[name^=teamLeft]').val()); + var $left = $tr.find('[name^=teamLeft]'); + var left = parseFloat($left.val()); if(!isNaN(left)) totalLeft += left; - if(!$tr.hasClass('member-done') && (isNaN(left) || left == 0)) + if(!$left.prop('readonly') && (isNaN(left) || left == 0)) { bootbox.alert(account + ' ' + leftNotEmpty); error = true; diff --git a/module/task/js/edit.js b/module/task/js/edit.js index f59094b8fd..8c6147bb47 100644 --- a/module/task/js/edit.js +++ b/module/task/js/edit.js @@ -97,7 +97,7 @@ $('#confirmButton').click(function() var $tr = $(this).closest('tr'); var account = $(this).find('option:selected').text(); - estimate = parseFloat($tr.find('[name^=teamEstimate]').val()); + var estimate = parseFloat($tr.find('[name^=teamEstimate]').val()); if(!isNaN(estimate)) totalEstimate += estimate; if(isNaN(estimate) || estimate == 0) { @@ -106,12 +106,13 @@ $('#confirmButton').click(function() return false; } - consumed = parseFloat($tr.find('[name^=teamConsumed]').val()); + var consumed = parseFloat($tr.find('[name^=teamConsumed]').val()); if(!isNaN(consumed)) totalConsumed += consumed; - left = parseFloat($tr.find('[name^=teamLeft]').val()); + var $left = $tr.find('[name^=teamLeft]'); + var left = parseFloat($left.val()); if(!isNaN(left)) totalLeft += left; - if(!$tr.hasClass('member-done') && (isNaN(left) || left == 0)) + if(!$left.prop('readonly') && (isNaN(left) || left == 0)) { bootbox.alert(account + ' ' + leftNotEmpty); error = true; From c7c586691d1efbdd905b29d94af18d168a51d3ab Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 8 Sep 2022 10:31:10 +0800 Subject: [PATCH 049/168] * fix bug #27344. --- module/task/css/recordestimate.css | 1 + 1 file changed, 1 insertion(+) diff --git a/module/task/css/recordestimate.css b/module/task/css/recordestimate.css index 41a33d7a0d..3a3a23d572 100644 --- a/module/task/css/recordestimate.css +++ b/module/task/css/recordestimate.css @@ -13,3 +13,4 @@ .icon-calendar {color: rgb(22, 168, 248)} #recordForm .table>thead>tr>th{ border: none} .main-header {border-bottom: none !important} +.body-modal .main-header>h2 { max-width: 70% !important;} From 97b4bb948721e76213864683304901c898197fcb Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 8 Sep 2022 11:03:44 +0800 Subject: [PATCH 050/168] * Code for task#67691. --- module/bug/model.php | 18 +---------------- module/file/model.php | 31 ++++++++++++++++++++++++++++++ module/release/control.php | 8 +++----- module/release/model.php | 7 ++++--- module/release/view/edit.html.php | 5 ++++- module/release/view/view.html.php | 4 ++-- module/task/model.php | 18 +---------------- module/testcase/control.php | 10 +++------- module/testcase/model.php | 6 ++++-- module/testcase/view/edit.html.php | 5 ++++- module/testcase/view/view.html.php | 2 +- module/testtask/model.php | 8 ++++---- module/testtask/view/edit.html.php | 5 ++++- module/testtask/view/view.html.php | 2 +- 14 files changed, 67 insertions(+), 62 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index b7f1c4718a..5c0f974751 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -785,27 +785,11 @@ class bugModel extends model if(!empty($bug->resolvedBy)) $this->loadModel('score')->create('bug', 'resolve', $bugID); - $oldBugFiles = empty($oldBug->files) ? '' : join(',', array_keys($oldBug->files)); - if(!empty($bug->deleteFiles)) - { - $this->dao->delete()->from(TABLE_FILE)->where('id')->in($bug->deleteFiles)->exec(); - foreach($bug->deleteFiles as $fileID) - { - @unlink($oldBug->files[$fileID]->realPath); - $oldBugFiles = empty($oldBugFiles) ? '' : str_replace(",$fileID,", ',', ",$oldBugFiles,"); - } - } - - $this->file->updateObjectID($this->post->uid, $bugID, 'bug'); - $addedFiles = $this->loadModel('file')->saveUpload('bug', $bugID); - $addedFiles = empty($addedFiles) ? '' : ',' . join(',', array_keys($addedFiles)); - $bug->files = trim($oldBugFiles . $addedFiles, ','); - $oldBug->files = join(',', array_keys($oldBug->files)); - if($bug->execution and $bug->status != $oldBug->status) $this->loadModel('kanban')->updateLane($bug->execution, 'bug'); if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status); + $this->file->addFile4Object('bug', $oldBug, $bug); return common::createChanges($oldBug, $bug); } } diff --git a/module/file/model.php b/module/file/model.php index 1d61646733..8919843e09 100755 --- a/module/file/model.php +++ b/module/file/model.php @@ -1136,4 +1136,35 @@ class fileModel extends model $this->dao->update(TABLE_CASE)->set('`fromCaseVersion`')->eq($fromcaseVersion)->where('`fromCaseID`')->eq($file->objectID)->exec(); } } + + /** + * Add file info for object. + * + * @param string $objectType + * @param object $oldObject + * @param object $newObject + * @access public + * @return void + */ + public function addFile4Object($objectType, $oldObject, $newObject) + { + $oldFiles = empty($oldObject->files) ? '' : join(',', array_keys($oldObject->files)); + $deleteFiles = $newObject->deleteFiles; + if(!empty($deleteFiles)) + { + $this->dao->delete()->from(TABLE_FILE)->where('id')->in($deleteFiles)->exec(); + foreach($deleteFiles as $fileID) + { + @unlink($oldObject->files[$fileID]->realPath); + $oldFiles = empty($oldFiles) ? '' : trim(str_replace(",$fileID,", ',', ",$oldFiles,"), ','); + } + } + + $this->updateObjectID($this->post->uid, $oldObject->id, $objectType); + $addedFiles = $this->saveUpload($objectType, $oldObject->id); + $addedFiles = empty($addedFiles) ? '' : ',' . join(',', array_keys($addedFiles)); + + $newObject->files = trim($oldFiles . $addedFiles, ','); + $oldObject->files = join(',', array_keys($oldObject->files)); + } } diff --git a/module/release/control.php b/module/release/control.php index 1ff6c453b6..643abc4250 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -119,12 +119,10 @@ class release extends control { $changes = $this->release->update($releaseID); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - $files = $this->loadModel('file')->saveUpload('release', $releaseID); - if($changes or $files) + + if($changes) { - $fileAction = ''; - if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ; - $actionID = $this->loadModel('action')->create('release', $releaseID, 'Edited', $fileAction); + $actionID = $this->loadModel('action')->create('release', $releaseID, 'Edited'); if(!empty($changes)) $this->action->logHistory($actionID, $changes); } diff --git a/module/release/model.php b/module/release/model.php index 1215b765bd..d7c2bc774c 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -263,13 +263,14 @@ class releaseModel extends model { /* Init vars. */ $releaseID = (int)$releaseID; - $oldRelease = $this->dao->select('*')->from(TABLE_RELEASE)->where('id')->eq($releaseID)->fetch(); + $oldRelease = $this->getById($releaseID); $branch = $this->dao->select('branch')->from(TABLE_BUILD)->where('id')->eq((int)$this->post->build)->fetch('branch'); $release = fixer::input('post')->stripTags($this->config->release->editor->edit['id'], $this->config->allowedTags) ->add('id', $releaseID) ->add('branch', (int)$branch) ->setDefault('mailto', '') + ->setDefault('deleteFiles', array()) ->join('mailto', ',') ->setIF(!$this->post->marker, 'marker', 0) ->cleanInt('product') @@ -286,7 +287,7 @@ class releaseModel extends model $release->project = $buildInfo->project; } - $this->dao->update(TABLE_RELEASE)->data($release) + $this->dao->update(TABLE_RELEASE)->data($release, 'deleteFiles') ->autoCheck() ->batchCheck($this->config->release->edit->requiredFields, 'notempty') ->check('name', 'unique', "id != '$releaseID' AND product = '{$release->product}' AND branch = '$branch' AND deleted = '0'") @@ -295,7 +296,7 @@ class releaseModel extends model ->exec(); if(!dao::isError()) { - $this->file->updateObjectID($this->post->uid, $releaseID, 'release'); + $this->file->addFile4Object('release', $oldRelease, $release); return common::createChanges($oldRelease, $release); } } diff --git a/module/release/view/edit.html.php b/module/release/view/edit.html.php index 7bd197dab6..a72643b371 100644 --- a/module/release/view/edit.html.php +++ b/module/release/view/edit.html.php @@ -62,7 +62,10 @@
    files;?>fetch('file', 'buildform');?> + fetch('file', 'printFiles', array('files' => $release->files, 'fieldset' => 'false', 'object' => $release, 'method' => 'edit'));?> + fetch('file', 'buildform');?> +
    diff --git a/module/release/view/view.html.php b/module/release/view/view.html.php index 801b54a2fc..ba37f91c67 100644 --- a/module/release/view/view.html.php +++ b/module/release/view/view.html.php @@ -373,11 +373,11 @@
    files?>
    -
    +
    files) { - echo $this->fetch('file', 'printFiles', array('files' => $release->files, 'fieldset' => 'false')); + echo $this->fetch('file', 'printFiles', array('files' => $release->files, 'fieldset' => 'false', 'object' => $release, 'method' => 'view', 'showDelete' => false)); } elseif($release->filePath) { diff --git a/module/task/model.php b/module/task/model.php index ee67294584..494c082114 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1268,23 +1268,7 @@ class taskModel extends model } } - $oldTaskFiles = empty($oldTask->files) ? '' : join(',', array_keys($oldTask->files)); - if(!empty($task->deleteFiles)) - { - $this->dao->delete()->from(TABLE_FILE)->where('id')->in($task->deleteFiles)->exec(); - foreach($task->deleteFiles as $fileID) - { - @unlink($oldTask->files[$fileID]->realPath); - $oldTaskFiles = empty($oldTaskFiles) ? '' : str_replace(",$fileID,", ',', ",$oldTaskFiles,"); - } - } - - $this->file->updateObjectID($this->post->uid, $taskID, 'task'); - $addedFiles = $this->loadModel('file')->saveUpload('task', $taskID); - $addedFiles = empty($addedFiles) ? '' : ',' . join(',', array_keys($addedFiles)); - $task->files = trim($oldTaskFiles . $addedFiles, ','); - $oldTask->files = join(',', array_keys($oldTask->files)); - + $this->file->addFile4Object('task', $oldTask, $task); return common::createChanges($oldTask, $task); } } diff --git a/module/testcase/control.php b/module/testcase/control.php index 591f82c8cd..46be8135c0 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -860,20 +860,16 @@ class testcase extends control if(!empty($_POST)) { $changes = array(); - $files = array(); if($comment == false or $comment == 'false') { $changes = $this->testcase->update($caseID, $testtasks); if(dao::isError()) return print(js::error(dao::getError())); - $files = $this->loadModel('file')->saveUpload('testcase', $caseID); } - if($this->post->comment != '' or !empty($changes) or !empty($files)) + if($this->post->comment != '' or !empty($changes)) { $this->loadModel('action'); - $action = (!empty($changes) or !empty($files)) ? 'Edited' : 'Commented'; - $fileAction = ''; - if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n"; - $actionID = $this->action->create('case', $caseID, $action, $fileAction . $this->post->comment); + $action = !empty($changes) ? 'Edited' : 'Commented'; + $actionID = $this->action->create('case', $caseID, $action, $this->post->comment); $this->action->logHistory($actionID, $changes); } diff --git a/module/testcase/model.php b/module/testcase/model.php index c4346c043a..e31a44cf58 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -802,6 +802,7 @@ class testcaseModel extends model ->add('lastEditedDate', $now) ->setDefault('story,branch', 0) ->setDefault('stage', '') + ->setDefault('deleteFiles', array()) ->join('stage', ',') ->join('linkCase', ',') ->setForce('status', $status) @@ -820,7 +821,7 @@ class testcaseModel extends model $requiredFields = implode(',', $requiredFieldsArr); } $case = $this->loadModel('file')->processImgURL($case, $this->config->testcase->editor->edit['id'], $this->post->uid); - $this->dao->update(TABLE_CASE)->data($case)->autoCheck()->batchCheck($requiredFields, 'notempty')->checkFlow()->where('id')->eq((int)$caseID)->exec(); + $this->dao->update(TABLE_CASE)->data($case, 'deleteFiles')->autoCheck()->batchCheck($requiredFields, 'notempty')->checkFlow()->where('id')->eq((int)$caseID)->exec(); if(!$this->dao->isError()) { $this->updateCase2Project($oldCase, $case, $caseID); @@ -927,6 +928,8 @@ class testcaseModel extends model } } } + + $this->file->addFile4Object('testcase', $oldCase, $case); return common::createChanges($oldCase, $case); } } @@ -2390,7 +2393,6 @@ class testcaseModel extends model if(!empty($_POST['title']) and $case->title != $this->post->title) $stepChanged = true; if(!empty($_POST['precondition']) and $case->precondition != $this->post->precondition) $stepChanged = true; - if(!empty($_POST['labels'][0])) $stepChanged = true; return array($stepChanged, $status); } diff --git a/module/testcase/view/edit.html.php b/module/testcase/view/edit.html.php index bd0e86840a..9e98562bfd 100644 --- a/module/testcase/view/edit.html.php +++ b/module/testcase/view/edit.html.php @@ -130,7 +130,10 @@
    files;?>
    -
    fetch('file', 'buildform');?>
    +
    + fetch('file', 'printFiles', array('files' => $case->files, 'fieldset' => 'false', 'object' => $case, 'method' => 'edit'));?> + fetch('file', 'buildform');?> +
    lastEditedDate);?> diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php index 7723517c9d..935c0ecd7d 100644 --- a/module/testcase/view/view.html.php +++ b/module/testcase/view/view.html.php @@ -106,7 +106,7 @@
    xml));?>
    - fetch('file', 'printFiles', array('files' => $case->files, 'fieldset' => 'true', 'object' => $case));?> + fetch('file', 'printFiles', array('files' => $case->files, 'fieldset' => 'true', 'object' => $case, 'method' => 'view', 'showDelete' => false));?>
    printExtendFields($case, 'div', "position=left&inForm=0&inCell=1");?>
    diff --git a/module/testtask/model.php b/module/testtask/model.php index 2186dcedac..1b1ac51be6 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -750,11 +750,12 @@ class testtaskModel extends model */ public function update($taskID) { - $oldTask = $this->dao->select("*")->from(TABLE_TESTTASK)->where('id')->eq((int)$taskID)->fetch(); + $oldTask = $this->getById($taskID); $task = fixer::input('post') ->add('id', $taskID) ->setDefault('type', '') ->setDefault('mailto', '') + ->setDefault('deleteFiles', array()) ->stripTags($this->config->testtask->editor->edit['id'], $this->config->allowedTags) ->join('mailto', ',') ->join('type', ',') @@ -762,7 +763,7 @@ class testtaskModel extends model ->get(); $task = $this->loadModel('file')->processImgURL($task, $this->config->testtask->editor->edit['id'], $this->post->uid); - $this->dao->update(TABLE_TESTTASK)->data($task) + $this->dao->update(TABLE_TESTTASK)->data($task, 'deleteFiles') ->autoCheck() ->batchcheck($this->config->testtask->edit->requiredFields, 'notempty') ->checkIF($task->end != '', 'end', 'ge', $task->begin) @@ -772,8 +773,7 @@ class testtaskModel extends model if(!dao::isError()) { - $this->file->updateObjectID($this->post->uid, $taskID, 'testtask'); - $this->file->saveUpload('testtask', $taskID); + $this->file->addFile4Object('testtask', $oldTask, $task); return common::createChanges($oldTask, $task); } } diff --git a/module/testtask/view/edit.html.php b/module/testtask/view/edit.html.php index 23769ff4c0..2eae015802 100644 --- a/module/testtask/view/edit.html.php +++ b/module/testtask/view/edit.html.php @@ -88,7 +88,10 @@
    files;?>fetch('file', 'buildform');?> + fetch('file', 'printFiles', array('files' => $task->files, 'fieldset' => 'false', 'object' => $task, 'method' => 'edit'));?> + fetch('file', 'buildform');?> +
    testtask->mailto;?>
    + - + + $count):?> + account != $this->app->user->account) continue;?> + + + + @@ -64,20 +70,16 @@ foreach($efforts as $effort) +
    task->teamOrder;?> task->date;?> task->recordedBy;?>comment;?>task->work;?> task->consumed;?> task->left;?> actions;?>
    date;?> account);?> work;?>
    -
    - $accounts):?> -
    - - -
    + @@ -87,8 +89,14 @@ foreach($efforts as $effort) + $accounts):?> + + + + + @@ -103,9 +111,9 @@ foreach($efforts as $effort) +
    task->teamOrder;?> task->date;?> task->recordedBy;?> comment;?>
    date;?> account);?> work;?>
    -
    From ea1b08905ce6b898264991f9b58693b5790faba7 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 08:19:44 +0800 Subject: [PATCH 067/168] * Fix bug#27124. --- 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 c847bc4a05..ec0881ee7e 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -230,7 +230,7 @@ class task extends control elseif($this->post->after == 'toTaskList') { setcookie('moduleBrowseParam', 0, 0, $this->config->webRoot, '', $this->config->cookieSecure, false); - $taskLink = $this->createLink('execution', 'task', "executionID=$executionID&status=all¶m=0&orderBy=id_desc"); + $taskLink = $this->createLink('execution', 'task', "executionID=$executionID&status=unclosed¶m=0&orderBy=id_desc"); $response['locate'] = $taskLink; return $this->send($response); } From 7e683404db6c322cd60c317c999e57055ffb2471 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 9 Sep 2022 09:00:16 +0800 Subject: [PATCH 068/168] * adjust for waterfall report. --- module/block/control.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/module/block/control.php b/module/block/control.php index e8959d13c7..668d64ac3a 100755 --- a/module/block/control.php +++ b/module/block/control.php @@ -1208,8 +1208,9 @@ class block extends control $this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv); $this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac); + $progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0; + $this->view->progress = $progress > 100 ? 100 : $progress; $this->view->current = $current; - $this->view->progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0; } /** @@ -1231,7 +1232,8 @@ class block extends control $this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv); $this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac); - $this->view->progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0; + $progress = !empty($this->view->pv) ? floor($this->view->ac / $this->view->pv * 1000) / 1000 * 100 : 0; + $this->view->progress = $progress > 100 ? 100 : $progress; } /** From 1bb552b34de4838410aefd6383e0f33a16d6c39a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 9 Sep 2022 09:23:12 +0800 Subject: [PATCH 069/168] * fix bug for linear task. --- module/task/view/lineareffort.html.php | 2 +- module/task/view/recordestimate.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/task/view/lineareffort.html.php b/module/task/view/lineareffort.html.php index fd9d26160c..e49b2f7eef 100644 --- a/module/task/view/lineareffort.html.php +++ b/module/task/view/lineareffort.html.php @@ -82,7 +82,7 @@ foreach($efforts as $effort) task->teamOrder;?> task->date;?> task->recordedBy;?> - comment;?> + task->work;?> task->consumed;?> task->left;?> actions;?> diff --git a/module/task/view/recordestimate.html.php b/module/task/view/recordestimate.html.php index 3734ead79c..8f70f88c3c 100644 --- a/module/task/view/recordestimate.html.php +++ b/module/task/view/recordestimate.html.php @@ -91,7 +91,7 @@ $readonly = ' readonly'; $left = 0; $reverseOrders = array_reverse($myOrders, true); - foreach($reverseOrders as $order) $reverseOrders[$order] = $order + 1; + foreach($reverseOrders as $order => $count) $reverseOrders[$order] = $order + 1; } ?> From 2500ad1fb74e131881759039c4cda51eae52f061 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 9 Sep 2022 09:45:33 +0800 Subject: [PATCH 070/168] * Fix bug #27428. --- module/project/css/create.css | 3 ++- module/project/js/create.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/project/css/create.css b/module/project/css/create.css index d51de52fae..0c06d2fff2 100644 --- a/module/project/css/create.css +++ b/module/project/css/create.css @@ -17,11 +17,12 @@ #projectName {display: inline-block; width: 32%;} #productsBox a {border-radius: 2px !important;} #productsBox .col-sm-4 {padding-right: 5px;} -#productsBox .required:after {right: -4.5px !important;} +#productsBox .required:after {right: -9.5px !important;} #productsBox .addProduct {padding-left: 0px !important; padding-right: 10px;} #productsBox .addProduct.required:after {right: -1px !important;} #productsBox .input-group-addon > div {display: inline-block !important;} #productsBox .required + .text-danger.help-text {position: relative; left: 10px;} +#productsBox > #productNameLabel {padding-top: 8px;} #plansBox .row {display: inline-table; width: 102%;} #plansBox .col-sm-4 {float: none; display: inline-block; padding-right: 5px;} #dataform th {vertical-align: top; padding-top: 13px;} diff --git a/module/project/js/create.js b/module/project/js/create.js index a22a714e7d..795cbd72aa 100644 --- a/module/project/js/create.js +++ b/module/project/js/create.js @@ -212,7 +212,7 @@ function addNewProduct(obj) $('#productTitle').html(manageProducts); } - $('#productsBox div + .text-danger.help-text').empty(); + $('#productsBox div + .text-danger.help-text').remove(); } /** From adb25f92b34f231dfc664a9164fe7466ea1eaa21 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 9 Sep 2022 09:55:42 +0800 Subject: [PATCH 071/168] * Fix bug #27296. --- module/task/js/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/js/create.js b/module/task/js/create.js index 0a65fc34c3..839ac331ed 100644 --- a/module/task/js/create.js +++ b/module/task/js/create.js @@ -97,7 +97,7 @@ function loadExecutionMembers(executionID) */ function loadExecutionStories(executionID) { - $.get(createLink('story', 'ajaxGetExecutionStories', 'executionID=' + executionID + '&productID=0&branch=0&moduleID=0&storyID=' + $('#story').val()), function(data) + $.get(createLink('story', 'ajaxGetExecutionStories', 'executionID=' + executionID + '&productID=0&branch=0&moduleID=0&storyID=' + $('#story').val() + '&number=&type=full&status=active'), function(data) { $('#story_chosen').remove(); $('#story').next('.picker').remove(); From 490c0f8791d45d36b2643a5af8da273b00d4cb47 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 9 Sep 2022 10:10:17 +0800 Subject: [PATCH 072/168] * Fix bug #27281. --- module/doc/css/createbasicinfo.css | 1 + module/doc/css/tablecontents.css | 2 +- module/doc/view/createbasicinfo.html.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/doc/css/createbasicinfo.css b/module/doc/css/createbasicinfo.css index a6a00155ce..0c0e796ae6 100644 --- a/module/doc/css/createbasicinfo.css +++ b/module/doc/css/createbasicinfo.css @@ -1 +1,2 @@ #whiteListBox .input-group:last-child {margin-top: 10px;} +#module_chosen.chosen-container .chosen-results {max-height: 200px;} diff --git a/module/doc/css/tablecontents.css b/module/doc/css/tablecontents.css index 01fc3e2ab6..8e12dc7d0f 100644 --- a/module/doc/css/tablecontents.css +++ b/module/doc/css/tablecontents.css @@ -9,7 +9,7 @@ .no-content-button a:nth-child(2) {margin-left: 20px;} .cell .detail .detail-title {padding-left: 5px; list-style: none;} -.menu-actions {position: relative; float: right; top: -34px; right: -15px; padding: 7px 8px;} +.menu-actions {position: absolute; top: 7px; right: 45px; padding: 7px 8px;} .detail ul {position: relative;} .tail-info {position: absolute; right: 0; padding-left: 10px; padding-top: 1px;} .tail-info, .doc-title, span.item {background: #fff;} diff --git a/module/doc/view/createbasicinfo.html.php b/module/doc/view/createbasicinfo.html.php index 165e6ce5b0..31a1fa7736 100644 --- a/module/doc/view/createbasicinfo.html.php +++ b/module/doc/view/createbasicinfo.html.php @@ -31,7 +31,7 @@ From 82a93150271591943dbd4f82e4777975c0b16582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=BB=B6=E4=B9=89?= Date: Fri, 9 Sep 2022 10:13:56 +0800 Subject: [PATCH 073/168] * Fix bug #27158. --- api/v1/entries/user.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/api/v1/entries/user.php b/api/v1/entries/user.php index 8940d9ee05..8e5d696a2b 100644 --- a/api/v1/entries/user.php +++ b/api/v1/entries/user.php @@ -196,6 +196,8 @@ class userEntry extends Entry if(!common::hasPriv('my', 'work')) break; $this->config->openMethods[] = 'my.task'; + global $app; + $app->rawMethod = 'work'; $control = $this->loadController('my', 'task'); $control->task($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1)); $data = $this->getData(); @@ -212,6 +214,8 @@ class userEntry extends Entry if(!common::hasPriv('my', 'work')) break; $this->config->openMethods[] = 'my.bug'; + global $app; + $app->rawMethod = 'work'; $control = $this->loadController('my', 'bug'); $control->bug($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1)); $data = $this->getData(); @@ -269,6 +273,8 @@ class userEntry extends Entry if(!common::hasPriv('my', 'work')) break; $this->config->openMethods[] = 'my.story'; + global $app; + $app->rawMethod = 'work'; $control = $this->loadController('my', 'story'); $control->story($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1)); $data = $this->getData(); @@ -293,6 +299,8 @@ class userEntry extends Entry if($this->config->edition == 'max') { + global $app; + $app->rawMethod = 'work'; $this->config->openMethods[] = 'my.issue'; $control = $this->loadController('my', 'issue'); $control->issue('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1); @@ -311,6 +319,8 @@ class userEntry extends Entry if($this->config->edition == 'max') { + global $app; + $app->rawMethod = 'work'; $this->config->openMethods[] = 'my.risk'; $control = $this->loadController('my', 'risk'); $control->risk('assignedTo', 0, 'id_desc', 0, $this->param('limit', 5), 1); @@ -329,6 +339,8 @@ class userEntry extends Entry if($this->config->edition == 'max') { + global $app; + $app->rawMethod = 'work'; $this->config->openMethods[] = 'my.myMeeting'; $control = $this->loadController('my', 'myMeeting'); $control->myMeeting('futureMeeting', '', 'id_desc', 0, $this->param('limit', 5), 1); From e9efb567692a33420c619447e0ce5dd8671b97d1 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 9 Sep 2022 10:37:28 +0800 Subject: [PATCH 074/168] * Fix bug #27437. --- module/bug/lang/de.php | 5 +++-- module/bug/lang/en.php | 5 +++-- module/bug/lang/fr.php | 5 +++-- module/bug/lang/zh-cn.php | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/module/bug/lang/de.php b/module/bug/lang/de.php index 6925197c5b..92c7f5d4fb 100644 --- a/module/bug/lang/de.php +++ b/module/bug/lang/de.php @@ -187,10 +187,11 @@ $lang->bug->allUsers = 'Alle Benutzer laden'; $lang->bug->allBuilds = 'Alle'; $lang->bug->createBuild = 'Neu'; -/* Legend list。*/ +global $config; +/* Legend list. */ $lang->bug->legendBasicInfo = 'Basis Info'; $lang->bug->legendAttatch = 'Anlagen'; -$lang->bug->legendPRJExecStoryTask = 'Project/' . $lang->executionCommon . '/Story/Task'; +$lang->bug->legendPRJExecStoryTask = $config->systemMode == 'new' ? 'Project/' . $lang->executionCommon . '/Story/Task' : $lang->executionCommon . '/Story/Task'; $lang->bug->legendExecStoryTask = $lang->executionCommon . '/Story/Task'; $lang->bug->lblTypeAndSeverity = 'Typ/Schwere'; $lang->bug->lblSystemBrowserAndHardware = 'System/Browser'; diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 8a14403c90..439690a04f 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -187,10 +187,11 @@ $lang->bug->allUsers = 'Load All Users'; $lang->bug->allBuilds = 'All Builds'; $lang->bug->createBuild = 'New'; -/* Legend list。*/ +global $config; +/* Legend list. */ $lang->bug->legendBasicInfo = 'Basic Info'; $lang->bug->legendAttatch = 'Files'; -$lang->bug->legendPRJExecStoryTask = 'Project/' . $lang->executionCommon . '/Story/Task'; +$lang->bug->legendPRJExecStoryTask = $config->systemMode == 'new' ? 'Project/' . $lang->executionCommon . '/Story/Task' : $lang->executionCommon . '/Story/Task'; $lang->bug->legendExecStoryTask = $lang->executionCommon . '/Story/Task'; $lang->bug->lblTypeAndSeverity = 'Type/Severity'; $lang->bug->lblSystemBrowserAndHardware = 'System/Browser'; diff --git a/module/bug/lang/fr.php b/module/bug/lang/fr.php index f23542c7ef..de0bfd7c05 100644 --- a/module/bug/lang/fr.php +++ b/module/bug/lang/fr.php @@ -187,10 +187,11 @@ $lang->bug->allUsers = 'Charger Tous'; $lang->bug->allBuilds = 'Tous les Builds'; $lang->bug->createBuild = 'Nouveau'; -/* Legend list。*/ +global $config; +/* Legend list. */ $lang->bug->legendBasicInfo = 'Infos de Base'; $lang->bug->legendAttatch = 'Fichiers'; -$lang->bug->legendPRJExecStoryTask = 'Project/' . $lang->executionCommon . '/Story/Task'; +$lang->bug->legendPRJExecStoryTask = $config->systemMode == 'new' ? 'Project/' . $lang->executionCommon . '/Story/Task' : $lang->executionCommon . '/Story/Task'; $lang->bug->legendExecStoryTask = $lang->executionCommon . '/Story/Tâche'; $lang->bug->lblTypeAndSeverity = 'Type/Severité'; $lang->bug->lblSystemBrowserAndHardware = 'Système/Browser'; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 719ba107c1..cab71d93d5 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -187,10 +187,11 @@ $lang->bug->allUsers = '加载所有用户'; $lang->bug->allBuilds = '所有'; $lang->bug->createBuild = '创建'; +global $config; /* legend列表。*/ $lang->bug->legendBasicInfo = '基本信息'; $lang->bug->legendAttatch = '附件'; -$lang->bug->legendPRJExecStoryTask = "项目/" . $lang->executionCommon . "/{$lang->SRCommon}/任务"; +$lang->bug->legendPRJExecStoryTask = $config->systemMode == 'new' ? "项目/" . $lang->executionCommon . "/{$lang->SRCommon}/任务" : $lang->executionCommon . "/{$lang->SRCommon}/任务"; $lang->bug->legendExecStoryTask = $lang->executionCommon . "/{$lang->SRCommon}/任务"; $lang->bug->lblTypeAndSeverity = '类型/严重程度'; $lang->bug->lblSystemBrowserAndHardware = '系统/浏览器'; From f8fdeafb3aefc4e8c36e6f1b7abf7c54f56e786e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=BB=B6=E4=B9=89?= Date: Fri, 9 Sep 2022 11:06:56 +0800 Subject: [PATCH 075/168] * Fix bug #27150. --- api/v1/entries/testcases.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/entries/testcases.php b/api/v1/entries/testcases.php index 11ed761d97..5facb8ce38 100644 --- a/api/v1/entries/testcases.php +++ b/api/v1/entries/testcases.php @@ -26,7 +26,7 @@ class testcasesEntry extends entry $this->app->cookie->caseModule = 0; $this->app->cookie->caseSuite = 0; - $type = 'all'; + $type = $this->param('status', 'all'); $param = 0; $moduleID = $this->param('module', 0); if($moduleID) From 40bc0e79662c4fb7ceb817d379aadd3b9f5a19b4 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 11:17:37 +0800 Subject: [PATCH 076/168] * Fix bug#26942. --- module/story/control.php | 9 ++++++++- 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 + 6 files changed, 13 insertions(+), 1 deletion(-) diff --git a/module/story/control.php b/module/story/control.php index b29572e3e1..16b4b7158b 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1858,11 +1858,18 @@ class story extends control $storyGroup = array(); foreach($stories as $story) { - if(strpos('draft,reviewing,changing,closed', $story->status) !== false) continue; + if(strpos('draft,reviewing,changing,closed', $story->status) !== false) + { + unset($stories[$story->id]); + continue; + } + if(isset($storyGroup[$story->module])) continue; $storyGroup[$story->module] = $this->story->getExecutionStoryPairs($executionID, 0, 'all', $story->module, 'short', 'active'); } + if(empty($stories)) return print(js::error($this->lang->story->noStoryToTask) . js::locate($this->session->storyList)); + $this->view->title = $this->lang->story->batchToTask; $this->view->executionID = $executionID; $this->view->syncFields = empty($_POST['fields']) ? array() : $_POST['fields']; diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 4dc37b3253..b4fd31b40c 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -307,6 +307,7 @@ $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the bra $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; $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->noStoryToTask = "Only the activated {$lang->SRCommon} can be converted into a task!"; $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 07a0fea7d6..eaf61f59dd 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -307,6 +307,7 @@ $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the bra $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; $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->noStoryToTask = "Only the activated {$lang->SRCommon} can be converted into a task!"; $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 529500b906..d0bff1b1f6 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -307,6 +307,7 @@ $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the bra $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; $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->noStoryToTask = "Only the activated {$lang->SRCommon} can be converted into a task!"; $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 b21627c2cf..e92b3a8b0c 100644 --- a/module/story/lang/vi.php +++ b/module/story/lang/vi.php @@ -299,6 +299,7 @@ $lang->story->confirmChangePlan = $lang->SRCommon . ' %s is linked to the bra $lang->story->errorDuplicateStory = $lang->SRCommon . '%s not exist'; $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->noStoryToTask = "Only the activated {$lang->SRCommon} can be converted into a task!"; $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 3448bbfdc9..b33b955e51 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -307,6 +307,7 @@ $lang->story->confirmChangePlan = $lang->SRCommon . '%s已关联在之前计 $lang->story->errorDuplicateStory = $lang->SRCommon . '%s不存在'; $lang->story->confirmRecallChange = "撤销变更后,需求内容会回退至变更前的版本,您确定要撤销吗?"; $lang->story->confirmRecallReview = "您确定要撤回评审吗?"; +$lang->story->noStoryToTask = "只有激活的{$lang->SRCommon}才能转为任务!"; $lang->story->form = new stdclass(); $lang->story->form->area = "该{$lang->SRCommon}所属范围"; From 981aaf5755ce1a06ec505cf3f52ef6c53a73f7fa Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 11:24:04 +0800 Subject: [PATCH 077/168] * Fix bug#26874. --- module/product/view/ajaxgetdropmenu.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/product/view/ajaxgetdropmenu.html.php b/module/product/view/ajaxgetdropmenu.html.php index dab16dd063..81b430e4d9 100644 --- a/module/product/view/ajaxgetdropmenu.html.php +++ b/module/product/view/ajaxgetdropmenu.html.php @@ -26,7 +26,7 @@ #swapper .tree li>.list-toggle {top: -1px;} #subHeader .tree ul {display: block;} -#closed {width: 90px; height: 25px; line-height: 25px; background-color: #ddd; color: #3c495c; text-align: center; margin-left: 15px; border-radius: 2px;} +div#closed {width: 90px; height: 25px; line-height: 25px; background-color: #ddd; color: #3c495c; text-align: center; margin-left: 15px; border-radius: 2px;} #gray-line {width: 230px; height: 1px; margin-left: 10px; margin-bottom:2px; background-color: #ddd;} #swapper li >.selected {color: #0c64eb!important;background: #e9f2fb!important;} From d2deaca78e7a5f0d65fc30ed613ccafe7665114c Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 9 Sep 2022 13:07:25 +0800 Subject: [PATCH 078/168] * Fix bug. --- module/doc/css/createbasicinfo.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/doc/css/createbasicinfo.css b/module/doc/css/createbasicinfo.css index a6a00155ce..0ed1ddfcfd 100644 --- a/module/doc/css/createbasicinfo.css +++ b/module/doc/css/createbasicinfo.css @@ -1 +1,3 @@ #whiteListBox .input-group:last-child {margin-top: 10px;} +#module_chosen.chosen-container .chosen-results {max-height: 200px;} +#dataform .radio-inline.hidden + .radio-inline {margin-left: 0px;} From 52bdcfb8d1016d7bc0bcd0e5fcf5be8436aaf627 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 9 Sep 2022 13:07:54 +0800 Subject: [PATCH 079/168] * Fix bug. --- module/doc/css/createbasicinfo.css | 1 - 1 file changed, 1 deletion(-) diff --git a/module/doc/css/createbasicinfo.css b/module/doc/css/createbasicinfo.css index 0ed1ddfcfd..651b8809a0 100644 --- a/module/doc/css/createbasicinfo.css +++ b/module/doc/css/createbasicinfo.css @@ -1,3 +1,2 @@ #whiteListBox .input-group:last-child {margin-top: 10px;} -#module_chosen.chosen-container .chosen-results {max-height: 200px;} #dataform .radio-inline.hidden + .radio-inline {margin-left: 0px;} From 8fe84e651fbc6cc9ee05d6cdb39ccb8a66b1f856 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 13:23:09 +0800 Subject: [PATCH 080/168] * Modify submit review icon. --- extension/lite/story/ext/view/view.html.php | 4 ++-- module/my/view/requirement.html.php | 4 ++-- module/my/view/story.html.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extension/lite/story/ext/view/view.html.php b/extension/lite/story/ext/view/view.html.php index fb971c4d9f..df7df73062 100644 --- a/extension/lite/story/ext/view/view.html.php +++ b/extension/lite/story/ext/view/view.html.php @@ -110,7 +110,7 @@ common::printIcon('story', 'change', "storyID=$child->id", $child, 'list', 'alter'); if(strpos('draft,changing', $child->status) !== false) { - common::printIcon('story', 'submitReview', "storyID=$child->id", $child, 'list', 'sub-review', '', 'iframe showinonlybody', true); + common::printIcon('story', 'submitReview', "storyID=$child->id", $child, 'list', 'confirm', '', 'iframe showinonlybody', true); } else { @@ -143,7 +143,7 @@ common::printIcon('story', 'change', "storyID=$story->id", $story, 'button', 'alter', '', 'showinonlybody'); if(strpos('draft,changing', $story->status) !== false) { - common::printIcon('story', 'submitReview', "storyID=$story->id", $story, 'button', 'sub-review', '', 'iframe showinonlybody', true); + common::printIcon('story', 'submitReview', "storyID=$story->id", $story, 'button', 'confirm', '', 'iframe showinonlybody', true); } else { diff --git a/module/my/view/requirement.html.php b/module/my/view/requirement.html.php index 8472470c53..37248276c6 100644 --- a/module/my/view/requirement.html.php +++ b/module/my/view/requirement.html.php @@ -107,7 +107,7 @@ if(strpos('draft,changing', $story->status) !== false) { - echo common::buildIconButton('story', 'submitReview', "$vars&storyType=requirement", $story, 'list', 'sub-review', '', 'iframe', true); + echo common::buildIconButton('story', 'submitReview', "$vars&storyType=requirement", $story, 'list', 'confirm', '', 'iframe', true); } else { @@ -155,7 +155,7 @@ if(strpos('draft,changing', $child->status) !== false) { - common::printIcon('story', 'submitReview', "$vars&storyType=story", $child, 'list', 'sub-review', '', 'iframe', true); + common::printIcon('story', 'submitReview', "$vars&storyType=story", $child, 'list', 'confirm', '', 'iframe', true); } else { diff --git a/module/my/view/story.html.php b/module/my/view/story.html.php index e19a82ece3..b309858436 100644 --- a/module/my/view/story.html.php +++ b/module/my/view/story.html.php @@ -108,7 +108,7 @@ if(strpos('draft,changing', $story->status) !== false) { - echo common::buildIconButton('story', 'submitReview', $vars, $story, 'list', 'sub-review', '', 'iframe', true); + echo common::buildIconButton('story', 'submitReview', $vars, $story, 'list', 'confirm', 'confirm', 'iframe', true); } else { @@ -158,7 +158,7 @@ if(strpos('draft,changing', $child->status) !== false) { - common::printIcon('story', 'submitReview', $vars, $child, 'list', 'sub-review', '', 'iframe', true); + common::printIcon('story', 'submitReview', $vars, $child, 'list', 'confirm', '', 'iframe', true); } else { From a258b7b9db6660a7446a6114d0e4246d64305785 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 14:11:36 +0800 Subject: [PATCH 081/168] * Fix bug#26156. --- module/bug/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/bug/control.php b/module/bug/control.php index 66a0585929..14e5cf7de2 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -525,7 +525,7 @@ class bug extends control $severity = $bug->severity; $type = $bug->type; $assignedTo = $bug->assignedTo; - $deadline = $bug->deadline; + $deadline = helper::isZeroDate($bug->deadline) ? '' : $bug->deadline; $color = $bug->color; $testtask = $bug->testtask; if($pri == 0) $pri = '3'; From dfe4de62a578f8cf260e21ee860ac2f76ee58aaf Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 14:14:53 +0800 Subject: [PATCH 082/168] * Fix bug#26179. --- module/bug/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/bug/model.php b/module/bug/model.php index 593bd21324..dbb79b8230 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -3279,7 +3279,7 @@ class bugModel extends model $title = "title='" . zget($projectPairs, $bug->project, '') . "'"; break; case 'plan': - $title = "title='" . zget($plans, $bug->plan) . "'"; + $title = "title='" . zget($plans, $bug->plan, '') . "'"; break; case 'execution': $title = "title='" . zget($executions, $bug->execution) . "'"; From 9f28ebf56b915c7765fab1635d6e1bccd4f9e847 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 14:27:18 +0800 Subject: [PATCH 083/168] * Fix bug#26180. --- module/build/view/linkstory.html.php | 2 +- module/build/view/view.html.php | 2 +- module/projectrelease/view/linkstory.html.php | 2 +- module/projectrelease/view/view.html.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/build/view/linkstory.html.php b/module/build/view/linkstory.html.php index 9700032238..7bf64d0c76 100644 --- a/module/build/view/linkstory.html.php +++ b/module/build/view/linkstory.html.php @@ -47,7 +47,7 @@ diff --git a/module/build/view/view.html.php b/module/build/view/view.html.php index ea39390fb3..d1f39416fd 100644 --- a/module/build/view/view.html.php +++ b/module/build/view/view.html.php @@ -103,7 +103,7 @@ tbody tr td:first-child input {display: none;} diff --git a/module/projectrelease/view/view.html.php b/module/projectrelease/view/view.html.php index 9ac0487fc3..70378c16b2 100644 --- a/module/projectrelease/view/view.html.php +++ b/module/projectrelease/view/view.html.php @@ -94,7 +94,7 @@ From 4d439f7337047ee4f9ea2840f6c8116cd680801c Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 14:33:29 +0800 Subject: [PATCH 084/168] * Fix bug#26180. --- module/execution/view/linkstory.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/execution/view/linkstory.html.php b/module/execution/view/linkstory.html.php index 80e97dbfde..29bf65c18d 100644 --- a/module/execution/view/linkstory.html.php +++ b/module/execution/view/linkstory.html.php @@ -66,7 +66,7 @@ - + team) ? $this->task->getTeamByAccount($task->team) : ''; + $consumed = !empty($currentTeam) ? (float)$currentTeam->consumed : $task->consumed; + $lblConsumed = $lang->task->consumed; + $readonly = ''; + if($app->rawMethod == 'restart' and !empty($currentTeam)) + { + $lblConsumed = $lang->task->myConsumed; + $readonly = 'readonly'; + } + ?> + From 0142653d2b9360fb2fd177d5e3c647a2fa7f0201 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 13 Sep 2022 13:21:14 +0800 Subject: [PATCH 107/168] * adjust lang. --- module/task/lang/zh-cn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 68de34a217..eff5cc6652 100755 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -232,7 +232,7 @@ $lang->task->remindIssue = "该任务为问题转化得到,是 $lang->task->confirmChangeExecution = "修改{$lang->executionCommon}会导致相应的所属模块、相关{$lang->SRCommon}和指派人发生变化,确定吗?"; $lang->task->confirmFinish = '"预计剩余"为0,确认将任务状态改为"已完成"吗?'; $lang->task->confirmRecord = '"剩余"为0,任务将标记为"已完成",您确定吗?'; -$lang->task->confirmTransfer = '"当前剩余"为0,任务将被指派给:%s,您确定吗?'; +$lang->task->confirmTransfer = '剩余工时为0,当前成员已完成任务,任务指派给:%s。'; $lang->task->noticeTaskStart = '"总计消耗"和"预计剩余"不能同时为0'; $lang->task->noticeLinkStory = "没有可关联的相关{$lang->SRCommon},您可以为当前项目%s,然后%s"; $lang->task->noticeSaveRecord = '您有尚未保存的工时记录,请先将其保存。'; From b3812880ae960bcd9ddbc1080c97c95370e356c4 Mon Sep 17 00:00:00 2001 From: liuhong Date: Tue, 13 Sep 2022 05:22:04 +0000 Subject: [PATCH 108/168] *Fix bug #27183. --- module/execution/view/taskkanban.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/execution/view/taskkanban.html.php b/module/execution/view/taskkanban.html.php index 2a9b390200..759c214457 100644 --- a/module/execution/view/taskkanban.html.php +++ b/module/execution/view/taskkanban.html.php @@ -116,7 +116,7 @@ ';?> ' . html::a(helper::createLink('execution', 'importBug', "execution=$execution->id", '', true), $lang->execution->importBug, '', "class='iframe' data-width='90%'") . '';?> - ' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe'") . '';?> + ' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe' data-width='80%'") . '';?> ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe' data-width=90%") . '';?> From 164eaacf30e51eaaf71a18a1f5058bea79e50c22 Mon Sep 17 00:00:00 2001 From: daitingting Date: Tue, 13 Sep 2022 05:34:48 +0000 Subject: [PATCH 109/168] * Fix bug #27272. --- module/common/model.php | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/module/common/model.php b/module/common/model.php index 5bcbd38c37..7532ce25be 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2000,11 +2000,10 @@ EOD; $oldStatus = zget($old, 'status', ''); $newStatus = zget($new, 'status', ''); $newSubStatus = zget($new, 'subStatus', ''); + if(empty($moduleName)) $moduleName = $app->getModuleName(); if($oldID and $oldStatus and $newStatus and !$newSubStatus and $oldStatus != $newStatus) { - if(empty($moduleName)) $moduleName = $app->getModuleName(); - $field = $app->dbh->query('SELECT options FROM ' . TABLE_WORKFLOWFIELD . " WHERE `module` = '$moduleName' AND `field` = 'subStatus'")->fetch(); if(!empty($field->options)) $field->options = json_decode($field->options, true); @@ -2018,6 +2017,11 @@ EOD; $new->subStatus = $default; } } + + $dateFields = array(); + $sql = "SELECT `field` FROM " . TABLE_WORKFLOWFIELD . " WHERE `module` = '{$moduleName}' and `control` in ('date', 'datetime')"; + $stmt = $app->dbh->query($sql); + while($row = $stmt->fetch()) $dateFields[$row->field] = $row->field; } $changes = array(); @@ -2030,24 +2034,29 @@ EOD; if(strtolower($key) == 'editedby') continue; if(strtolower($key) == 'editeddate') continue; if(strtolower($key) == 'uid') continue; - if(strtolower($key) == 'finisheddate' and $value == '') continue; - if(strtolower($key) == 'canceleddate' and $value == '') continue; - if(strtolower($key) == 'hangupeddate' and $value == '') continue; - if(strtolower($key) == 'lastcheckeddate' and $value == '') continue; - if(strtolower($key) == 'activateddate' and $value == '') continue; - if(strtolower($key) == 'closeddate' and $value == '') continue; + if(strtolower($key) == 'finisheddate' and $value == '') continue; + if(strtolower($key) == 'canceleddate' and $value == '') continue; + if(strtolower($key) == 'hangupeddate' and $value == '') continue; + if(strtolower($key) == 'lastcheckeddate' and $value == '') continue; + if(strtolower($key) == 'activateddate' and $value == '') continue; + if(strtolower($key) == 'closeddate' and $value == '') continue; if(strtolower($key) == 'actualcloseddate' and $value == '') continue; - if(isset($old->$key) and $value != stripslashes($old->$key)) + if(isset($old->$key)) { - $diff = ''; - if(substr_count($value, "\n") > 1 or - substr_count($old->$key, "\n") > 1 or - strpos('name,title,desc,spec,steps,content,digest,verify,report,definition,analysis,summary,prevention,resolution,outline,schedule,minutes', strtolower($key)) !== false) + if($config->edition != 'open' && isset($dateFields[$key])) $old->$key = formatTime($old->$key); + + if($value != stripslashes($old->$key)) { - $diff = commonModel::diff($old->$key, $value); + $diff = ''; + if(substr_count($value, "\n") > 1 or + substr_count($old->$key, "\n") > 1 or + strpos('name,title,desc,spec,steps,content,digest,verify,report,definition,analysis,summary,prevention,resolution,outline,schedule,minutes', strtolower($key)) !== false) + { + $diff = commonModel::diff($old->$key, $value); + } + $changes[] = array('field' => $key, 'old' => $old->$key, 'new' => $value, 'diff' => $diff); } - $changes[] = array('field' => $key, 'old' => $old->$key, 'new' => $value, 'diff' => $diff); } } return $changes; From 09694f37516d180e36737a61d868f7901a1e87a5 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 13 Sep 2022 13:37:13 +0800 Subject: [PATCH 110/168] * adjust for edit effort. --- module/task/control.php | 18 ++++++------------ module/task/model.php | 6 +++--- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index efe0fd01dc..8fa8b9b497 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -1038,12 +1038,9 @@ class task extends control return print(js::error(dao::getError())); } - if($this->post->comment != '' or !empty($changes)) - { - $act = $this->post->left == 0 ? 'Finished' : 'Started'; - $actionID = $this->action->create('task', $taskID, $act, $this->post->comment); - $this->action->logHistory($actionID, $changes); - } + $act = $this->post->left == 0 ? 'Finished' : 'Started'; + $actionID = $this->action->create('task', $taskID, $act, $this->post->comment); + if(!empty($changes)) $this->action->logHistory($actionID, $changes); $this->executeHooks($taskID); $this->loadModel('common')->syncPPEStatus($taskID); @@ -1447,12 +1444,9 @@ class task extends control $changes = $this->task->start($taskID); if(dao::isError()) return print(js::error(dao::getError())); - if($this->post->comment != '' or !empty($changes)) - { - $act = $this->post->left == 0 ? 'Finished' : 'Restarted'; - $actionID = $this->action->create('task', $taskID, $act, $this->post->comment); - $this->action->logHistory($actionID, $changes); - } + $act = $this->post->left == 0 ? 'Finished' : 'Restarted'; + $actionID = $this->action->create('task', $taskID, $act, $this->post->comment); + if(!empty($changes)) $this->action->logHistory($actionID, $changes); $this->executeHooks($taskID); diff --git a/module/task/model.php b/module/task/model.php index 532e03dc2d..bddc847af4 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1744,7 +1744,7 @@ class taskModel extends model $estimate->account = $this->app->user->account; $estimate->consumed = (!empty($oldTask->team) and $currentTeam) ? $estimate->consumed - $currentTeam->consumed : $estimate->consumed - $oldTask->consumed; if($this->post->comment) $estimate->work = $this->post->comment; - $estimateID = $this->addTaskEstimate($estimate); + if($estimate->consumed > 0) $estimateID = $this->addTaskEstimate($estimate); if(!empty($oldTask->team) and $currentTeam) { @@ -1754,7 +1754,7 @@ class taskModel extends model $team->status = empty($team->left) ? 'done' : 'doing'; $this->dao->update(TABLE_TASKTEAM)->data($team)->where('id')->eq($currentTeam->id)->exec(); - if($oldTask->mode == 'linear') $this->updateEstimateOrder($estimateID, $currentTeam->order); + if($oldTask->mode == 'linear' and !empty($estimateID)) $this->updateEstimateOrder($estimateID, $currentTeam->order); $task = $this->computeHours4Multiple($oldTask, $task); if($team->status == 'done') @@ -2885,7 +2885,7 @@ class taskModel extends model $today = helper::today(); if($estimate->date > $today) return dao::$errors[] = $this->lang->task->error->date; - if($estimate->consumed < 0) return dao::$errors[] = sprintf($this->lang->error->ge, $this->lang->task->record, '0'); + if($estimate->consumed <= 0) return dao::$errors[] = sprintf($this->lang->error->ge, $this->lang->task->record, '0'); if($estimate->left < 0) return dao::$errors[] = sprintf($this->lang->error->ge, $this->lang->task->left, '0'); $task = $this->getById($oldEstimate->objectID); From 3dc0abf2d10ab604a658f7e45d419da5fe749de9 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 13 Sep 2022 13:58:13 +0800 Subject: [PATCH 111/168] * adjust for check effort consumed. --- 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 bddc847af4..594cb66039 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -2885,7 +2885,7 @@ class taskModel extends model $today = helper::today(); if($estimate->date > $today) return dao::$errors[] = $this->lang->task->error->date; - if($estimate->consumed <= 0) return dao::$errors[] = sprintf($this->lang->error->ge, $this->lang->task->record, '0'); + if($estimate->consumed <= 0) return dao::$errors[] = sprintf($this->lang->error->gt, $this->lang->task->record, '0'); if($estimate->left < 0) return dao::$errors[] = sprintf($this->lang->error->ge, $this->lang->task->left, '0'); $task = $this->getById($oldEstimate->objectID); From ba5eb3f915fea8168efea89145bed954729508bc Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 13 Sep 2022 14:39:01 +0800 Subject: [PATCH 112/168] * Finish task #68942,68941. --- module/execution/model.php | 1 + module/project/control.php | 14 +++++++++++++- module/project/css/execution.css | 2 ++ module/project/view/execution.html.php | 4 +++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/module/execution/model.php b/module/execution/model.php index 32b6aaa4e0..cf5a720c3a 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -4556,6 +4556,7 @@ class executionModel extends model * @param object $execution * @param bool $isChild * @param array $users + * @param int $productID * @access public * @return void */ diff --git a/module/project/control.php b/module/project/control.php index 56282a0926..21e31baef2 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -1034,7 +1034,19 @@ class project extends control $this->view->title = $this->lang->execution->allExecutions; $this->view->position[] = $this->lang->execution->allExecutions; - $this->view->executionStats = $this->execution->getStatData($projectID, $status, $productID, 0, $this->cookie->showTask, '', $orderBy, $pager); + $executionStats = $this->execution->getStatData($projectID, $status, $productID, 0, $this->cookie->showTask, '', $orderBy, $pager); + $showToggleIcon = false; + foreach($executionStats as $execution) + { + if(!empty($execution->tasks) or !empty($execution->children)) + { + $showToggleIcon = true; + continue; + } + } + + $this->view->executionStats = $executionStats; + $this->view->showToggleIcon = $showToggleIcon; $this->view->productList = $this->loadModel('product')->getProductPairsByProject($projectID); $this->view->productID = $productID; $this->view->projectID = $projectID; diff --git a/module/project/css/execution.css b/module/project/css/execution.css index 7b59058feb..41848ea166 100644 --- a/module/project/css/execution.css +++ b/module/project/css/execution.css @@ -8,3 +8,5 @@ th.table-nest-title-edit {padding-left: 50px !important;} th.table-nest-title-edit .table-nest-toggle {left: 28px;} th.table-nest-title .check-all {position: absolute; left: 15px; top: 7px;} .c-date {text-align: center;} +#executionTableList > tr:not(.has-nest-child) .table-nest-toggle {display: none;} +#executionTableList > tr:not(.has-nest-child) .project-type-label {margin-left: 22px;} diff --git a/module/project/view/execution.html.php b/module/project/view/execution.html.php index dcc40d6fd8..f63268a42f 100644 --- a/module/project/view/execution.html.php +++ b/module/project/view/execution.html.php @@ -68,7 +68,9 @@ From 626de039fa07983eeb45aab08fea077ec2b0a1ba Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 13 Sep 2022 15:10:40 +0800 Subject: [PATCH 113/168] * Finish task #68928. --- module/kanban/css/view.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/module/kanban/css/view.css b/module/kanban/css/view.css index d841043f41..5c42a7e4dc 100644 --- a/module/kanban/css/view.css +++ b/module/kanban/css/view.css @@ -178,5 +178,6 @@ #region-tab-actions.active {display: flex; position: relative; right: 0px; top: -2px;} .region {display: none;} .region.active {display: block;} -.region.active.notAll {margin-top: 0px;} -.region.active.notAll .region-header > * {display: none;} +.region.active.notAll {margin-top: -5px;} +.region.active.notAll .region-header {display: none;} +.region.active.notAll .kanban {padding: 0 0 10px 0;} From ee148d3a0e3178271e28d17add895e9c228ea155 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 13 Sep 2022 15:29:55 +0800 Subject: [PATCH 114/168] * fix bug #27447. --- extension/lite/task/ext/view/create.html.php | 22 +++++++------------- module/task/js/create.js | 10 ++------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/extension/lite/task/ext/view/create.html.php b/extension/lite/task/ext/view/create.html.php index 227d383766..c9e0f06843 100644 --- a/extension/lite/task/ext/view/create.html.php +++ b/extension/lite/task/ext/view/create.html.php @@ -90,6 +90,10 @@ + + + + @@ -283,24 +287,11 @@
    doc->module;?> - +
    story->priList, $story->pri, $story->pri)?> parent > 0) echo "{$lang->story->childrenAB}"; + if($story->parent > 0) echo "{$lang->story->childrenAB}"; echo html::a($this->createLink('story', 'view', "storyID=$story->id&version=0¶m=$objectID", '', true), $story->title, '', "data-toggle='modal' data-type='iframe' data-width='90%'"); ?> story->priList, $story->pri, $story->pri);?> parent > 0) echo "{$lang->story->childrenAB}"; + if($story->parent > 0) echo "{$lang->story->childrenAB}"; if($this->app->tab == 'execution' and common::hasPriv('execution', 'storyView')) { echo html::a($this->createLink('execution', 'storyView', "storyID=$story->id", '', true), $story->title, '', isonlybody() ? "data-width='1000'" : "class='iframe' data-width='1000'"); diff --git a/module/projectrelease/view/linkstory.html.php b/module/projectrelease/view/linkstory.html.php index 2d37e27b1c..36f169da5f 100644 --- a/module/projectrelease/view/linkstory.html.php +++ b/module/projectrelease/view/linkstory.html.php @@ -50,7 +50,7 @@ pri;?>' title='story->priList, $story->pri)?>'>story->priList, $story->pri)?> parent > 0) echo "{$lang->story->childrenAB}"; + if($story->parent > 0) echo "{$lang->story->childrenAB}"; echo html::a($this->createLink('story', 'view', "storyID={$story->id}&version=0¶m=$projectID", '', true), $story->title, '', "data-toggle='modal' data-type='iframe' data-width='90%'"); ?> pri;?>' title='story->priList, $story->pri, $story->pri);?>'>story->priList, $story->pri, $story->pri);?> parent > 0) echo "{$lang->story->childrenAB}"; + if($story->parent > 0) echo "{$lang->story->childrenAB}"; echo html::a($storyLink,$story->title, '', "class='preview'"); ?> pri;?>' title='story->priList, $story->pri, $story->pri);?>'>story->priList, $story->pri, $story->pri);?> parent > 0) echo "{$lang->story->childrenAB}"; + if($story->parent > 0) echo "{$lang->story->childrenAB}"; if(common::hasPriv('execution', 'storyView')) { echo html::a($storyLink, $story->title, '', "class='iframe' data-width='80%'"); From abffa486a1dbe37ff83b73110b3545f749781fc0 Mon Sep 17 00:00:00 2001 From: sunguangming Date: Fri, 9 Sep 2022 14:51:41 +0800 Subject: [PATCH 085/168] * Fix bug #27442. --- module/task/view/batchedit.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/task/view/batchedit.html.php b/module/task/view/batchedit.html.php index 611ddbb728..d220b44399 100755 --- a/module/task/view/batchedit.html.php +++ b/module/task/view/batchedit.html.php @@ -99,8 +99,8 @@ js::set('requiredFields', $config->task->edit->requiredFields); $taskMembers = array(); if(isset($teams[$taskID])) { - $teamAccounts = array_keys($teams[$taskID]); - foreach($teamAccounts as $teamAccount) $taskMembers[$teamAccount] = $users[$teamAccount]; + $teamAccounts = $teams[$taskID]; + foreach($teamAccounts as $teamAccount) $taskMembers[$teamAccount->account] = $users[$teamAccount->account]; } else { From f7883bf7b736a5aad795aaba8b98a0cced354104 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 15:08:06 +0800 Subject: [PATCH 086/168] * Fix bug#26350. --- module/story/view/create.html.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index b035884158..856bc23ffe 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -11,9 +11,6 @@ */ ?> - story->placeholder); ?> From e59f8d97e40444c24289c50e0143555954776455 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 9 Sep 2022 15:53:45 +0800 Subject: [PATCH 087/168] * Fix api test. --- test/config/config.php | 10 +++++++--- test/lib/init.php | 14 +++++++++++++- test/lib/rest.php | 1 + 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/test/config/config.php b/test/config/config.php index df921468b6..7dc8d5e75f 100644 --- a/test/config/config.php +++ b/test/config/config.php @@ -1,5 +1,9 @@ test = new stdclass; -$config->test->dbPrefix = "db_"; -$config->test->rawDB = 'zentaounittest'; -$config->test->dbNum = 10; +$config->test->dbPrefix = "db_"; //复制数据库的数据库前缀,便于区分复制数据库 +$config->test->rawDB = 'zentao16pms'; //要复制的数据库,也就是ztest init初始化的数据库 +$config->test->dbNum = 10; //复制数据库的数量,可以根据自己的需要自行调节 + +$config->test->base = 'http://liyang.oop.cc:8072/max/api.php/v1'; //api测试基准路径 +$config->test->account = 'admin'; //api测试登录账户 +$config->test->password = 'Ly123456'; //api测试账户密码 diff --git a/test/lib/init.php b/test/lib/init.php index 344f2625d9..17f067a466 100644 --- a/test/lib/init.php +++ b/test/lib/init.php @@ -28,7 +28,12 @@ $frameworkRoot = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'fr function c($code) { global $_result; - if($_result and isset($_result->status_code) and $_result->status_code == $code) + if(empty($_result) or empty($_result->status_code)) return false; + + $codeStr = (string)$code; + $statusCodeStr = (string)($_result->status_code); + + if($_result->status_code == $code or ($statusCodeStr[0] === '2' and $codeStr[0] === '2')) { $_result = $_result->body; return true; @@ -55,8 +60,15 @@ $config->zdPath = dirname(dirname(__FILE__)) . '/tools/zd'; /* init testDB. */ include $testPath . 'config/config.php'; include $testPath. 'lib/db.class.php'; +include $testPath. 'lib/rest.php'; $db = new db(); +$rest = new rest($config->test->base); +if(isset($config->test->account, $config->test->password)) +{ + $token = $rest->post('/tokens', array('account' => $config->test->account, 'password' => $config->test->password)); + $token = $token->body; +} /** * Save variable to $_result. * diff --git a/test/lib/rest.php b/test/lib/rest.php index 94ad48c494..d9ccb3a494 100644 --- a/test/lib/rest.php +++ b/test/lib/rest.php @@ -1,4 +1,5 @@ Date: Fri, 9 Sep 2022 15:54:59 +0800 Subject: [PATCH 088/168] + Add create api test. --- test/lib/initapi.php | 184 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 test/lib/initapi.php diff --git a/test/lib/initapi.php b/test/lib/initapi.php new file mode 100644 index 0000000000..edeaa496a1 --- /dev/null +++ b/test/lib/initapi.php @@ -0,0 +1,184 @@ +routes; + + $apiMethods = array(); + foreach($apiFiles as $apiFile) + { + preg_match_all('/function\s(get|put|delete|post)\(/', file_get_contents($apiRoot . DS . $apiFile), $methods); + if($methods) + { + $apiFileName = str_replace(strrchr($apiFile, "."),"",$apiFile); + $apiMethods[$apiFileName] = $methods[1]; + } + } + + $noApiFile = ''; + $nodata = ''; + $api = array(); + + foreach($routes as $url => $apiName) + { + $apiName = strtolower($apiName); + if(isset($apiMethods[$apiName])) + { + $api[$apiName]['url'] = $url; + + foreach($apiMethods[$apiName] as $apiMethod) + { + $apiData = $dao->select('params, paramsExample')->from(TABLE_API)->where('path')->eq($url)->andwhere('method')->eq(strtoupper($apiMethod))->fetch(); + + if($apiData) + { + $api[$apiName]['method'][$apiMethod]['params'] = $apiData->params; + $api[$apiName]['method'][$apiMethod]['example'] = $apiData->paramsExample; + } + else + { + $nodata .= $url . '的' . $apiMethod . '方法没有在数据库维护' . PHP_EOL; + + $api[$apiName]['method'][$apiMethod]['params'] = ''; + $api[$apiName]['method'][$apiMethod]['example'] = ''; + } + } + } + else + { + $noApiFile .= "没有api文件的routes:" . $apiName . PHP_EOL; + } + } + + if($info === true) echo '没有数据库数据:' . PHP_EOL . $nodata . PHP_EOL . '没有API文件:' . PHP_EOL .$noApiFile . PHP_EOL; + return $api; +} + +function setValue($values) +{ + $result = "array("; + foreach($values as $field => $value) + { + if(is_array($value)) + { + $result .= setValue($value); + } + else + { + $result .= "'$field' => '$value', "; + } + } + $result = trim($result, ", "); + $result .= ')'; + return $result; +} + +$apiList = getApi($apiRoot, $apiFiles); +$caseRoot = dirname(__FILE__, 2) . '/checkapi'; + +function createCase($caseRoot, $apiList) +{ + if(!is_dir($caseRoot)) mkdir($caseRoot, 0777, true); + + foreach($apiList as $apiName => $api) + { + if(strpos($api['url'], ':')) + { + preg_match_all('/\/(:\w+)/', $api['url'], $matches); + $apiUrl = str_replace($matches[1], '1', $api['url']); + } + else + { + $apiUrl = $api['url']; + } + + foreach($api['method'] as $method => $methodValue) + { + $apiMethodUrl = $apiUrl; + $caseFile = $caseRoot . DS . $apiName . DS . $method; + if($method === 'get') + { + if($methodValue['params']) + { + $queryParams = json_decode($methodValue['params'])->query; + + $querys = '?'; + foreach($queryParams as $queryParam) $querys .= $queryParam->field . '=&'; + + $apiMethodUrl .= rtrim($querys, "&"); + } + $testData = "array('token' => \$token->token)"; + } + + if($method === 'post' or $method === 'put') + { + if($methodValue['example'] !== '') + { + $testData = "array("; + + $examples = json_decode(str_replace('"', '"', $methodValue['example']), true); + + foreach($examples as $key => $value) + { + if(is_array($value)) + { + $paramValue = setValue($value); + } + else + { + $paramValue = "'$value'"; + } + $testData .= "'" . $key . "' => " . $paramValue . ", "; + } + + if($apiMethodUrl == "/tokens") + { + $testData = rtrim($testData, ", ") . ")"; + } + else + { + $testData = rtrim($testData, ", ") . "), array('token' => \$token->token)"; + } + } + else + { + $testData = "array('token' => \$token->token)"; + } + } + $testData = "array('token' => \$token->token)"; + + $caseContent = <<> 0 + + */ + \$%s = \$rest->%s('%s', %s); + + r(\$%s) && c(200) && p() && e('0'); // 通用api检查 + caseContent; + + $caseContent = sprintf($caseContent, $apiName . "测试" . $method, $apiName, $method, $apiMethodUrl, $testData, $apiName); + + if(!is_dir(dirname($caseFile))) mkdir(dirname($caseFile), 0777, true); + file_put_contents($caseFile, $caseContent); + } + } +} +createCase($caseRoot, $apiList); From 03f858361d87a80635ce62f22050efc1a2b72a2f Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 9 Sep 2022 15:57:58 +0800 Subject: [PATCH 089/168] * Fix bug #27448. --- module/testcase/model.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/module/testcase/model.php b/module/testcase/model.php index ca01f5dca2..29aa2d91dd 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -815,10 +815,7 @@ class testcaseModel extends model if($oldCase->lib != 0) { /* Remove the require field named story when the case is a lib case.*/ - $requiredFieldsArr = explode(',', $requiredFields); - $fieldIndex = array_search('story', $requiredFieldsArr); - array_splice($requiredFieldsArr, $fieldIndex, 1); - $requiredFields = implode(',', $requiredFieldsArr); + $requiredFields = str_replace(',story,', ',', ",$requiredFields,"); } $case = $this->loadModel('file')->processImgURL($case, $this->config->testcase->editor->edit['id'], $this->post->uid); $this->dao->update(TABLE_CASE)->data($case, 'deleteFiles')->autoCheck()->batchCheck($requiredFields, 'notempty')->checkFlow()->where('id')->eq((int)$caseID)->exec(); From 4e10ea8fe6fbbcf6720db7d8b03a87bd506611aa Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 9 Sep 2022 16:05:02 +0800 Subject: [PATCH 090/168] * Fix code format. --- test/lib/init.php | 2 +- test/lib/initapi.php | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/test/lib/init.php b/test/lib/init.php index 17f067a466..6295833f11 100644 --- a/test/lib/init.php +++ b/test/lib/init.php @@ -61,7 +61,7 @@ $config->zdPath = dirname(dirname(__FILE__)) . '/tools/zd'; include $testPath . 'config/config.php'; include $testPath. 'lib/db.class.php'; include $testPath. 'lib/rest.php'; -$db = new db(); +$db = new db(); $rest = new rest($config->test->base); if(isset($config->test->account, $config->test->password)) diff --git a/test/lib/initapi.php b/test/lib/initapi.php index edeaa496a1..b7270bd63e 100644 --- a/test/lib/initapi.php +++ b/test/lib/initapi.php @@ -58,7 +58,7 @@ function getApi($apiRoot, $apiFiles, $info = false) } } - if($info === true) echo '没有数据库数据:' . PHP_EOL . $nodata . PHP_EOL . '没有API文件:' . PHP_EOL .$noApiFile . PHP_EOL; + if($info === true) echo '没有数据库数据:' . PHP_EOL . $nodata . PHP_EOL . '没有API文件:' . PHP_EOL . $noApiFile . PHP_EOL; return $api; } @@ -76,8 +76,7 @@ function setValue($values) $result .= "'$field' => '$value', "; } } - $result = trim($result, ", "); - $result .= ')'; + $result = trim($result, ", ") . ')'; return $result; } @@ -123,7 +122,6 @@ function createCase($caseRoot, $apiList) if($methodValue['example'] !== '') { $testData = "array("; - $examples = json_decode(str_replace('"', '"', $methodValue['example']), true); foreach($examples as $key => $value) From b5630098eb9dc405f245eff4ce0cce4f66e6dce8 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 9 Sep 2022 16:10:34 +0800 Subject: [PATCH 091/168] * Fix bug #27449. --- module/bug/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index dbb79b8230..5418527c3a 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -1014,13 +1014,13 @@ class bugModel extends model * * @param int $bugID * @access public - * @return string + * @return array */ public function assign($bugID) { $now = helper::now(); $oldBug = $this->getById($bugID); - if($oldBug->status == 'closed') return false; + if($oldBug->status == 'closed') return array(); $bug = fixer::input('post') ->add('id', $bugID) From 3251d92f474ed6afee0e6c84b1f3cf687e7457a9 Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 9 Sep 2022 16:10:46 +0800 Subject: [PATCH 092/168] * Fix config of unittest. --- test/config/config.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/config/config.php b/test/config/config.php index 7dc8d5e75f..f2dad7e19c 100644 --- a/test/config/config.php +++ b/test/config/config.php @@ -1,9 +1,9 @@ test = new stdclass; -$config->test->dbPrefix = "db_"; //复制数据库的数据库前缀,便于区分复制数据库 -$config->test->rawDB = 'zentao16pms'; //要复制的数据库,也就是ztest init初始化的数据库 -$config->test->dbNum = 10; //复制数据库的数量,可以根据自己的需要自行调节 +$config->test->dbPrefix = "db_"; //复制数据库的数据库前缀,便于区分复制数据库 +$config->test->rawDB = ''; //要复制的数据库,也就是ztest init初始化的数据库,例子:zentaounittest +$config->test->dbNum = 10; //复制数据库的数量,可以根据自己的需要自行调节 -$config->test->base = 'http://liyang.oop.cc:8072/max/api.php/v1'; //api测试基准路径 -$config->test->account = 'admin'; //api测试登录账户 -$config->test->password = 'Ly123456'; //api测试账户密码 +$config->test->base = ''; //api测试基准路径,例子:http://liyang.oop.cc:8072/max/api.php/v1 +$config->test->account = ''; //api测试登录账户,例子:admin +$config->test->password = ''; //api测试账户密码,例子:Ly123456 From 0881e39c543682d487d354c79185f0b6cfc3d67b Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 9 Sep 2022 16:14:08 +0800 Subject: [PATCH 093/168] * adjust for multi task. --- module/project/model.php | 2 +- module/task/control.php | 2 +- module/task/css/recordestimate.css | 6 ++++-- module/task/js/editestimate.js | 12 ------------ module/task/js/recordestimate.js | 16 ++++++++++------ module/task/lang/de.php | 2 +- module/task/lang/en.php | 2 +- module/task/lang/fr.php | 2 +- module/task/lang/zh-cn.php | 2 +- module/task/model.php | 19 ++++++++++++------- module/task/view/editestimate.html.php | 24 +++++++++++++++++++++++- module/task/view/recordestimate.html.php | 18 ++++++++++++++++-- module/task/view/view.html.php | 9 +++------ module/weekly/model.php | 2 +- 14 files changed, 75 insertions(+), 43 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 42d8d4d869..64e107c2ab 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -443,7 +443,7 @@ class projectModel extends model else { $task->progress = 0; - if(($task->consumed + $task->left) > 0) $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; + if(($task->consumed + $task->left) > 0) $task->progress = round($task->consumed / ($task->consumed + $task->left) * 100, 2); $EV += round($task->estimate * $task->progress / 100, 2); } } diff --git a/module/task/control.php b/module/task/control.php index ec0881ee7e..efe0fd01dc 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -1079,7 +1079,7 @@ class task extends control return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData, $regionID)")); } - if($output['from'] == 'taskkanban') + if(isset($output['from']) and $output['from'] == 'taskkanban') { $taskSearchValue = $this->session->taskSearchValue ? $this->session->taskSearchValue : ''; $kanbanData = $this->loadModel('kanban')->getExecutionKanban($task->execution, $execLaneType, $execGroupBy, $taskSearchValue); diff --git a/module/task/css/recordestimate.css b/module/task/css/recordestimate.css index 3a3a23d572..a3f8ccb7c3 100644 --- a/module/task/css/recordestimate.css +++ b/module/task/css/recordestimate.css @@ -1,6 +1,6 @@ .table-recorded thead{background: rgb(245 245 245);} .form-condensed .table-form {margin-bottom: 20px;} -.hours {display: flex; float: left; transform: translate(0, 50%); margin: 0 0 0 10px;} +.hours {display: flex; float: left; transform: translate(0, 50%); margin: 0;} .estimateTotally, .consumedTotally {border-radius: 9px; padding: 3px 7px; margin: 0 5px 0 5px; min-width: 18px;} .consumedTotally {background: #EAF3FF; color: #2B80FF;} .estimateTotally {background: #FFEFEF; color: #FF6262;} @@ -13,4 +13,6 @@ .icon-calendar {color: rgb(22, 168, 248)} #recordForm .table>thead>tr>th{ border: none} .main-header {border-bottom: none !important} -.body-modal .main-header>h2 { max-width: 70% !important;} +.main-header ul.hours:before{content:"("} +.main-header ul.hours:after{content:")"} +.body-modal .main-header>h2 { max-width: 70% !important; margin-right:0px;} diff --git a/module/task/js/editestimate.js b/module/task/js/editestimate.js index d9cdb02abe..aa27776f00 100644 --- a/module/task/js/editestimate.js +++ b/module/task/js/editestimate.js @@ -1,15 +1,3 @@ -/** - * Confirm left. - * - * @access public - * @return bool - */ -function confirmLeft() -{ - $left = $('#left'); - if(!$left.prop('readonly') && $left.val() === '0') return confirm(confirmRecord); -} - $(function() { $('.form-date').datetimepicker('setEndDate', today); diff --git a/module/task/js/recordestimate.js b/module/task/js/recordestimate.js index 8f0f0c86ee..bac93375f7 100644 --- a/module/task/js/recordestimate.js +++ b/module/task/js/recordestimate.js @@ -2,20 +2,24 @@ $(function() { $('.form-date').datetimepicker('setEndDate', today); - $("#recordForm").submit(function() + $("#recordForm #submit").click(function(e, confirmed) { + if(confirmed) return true; + + var $this = $(this); $('#recordForm .left').each(function() { if($(this).val() !== '' && !$(this).prop('readonly')) left = $(this).val(); }); + if(typeof(left) != 'undefined' && left == '0') { - var confirmMsg = confirm(confirmRecord); - if(confirmMsg == false) + e.preventDefault(); + bootbox.confirm(confirmRecord, function(result) { - $('#submit').attr("disabled", false); - return false; - } + if(!result) $('#submit').attr("disabled", false); + if(result) $this.trigger('click', true); + }); } }); diff --git a/module/task/lang/de.php b/module/task/lang/de.php index a7e3f74b7b..816adcc8aa 100644 --- a/module/task/lang/de.php +++ b/module/task/lang/de.php @@ -232,7 +232,7 @@ $lang->task->remindIssue = "This task is converted from a issue. D $lang->task->confirmChangeExecution = "Wenn Sie {$lang->executionCommon} ändern, das verwendete Modul, Story and Assignor will be changed. Do you want to do it?"; $lang->task->confirmFinish = '"Reststunden " sind 0. Möchten Sue den Status auf Erledigt setzen?'; $lang->task->confirmRecord = '"Reststunden " sind 0. Möchten Sie den Task auf Erledigt setzen?'; -$lang->task->confirmTransfer = '"Reststunden " sind 0. Möchten Sie den Task transferieren?'; +$lang->task->confirmTransfer = '"Left Hour" is 0,Do you want to assign to %s task?'; $lang->task->noticeTaskStart = '"Cost Hour" and "Left Hour" cannot be 0 at the same time.'; $lang->task->noticeLinkStory = "Es wurde keine Story verknüpft. Sie können %s für dieses Projekt, anschließend %s."; $lang->task->noticeSaveRecord = 'Ihre Stunden wurden nicht gespeichrt. Bitte erst speichern.'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index 5238ca4189..c4d44a19b8 100755 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -232,7 +232,7 @@ $lang->task->remindIssue = "This task is converted from a issue. D $lang->task->confirmChangeExecution = "If you change {$lang->executionCommon}, Module, Story and AssignedTo will also be changed. Do you want to change it?"; $lang->task->confirmFinish = '"Left Hour" is 0. Do you want to change the status to "Finished"?'; $lang->task->confirmRecord = '"Left Hour" is 0. Do you want to set the task as "Finished"?'; -$lang->task->confirmTransfer = '"Left Hour" is 0,Do you want to transfer task?'; +$lang->task->confirmTransfer = '"Left Hour" is 0,Do you want to assign to %s task?'; $lang->task->noticeTaskStart = '"Cost Hour" and "Left Hour" cannot be 0 at the same time.'; $lang->task->noticeLinkStory = "No story has been linked. You can %s for this project, then %s."; $lang->task->noticeSaveRecord = 'Your Hour is not saved. Please save it first.'; diff --git a/module/task/lang/fr.php b/module/task/lang/fr.php index 2a5669d128..eb52bf4018 100644 --- a/module/task/lang/fr.php +++ b/module/task/lang/fr.php @@ -232,7 +232,7 @@ $lang->task->remindIssue = "This task is converted from a issue. D $lang->task->confirmChangeExecution = "Si vous changez {$lang->executionCommon}, Module, Story et AssignedTo seront également changés. Voulez-vous le faire ?"; $lang->task->confirmFinish = '"Heures Restantes" à 0. Voulez-vous passer le statut à "Terminée" ?'; $lang->task->confirmRecord = '"Heures Restantes" à 0. Voulez-vous passer le statut de la tâche à "Finie" ?'; -$lang->task->confirmTransfer = '"Heures Restantes" à 0. Voulez-vous transférer la tâche ?'; +$lang->task->confirmTransfer = '"Left Hour" is 0,Do you want to assign to %s task?'; $lang->task->noticeTaskStart = '"Cost Hour" and "Left Hour" cannot be 0 at the same time.'; $lang->task->noticeLinkStory = "Aucune Story n'est associée. Vous pouvez %s pour ce projet, alors %s."; $lang->task->noticeSaveRecord = "Votre temps n'a pas été sauvé. Enregistrez-le d'abord."; diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index c58afaeb99..1ec42d3afc 100755 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -232,7 +232,7 @@ $lang->task->remindIssue = "该任务为问题转化得到,是 $lang->task->confirmChangeExecution = "修改{$lang->executionCommon}会导致相应的所属模块、相关{$lang->SRCommon}和指派人发生变化,确定吗?"; $lang->task->confirmFinish = '"预计剩余"为0,确认将任务状态改为"已完成"吗?'; $lang->task->confirmRecord = '"剩余"为0,任务将标记为"已完成",您确定吗?'; -$lang->task->confirmTransfer = '"当前剩余"为0,任务将被转交,您确定吗?'; +$lang->task->confirmTransfer = '"当前剩余"为0,任务将被指派给:%s,您确定吗?'; $lang->task->noticeTaskStart = '"总计消耗"和"预计剩余"不能同时为0'; $lang->task->noticeLinkStory = "没有可关联的相关{$lang->SRCommon},您可以为当前项目%s,然后%s"; $lang->task->noticeSaveRecord = '您有尚未保存的工时记录,请先将其保存。'; diff --git a/module/task/model.php b/module/task/model.php index 262a8dd087..92c396b4c2 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1729,7 +1729,7 @@ class taskModel extends model { $task->status = 'done'; $task->finishedBy = $this->app->user->account; - $task->finishedDate = helper::now(); + $task->finishedDate = $now; $task->assignedTo = $oldTask->openedBy; } } @@ -1748,15 +1748,20 @@ class taskModel extends model if(!empty($oldTask->team) and $currentTeam) { - $data = new stdclass(); - $data->consumed = $this->post->consumed; - $data->left = $this->post->left; - $data->status = 'doing'; + $team = new stdclass(); + $team->consumed = $this->post->consumed; + $team->left = $this->post->left; + $team->status = empty($data->left) ? 'done' : 'doing'; - $this->dao->update(TABLE_TASKTEAM)->data($data)->where('id')->eq($currentTeam->id)->exec(); + $this->dao->update(TABLE_TASKTEAM)->data($team)->where('id')->eq($currentTeam->id)->exec(); if($oldTask->mode == 'linear') $this->updateEstimateOrder($estimateID, $currentTeam->order); $task = $this->computeHours4Multiple($oldTask, $task); + if($team->status == 'done') + { + $task->assignedTo = $this->getAssignedTo4Multi($oldTask->team, $oldTask, 'next'); + $task->assignedDate = $now; + } $finishedUsers = $this->getFinishedUsers($oldTask->id, array_keys($oldTask->members)); if(count($finishedUsers) == count($oldTask->team)) @@ -3933,7 +3938,7 @@ class taskModel extends model foreach($users as $i => $account) { - if(isset($teamHours[$i]) and $teamHours[$i]->status == 'done') continue; + if(isset($teamHours[$i]) and $teamHours[$i]->status == 'done') continue; if($type == 'current') return $account; break; } diff --git a/module/task/view/editestimate.html.php b/module/task/view/editestimate.html.php index 5dbf6278fb..adcf41f721 100644 --- a/module/task/view/editestimate.html.php +++ b/module/task/view/editestimate.html.php @@ -19,7 +19,7 @@

    task->editEstimate;?>

    - isLast) echo "onsubmit='return confirmLeft();'"?>> + @@ -47,4 +47,26 @@ +isLast):?> + + diff --git a/module/task/view/recordestimate.html.php b/module/task/view/recordestimate.html.php index 8f70f88c3c..63d4306d85 100644 --- a/module/task/view/recordestimate.html.php +++ b/module/task/view/recordestimate.html.php @@ -13,7 +13,21 @@ members;?> -mode == 'linear' && $task->assignedTo != end($members)) ? $lang->task->confirmTransfer : $lang->task->confirmRecord);?> +task->confirmRecord; +if(!empty($members) && $task->mode == 'linear') +{ + $nextAccount = ''; + $isCurrent = false; + foreach($task->team as $taskTeam) + { + if($isCurrent) $nextAccount = $taskTeam->account; + if($task->assignedTo == $taskTeam->account and $taskTeam->account == $app->user->account and $taskTeam->status != 'done') $isCurrent = true; + } + if($nextAccount) $confirmRecord = sprintf($lang->task->confirmTransfer, zget($users, $nextAccount)); +} +?> +task->noticeSaveRecord);?>
    @@ -26,7 +40,7 @@ diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index 5caec05056..47e1697c39 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -24,8 +24,8 @@
    id?> - parent > 0) echo '' . $this->lang->task->childrenAB . '';?> - team)) echo '' . $this->lang->task->multipleAB . '';?> + team)) echo '' . $lang->task->multipleAB . (common::checkNotCN() ? ' ' : '') . $lang->task->modeList[$task->mode] . '';?> + parent > 0) echo '' . $lang->task->childrenAB . '';?> parent > 0) echo isset($task->parentName) ? html::a(inlink('view', "taskID={$task->parent}"), $task->parentName) . ' / ' : '';?>name;?> deleted):?> @@ -354,10 +354,7 @@ team as $member):?>
    - + diff --git a/module/weekly/model.php b/module/weekly/model.php index 666d8f8ff1..44f683f754 100755 --- a/module/weekly/model.php +++ b/module/weekly/model.php @@ -434,7 +434,7 @@ class weeklyModel extends model else { $task->progress = 0; - if(($task->consumed + $task->left) > 0) $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; + if(($task->consumed + $task->left) > 0) $task->progress = round($task->consumed / ($task->consumed + $task->left) * 100, 2); $EV += round($thisPV * $task->progress / 100, 2); } $PV += $thisPV; From 46a7c7f409c34783772a76b13856ee30ca5a614b Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 9 Sep 2022 16:14:16 +0800 Subject: [PATCH 094/168] * Fix bug #27450. --- module/kanban/css/space.css | 1 + 1 file changed, 1 insertion(+) diff --git a/module/kanban/css/space.css b/module/kanban/css/space.css index 1b58d9edcc..66ebfd7f95 100644 --- a/module/kanban/css/space.css +++ b/module/kanban/css/space.css @@ -26,6 +26,7 @@ .kanbans .panel .label-closed {background: #AAA !important; color: #FFF; margin-top:-6px;} .kanbans .panel-body {padding: 0 16px 16px;} .kanbans .kanban-desc {color: #838a9d; word-break:break-all; height: 70px; overflow: hidden; float:left;} +.kanbans .kanban-desc > * {float: left;} .kanbans .kanban-footer {position: absolute; bottom: 10px; right: 10px; left: 15px;} .kanbans .kanban-members {float: left; height: 24px; line-height: 24px;} .kanbans .kanban-members > div {display: inline-block; height: 24px;} From cbfe513c5ba291d9142ef5c22346f419bd7fc97e Mon Sep 17 00:00:00 2001 From: liyang Date: Fri, 9 Sep 2022 16:23:28 +0800 Subject: [PATCH 095/168] * Add methods comment. --- test/lib/initapi.php | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/test/lib/initapi.php b/test/lib/initapi.php index b7270bd63e..cff9eee53d 100644 --- a/test/lib/initapi.php +++ b/test/lib/initapi.php @@ -7,6 +7,15 @@ $apiRoot = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'api/v1/ $apiFiles = scandir($apiRoot); $apiFiles = array_splice($apiFiles, 2); +/** + * Get api List from the file and database. + * + * @param string $apiRoot + * @param string $apiFiles + * @param boole $info + * @access public + * @return array + */ function getApi($apiRoot, $apiFiles, $info = false) { global $config, $dao; @@ -62,6 +71,13 @@ function getApi($apiRoot, $apiFiles, $info = false) return $api; } +/** + * Set the value of the parameter. + * + * @param string $values + * @access public + * @return string + */ function setValue($values) { $result = "array("; @@ -83,6 +99,14 @@ function setValue($values) $apiList = getApi($apiRoot, $apiFiles); $caseRoot = dirname(__FILE__, 2) . '/checkapi'; +/** + * Batch create API cases. + * + * @param string $caseRoot + * @param string $apiList + * @access public + * @return void + */ function createCase($caseRoot, $apiList) { if(!is_dir($caseRoot)) mkdir($caseRoot, 0777, true); @@ -116,8 +140,7 @@ function createCase($caseRoot, $apiList) } $testData = "array('token' => \$token->token)"; } - - if($method === 'post' or $method === 'put') + elseif($method === 'post' or $method === 'put') { if($methodValue['example'] !== '') { From 226029f1e56cd5c1cbd74854f62279f8004ca5f4 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Fri, 9 Sep 2022 16:34:08 +0800 Subject: [PATCH 096/168] * Fix bug #27451. --- module/bug/control.php | 10 +++++++--- module/bug/js/edit.js | 14 ++++++++++++++ module/bug/model.php | 5 +++-- module/bug/view/edit.html.php | 3 ++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index 14e5cf7de2..a77e087cab 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -2003,11 +2003,15 @@ class bug extends control * * @param int $bugID * @param string $browseType + * @param string $excludeBugs * @param int $param + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ - public function linkBugs($bugID, $browseType = '', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) + public function linkBugs($bugID, $browseType = '', $excludeBugs = '', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* Load pager. */ $this->app->loadClass('pager', $static = true); @@ -2022,11 +2026,11 @@ class bug extends control $this->qa->setMenu($this->products, $bug->product, $bug->branch); /* Build the search form. */ - $actionURL = $this->createLink('bug', 'linkBugs', "bugID=$bugID&browseType=bySearch&queryID=myQueryID", '', true); + $actionURL = $this->createLink('bug', 'linkBugs', "bugID=$bugID&browseType=bySearch&excludeBugs=$excludeBugs&queryID=myQueryID", '', true); $this->bug->buildSearchForm($bug->product, $this->products, $queryID, $actionURL); /* Get bugs to link. */ - $bugs2Link = $this->bug->getBugs2Link($bugID, $browseType, $queryID, $pager); + $bugs2Link = $this->bug->getBugs2Link($bugID, $browseType, $queryID, $pager, $excludeBugs); /* Assign. */ $this->view->title = $this->lang->bug->linkBugs . "BUG #$bug->id $bug->title - " . $this->products[$bug->product]; diff --git a/module/bug/js/edit.js b/module/bug/js/edit.js index e039379845..c077912cab 100644 --- a/module/bug/js/edit.js +++ b/module/bug/js/edit.js @@ -26,6 +26,20 @@ $(function() dropWidth : 'auto', maxAutoDropWidth : document.body.scrollWidth + document.getElementById('resolution').offsetWidth - document.getElementById('resolution').getBoundingClientRect().right }); + + $('#linkBugsLink').click(function() + { + var bugIdList = ''; + $('#linkBugsBox input').each(function() + { + bugIdList += $(this).val() + ','; + }); + + var link = createLink('bug', 'linkBugs', 'bugID=' + bugID + '&browseType=&excludeBugs=' + bugIdList, '', true); + + var modalTrigger = new $.zui.ModalTrigger({type: 'iframe', width: '95%', url: link}); + modalTrigger.show(); + }); }); /** diff --git a/module/bug/model.php b/module/bug/model.php index 5418527c3a..98f11bebb6 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -1526,15 +1526,16 @@ class bugModel extends model * @param string $browseType * @param int $queryID * @param object $pager + * @param string $excludeBugs * @access public * @return array */ - public function getBugs2Link($bugID, $browseType = 'bySearch', $queryID = 0, $pager = null) + public function getBugs2Link($bugID, $browseType = 'bySearch', $queryID = 0, $pager = null, $excludeBugs = '') { if($browseType == 'bySearch') { $bug = $this->getById($bugID); - $bugIDList = $bug->id . ',' . $bug->linkBug; + $bugIDList = $bug->id . ',' . $bug->linkBug . ',' . $excludeBugs; $bugs2Link = $this->getBySearch($bug->product, 'all', $queryID, 'id', $bugIDList, $pager); return $bugs2Link; } diff --git a/module/bug/view/edit.html.php b/module/bug/view/edit.html.php index 1b662bb77e..48cd5fea48 100644 --- a/module/bug/view/edit.html.php +++ b/module/bug/view/edit.html.php @@ -27,6 +27,7 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild); js::set('systemMode' , $config->systemMode); js::set('confirmUnlinkBuild' , sprintf($lang->bug->confirmUnlinkBuild, zget($resolvedBuilds, $bug->resolvedBuild))); js::set('tab' , $this->app->tab); +js::set('bugID' , $bug->id); js::set('bugBranch' , $bug->branch); js::set('isClosedBug' , $bug->status == 'closed'); if($this->app->tab == 'execution') js::set('objectID', $bug->execution); @@ -287,7 +288,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project); - + linkBugTitles)) echo 'class="hidden"';?>> From 638586bea2a7cf70578ef1ffe35b0b825be744f9 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 9 Sep 2022 16:44:09 +0800 Subject: [PATCH 097/168] * Fix bug#27445. --- module/product/model.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/module/product/model.php b/module/product/model.php index 95766d7eea..6d7da2880a 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -111,8 +111,7 @@ class productModel extends model } $this->session->set('currentProductType', $currentProduct->type); - $executionID = ($isQaModule and $this->app->tab == 'execution') ? $extra : 0; - $output = ''; + $output = ''; if(!empty($products)) { $dropMenuLink = helper::createLink($isQaModule ? 'bug' : 'product', 'ajaxGetDropMenu', "objectID=$productID&module=$currentModule&method=$currentMethod&extra=$extra"); @@ -127,8 +126,8 @@ class productModel extends model $this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$currentProduct->type]); $this->lang->product->menu->settings['subMenu']->branch = str_replace('@branch@', $this->lang->product->branch, $this->lang->product->menu->settings['subMenu']->branch); - $branches = $this->loadModel('branch')->getPairs($productID, 'all', $executionID); - $branchName = isset($branches[$branch]) ? $branches[$branch] : $branches[0]; + $branches = $this->loadModel('branch')->getPairs($productID, 'all'); + $branchName = $branches[$branch]; if(!$isMobile) { $dropMenuLink = helper::createLink('branch', 'ajaxGetDropMenu', "objectID=$productID&branch=$branch&module=$currentModule&method=$currentMethod&extra=$extra"); From 9868aee96b956eef4ea025097bcb3a81c0983218 Mon Sep 17 00:00:00 2001 From: lanzongjun Date: Fri, 9 Sep 2022 17:00:44 +0800 Subject: [PATCH 098/168] * add feedback data --- test/data/feedback.yaml | 219 +++++++++++++++++++++++++++++++ test/data/feedbackmodule.yaml | 79 +++++++++++ test/data/feedbackmoduleson.yaml | 79 +++++++++++ test/data/zentao/config.php | 57 ++++---- 4 files changed, 407 insertions(+), 27 deletions(-) create mode 100644 test/data/feedback.yaml create mode 100644 test/data/feedbackmodule.yaml create mode 100644 test/data/feedbackmoduleson.yaml diff --git a/test/data/feedback.yaml b/test/data/feedback.yaml new file mode 100644 index 0000000000..4fe0306a42 --- /dev/null +++ b/test/data/feedback.yaml @@ -0,0 +1,219 @@ +title: table zt_feedback +desc: "模块" +author: zongjun.lan +version: "1.0" +fields: + - field: id + note: "ID" + range: 1-1000 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: product + note: "所属产品" + range: 1-100{4} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: module + note: "所属模块" + range: 4521-4820{1} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: title + note: "标题" + range: 1-10000 + prefix: "反馈标题" + postfix: "" + loop: 0 + format: "" + - field: type + note: "反馈类型" + range: story,task,bug,todo,advice,issue,risk,opportunity + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: solution + note: "处理方案" + range: tobug,tostory,touserstory,totask,totodo + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: desc + note: "描述" + range: 1-10000 + prefix: "这是反馈描述" + postfix: "" + loop: 0 + format: "" + - field: status + note: "状态" + range: noreview,clarify,wait,commenting,replied,asked,closed + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: subStatus + note: "子状态" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: public + note: "公开" + range: 0,1 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: notify + note: "通知" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: notifyEmail + note: "通知邮箱" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: likes + note: "点赞人" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: result + note: "转化结果" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: faq + note: "FAQ" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: openedBy + note: "反馈创建人" + range: admin + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: openedDate + range: "(-1M)-(+1w):-1D" + type: timestamp + format: "YYYY-MM-DD hh:mm:ss" + - field: reviewedBy + note: "由谁评审" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: reviewedDate + note: "评审时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: processedBy + note: "由谁处理" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: processedDate + note: "处理时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: closedBy + note: "由谁关闭" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: closedDate + note: "关闭时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: closedReason + note: "关闭原因" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: editedBy + note: "最后处理人" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: editedDate + note: "最后修改时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: assignedTo + note: "指派给" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: assignedDate + note: "指派时间" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: feedbackBy + note: "反馈者" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: mailto + note: "抄送给" + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: deleted + note: "是否删除" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" diff --git a/test/data/feedbackmodule.yaml b/test/data/feedbackmodule.yaml new file mode 100644 index 0000000000..aa138815db --- /dev/null +++ b/test/data/feedbackmodule.yaml @@ -0,0 +1,79 @@ +title: table zt_module +desc: "模块" +author: zongjun.lan +version: "1.0" +fields: + - field: id + note: "ID" + range: 4521-4620 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: root + note: "根目录" + range: 1-100 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: branch + note: "分支" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: name + note: "模块名称" + range: 1-10000 + prefix: "feedback模块" + postfix: "" + loop: 0 + format: "" + - field: parent + note: "父ID" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: path + note: "ID路径" + fields: + - field: path1 + range: 4521-4620 + prefix: "," + postfix: "," + - field: path2 + range: [] + postfix: "" + format: "" + - field: grade + note: "等级" + range: 1 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: order + note: "排序" + range: 10-100:10 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: type + note: "对象类型" + range: feedback + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: deleted + note: "是否删除" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" diff --git a/test/data/feedbackmoduleson.yaml b/test/data/feedbackmoduleson.yaml new file mode 100644 index 0000000000..681b458972 --- /dev/null +++ b/test/data/feedbackmoduleson.yaml @@ -0,0 +1,79 @@ +title: table zt_module +desc: "模块" +author: zongjun.lan +version: "1.0" +fields: + - field: id + note: "ID" + range: 4621-4820 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: root + note: "根目录" + range: 1-100{2} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: branch + note: "分支" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: name + note: "模块名称" + range: 1-10000 + prefix: "feedback子模块" + postfix: "" + loop: 0 + format: "" + - field: parent + note: "父ID" + range: 4521-4620{2} + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: path + note: "ID路径" + fields: + - field: path1 + range: 4521-4620{2} + prefix: "," + postfix: "," + - field: path2 + range: 4621-4820 + postfix: "," + format: "" + - field: grade + note: "等级" + range: 2 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: order + note: "排序" + range: 10-100:10 + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: type + note: "对象类型" + range: feedback + prefix: "" + postfix: "" + loop: 0 + format: "" + - field: deleted + note: "是否删除" + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" diff --git a/test/data/zentao/config.php b/test/data/zentao/config.php index d67e57308f..41fc3856e9 100644 --- a/test/data/zentao/config.php +++ b/test/data/zentao/config.php @@ -21,33 +21,36 @@ $builder->project = array('rows' => 90, 'extends' => array('project', 'proj $builder->sprint = array('rows' => 600, 'extends' => array('project', 'execution')); $builder->projectalone = array('rows' => 20, 'extends' => array('project', 'projectalone')); -$builder->story = array('rows' => 400, 'extends' => array('story')); -$builder->childstory = array('rows' => 50, 'extends' => array('story','childstory')); -$builder->storyreview = array('rows' => 100, 'extends' => array('storyreview')); -$builder->storymodule = array('rows' => 800, 'extends' => array('module','storymodule')); -$builder->storymoduleson = array('rows' => 400, 'extends' => array('module','storymoduleson')); -$builder->storyplan = array('rows' => 400, 'extends' => array('planstory')); -$builder->storystage = array('rows' => 450, 'extends' => array('storystage')); -$builder->storyspec = array('rows' => 570, 'extends' => array('storyspec')); -$builder->storyestimate = array('rows' => 6, 'extends' => array('storyestimate')); -$builder->relation = array('rows' => 12, 'extends' => array('relation')); -$builder->task = array('rows' => 600, 'extends' => array('task','task')); -$builder->taskmore = array('rows' => 300, 'extends' => array('task','moretask')); -$builder->taskspec = array('rows' => 600, 'extends' => array('taskspec')); -$builder->taskmodule = array('rows' => 1800, 'extends' => array('module','taskmodule')); -$builder->taskmoduleson = array('rows' => 600, 'extends' => array('module','taskmoduleson')); -$builder->taskestimate = array('rows' => 600, 'extends' => array('taskestimate')); -$builder->taskson = array('rows' => 10, 'extends' => array('task', 'taskson')); -$builder->case = array('rows' => 400, 'extends' => array('case')); -$builder->libcase = array('rows' => 10, 'extends' => array('case','libcase')); -$builder->unitcase = array('rows' => 150, 'extends' => array('case','unitcase')); -$builder->casestep = array('rows' => 400, 'extends' => array('casestep')); -$builder->casemodule = array('rows' => 100, 'extends' => array('module', 'casemodule')); -$builder->casemoduleson = array('rows' => 200, 'extends' => array('module', 'casemoduleson')); -$builder->bug = array('rows' => 300, 'extends' => array('bug')); -$builder->morebug = array('rows' => 15, 'extends' => array('bug','morebug')); -$builder->bugmodule = array('rows' => 100, 'extends' => array('module','bugmodule')); -$builder->bugmoduleson = array('rows' => 200, 'extends' => array('module','bugmoduleson')); +$builder->story = array('rows' => 400, 'extends' => array('story')); +$builder->childstory = array('rows' => 50, 'extends' => array('story','childstory')); +$builder->storyreview = array('rows' => 100, 'extends' => array('storyreview')); +$builder->storymodule = array('rows' => 800, 'extends' => array('module','storymodule')); +$builder->storymoduleson = array('rows' => 400, 'extends' => array('module','storymoduleson')); +$builder->storyplan = array('rows' => 400, 'extends' => array('planstory')); +$builder->storystage = array('rows' => 450, 'extends' => array('storystage')); +$builder->storyspec = array('rows' => 570, 'extends' => array('storyspec')); +$builder->storyestimate = array('rows' => 6, 'extends' => array('storyestimate')); +$builder->relation = array('rows' => 12, 'extends' => array('relation')); +$builder->task = array('rows' => 600, 'extends' => array('task','task')); +$builder->taskmore = array('rows' => 300, 'extends' => array('task','moretask')); +$builder->taskspec = array('rows' => 600, 'extends' => array('taskspec')); +$builder->taskmodule = array('rows' => 1800, 'extends' => array('module','taskmodule')); +$builder->taskmoduleson = array('rows' => 600, 'extends' => array('module','taskmoduleson')); +$builder->taskestimate = array('rows' => 600, 'extends' => array('taskestimate')); +$builder->taskson = array('rows' => 10, 'extends' => array('task', 'taskson')); +$builder->case = array('rows' => 400, 'extends' => array('case')); +$builder->libcase = array('rows' => 10, 'extends' => array('case','libcase')); +$builder->unitcase = array('rows' => 150, 'extends' => array('case','unitcase')); +$builder->casestep = array('rows' => 400, 'extends' => array('casestep')); +$builder->casemodule = array('rows' => 100, 'extends' => array('module', 'casemodule')); +$builder->casemoduleson = array('rows' => 200, 'extends' => array('module', 'casemoduleson')); +$builder->bug = array('rows' => 300, 'extends' => array('bug')); +$builder->morebug = array('rows' => 15, 'extends' => array('bug','morebug')); +$builder->bugmodule = array('rows' => 100, 'extends' => array('module','bugmodule')); +$builder->bugmoduleson = array('rows' => 200, 'extends' => array('module','bugmoduleson')); +$builder->feedback = array('rows' => 100, 'extends' => array('feedback')); +$builder->feedbackmodule = array('rows' => 100, 'extends' => array('module','feedbackmodule')); +$builder->feedbackmoduleson = array('rows' => 200, 'extends' => array('module','feedbackmoduleson')); $builder->testtask = array('rows' => 100, 'extends' => array('testtask')); $builder->testresult = array('rows' => 70, 'extends' => array('testresult')); From 6c04f3fee3517f6d3191ae564b1a82e8744adad7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 13 Sep 2022 08:41:50 +0800 Subject: [PATCH 099/168] * ajax reload for effort. --- module/task/control.php | 4 ++-- module/task/js/recordestimate.js | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index efe0fd01dc..0862950065 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -1164,7 +1164,7 @@ class task extends control return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban(\"task\", $kanbanData)")); } - return print(js::closeModal('parent.parent', 'this')); + return print(js::reload('parent')); } return print(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); } @@ -1202,7 +1202,7 @@ class task extends control $actionID = $this->loadModel('action')->create('task', $estimate->task, 'EditEstimate', $this->post->work); $this->action->logHistory($actionID, $changes); - $url = $this->session->estimateList ? $this->session->estimateList : inlink('record', "taskID={$estimate->task}"); + $url = $this->session->estimateList ? $this->session->estimateList : inlink('recordEstimate', "taskID={$estimate->task}"); return print(js::locate($url, 'parent')); } diff --git a/module/task/js/recordestimate.js b/module/task/js/recordestimate.js index bac93375f7..d3a3326679 100644 --- a/module/task/js/recordestimate.js +++ b/module/task/js/recordestimate.js @@ -1,5 +1,18 @@ $(function() { + var parentLink = parent.location.href; + if(parentLink.indexOf('view') > 0) + { + $.get(parentLink, function(data) + { + $data = $(data); + parent.$('#actionbox ol.histories-list').html($data.find('#actionbox ol.histories-list').html()); + parent.$('.side-col').html($data.find('.side-col').html()); + + if(parent.$('#actionbox ol.histories-list #lastComment').length > 0) $(initKindeditor); + }); + } + $('.form-date').datetimepicker('setEndDate', today); $("#recordForm #submit").click(function(e, confirmed) From d88700a2e72c3ba6435b641e04b522344e00b369 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 13 Sep 2022 10:35:56 +0800 Subject: [PATCH 100/168] * adjust for notice manage task team. --- module/task/lang/de.php | 1 + module/task/lang/en.php | 1 + module/task/lang/fr.php | 1 + module/task/lang/zh-cn.php | 3 ++- module/task/view/taskteam.html.php | 7 +++++++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/module/task/lang/de.php b/module/task/lang/de.php index 816adcc8aa..c52b90ff42 100644 --- a/module/task/lang/de.php +++ b/module/task/lang/de.php @@ -236,6 +236,7 @@ $lang->task->confirmTransfer = '"Left Hour" is 0,Do you want to assi $lang->task->noticeTaskStart = '"Cost Hour" and "Left Hour" cannot be 0 at the same time.'; $lang->task->noticeLinkStory = "Es wurde keine Story verknüpft. Sie können %s für dieses Projekt, anschließend %s."; $lang->task->noticeSaveRecord = 'Ihre Stunden wurden nicht gespeichrt. Bitte erst speichern.'; +$lang->task->noticeManageTeam = 'Task status is %s, can not manage team.'; $lang->task->commentActions = '%s. %s, kommentiert von %s.'; $lang->task->deniedNotice = 'Nur %s kann die Aufgabe %s.'; $lang->task->deniedStatusNotice = 'The task status is %s, the effort cannot be maintained.'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index c4d44a19b8..fa64e7507a 100755 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -236,6 +236,7 @@ $lang->task->confirmTransfer = '"Left Hour" is 0,Do you want to assi $lang->task->noticeTaskStart = '"Cost Hour" and "Left Hour" cannot be 0 at the same time.'; $lang->task->noticeLinkStory = "No story has been linked. You can %s for this project, then %s."; $lang->task->noticeSaveRecord = 'Your Hour is not saved. Please save it first.'; +$lang->task->noticeManageTeam = 'Task status is %s, can not manage team.'; $lang->task->commentActions = '%s. %s, commented by %s.'; $lang->task->deniedNotice = 'Only the %s can %s the task.'; $lang->task->deniedStatusNotice = 'The task status is %s, the effort cannot be maintained.'; diff --git a/module/task/lang/fr.php b/module/task/lang/fr.php index eb52bf4018..15ecfa7c73 100644 --- a/module/task/lang/fr.php +++ b/module/task/lang/fr.php @@ -236,6 +236,7 @@ $lang->task->confirmTransfer = '"Left Hour" is 0,Do you want to assi $lang->task->noticeTaskStart = '"Cost Hour" and "Left Hour" cannot be 0 at the same time.'; $lang->task->noticeLinkStory = "Aucune Story n'est associée. Vous pouvez %s pour ce projet, alors %s."; $lang->task->noticeSaveRecord = "Votre temps n'a pas été sauvé. Enregistrez-le d'abord."; +$lang->task->noticeManageTeam = 'Task status is %s, can not manage team.'; $lang->task->commentActions = '%s. %s, commenté par %s.'; $lang->task->deniedNotice = 'Seulement le %s peut %s la tâche.'; $lang->task->deniedStatusNotice = 'The task status is %s, the effort cannot be maintained.'; diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 1ec42d3afc..a16df3a68c 100755 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -236,6 +236,7 @@ $lang->task->confirmTransfer = '"当前剩余"为0,任务将被指 $lang->task->noticeTaskStart = '"总计消耗"和"预计剩余"不能同时为0'; $lang->task->noticeLinkStory = "没有可关联的相关{$lang->SRCommon},您可以为当前项目%s,然后%s"; $lang->task->noticeSaveRecord = '您有尚未保存的工时记录,请先将其保存。'; +$lang->task->noticeManageTeam = '任务状态是%s,不能维护团队'; $lang->task->commentActions = '%s. %s, 由 %s 添加备注。'; $lang->task->deniedNotice = '当前任务只有%s才可以%s。'; $lang->task->deniedStatusNotice = '当前任务状态是%s,不能维护日志。'; @@ -253,7 +254,7 @@ $lang->task->error->recordMinus = '工时不能为负数'; $lang->task->error->leftNumber = '"预计剩余"必须为数字'; $lang->task->error->recordMinus = '工时不能为负数'; $lang->task->error->consumedSmall = '"总计消耗"必须大于之前消耗'; -$lang->task->error->consumedThisTime = '请填写"工时"'; +$lang->task->error->consumedThisTime = '请填写"消耗"'; $lang->task->error->left = '请填写"剩余"'; $lang->task->error->work = '"备注"必须小于%d个字符'; $lang->task->error->teamMember = '团队成员必须不少于2人'; diff --git a/module/task/view/taskteam.html.php b/module/task/view/taskteam.html.php index 4545f15908..b089ff7803 100644 --- a/module/task/view/taskteam.html.php +++ b/module/task/view/taskteam.html.php @@ -81,6 +81,13 @@ if($task->mode == 'multi' and $app->rawMethod == 'activate') $hourDisabled = fal status)):?> status);?> lang->task->error->leftEmptyAB, $this->lang->task->statusList[$task->status]));?> +rawMethod == 'edit'):?> + + + + + diff --git a/module/report/ext/view/manhourleftbar.html.php b/module/report/ext/view/manhourleftbar.html.php new file mode 100644 index 0000000000..756959a0ea --- /dev/null +++ b/module/report/ext/view/manhourleftbar.html.php @@ -0,0 +1,25 @@ + +
    +
    +
    +
    manhour->list;?>
    +
    +
    +
    + manhour->tableName; + echo html::a($this->createLink("manhour", "index", ""), ' ' . $lang->manhour->tableName, '', "class='selected' title='$title'"); + ?> +
    +
    +
    + config->edition == 'open'):?> +
    +
    + BIZ  isINT)) ? $lang->manhour->proVersionEn : $lang->manhour->proVersion;?> +
    +
    + +
    diff --git a/module/report/ext/view/manhourtable.html.php b/module/report/ext/view/manhourtable.html.php new file mode 100644 index 0000000000..8d6aedb24d --- /dev/null +++ b/module/report/ext/view/manhourtable.html.php @@ -0,0 +1,8 @@ +
    task->date;?>
    - account);?> - transfer) echo "({$lang->task->replace})";?> - account);?> estimate?> consumed?> left?>
    bug->linkBug;?>createLink('bug', 'linkBugs', "bugID=$bug->id", '', true), $lang->bug->linkBugs, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");?>bug->linkBugs, '', "class='text-primary' id='linkBugsLink'");?>
    +
    task->noticeManageTeam, zget($lang->task->statusList, $task->status));?>
    +
    + + + + + + +
    diff --git a/module/report/img.png b/module/report/img.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c2f92333afeac9392131d217b10076cc3a592a GIT binary patch literal 105522 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 Y%D(QKjNJz=v(EFwZCP8pHs>Ar6SqJL`~Uy| literal 0 HcmV?d00001 From 648efad24fa4662558cdbe536909b2e0492951c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B9=BF=E6=98=8E?= Date: Tue, 13 Sep 2022 03:29:20 +0000 Subject: [PATCH 105/168] Revert "* Add task effort report." This reverts commit 32119ec28dc6a5fda838fd0dd3e208fa02669af2 --- module/report/README.md | 10 - module/report/ext/control/consumed.php | 25 --- module/report/ext/control/manhour.php | 12 -- module/report/ext/control/projectlist.php | 11 -- module/report/ext/css/manhour/index.css | 26 --- module/report/ext/js/manhour/index.js | 61 ------ module/report/ext/lang/en/en.php | 33 ---- module/report/ext/lang/zh-cn/zh-cn.php | 33 ---- .../report/ext/model/class/manhour.class.php | 164 ---------------- module/report/ext/model/manhour.model.php | 59 ------ module/report/ext/view/manhour.html.php | 180 ------------------ .../report/ext/view/manhourleftbar.html.php | 25 --- module/report/ext/view/manhourtable.html.php | 8 - module/report/img.png | Bin 105522 -> 0 bytes 14 files changed, 647 deletions(-) delete mode 100644 module/report/README.md delete mode 100644 module/report/ext/control/consumed.php delete mode 100644 module/report/ext/control/manhour.php delete mode 100644 module/report/ext/control/projectlist.php delete mode 100644 module/report/ext/css/manhour/index.css delete mode 100644 module/report/ext/js/manhour/index.js delete mode 100644 module/report/ext/lang/en/en.php delete mode 100644 module/report/ext/lang/zh-cn/zh-cn.php delete mode 100644 module/report/ext/model/class/manhour.class.php delete mode 100644 module/report/ext/model/manhour.model.php delete mode 100644 module/report/ext/view/manhour.html.php delete mode 100644 module/report/ext/view/manhourleftbar.html.php delete mode 100644 module/report/ext/view/manhourtable.html.php delete mode 100644 module/report/img.png diff --git a/module/report/README.md b/module/report/README.md deleted file mode 100644 index d70fc9067c..0000000000 --- a/module/report/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# 禅道工时统计插件 -每日工时统计插件能够帮助您在禅道中查看各个项目的指定时间段内每一天的团队成员的工作量信息。 - -本插件是对禅道 `统计` 功能的扩展。 - -![效果图](img.png) - -# 使用方法 -1. 复制 `biz/report` 文件夹到 `custom/` 文件下 -2. 访问地址:https://yourdomain.xxx/index.php?m=report&f=manhour diff --git a/module/report/ext/control/consumed.php b/module/report/ext/control/consumed.php deleted file mode 100644 index 632feb7c69..0000000000 --- a/module/report/ext/control/consumed.php +++ /dev/null @@ -1,25 +0,0 @@ -viewType = "json"; - if (!isset($_POST['data'])) { - $this->send(array('error' => -1, 'msg' => "bad request")); - return; - } - $data = json_decode($_POST['data']); - if (!isset($data->projects) || !isset($data->beginDate) || !isset($data->endDate) || strtotime($data->beginDate) > strtotime($data->endDate)) { - $this->send(array('error' => -2, 'msg' => "bad request , wrong params")); - return; - } - $forAll = count($data->projects) == 0; // 如果project id list 为空 则返回符合条件的所有项目 - if($forAll){ - $res = $this->report->getAllProjectConsumeInfo($data->beginDate,$data->endDate); - }else{ - $res = $this->report->getProjectConsumeInfoByIdList($data->projects,$data->beginDate,$data->endDate); - } - echo json_encode($res); - } -} \ No newline at end of file diff --git a/module/report/ext/control/manhour.php b/module/report/ext/control/manhour.php deleted file mode 100644 index 9b1d71cff8..0000000000 --- a/module/report/ext/control/manhour.php +++ /dev/null @@ -1,12 +0,0 @@ -view->title = $this->lang->manhour->tableName; - $projectList = $this->report->getProjectPairList();; - $this->view->projectList = $projectList; - $this->display(); - } -} \ No newline at end of file diff --git a/module/report/ext/control/projectlist.php b/module/report/ext/control/projectlist.php deleted file mode 100644 index 0277a6172c..0000000000 --- a/module/report/ext/control/projectlist.php +++ /dev/null @@ -1,11 +0,0 @@ -loadModel('program')->getProjectList(); -// $projectList = $this->manhour->getProjectPairList(); - echo json_encode($projectList); - } -} \ No newline at end of file diff --git a/module/report/ext/css/manhour/index.css b/module/report/ext/css/manhour/index.css deleted file mode 100644 index e172af18d1..0000000000 --- a/module/report/ext/css/manhour/index.css +++ /dev/null @@ -1,26 +0,0 @@ -#sidebar > .cell { - width: 100% -} - -.cell.noDataCell { - /*display: none;*/ -} - -.cell.dataTableCell { - display: none; -} -.dataTable{ - width: 100%; -} - -.myTopTH,.myLeftTH,.myMidTH{ - width: 100px; - height: 30px; - line-height: 30px; - text-align: center; - margin: auto 0; -} - -.myTD{ - text-align: center; -} \ No newline at end of file diff --git a/module/report/ext/js/manhour/index.js b/module/report/ext/js/manhour/index.js deleted file mode 100644 index 8e4081eb12..0000000000 --- a/module/report/ext/js/manhour/index.js +++ /dev/null @@ -1,61 +0,0 @@ -$(".query-btn").click(function (e) { - $(".my-indicator").fadeIn(); - let projects = $("#selectedProjects").val(), - beginDate = $("#beginDate").val(), - endDate = $("#endDate").val() - if (projects === undefined || projects === null || projects.length === 0) { - projects = [] - } - const postData = { - projects, - beginDate, - endDate - } - $.ajax({ - url: './index.php?m=report&f=consumed', - method: "post", - data: { - data: JSON.stringify(postData) - }, - success: function (res) { - res = JSON.parse(res) - - const noDataCell = $('.cell.noDataCell'),dataTableCell = $('.cell.dataTableCell') - console.log(res) - if(res===undefined||res===null||res.length===0||res['error']!==undefined){ - noDataCell.show() - dataTableCell.hide() - if(res['error'] !== undefined){ - alert(res['msg']) - } - return - } - const html = createTable(res,beginDate,endDate) - $('.dataTable').html(html) - noDataCell.hide() - dataTableCell.show() - }, - - // contentType :'application/json' - }).done(function (r){ - $(".my-indicator").fadeOut() - }) -}) -Date.prototype.addDays = function (days) { - const date = new Date(this.valueOf()); - date.setDate(date.getDate() + days); - return date; -} - -function toNormalDateFormatString(MyDate) { - return MyDate.getFullYear() + '-' + ('0' + (MyDate.getMonth() + 1)).slice(-2) + '-' - + ('0' + MyDate.getDate()).slice(-2) -} - -function calcDiffDays(date1, date2) { - return Math.abs((date2 - date1) / 1000 / 60 / 60 / 24); -} - - - - diff --git a/module/report/ext/lang/en/en.php b/module/report/ext/lang/en/en.php deleted file mode 100644 index a91ca6c652..0000000000 --- a/module/report/ext/lang/en/en.php +++ /dev/null @@ -1,33 +0,0 @@ -manhour->program = 'Projects'; -$lang->manhour->index = 'Index'; -$lang->manhour->tableName = 'Daily Man-hour Table'; -$lang->manhour->projectName = 'Project Name'; -$lang->manhour->stuff = 'Stuff'; -$lang->manhour->startDate = 'Begin'; -$lang->manhour->endDate = 'End'; - -$lang->manhour->list = 'Report'; -$lang->manhour->item = 'Item'; -$lang->manhour->value = 'Value'; -$lang->manhour->percent = 'Percentage'; -$lang->manhour->undefined = 'Undefined'; -$lang->manhour->query = 'Query'; -$lang->manhour->annual = 'Annual Summary'; -$lang->manhour->project = 'Project'; -$lang->manhour->PO = 'PO'; -$lang->manhour->proVersion = 'Try ZenTao Biz for more!'; -$lang->manhour->proVersionEn = 'Try ZenTao Biz for more!'; - -$lang->manhour->colors[] = 'AFD8F8'; -$lang->manhour->colors[] = 'F6BD0F'; -$lang->manhour->colors[] = '8BBA00'; -$lang->manhour->colors[] = 'FF8E46'; -$lang->manhour->colors[] = '008E8E'; -$lang->manhour->colors[] = 'D64646'; -$lang->manhour->colors[] = '8E468E'; -$lang->manhour->colors[] = '588526'; -$lang->manhour->colors[] = 'B3AA00'; -$lang->manhour->colors[] = '008ED6'; -$lang->manhour->colors[] = '9D080D'; -$lang->manhour->colors[] = 'A186BE'; \ No newline at end of file diff --git a/module/report/ext/lang/zh-cn/zh-cn.php b/module/report/ext/lang/zh-cn/zh-cn.php deleted file mode 100644 index ad005be21a..0000000000 --- a/module/report/ext/lang/zh-cn/zh-cn.php +++ /dev/null @@ -1,33 +0,0 @@ -manhour->program = '项目'; -$lang->manhour->index = '统计首页'; -$lang->manhour->tableName = '每日工时统计表'; -$lang->manhour->projectName = '所属项目'; -$lang->manhour->stuff = '投入人员'; -$lang->manhour->startDate = '起始时间'; -$lang->manhour->endDate = '截止时间'; - -$lang->manhour->list = '统计报表'; -$lang->manhour->item = '条目'; -$lang->manhour->value = '值'; -$lang->manhour->percent = '百分比'; -$lang->manhour->undefined = '未设定'; -$lang->manhour->query = '查询'; -$lang->manhour->annual = '年度总结'; -$lang->manhour->project = '项目'; -$lang->manhour->PO = 'PO'; -$lang->manhour->proVersion = '更多精彩,尽在企业版!'; -$lang->manhour->proVersionEn = 'Try ZenTao Biz for more!'; - -$lang->manhour->colors[] = 'AFD8F8'; -$lang->manhour->colors[] = 'F6BD0F'; -$lang->manhour->colors[] = '8BBA00'; -$lang->manhour->colors[] = 'FF8E46'; -$lang->manhour->colors[] = '008E8E'; -$lang->manhour->colors[] = 'D64646'; -$lang->manhour->colors[] = '8E468E'; -$lang->manhour->colors[] = '588526'; -$lang->manhour->colors[] = 'B3AA00'; -$lang->manhour->colors[] = '008ED6'; -$lang->manhour->colors[] = '9D080D'; -$lang->manhour->colors[] = 'A186BE'; \ No newline at end of file diff --git a/module/report/ext/model/class/manhour.class.php b/module/report/ext/model/class/manhour.class.php deleted file mode 100644 index 345cd4dfed..0000000000 --- a/module/report/ext/model/class/manhour.class.php +++ /dev/null @@ -1,164 +0,0 @@ -loadModel('project')->getInfoList($status, $orderBy, $pager, $involved); - $result = array(); - foreach ($projects as $item) { - $key = $item->id; - $val = $item->name; - $result[$key] = $val; - } - return $result; - } - - /** - * Get Project Consume Information by Project ID - * @param $projectId - * @param $beginDate - * @param $endDate - * @return array - */ - public function getProjectConsumeInfoById($projectId, $beginDate, $endDate) - { - // select project,account,date,sum(consumed) as consumed from - // zt_taskestimate as t1 left join zt_task as t2 on t1.task=t2.id - // where project=${projectId} - // group by account,date - - return $this->dao->select('t2.project,t1.account,t3.realname,t3.nickname,t1.date,sum(t1.consumed) as consumed , count(t1.id) as mergedRow') - ->from(TABLE_TASKESTIMATE)->alias('t1')->leftJoin(TABLE_TASK)->alias('t2')->on('t1.task=t2.id') - ->leftJoin(TABLE_USER)->alias('t3')->on('t1.account=t3.account') - ->where('project')->eq($projectId) - ->andWhere('date')->between($beginDate, $endDate) - ->groupBy('account,date') - ->fetchGroup('date'); - } - - /** - * Get Project Consume Information by Project ID List - * @param $projectIdList - * @param $beginDate - * @param $endDate - * @return array - */ - public function getProjectConsumeInfoByIdList($projectIdList, $beginDate, $endDate) - { - $result = array(); - $projectNameMap = $this->getProjectPairList(); - for ($i = 0; $i < count($projectIdList); $i++) { - $projectInfo = new stdclass(); - $projectInfo->projectId = $projectIdList[$i]; - $projectInfo->projectName = $projectNameMap[$projectIdList[$i]]; - $projectInfo->consumeInfo = $this->getProjectConsumeInfoById($projectIdList[$i], $beginDate, $endDate); - if (count($projectInfo->consumeInfo) > 0) { - $projectInfo->users = $this->getUsers($projectInfo->consumeInfo); - $result[$i] = $projectInfo; - } - } - return $result; - } - - /** - * Get Project Consume Information for all the Projects - * @param $beginDate - * @param $endDate - * @return array - */ - public function getAllProjectConsumeInfo($beginDate, $endDate) - { - $result = array(); - $projectNameMap = $this->getProjectPairList(); - $i = 0; - foreach ($projectNameMap as $key => $val) { - $projectInfo = new stdclass(); - $projectInfo->projectId = $key; - $projectInfo->projectName = $val; - $projectInfo->consumeInfo = $this->getProjectConsumeInfoById($key, $beginDate, $endDate); - if (count($projectInfo->consumeInfo) > 0) { - $projectInfo->users = $this->getUsers($projectInfo->consumeInfo); - $result[$i++] = $projectInfo; - } - } - return $result; - } - - /** - * Extract Users Set from Consume Information - * @param $consumeInfo - * @return array - */ - public function getUsers($consumeInfo) - { - $users = array(); - $i=0; - foreach ($consumeInfo as $infos){ - foreach($infos as $val){ - $users[$i++] = $val->realname; - } - } - $i = 0; - $res = array(); - foreach (array_unique($users) as $item){ - $res[$i++] = $item; - } - return $res; - } - /** - * Get project info. - * - * @param string $status - * @param string $orderBy - * @param int $pager - * @param int $involved - * @access public - * @return array - */ - public function getInfoList($status = 'undone', $orderBy = 'order_desc', $pager = null, $involved = 0) - { - /* Init vars. */ - $projects = $this->loadModel('program')->getProjectList(0, $status, 0, $orderBy, $pager, 0, $involved); - if(empty($projects)) return array(); - - $projectIdList = array_keys($projects); - $teams = $this->dao->select('t1.root, count(t1.id) as count')->from(TABLE_TEAM)->alias('t1') - ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account') - ->where('t1.root')->in($projectIdList) - ->andWhere('t2.deleted')->eq(0) - ->groupBy('t1.root') - ->fetchAll('root'); - - $condition = $this->config->systemMode == 'classic' ? 't2.id as project' : 't2.parent as project'; - $estimates = $this->dao->select("$condition, sum(estimate) as estimate")->from(TABLE_TASK)->alias('t1') - ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution = t2.id') - ->where('t1.parent')->lt(1) - ->beginIF($this->config->systemMode == 'new')->andWhere('t2.parent')->in($projectIdList)->fi() - ->beginIF($this->config->systemMode == 'classic')->andWhere('t2.id')->in($projectIdList)->fi() - ->andWhere('t1.deleted')->eq(0) - ->andWhere('t2.deleted')->eq(0) - ->groupBy('project') - ->fetchAll('project'); - - $this->app->loadClass('pager', $static = true); - foreach($projects as $projectID => $project) - { - $orderBy = $project->model == 'waterfall' ? 'id_asc' : 'id_desc'; - $pager = $project->model == 'waterfall' ? null : new pager(0, 1, 1); - $project->executions = $this->loadModel('execution')->getStatData($projectID, 'undone', 0, 0, false, '', $orderBy, $pager); - $project->teamCount = isset($teams[$projectID]) ? $teams[$projectID]->count : 0; - $project->estimate = isset($estimates[$projectID]) ? round($estimates[$projectID]->estimate, 2) : 0; - $project->parentName = $this->getParentProgram($project); - } - return $projects; - } -} diff --git a/module/report/ext/model/manhour.model.php b/module/report/ext/model/manhour.model.php deleted file mode 100644 index bba2667a7f..0000000000 --- a/module/report/ext/model/manhour.model.php +++ /dev/null @@ -1,59 +0,0 @@ -loadExtension('manhour')->getProjectPairList($status , $orderBy, $pager, $involved); - return $projectList; -} -/** - * Get Project Consume Information by Project ID - * @param $projectId - * @param $beginDate - * @param $endDate - * @return array - */ -public function getProjectConsumeInfoById($projectId,$beginDate,$endDate) -{ - $projectList = $this->loadExtension('manhour')->getProjectConsumeInfoById($projectId,$beginDate,$endDate); - return $projectList; -} -/** - * Get Project Consume Information by Project ID List - * @param $projectIdList - * @param $beginDate - * @param $endDate - * @return array - */ -public function getProjectConsumeInfoByIdList($projectIdList,$beginDate,$endDate) -{ - $projectList = $this->loadExtension('manhour')->getProjectConsumeInfoByIdList($projectIdList,$beginDate,$endDate); - return $projectList; -} -/** - * Get Project Consume Information for all the Projects - * @param $beginDate - * @param $endDate - * @return array - */ -public function getAllProjectConsumeInfo($beginDate,$endDate) -{ - $projectList = $this->loadExtension('manhour')->getAllProjectConsumeInfo($beginDate,$endDate); - return $projectList; -} -/** - * Extract Users Set from Consume Information - * @param $consumeInfo - * @return array - */ -public function getUsers($consumeInfo) -{ - $projectList = $this->loadExtension('manhour')->getUsers($consumeInfo); - return $projectList; -} \ No newline at end of file diff --git a/module/report/ext/view/manhour.html.php b/module/report/ext/view/manhour.html.php deleted file mode 100644 index 557d1407d2..0000000000 --- a/module/report/ext/view/manhour.html.php +++ /dev/null @@ -1,180 +0,0 @@ - - - -config->edition != 'open'): ?> - - - - array(), 'data' => array()); ?> - -
    -
    - -
    -
    -
    -
    -
    - manhour->program ?> - -
    -
    -
    -
    - manhour->startDate ?> -
    -
    -
    -
    -
    - manhour->endDate ?> -
    -
    -
    - -
    -
    -
    -
    -

    error->noData; ?>

    -
    -
    -
    -
    -
    -
    - manhour->tableName; ?> - - -
    - -
    -
    - - -
    -
    -
    -
    -
    - -
    - - diff --git a/module/report/ext/view/manhourleftbar.html.php b/module/report/ext/view/manhourleftbar.html.php deleted file mode 100644 index 756959a0ea..0000000000 --- a/module/report/ext/view/manhourleftbar.html.php +++ /dev/null @@ -1,25 +0,0 @@ - -
    -
    -
    -
    manhour->list;?>
    -
    -
    -
    - manhour->tableName; - echo html::a($this->createLink("manhour", "index", ""), ' ' . $lang->manhour->tableName, '', "class='selected' title='$title'"); - ?> -
    -
    -
    - config->edition == 'open'):?> -
    -
    - BIZ  isINT)) ? $lang->manhour->proVersionEn : $lang->manhour->proVersion;?> -
    -
    - -
    diff --git a/module/report/ext/view/manhourtable.html.php b/module/report/ext/view/manhourtable.html.php deleted file mode 100644 index 8d6aedb24d..0000000000 --- a/module/report/ext/view/manhourtable.html.php +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - -
    diff --git a/module/report/img.png b/module/report/img.png deleted file mode 100644 index a3c2f92333afeac9392131d217b10076cc3a592a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105522 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 Y%D(QKjNJz=v(EFwZCP8pHs>Ar6SqJL`~Uy| From 2ba29dd57482b7c3157a3871fda946191d6f8639 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 13 Sep 2022 13:03:21 +0800 Subject: [PATCH 106/168] * adjust for effort when restart task. --- module/task/model.php | 2 +- module/task/view/start.html.php | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/module/task/model.php b/module/task/model.php index 51c8936f6b..532e03dc2d 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1736,7 +1736,7 @@ class taskModel extends model /* Record consumed and left. */ $estimate = new stdclass(); - $estimate->date = helper::isZeroDate($task->realStarted) ? helper::today() : substr($task->realStarted, 0, 10); + $estimate->date = helper::today(); $estimate->task = $taskID; $estimate->consumed = zget($_POST, 'consumed', 0); $estimate->left = zget($_POST, 'left', 0); diff --git a/module/task/view/start.html.php b/module/task/view/start.html.php index 7ae33dafe4..87846e617b 100644 --- a/module/task/view/start.html.php +++ b/module/task/view/start.html.php @@ -65,14 +65,21 @@
    task->consumed;?>
    - team) ? $this->task->getTeamByAccount($task->team) : ''; - $consumed = !empty($currentTeam) ? (float)$currentTeam->consumed : $task->consumed; - ?> - task->hour;?> + task->hour;?>
    - + + + nameAB;?> execution->owner;?>
    task->status;?>
    - - - - - + getModuleRoot() . 'task/view/taskteam.html.php';?> - +
    -
    - task->estimateAB}'") ?> - task->hour;?> -
    -
    - - - -
    confirm, '', "class='btn btn-primary' data-dismiss='modal'");?>confirm, '', "class='btn btn-primary'");?>
    @@ -351,6 +342,7 @@ $(function() }) + + + diff --git a/www/js/zui/min.js b/www/js/zui/min.js index dbdd97c64d..a56b50b0e1 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-30 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-09-14 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -16,7 +16,7 @@ function(t,e,i){"$:nomunge";function n(){o=e[r](function(){a.each(function(){var * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ -function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(t){return r.raw?t:encodeURIComponent(t)}function i(t){return r.raw?t:decodeURIComponent(t)}function n(t){return e(r.json?JSON.stringify(t):String(t))}function o(t){0===t.indexOf('"')&&(t=t.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return t=decodeURIComponent(t.replace(s," ")),r.json?JSON.parse(t):t}catch(e){}}function a(t,e){var i=r.raw?t:o(t);return"function"==typeof e?e(i):i}var s=/\+/g,r=t.cookie=function(o,s,l){if(void 0!==s&&"function"!=typeof s){if(l=t.extend({},r.defaults,l),"number"==typeof l.expires){var c=l.expires,h=l.expires=new Date;h.setTime(+h+864e5*c)}return document.cookie=[e(o),"=",n(s),l.expires?"; expires="+l.expires.toUTCString():"",l.path?"; path="+l.path:"",l.domain?"; domain="+l.domain:"",l.secure?"; secure":""].join("")}for(var d=o?void 0:{},u=document.cookie?document.cookie.split("; "):[],p=0,f=u.length;p=0;t--)delete this.page[i[t]];this.set(a,this.page)}},s.prototype.pageRemove=function(t){"undefined"!=typeof this.page[t]&&(this.page[t]=null,this.pageSave())},s.prototype.pageClear=function(){this.page={},this.pageSave()},s.prototype.pageGet=function(t,e){var i=this.page[t];return void 0===e||null!==i&&void 0!==i?i:e},s.prototype.pageSet=function(t,i){e.isPlainObject(t)?e.extend(!0,this.page,t):this.page[this.serialize(t)]=i,this.pageSave()},s.prototype.check=function(){if(!this.enable&&!this.silence)throw new Error("Browser not support localStorage or enable status been set true.");return this.enable},s.prototype.length=function(){return this.check()?i.getLength?i.getLength():i.length:0},s.prototype.removeItem=function(t){return i.removeItem(t),this},s.prototype.remove=function(t){return this.removeItem(t)},s.prototype.getItem=function(t){return i.getItem(t)},s.prototype.get=function(t,e){var i=this.deserialize(this.getItem(t));return"undefined"!=typeof i&&null!==i||"undefined"==typeof e?i:e},s.prototype.key=function(t){return i.key(t)},s.prototype.setItem=function(t,e){return i.setItem(t,e),this},s.prototype.set=function(t,e){return void 0===e?this.remove(t):(this.setItem(t,this.serialize(e)),this)},s.prototype.clear=function(){return i.clear(),this},s.prototype.forEach=function(t){for(var e=this.length(),n=e-1;n>=0;n--){var o=i.key(n);t(o,this.get(o))}return this},s.prototype.getAll=function(){var t={};return this.forEach(function(e,i){t[e]=i}),t},s.prototype.serialize=function(t){return"string"==typeof t?t:JSON.stringify(t)},s.prototype.deserialize=function(t){if("string"==typeof t)try{return JSON.parse(t)}catch(e){return t||void 0}},e.zui({store:new s})}(window,jQuery),function(t){"use strict";var e="zui.searchBox",i=function(e,n){var o=this;o.name=name,o.$=t(e),o.options=n=t.extend({},i.DEFAULTS,o.$.data(),n);var a=o.$.is(n.inputSelector)?o.$:o.$.find(n.inputSelector);if(a.length){var s=function(){o.changeTimer&&(clearTimeout(o.changeTimer),o.changeTimer=null)},r=function(){s();var t=o.getSearch();if(t!==o.lastValue){var e=""===t;a.toggleClass("empty",e),o.$.callComEvent(o,"onSearchChange",[t,e]),o.lastValue=t}};o.$input=a=a.first(),a.on(n.listenEvent,function(t){o.changeTimer=setTimeout(function(){r()},n.changeDelay)}).on("focus",function(t){a.addClass("focus"),o.$.callComEvent(o,"onFocus",[t])}).on("blur",function(t){a.removeClass("focus"),o.$.callComEvent(o,"onBlur",[t])}).on("keydown",function(t){var e=0,i=t.which;27===i&&n.escToClear?(this.setSearch("",!0),r(),e=1):13===i&&n.onPressEnter&&(r(),o.$.callComEvent(o,"onPressEnter",[t]));var a=o.$.callComEvent(o,"onKeyDown",[t]);a===!1&&(e=1),e&&t.preventDefault()}),o.$.on("click",".search-clear-btn",function(t){o.setSearch("",!0),r(),o.focus(),t.preventDefault()}),r()}else console.error("ZUI: search box init error, cannot find search box input element.")};i.DEFAULTS={inputSelector:'input[type="search"],input[type="text"]',listenEvent:"change input paste",changeDelay:500},i.prototype.getSearch=function(){return this.$input&&t.trim(this.$input.val())},i.prototype.setSearch=function(t,e){var i=this.$input;i&&(i.val(t),e||i.trigger("change"))},i.prototype.focus=function(){this.$input&&this.$input.focus()},t.fn.searchBox=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[n]()})},i.NAME=e,t.fn.searchBox.Constructor=i}(jQuery),function(t,e){"use strict";var i="zui.draggable",n={container:"body",move:!0},o=0,a=function(e,i){var a=this;a.$=t(e),a.id=o++,a.options=t.extend({},n,a.$.data(),i),a.init()};a.DEFAULTS=n,a.NAME=i,a.prototype.init=function(){var n,o,a,s,r,l=this,c=l.$,h="before",d="drag",u="finish",p="."+i+"."+l.id,f="mousedown"+p,g="mouseup"+p,m="mousemove"+p,v=l.options,y=v.selector,b=v.handle,w=c,x="function"==typeof v.move,C=function(t){var e=t.pageX,i=t.pageY;r=!0;var o={left:e-a.x,top:i-a.y};w.removeClass("drag-ready").addClass("dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[d]&&v[d]({event:t,element:w,startOffset:a,pos:o,offset:{x:e-n.x,y:i-n.y},smallOffset:{x:e-s.x,y:i-s.y}}),s.x=e,s.y=i,v.stopPropagation&&t.stopPropagation()},_=0,k=function(e){_&&(t.zui.clearAsap||clearTimeout)(_),_=(t.zui.asap||setTimeout)(function(){_=0,C(e)},0)},T=function(i){if(t(e).off(p),!r)return void w.removeClass("drag-ready");var o={left:i.pageX-a.x,top:i.pageY-a.y};w.removeClass("drag-ready dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[u]&&v[u]({event:i,element:w,startOffset:a,pos:o,offset:{x:i.pageX-n.x,y:i.pageY-n.y},smallOffset:{x:i.pageX-s.x,y:i.pageY-s.y}}),i.preventDefault(),v.stopPropagation&&i.stopPropagation()},S=function(i){var l=t.zui.getMouseButtonCode(v.mouseButton);if(!(l>-1&&i.button!==l)){var c=t(this);if(y&&(w=b?c.closest(y):c),v[h]){var d=v[h]({event:i,element:w});if(d===!1)return}var u=t(v.container),p=w.offset();o=u.offset(),n={x:i.pageX,y:i.pageY},a={x:i.pageX-p.left+o.left,y:i.pageY-p.top+o.top},s=t.extend({},n),r=!1,w.addClass("drag-ready"),i.preventDefault(),v.stopPropagation&&i.stopPropagation(),t(e).on(m,k).on(g,T)}};b?c.on(f,b,S):y?c.on(f,y,S):c.on(f,S)},a.prototype.destroy=function(){var n="."+i+"."+this.id;this.$.off(n),t(e).off(n),this.$.data(i,null)},t.fn.draggable=function(e){return this.each(function(){var n=t(this),o=n.data(i),s="object"==typeof e&&e;o||n.data(i,o=new a(this,s)),"string"==typeof e&&o[e]()})},t.fn.draggable.Constructor=a}(jQuery,document),function(t,e,i){"use strict";var n="zui.droppable",o={target:".droppable-target",deviation:5,sensorOffsetX:0,sensorOffsetY:0,dropToClass:"drop-to",dropTargetClass:"drop-target"},a=0,s=function(e,i){var n=this;n.id=a++,n.$=t(e),n.options=t.extend({},o,n.$.data(),i),n.init()};s.DEFAULTS=o,s.NAME=n,s.prototype.trigger=function(e,i){return t.zui.callEvent(this.options[e],i,this)},s.prototype.init=function(){var o,a,s,r,l,c,h,d,u,p,f,g,m,v,y=this,b=y.$,w=y.options,x=w.deviation,C="."+n+"."+y.id,_="mousedown"+C,k="mouseup"+C,T="mousemove"+C,S=w.selector,D=w.handle,M=w.flex,L=w.canMoveHere,z=w.dropToClass,P=w.noShadow,$=b,I=!1;w.dropOnMouseleave&&(k+=" mouseleave"+C);var F=function(e){if(I){if(g={left:e.pageX,top:e.pageY},!r){if(i.abs(g.left-u.left)a&&g.top>s&&g.left-1&&i.button!==n)){var g=t(this);S&&($=D?g.closest(S):g),$.hasClass("drag-shadow")||w.before&&w.before({event:i,element:$})===!1||(I=!0,o=w.container?"function"==typeof w.container?w.container($,b):t(w.container).first():S?b:t("body"),a="function"==typeof w.target?w.target($,b):o.find(w.target),s=null,r=null,l=!1,c=!0,h=null,d=$.offset(),p=o.offset(),p.top=p.top-o.scrollTop(),p.left=p.left-o.scrollLeft(),u={left:i.pageX,top:i.pageY},m=t.extend({},u),f={left:u.left-d.left,top:u.top-d.top},$.addClass("drag-from"),t(e).on(T,E).on(k,O),v=setTimeout(function(){t(e).on(_,O)},10),i.preventDefault(),w.stopPropagation&&i.stopPropagation())}};D?b.on(_,D,R):S?b.on(_,S,R):b.on(_,R)},s.prototype.destroy=function(){var i="."+n+"."+this.id;this.$.off(i),t(e).off(i),this.$.data(n,null)},s.prototype.reset=function(){this.destroy(),this.init()},t.fn.droppable=function(e){return this.each(function(){var i=t(this),o=i.data(n),a="object"==typeof e&&e;o||i.data(n,o=new s(this,a)),"string"==typeof e&&o[e]()})},t.fn.droppable.Constructor=s}(jQuery,document,Math),+function(t,e){"use strict";function i(e,i,a){return this.each(function(){var s=t(this),r=s.data(n),l=t.extend({},o.DEFAULTS,s.data(),"object"==typeof e&&e);r||s.data(n,r=new o(this,l)),"string"==typeof e?r[e](i,a):l.show&&r.show(i,a)})}var n="zui.modal",o=function(i,o){var a=this;a.options=o,a.$body=t(document.body),a.$element=t(i),a.$backdrop=a.isShown=null,a.scrollbarWidth=0,o.moveable===e&&(a.options.moveable=a.$element.hasClass("modal-moveable")),o.remote&&a.$element.find(".modal-content").load(o.remote,function(){a.$element.trigger("loaded."+n)}),o.scrollInside&&t(window).on("resize."+n,function(){a.isShown&&a.adjustPosition(e,100)})};o.VERSION="3.2.0",o.TRANSITION_DURATION=300,o.BACKDROP_TRANSITION_DURATION=150,o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0,position:"fit"};var a=function(e,i){var n=t(window);i.left=Math.max(0,Math.min(i.left,n.width()-e.outerWidth())),i.top=Math.max(0,Math.min(i.top,n.height()-e.outerHeight())),e.css(i)};o.prototype.toggle=function(t,e){return this.isShown?this.hide():this.show(t,e)},o.prototype.adjustPosition=function(i,o){var s=this;if(clearTimeout(s.reposTask),o)return void(s.reposTask=setTimeout(s.adjustPosition.bind(s,i,0),o));var r=s.options;if(i===e&&(i=r.position),i!==e&&null!==i){"function"==typeof i&&(i=i(s));var l=s.$element.find(".modal-dialog"),c=t(window).height(),h={maxHeight:"initial",overflow:"visible"},d=l.find(".modal-body").css(h);if(r.scrollInside&&d.length){var u=r.headerHeight,p=r.footerHeight,f=l.find(".modal-header"),g=l.find(".modal-footer");"number"!=typeof u&&(u=f.length?f.outerHeight():"function"==typeof u?u(f):0),"number"!=typeof p&&(p=g.length?g.outerHeight():"function"==typeof p?p(g):0),h.maxHeight=c-u-p,h.overflow=d[0].scrollHeight>h.maxHeight?"auto":"visible",d.css(h)}var m=Math.max(0,(c-l.outerHeight())/2);if("fit"===i?i={top:m>50?Math.floor(2*m/3):m}:"center"===i?i={top:m}:t.isPlainObject(i)||(i={top:i}),l.hasClass("modal-moveable")){var v=null,y=r.rememberPos;y&&(y===!0?v=s.$element.data("modal-pos"):t.zui.store&&(v=t.zui.store.pageGet(n+".rememberPos."+y))),i=t.extend(i,{left:Math.max(0,(t(window).width()-l.outerWidth())/2)},v),"inside"===r.moveable?a(l,i):l.css(i)}else l.css(i)}},o.prototype.setMoveable=function(){t.fn.draggable||console.error("Moveable modal requires draggable.js.");var e=this,i=e.options,o=e.$element.find(".modal-dialog").removeClass("modal-dragged");o.toggleClass("modal-moveable",!!i.moveable),e.$element.data("modal-moveable-setup")||o.draggable({container:e.$element,handle:".modal-header",before:function(){var t=o.css("margin-top");t&&"0px"!==t&&o.css("top",t).css("margin-top","").addClass("modal-dragged")},finish:function(o){var a=i.rememberPos;a&&(e.$element.data("modal-pos",o.pos),t.zui.store&&a!==!0&&t.zui.store.pageSet(n+".rememberPos."+a,o.pos))},move:"inside"!==i.moveable||function(t){a(o,t)}})},o.prototype.show=function(e,i){var a=this,s=t.Event("show."+n,{relatedTarget:e});a.$element.trigger(s),a.$element.toggleClass("modal-scroll-inside",!!a.options.scrollInside),a.isShown||s.isDefaultPrevented()||(a.isShown=!0,a.options.moveable&&a.setMoveable(),a.options.backdrop!==!1&&(a.setScrollbar(),a.$body.addClass("modal-open")),a.escape(),a.$element.on("click.dismiss."+n,'[data-dismiss="modal"]',function(t){a.hide(),t.stopPropagation()}),a.backdrop(function(){var s=t.support.transition&&a.$element.hasClass("fade");a.$element.parent().length||a.$element.appendTo(a.$body),a.$element.show().scrollTop(0),s&&a.$element[0].offsetWidth,a.$element.addClass("in").attr("aria-hidden",!1),a.adjustPosition(i),a.enforceFocus();var r=t.Event("shown."+n,{relatedTarget:e});s?a.$element.find(".modal-dialog").one("bsTransitionEnd",function(){a.$element.trigger("focus").trigger(r)}).emulateTransitionEnd(o.TRANSITION_DURATION):a.$element.trigger("focus").trigger(r)}))},o.prototype.hide=function(e){e&&e.preventDefault&&e.preventDefault();var i=this;e=t.Event("hide."+n),i.$element.trigger(e),i.isShown&&!e.isDefaultPrevented()&&(i.isShown=!1,i.options.backdrop!==!1&&(i.$body.removeClass("modal-open"),i.resetScrollbar()),i.escape(),t(document).off("focusin."+n),i.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss."+n),t.support.transition&&i.$element.hasClass("fade")?i.$element.one("bsTransitionEnd",i.hideModal.bind(i)).emulateTransitionEnd(o.TRANSITION_DURATION):i.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin."+n).on("focusin."+n,function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")}.bind(this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?t(document).on("keydown.dismiss."+n,function(i){if(27==i.which){var o=t.Event("escaping."+n),a=this.$element.triggerHandler(o,"esc");if(a!=e&&!a)return;this.hide()}}.bind(this)):this.isShown||t(document).off("keydown.dismiss."+n)},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden."+n)})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var i=this,a=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&a;if(this.$backdrop=t('').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"}}); +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=ti.fileMaxSize||e.push(s)}t.length!=e.length&&(window.bootbox||window).alert(i.fileSizeError.format(n(i.fileMaxSize))),e.forEach(function(t){o.add(t)})})};r.prototype.add=function(t){var e=this,i=e.options,n=e.$template.clone();"before"===i.appendWay?e.$.prepend(n):e.$.append(n),n.fileInput({file:t,fileMaxSize:i.eachFileMaxSize,fileSizeError:i.fileSizeError,onDelete:function(t){t.$.remove(),e.options.onDelete&&e.options.onDelete(t,e)},onSelect:function(t,i){e.options.onSelect&&e.options.onSelect(t,i,e)}})},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,c){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid,e.params);if(c&&(c.tid&!l&&(l=c.tid),void 0!==c.isOnlyBody&&void 0===s&&(s=c.isOnlyBody)),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"}}); diff --git a/www/theme/zui/css/min.css b/www/theme/zui/css/min.css index 710cd2bb95..7ef548d109 100644 --- a/www/theme/zui/css/min.css +++ b/www/theme/zui/css/min.css @@ -1,7 +1,7 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-09-07 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-09-14 * http://openzui.com - * GitHub: https://github.com/easysoft/zui.git + * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT *//*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a{background:0 0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-spacing:0;border-collapse:collapse}#userMenu:after,#userMenu:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fixed-md:after,.container-fixed-md:before,.container-fixed-sm:after,.container-fixed-sm:before,.container-fixed-xs:after,.container-fixed-xs:before,.container-fixed:after,.container-fixed:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.dl-inline:after,.dl-inline:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager-justify:after,.pager-justify:before,.pager-loose:after,.pager-loose:before,.row:after,.row:before,.table-footer:after,.table-footer:before{display:table;content:" "}#userMenu:after,.btn-toolbar:after,.clearfix:after,.container-fixed-md:after,.container-fixed-sm:after,.container-fixed-xs:after,.container-fixed:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.dl-inline:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager-justify:after,.pager-loose:after,.row:after,.table-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none}.showing{display:block}.hidden{display:none!important;visibility:hidden!important}.show{display:block!important;visibility:visible!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}.with-padding{padding:5px 12px}.no-padding{padding:0!important}.no-margin{margin:0!important}.inline-block.visible-xs,.inline.visible-xs,.visible-xs,td.visible-xs,th.visible-xs,tr.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}.inline.visible-xs{display:inline!important}.inline-block.visible-xs{display:inline-block!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}.inline.visible-xs.visible-sm{display:inline!important}.inline-block.visible-xs.visible-sm{display:inline-block!important}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1799px){.visible-xs.visible-md{display:block!important}.inline.visible-xs.visible-md{display:inline!important}.inline-block.visible-xs.visible-md{display:inline-block!important}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1800px){.visible-xs.visible-lg{display:block!important}.inline.visible-xs.visible-lg{display:inline!important}.inline-block.visible-xs.visible-lg{display:inline-block!important}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}.inline-block.visible-sm,.inline.visible-sm,.visible-sm,td.visible-sm,th.visible-sm,tr.visible-sm{display:none!important}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}.inline.visible-sm.visible-xs{display:inline!important}.inline-block.visible-sm.visible-xs{display:inline-block!important}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}.inline.visible-sm{display:inline!important}.inline-block.visible-sm{display:inline-block!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1799px){.visible-sm.visible-md{display:block!important}.inline.visible-sm.visible-md{display:inline!important}.inline-block.visible-sm.visible-md{display:inline-block!important}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1800px){.visible-sm.visible-lg{display:block!important}.inline.visible-sm.visible-lg{display:inline!important}.inline-block.visible-sm.visible-lg{display:inline-block!important}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}.inline-block.visible-md,.inline.visible-md,.visible-md,td.visible-md,th.visible-md,tr.visible-md{display:none!important}@media (max-width:767px){.visible-md.visible-xs{display:block!important}.inline.visible-md.visible-xs{display:inline!important}.inline-block.visible-md.visible-xs{display:inline-block!important}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}.inline.visible-md.visible-sm{display:inline!important}.inline-block.visible-md.visible-sm{display:inline-block!important}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1799px){.visible-md{display:block!important}.inline.visible-md{display:inline!important}.inline-block.visible-md{display:inline-block!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1800px){.visible-md.visible-lg{display:block!important}.inline.visible-md.visible-lg{display:inline!important}.inline-block.visible-md.visible-lg{display:inline-block!important}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}.inline-block.visible-lg,.inline.visible-lg,.visible-lg,td.visible-lg,th.visible-lg,tr.visible-lg{display:none!important}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}.inline.visible-lg.visible-xs{display:inline!important}.inline-block.visible-lg.visible-xs{display:inline-block!important}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}.inline.visible-lg.visible-sm{display:inline!important}.inline-block.visible-lg.visible-sm{display:inline-block!important}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1799px){.visible-lg.visible-md{display:block!important}.inline.visible-lg.visible-md{display:inline!important}.inline-block.visible-lg.visible-md{display:inline-block!important}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1800px){.visible-lg{display:block!important}.inline.visible-lg{display:inline!important}.inline-block.visible-lg{display:inline-block!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}.inline.hidden-xs{display:inline!important}.inline-block.hidden-xs{display:inline-block!important}tr.hidden-xs{display:table-row!important}td.hidden-xs,th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,.inline-block.hidden-xs,.inline.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,.inline-block.hidden-xs.hidden-sm,.inline.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1799px){.hidden-xs.hidden-md,.inline-block.hidden-xs.hidden-md,.inline.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1800px){.hidden-xs.hidden-lg,.inline-block.hidden-xs.hidden-lg,.inline.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}.inline.hidden-sm{display:inline!important}.inline-block.hidden-sm{display:inline-block!important}tr.hidden-sm{display:table-row!important}td.hidden-sm,th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,.inline-block.hidden-sm.hidden-xs,.inline.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,.inline-block.hidden-sm,.inline.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1799px){.hidden-sm.hidden-md,.inline-block.hidden-sm.hidden-md,.inline.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1800px){.hidden-sm.hidden-lg,.inline-block.hidden-sm.hidden-lg,.inline.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}.inline.hidden-md{display:inline!important}.inline-block.hidden-md{display:inline-block!important}tr.hidden-md{display:table-row!important}td.hidden-md,th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,.inline-block.hidden-md.hidden-xs,.inline.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,.inline-block.hidden-md.hidden-sm,.inline.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1799px){.hidden-md,.inline-block.hidden-md,.inline.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1800px){.hidden-md.hidden-lg,.inline-block.hidden-md.hidden-lg,.inline.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}.inline.hidden-lg{display:inline!important}.inline-block.hidden-lg{display:inline-block!important}tr.hidden-lg{display:table-row!important}td.hidden-lg,th.hidden-lg{display:table-cell!important}@media (max-width:767px){.hidden-lg.hidden-xs,.inline-block.hidden-lg.hidden-xs,.inline.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,.inline-block.hidden-lg.hidden-sm,.inline.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1799px){.hidden-lg.hidden-md,.inline-block.hidden-lg.hidden-md,.inline.hidden-lg.hidden-md,td.hidden-lg.hidden-md,th.hidden-lg.hidden-md,tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1800px){.hidden-lg,.inline-block.hidden-lg,.inline.hidden-lg,td.hidden-lg,th.hidden-lg,tr.hidden-lg{display:none!important}}.inline-block.visible-print,.inline.visible-print,.visible-print,td.visible-print,th.visible-print,tr.visible-print{display:none!important}@media print{.visible-print{display:block!important}.inline.visible-print{display:inline!important}.inline-block.visible-print{display:inline-block!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}.hidden-print,.inline-block.hidden-print,.inline.hidden-print,td.hidden-print,th.hidden-print,tr.hidden-print{display:none!important}}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Tahoma,Arial,'PingFang SC','Source Han Sans CN','Source Han Sans','Source Han Serif','Hiragino Sans GB','WenQuanYi Micro Hei','Microsoft YaHei',sans-serif;font-size:13px;line-height:1.42857143;color:#3c4353;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#3c4353;text-decoration:none;cursor:pointer;-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:color,background,opacity,-webkit-transform;-o-transition-property:color,background,opacity,-o-transform;transition-property:color,background,opacity,-webkit-transform;transition-property:color,background,transform,opacity;transition-property:color,background,transform,opacity,-webkit-transform,-o-transform}a:focus,a:hover{color:#0c64eb;text-decoration:none}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a.disabled,a.disabled:focus,a.disabled:hover,a[disabled],a[disabled]:focus,a[disabled]:hover{color:#aaa;text-decoration:none;cursor:default}audio,canvas,img,video{max-width:100%;vertical-align:middle}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}::-moz-selection{text-shadow:none;background:#b3d4fc}::selection{text-shadow:none;background:#b3d4fc}fieldset{padding:0;margin:0;border:0}textarea{resize:vertical}ol,ul{padding-left:20px}.scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.container,.container-fixed,.container-fixed-md,.container-fixed-sm,.container-fixed-xs,.container-fluid{padding-right:10px;padding-left:10px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{max-width:972px}}@media (min-width:992px){.container{max-width:1760px}}@media (min-width:1800px){.container{max-width:1760px}}.container-fixed{width:1760px}.container-fixed-md{width:1760px}.container-fixed-sm{width:972px}.container-fixed-xs{width:748px}.row{margin-right:-10px;margin-left:-10px}.col,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:10px;padding-left:10px}.col,.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-1,.col-xs-1{width:8.33333333%}.col-2,.col-xs-2{width:16.66666667%}.col-3,.col-xs-3{width:25%}.col-4,.col-xs-4{width:33.33333333%}.col-5,.col-xs-5{width:41.66666667%}.col-6,.col-xs-6{width:50%}.col-7,.col-xs-7{width:58.33333333%}.col-8,.col-xs-8{width:66.66666667%}.col-9,.col-xs-9{width:75%}.col-10,.col-xs-10{width:83.33333333%}.col-11,.col-xs-11{width:91.66666667%}.col-12,.col-xs-12{width:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}}@media (min-width:1800px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:14px;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}.small,small{font-size:85%}cite{font-style:normal}.text-gray,.text-muted{color:#838a9d}.text-gray a,.text-muted a{color:#757d92}.text-gray a:active,.text-gray a:hover,.text-muted a:active,.text-muted a:hover{color:#3c4353}.text-primary{color:#0c64eb}.text-warning,.text-yellow{color:#ff9800}.text-danger,.text-red{color:#ff5d5d}.text-green,.text-success{color:#00da88}.text-blue,.text-info{color:#2196f3}.text-brown,.text-important{color:#bd7b46}.text-purple,.text-special{color:#8666b8}.text-link{color:#3c4353}.text-link:active,.text-link:hover{color:#3c4353}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.nobr,.text-nowrap{overflow:hidden;white-space:nowrap}.text-wrap{overflow:visible;white-space:normal}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}dl{margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}.dl-inline dt{display:inline-block}.dl-inline dd{display:inline-block;padding-right:1em}.dl-inline dd:last-child{padding-right:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}blockquote{padding:10px 20px;margin:0 0 20px;font-size:16.25px;border-left:5px solid #eee}blockquote ol,blockquote p,blockquote ul{font-weight:300}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857143;color:#838a9d}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}.ol-pd-2{padding-left:40px}.ol-pd-3{padding-left:60px}.ol-pd-4{padding-left:80px}.bg-black,.bg-default{color:#fff;background-color:#3c4353}.bg-primary{color:#fff;background-color:#0c64eb}.bg-green,.bg-success{color:#fff;background-color:#00da88}.bg-blue,.bg-info{color:#fff;background-color:#2196f3}.bg-warning,.bg-yellow{color:#fff;background-color:#ff9800}.bg-danger,.bg-red{color:#fff;background-color:#ff5d5d}.bg-brown,.bg-important{color:#fff;background-color:#bd7b46}.bg-purple,.bg-special{color:#fff;background-color:#8666b8}.hl-default,.hl-gray{background-color:#f1f1f1}.hl-primary{background-color:#e9f2fb}.hl-green,.hl-success{background-color:#e8f5e9}.hl-blue,.hl-info{background-color:#e3f2fd}.hl-warning,.hl-yellow{background-color:#fff3e0}.hl-danger,.hl-red{background-color:#ffebee}.hl-brown,.hl-important{background-color:#efebe9}.hl-purple,.hl-special{background-color:#f3e5f5}.header-dividing,.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",Helvetica,Tahoma,Arial,'PingFang SC','Source Han Sans CN','Source Han Sans','Source Han Serif','Hiragino Sans GB','WenQuanYi Micro Hei','Microsoft YaHei',sans-serif;font-weight:700;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#838a9d}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small{font-size:75%}h1{font-size:24px}h2{font-size:20px}h3{font-size:18px}h4{font-size:14px}h5{font-size:13px}h6{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}hr.divider-sm{margin-top:10px;margin-bottom:10px}hr.divider{margin:0}.label{display:inline;padding:.2em .6em .2em;font-size:85.71428571%;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#838a9d;border-radius:.25em}.label[href]:focus,.label[href]:hover{color:#fff;background-color:#697084}.label.label-outline{color:#838a9d;background:0 0;border:1px solid #838a9d}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-badge{display:inline-block;min-width:18px;padding:3px 7px;font-size:12px;line-height:1;border-radius:9px}.label-dot{display:inline-block;width:8px;height:8px;padding:0;line-height:20px;text-indent:-9999em;border-radius:50%}.label-dot:empty{display:inline-block}.label-primary{background-color:#0c64eb}.label-primary[href]:focus,.label-primary[href]:hover{color:#fff;background-color:#0a4fba}.label-primary.label-outline{color:#0c64eb;background:0 0;border:1px solid #0c64eb}.label-success{background-color:#00da88}.label-success[href]:focus,.label-success[href]:hover{color:#fff;background-color:#00a768}.label-success.label-outline{color:#00da88;background:0 0;border:1px solid #00da88}.label-info{background-color:#2196f3}.label-info[href]:focus,.label-info[href]:hover{color:#fff;background-color:#0c7cd5}.label-info.label-outline{color:#2196f3;background:0 0;border:1px solid #2196f3}.label-warning{background-color:#ff9800}.label-warning[href]:focus,.label-warning[href]:hover{color:#fff;background-color:#cc7a00}.label-warning.label-outline{color:#ff9800;background:0 0;border:1px solid #ff9800}.label-danger{background-color:#ff5d5d}.label-danger[href]:focus,.label-danger[href]:hover{color:#fff;background-color:#ff2a2a}.label-danger.label-outline{color:#ff5d5d;background:0 0;border:1px solid #ff5d5d}.btn .label,.nav-primary>li>a>.label{position:relative;top:-1px}.btn-danger .label,.btn-info .label,.btn-primary .label,.btn-success .label,.btn-warning .label{background-color:rgba(0,0,0,.2)}.list-group-item.active>.label,.nav-pills>.active>a>.label,.nav-primary>.active>a>.label{color:#3c4353;background-color:#fff}.nav>li>a>.label{margin-left:3px}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#838a9d}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:8px;margin-bottom:20px;overflow:hidden;background-color:#e9f2fb;border-radius:3px}.progress-bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;background-color:#0c64eb;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress>.progress-bar:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.progress>.progress-bar:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#00da88}.progress-bar-info{background-color:#2196f3}.progress-bar-warning{background-color:#ff9800}.progress-bar-danger{background-color:#ff5d5d}.avatar{position:relative;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:30px;height:30px;overflow:hidden;font-size:15px;line-height:30px;text-align:center;background-position:center;-webkit-background-size:cover;background-size:cover;border-radius:4px;-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}.avatar img{display:block;width:100%;height:100%;margin:0}.avatar.has-text{color:#fff;background-color:#16a8f8}.avatar span{display:block;margin-right:-1em;margin-left:-1em;text-align:center}.avatar .text-len-2{-webkit-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}.avatar .text-len-3,.avatar .text-len-4{-webkit-transform:scale(.6);-ms-transform:scale(.6);-o-transform:scale(.6);transform:scale(.6)}.avatar-sm{width:20px;height:20px;font-size:10px;line-height:20px}.avatar-sm .text-len-2{-webkit-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);transform:scale(.7)}.avatar-sm .text-len-3,.avatar-sm .text-len-4{-webkit-transform:scale(.5);-ms-transform:scale(.5);-o-transform:scale(.5);transform:scale(.5)}.avatar-md{width:24px;height:24px;font-size:12px;line-height:24px}.avatar-lg{width:40px;height:40px;font-size:20px;line-height:40px}.avatar-lg>.icon{font-size:20px}.avatar-xl{width:70px;height:70px;font-size:35px;line-height:70px}.avatar-xl>.icon{font-size:35px}.avatar-circle{border-radius:50%}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:19.5px;line-height:inherit;color:#3c495c;border:0;border-bottom:1px solid #eee}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:5px 0 0;margin-top:0\9;line-height:normal}input[type=file]{display:block}select[multiple],select[size]{height:auto}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.os-mac select.form-control{-webkit-appearance:none;padding-right:18px;background-image:url(data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==);background-repeat:no-repeat;background-position:right 5px top 14px;-moz-appearance:none}.input-sm .os-mac select.form-control{background-position:right 5px top 9px}.input-lg .os-mac select.form-control{background-position:right 5px top 19px}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}@-moz-document url-prefix(){input[type=radio]:focus{outline:0}}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}.form-control::-webkit-input-placeholder{color:#838a9d}.form-control::-moz-placeholder{color:#838a9d}.form-control:-ms-input-placeholder{color:#838a9d}.form-control::placeholder{color:#838a9d}.form-control{display:block;width:100%;height:32px;padding:5px 8px;font-size:13px;line-height:1.42857143;color:#222;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}.form-control.focus,.form-control:focus{border-color:#0c64eb;outline:0;-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)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#f5f5f5}.form-control[readonly]{cursor:default}textarea.form-control{height:auto;min-height:32px}.form-group{margin-bottom:10px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:3px;margin-top:4px\9;margin-left:-20px}.os-android .checkbox input[type=checkbox],.os-android .checkbox-inline input[type=checkbox],.os-android .radio input[type=radio],.os-android .radio-inline input[type=radio]{margin-top:0}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.input-sm{height:24px;padding:2px 8px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:24px;line-height:24px}textarea.input-sm{height:auto}.input-lg{height:39px;padding:10px 16px;font-size:14px;line-height:1.25;border-radius:6px}select.input-lg{height:39px;line-height:39px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning>label{color:#ff9800}.has-warning .form-control{border-color:#ff9800;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#cc7a00;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ffc166;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ffc166}.has-warning .input-group-addon{color:#ff9800;background-color:#fff3e0;border-color:#ff9800}.has-error .help-block,.has-error>label{color:#ff5d5d}.has-error .form-control{border-color:#ff5d5d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#ff2a2a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ffc3c3;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ffc3c3}.has-error .input-group-addon{color:#ff5d5d;background-color:#ffebee;border-color:#ff5d5d}.has-success .help-block,.has-success>label{color:#00da88}.has-success .form-control{border-color:#00da88;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#00a768;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #41ffb8;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #41ffb8}.has-success .input-group-addon{color:#00da88;background-color:#e8f5e9;border-color:#00da88}.form-control-static{min-height:33px;padding-top:6px;padding-bottom:6px;margin-bottom:0}.help-block{display:block;margin:5px 0;color:#74809b}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .form-group>label,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:6px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-10px;margin-left:-10px}@media (min-width:768px){.form-horizontal .form-group>label{text-align:right}}.required{position:relative}.required:after{position:absolute;top:0;right:-10px;display:inline-block;font-size:14px;color:#ff5d5d;content:'*'}.form-horizontal .required:after{top:5px;right:-1px}.form-condensed .form-group{margin-bottom:10px}.form-condensed .form-control{height:24px;padding:2px 8px;font-size:12px;line-height:1.5;border-radius:3px}select.form-condensed .form-control{height:24px;line-height:24px}textarea.form-condensed .form-control{height:auto}.form-condensed textarea.form-control{height:auto}.form-condensed .btn{padding:3px 8px;font-size:12px;line-height:18px;border-radius:4px}.form-condensed .input-group>.form-control,.form-condensed .input-group>.input-group-addon,.form-condensed .input-group>.input-group-btn>.btn{padding:2px 8px;font-size:12px;border-radius:3px}.form-condensed .input-group .form-control:first-child,.form-condensed .input-group-addon:first-child,.form-condensed .input-group-btn:first-child>.btn,.form-condensed .input-group-btn:first-child>.btn-group>.btn,.form-condensed .input-group-btn:first-child>.dropdown-toggle,.form-condensed .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.form-condensed .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.form-condensed .input-group .form-control:last-child,.form-condensed .input-group-addon:last-child,.form-condensed .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.form-condensed .input-group-btn:first-child>.btn:not(:first-child),.form-condensed .input-group-btn:last-child>.btn,.form-condensed .input-group-btn:last-child>.btn-group>.btn,.form-condensed .input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.form-condensed .input-group-addon:first-child{border-right:0}.form-condensed .input-group-addon:last-child{border-left:0}.form-condensed .input-group-addon.fix-border,.form-condensed .input-group-btn.fix-border>.btn{border-right:0;border-left:0;border-radius:0}.form-condensed.form-horizontal .checkbox,.form-condensed.form-horizontal .checkbox-inline,.form-condensed.form-horizontal .form-group>label,.form-condensed.form-horizontal .radio,.form-condensed.form-horizontal .radio-inline{padding-top:1px}.close{float:right;font-size:19.5px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.load-indicator{position:relative}.load-indicator:after,.load-indicator:before{position:absolute;color:#838a9d;text-align:center;visibility:hidden;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:visibility,opacity;-o-transition-property:visibility,opacity;transition-property:visibility,opacity}.load-indicator:before{top:0;right:0;bottom:0;left:0;z-index:10;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:12px;content:attr(data-loading);background-color:rgba(255,255,255,.8);-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}.load-indicator[data-loading]:before{padding-top:50px}.load-indicator:after{top:50%;left:50%;z-index:11;display:block;width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-family:ZentaoIcon;font-size:14px;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:30px;text-transform:none;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.load-indicator.loading:after,.load-indicator.loading:before{visibility:visible;opacity:1}table{max-width:100%;font-size:inherit;background-color:transparent}caption{padding:8px 10px;color:#838a9d;text-align:left}th{text-align:left}.table{width:100%;margin-bottom:20px}.table td,.table th{padding:8px 10px;line-height:1.42857143;vertical-align:top;border-bottom:1px solid #cbd0db;-webkit-transition:background .2s cubic-bezier(.175,.885,.32,1);-o-transition:background .2s cubic-bezier(.175,.885,.32,1);transition:background .2s cubic-bezier(.175,.885,.32,1)}.table>thead>tr>th{font-weight:700;color:#3c4353;vertical-align:bottom;background-color:transparent;border-bottom:1px solid #cbd0db}.table>tbody+tbody{border-top:2px solid #cbd0db}.table-fixed{table-layout:fixed}.table-fixed td,.table-fixed th{overflow:hidden;white-space:nowrap}.table-fixed .nofixed,.table-fixed tfoot>tr>td,.table-fixed tfoot>tr>th{overflow:visible}.table-borderless td,.table-borderless th,.table-borderless thead>tr>th{border:none}.table-auto{width:auto;max-width:100%}.table-condensed td,.table-condensed th{padding:5px}.table-bordered{border:1px solid #cbd0db}.table-bordered td,.table-bordered th{border:1px solid #cbd0db}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#e9f2fb}table col[class*=col-]{display:table-column;float:none}table td[class*=col-],table th[class*=col-]{display:table-cell;float:none}.table tr.active>td,.table tr.active>th,.table tr>td.active,.table tr>th.active{background-color:#ffe9c6}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#e8f5e9;border-color:#c7e6c4}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d6edd8;border-color:#b7deb3}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#ffebee;border-color:#ffd1e0}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ffd1d8;border-color:#ffb8ce}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fff3e0;border-color:#ffe0c6}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#ffe9c6;border-color:#ffd2ad}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #cbd0db}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered th{border-top:none}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.alert{padding:15px;margin-bottom:20px;color:#313744;background-color:#f1f1f1;border-radius:3px;-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)}.alert hr{border-top-color:#e4e4e4}.alert .alert-link{color:#22262f}.alert h4{margin-top:0;color:inherit}.alert hr{margin:10px 0}.alert p,.alert ul{margin-bottom:0}.alert p+p{margin-top:5px}.alert-link{font-weight:700}.alert>[class*=icon-]{float:left;margin-top:-5px;font-size:42px;opacity:.6;-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)}.alert>[class*=icon-]+.content{min-height:30px;margin-left:64px}.alert.with-icon{display:table;width:100%}.alert.with-icon>[class*=icon-],.alert.with-icon>[class*=icon-]+.content{display:table-cell;float:none;min-height:0;margin:0;vertical-align:middle}.alert.with-icon>[class*=icon-]{width:48px;text-align:center}.alert.with-icon>[class*=icon-]+.content{padding-left:1em}.alert-block{margin:0;border-radius:0}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-6px;right:-21px;color:inherit}.alert-primary{color:#313744;background-color:#e9f2fb}.alert-primary hr{border-top-color:#cbe0f6}.alert-primary .alert-link{color:#22262f}.alert-success{color:#00c178;background-color:#e8f5e9}.alert-success hr{border-top-color:#c7e6c4}.alert-success .alert-link{color:#009d62}.alert-info{color:#0d8aee;background-color:#e3f2fd}.alert-info hr{border-top-color:#9ce0f8}.alert-info .alert-link{color:#0b76cc}.alert-warning{color:#e68900;background-color:#fff3e0}.alert-warning hr{border-top-color:#ffe0c6}.alert-warning .alert-link{color:#c27400}.alert-danger{color:#ff4343;background-color:#ffebee}.alert-danger hr{border-top-color:#ffd1e0}.alert-danger .alert-link{color:#ff2020}.alert-inverse{color:#fff;background-color:#3c4353;border-color:#3c4353}.alert-inverse hr{border-top-color:#cbd0db;border-top-color:rgba(203,208,219,.25)}.alert-inverse .alert-link{color:rgba(255,255,255,.8)}.alert-primary-inverse{color:#fff;background-color:#0c64eb;border-color:#0c64eb}.alert-primary-inverse hr{border-top-color:#cbd0db;border-top-color:rgba(203,208,219,.25)}.alert-primary-inverse .alert-link{color:rgba(255,255,255,.8)}.alert-success-inverse{color:#fff;background-color:#00da88;border-color:#00da88}.alert-success-inverse hr{border-top-color:#cbd0db;border-top-color:rgba(203,208,219,.25)}.alert-success-inverse .alert-link{color:rgba(255,255,255,.8)}.alert-info-inverse{color:#fff;background-color:#2196f3;border-color:#2196f3}.alert-info-inverse hr{border-top-color:#cbd0db;border-top-color:rgba(203,208,219,.25)}.alert-info-inverse .alert-link{color:rgba(255,255,255,.8)}.alert-warning-inverse{color:#fff;background-color:#ff9800;border-color:#ff9800}.alert-warning-inverse hr{border-top-color:#cbd0db;border-top-color:rgba(203,208,219,.25)}.alert-warning-inverse .alert-link{color:rgba(255,255,255,.8)}.alert-danger-inverse{color:#fff;background-color:#ff5d5d;border-color:#ff5d5d}.alert-danger-inverse hr{border-top-color:#cbd0db;border-top-color:rgba(203,208,219,.25)}.alert-danger-inverse .alert-link{color:rgba(255,255,255,.8)}.input-control-icon-left,.input-control-icon-right,.input-control-label-left,.input-control-label-right{position:absolute;top:1px;z-index:5;height:30px;line-height:30px;opacity:.5}.input-control-icon-left,.input-control-icon-right{width:30px;text-align:center}.input-control-icon-left,.input-control-label-left{left:1px}.input-control-icon-right,.input-control-label-right{right:1px}.input-control-label-left,.input-control-label-right{width:70px;padding:0 8px;overflow:hidden;text-overflow:ellipsis}.has-label-left-sm>.input-control-label-left,.has-label-left-sm>.input-control-label-right{width:55px}.has-label-left-lg>.input-control-label-left,.has-label-left-lg>.input-control-label-right{width:95px}.input-control{position:relative}.input-control.has-icon-left>.form-control{padding-left:30px}.input-control.has-icon-right>.form-control{padding-right:30px}.input-control.has-label-left>.form-control{padding-left:70px}.input-control.has-label-right>.form-control{padding-right:70px}.input-control.has-label-left-sm>.form-control{padding-left:55px}.input-control.has-label-right-sm>.form-control{padding-right:55px}.input-control.has-label-left-lg>.form-control{padding-left:95px}.input-control.has-label-right-lg>.form-control{padding-right:95px}.input-control>a:hover{background-color:#f1f1f1;opacity:1}.form-control:focus+[class^=input-control-],.form-control:focus+[class^=input-control-]+[class^=input-control-]{opacity:1}.form-control:focus+.input-control-label-left{color:#16a8f8}.empty+.search-clear-btn,.empty+.search-icon+.search-clear-btn{opacity:0!important}input:placeholder-shown+.search-clear-btn,input:placeholder-shown+.search-icon+.search-clear-btn{opacity:0!important}.search-box-circle .input-control-icon-left,.search-box-circle .input-control-icon-right,.search-box-circle>.form-control{border-radius:16px}.search-box-circle+.input-group-btn>.btn{border-radius:0 16px 16px 0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:5px 12px;font-size:13px;font-weight:400;line-height:1;color:#3c495c;text-align:center;background-color:#eee;border:1px solid #dcdcdc;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group-addon.fix-border{border-right:0;border-left:0}.input-group-addon:empty{width:1px;padding:0}.input-group-addon.fix-padding{width:1px;padding:0}.input-group-btn.fix-border>.btn{border-right:0;border-left:0;border-radius:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:first-child{border-right:0}.input-group-addon:last-child{border-left:0}.input-group-addon+.input-group-addon{border-left:1px solid #dcdcdc}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:39px;padding:10px 16px;font-size:14px;line-height:1.25;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:39px;line-height:39px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:24px;padding:2px 8px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:24px;line-height:24px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon.input-sm{padding:2px 8px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:14px;border-radius:6px}.code,code,kbd,pre,samp{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code,kbd{padding:2px 4px;font-size:90%;color:#37474f;background-color:#f3f5f7;border-radius:4px}kbd{padding:1px 4px;font-weight:700;color:#666;background-color:#f1f1f1;border:1px solid #d8d8d8;border-bottom-width:2px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:12px;line-height:1.38461538;color:#3c495c;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;margin:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.com{color:#93a1a1}.lit{color:#195f91}.clo,.opn,.pun{color:#93a1a1}.fun{color:#dc322f}.atv,.str{color:#d14}.kwd,.prettyprint .tag{color:#1e347b}.atn,.dec,.typ,.var{color:teal}.pln{color:#48484c}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0}.prettyprint ol.linenums{padding-left:35px;margin-bottom:0;line-height:20px;color:#bebec5;text-shadow:0 1px 0 #fff}.pager{display:inline-block;padding-left:0;margin:20px 0;list-style:none}.pager>li{display:inline}.pager>li>a,.pager>li>span{position:relative;float:left;padding:5px 12px;margin-left:-1px;line-height:1.42857143;text-decoration:none;background-color:#fff;border:1px solid #cbd0db}.pager>li:first-child>a,.pager>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pager>li:last-child>a,.pager>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pager>li>a:focus,.pager>li>a:hover,.pager>li>span:focus,.pager>li>span:hover{z-index:2;background-color:#eee}.pager>li.active>a,.pager>li.active>a:hover,.pager>li.active>span,.pager>li.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#0c64eb;border-color:#0c64eb}.pager>li.disabled>a,.pager>li.disabled>a:focus,.pager>li.disabled>a:hover,.pager>li.disabled>span,.pager>li.disabled>span:focus,.pager>li.disabled>span:hover{color:#cbd0db;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#cbd0db}.pager-justify{display:block}.pager-justify .next>a,.pager-justify .next>span{float:right;border-radius:4px}.pager-justify .previous>a,.pager-justify .previous>span{float:left;border-radius:4px}.pager-goto{width:100px;text-align:center}.pager>li>div{float:left}.pager>li .pager-goto,.pager>li .pager-size-menu,.pager>li.space{margin:0 5px}.pager-label{position:relative;float:left;padding:5px 4px;margin-left:-1px;line-height:1.42857143;text-decoration:none;border:1px solid transparent}.pager-item-left>a{border-top-left-radius:4px;border-bottom-left-radius:4px}.pager-item-right>a{border-top-right-radius:4px;border-bottom-right-radius:4px}.pager-lg>li>a,.pager-lg>li>span{padding:10px 16px;font-size:14px}.pager-lg>li:first-child>a,.pager-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pager-lg>li:last-child>a,.pager-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pager-sm>li>a,.pager-sm>li>span{padding:2px 8px;font-size:12px}.pager-sm>li:first-child>a,.pager-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pager-sm>li:last-child>a,.pager-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager-pills>li:first-child>a,.pager-pills>li:first-child>span{border-radius:16px 0 0 16px}.pager-pills>li:last-child>a,.pager-pills>li:last-child>span{border-radius:0 16px 16px 0}.pager-pills.pager-justify>li>a,.pager-pills.pager-justify>li>span{border-radius:16px}.pager-loose{display:block;margin:20px 0}.pager-loose.pager-pills>li>a,.pager-loose.pager-pills>li>span{border-radius:16px}.pager-loose>li>a,.pager-loose>li>span{margin-left:5px;border-radius:4px}.pager-loose>li:first-child>a,.pager-loose>li:first-child>span{margin-left:0}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>.nav-heading{padding:8px 15px;font-weight:700;color:#838a9d}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:8px 15px;color:#3c4353}.nav>li>a:focus,.nav>li>a:hover{color:#0c64eb;text-decoration:none;background-color:#f1f1f1}.nav>li.disabled>a{color:#cbd0db}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#cbd0db;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f1f1f1;border-color:#3c4353}.nav>li>a>img{max-width:none}.nav-default>li{float:left}.nav-simple>li{float:left}.nav-simple>li>a{border-radius:4px}.nav-simple>li.active>a,.nav-simple>li.active>a:focus,.nav-simple>li.active>a:hover{color:#0c64eb;background-color:#e9f2fb}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:20px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0c64eb}.nav-primary>li{float:left;margin-left:-1px}.nav-primary>li:first-child>a{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.nav-primary>li:last-child>a{border-top-right-radius:4px;border-bottom-right-radius:4px}.nav-primary>li>a{border:1px solid #cbd0db}.nav-primary>li.active>a,.nav-primary>li.active>a:focus,.nav-primary>li.active>a:hover{color:#fff;background-color:#0c64eb;border-color:#0c64eb}.nav-secondary>li{float:left}.nav-secondary>li>a{border-bottom:2px solid #eee}.nav-secondary>li.active>a,.nav-secondary>li.active>a:focus,.nav-secondary>li.active>a:hover{color:#0c64eb;border-bottom-color:#0c64eb}.nav-secondary>li.nav-heading{border-bottom:2px solid #eee}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-stacked.nav-primary>li,.nav-stacked.nav-primary>li>a{margin-left:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.nav-stacked.nav-primary>li+li{margin-top:-1px}.nav-stacked.nav-primary>li:first-child{margin-top:0}.nav-stacked.nav-primary>li:first-child.nav-heading,.nav-stacked.nav-primary>li:first-child>a{margin-left:0;border-top-left-radius:4px;border-top-right-radius:4px}.nav-stacked.nav-primary>li:last-child>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.nav-stacked.nav-primary>li.nav-heading{background-color:#f1f1f1;border:1px solid #cbd0db}.nav-stacked.nav-secondary>li>a{border:none;border-top-right-radius:4px;border-bottom-right-radius:4px;-webkit-box-shadow:inset 2px 0 0 #f5f5f5;box-shadow:inset 2px 0 0 #f5f5f5}.nav-stacked.nav-secondary>li>a:hover{-webkit-box-shadow:inset 2px 0 0 #eee;box-shadow:inset 2px 0 0 #eee}.nav-stacked.nav-secondary>li+li{margin-top:-1px}.nav-stacked.nav-secondary>li:first-child{margin-top:0}.nav-stacked.nav-secondary>li.active>a,.nav-stacked.nav-secondary>li.active>a:focus,.nav-stacked.nav-secondary>li.active>a:hover{background-color:#f5f5f5;-webkit-box-shadow:inset 2px 0 0 #0c64eb;box-shadow:inset 2px 0 0 #0c64eb}.nav-stacked.nav-secondary>li.nav-heading{border-bottom:1px solid #cbd0db}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{padding-right:0;padding-left:0;margin-bottom:5px;text-align:center}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-justified.nav-primary>li+li>a{border-left:0}}.nav-tabs{border-bottom:1px solid #cbd0db}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #cbd0db}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#838a9d;cursor:default;background-color:#fff;border:1px solid #cbd0db;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{padding-right:0;padding-left:0;margin-bottom:5px;text-align:center}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}.nav-tabs.nav-justified.nav-primary>li+li>a{border-left:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #cbd0db}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #cbd0db;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}@-moz-document url-prefix(){.nav-tabs>li.active>a:focus .nav-tabs>li>a:focus{outline:0}}.nav-tabs.nav-stacked{border-right:1px solid #cbd0db;border-bottom:none}.nav-tabs.nav-stacked>li{float:none;margin-right:-1px;margin-bottom:0}.nav-tabs.nav-stacked>li>a{margin-right:0;border-radius:4px 0 0 4px}.nav-tabs.nav-stacked>li.active>a,.nav-tabs.nav-stacked>li.active>a:focus,.nav-tabs.nav-stacked>li.active>a:hover{border:1px solid #cbd0db;border-right-color:transparent}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #cbd0db}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #cbd0db;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:40px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:10px;padding-left:10px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-10px;margin-left:-10px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:40px;padding:10px 15px;font-size:14px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-10px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:3px;margin-right:3px;margin-bottom:3px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:5px -10px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px}.navbar-nav.nav-justified>li{float:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:4px;margin-bottom:4px}.navbar-text{float:left;margin-top:10px;margin-bottom:10px}@media (min-width:768px){.navbar-text{margin-right:10px;margin-left:10px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-10px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f7f7f7;border-color:#dedede}.navbar-default .navbar-brand{color:#3c495c}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#28313d;background-color:transparent}.navbar-default .navbar-text{color:#3c495c}.navbar-default .navbar-nav>li>a{color:#3c495c}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#222;background-color:#eee}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#cbd0db}.navbar-default .navbar-toggle .icon-bar{background-color:#838a9d}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#dedede}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#3c495c}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#222;background-color:#eee}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#3c495c}.navbar-default .navbar-link:hover{color:#222}.navbar-default .btn-link{color:#3c495c}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#222}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#16a8f8;border-color:#068cd5}.navbar-inverse .navbar-brand{color:#cbd0db}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#cbd0db}.navbar-inverse .navbar-nav>li>a{color:#cbd0db}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:#34b3f9}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#48baf9}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#079ced}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#0795e3}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#48baf9}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#068cd5}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#068cd5}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#cbd0db}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:#34b3f9}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#48baf9}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#cbd0db}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-form{padding:10px 10px;margin-top:4px;margin-right:-10px;margin-bottom:4px;margin-left:-10px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.no-animation,.no-animation *,.no-animation :after,.no-animation :before,.no-animation:after,.no-animation:before{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.scale{-webkit-transition:all .15s ease;-o-transition:all .15s ease;transition:all .15s ease;-webkit-transform:scale(.8);-ms-transform:scale(.8);-o-transform:scale(.8);transform:scale(.8)}.scale.in{-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.scrollbar-hover::-webkit-scrollbar,.scrollbar-hover::-webkit-scrollbar-button,.scrollbar-hover::-webkit-scrollbar-thumb,.scrollbar-hover::-webkit-scrollbar-track{visibility:hidden}.scrollbar-hover:hover::-webkit-scrollbar,.scrollbar-hover:hover::-webkit-scrollbar-button,.scrollbar-hover:hover::-webkit-scrollbar-thumb,.scrollbar-hover:hover::-webkit-scrollbar-track{visibility:visible}@media (min-width:768px){::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scrollbar-button:end:increment,::-webkit-scrollbar-button:start:decrement{display:block}::-webkit-scrollbar-button:vertical:end:decrement,::-webkit-scrollbar-button:vertical:start:increment{display:none}::-webkit-scrollbar-thumb:horizontal,::-webkit-scrollbar-thumb:vertical,::-webkit-scrollbar-track:horizontal,::-webkit-scrollbar-track:vertical{border-color:transparent;border-style:solid}::-webkit-scrollbar-track:vertical::-webkit-scrollbar-track:horizontal{background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box}::-webkit-scrollbar-thumb{min-height:28px;background-color:rgba(0,0,0,.2);-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:2px;-webkit-box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);-webkit-box-shadow:inset 1px 1px 1px rgba(0,0,0,.25)}::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.5);-webkit-box-shadow:inset 1px 1px 3px rgba(0,0,0,.35)}::-webkit-scrollbar-thumb:horizontal,::-webkit-scrollbar-thumb:vertical,::-webkit-scrollbar-track:horizontal,::-webkit-scrollbar-track:vertical{border-width:0}::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.05);-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.1)}::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.05);-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px -1px 0 rgba(0,0,0,.07)}}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal>.loader{display:none}.modal.modal-loading .loader,.modal.modal-updating .loader{position:absolute;top:35%;left:50%;display:block;width:80px;margin-left:-40px;font-size:56px;color:#fff;text-align:center}.modal.modal-loading .modal-dialog{opacity:0}.modal.modal-updating .modal-dialog{opacity:1}.modal.modal-updating .modal-body{opacity:0}.modal.modal-updating .loader{z-index:1;color:#eee}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-iframe .modal-body{overflow:hidden!important}.modal-iframe .modal-body>iframe{border-radius:0 0 6px 6px}.modal-dialog{position:relative;width:auto;margin:0 auto;pointer-events:initial;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-dialog.modal-moveable{position:absolute;margin:0}.modal-dialog.modal-moveable .modal-header{cursor:move}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.modal-fullscreen{position:relative;width:100%!important;height:100%!important;margin:0;border-radius:0}.modal-fullscreen .modal-body{position:absolute;top:52px;right:0;bottom:0;left:0;overflow-y:auto}.modal-scroll-inside{overflow:hidden!important}.body-modal-scroll-inside{overflow:auto}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=100);opacity:1}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#3c4353;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#3c4353}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#3c4353}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#3c4353}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#3c4353}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#3c4353}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#3c4353}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#3c4353}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#3c4353}.tooltip-primary .tooltip-inner{background-color:#0c64eb}.tooltip-primary.tooltip.top .tooltip-arrow{border-top-color:#0c64eb}.tooltip-primary.tooltip.top-left .tooltip-arrow{border-top-color:#0c64eb}.tooltip-primary.tooltip.top-right .tooltip-arrow{border-top-color:#0c64eb}.tooltip-primary.tooltip.right .tooltip-arrow{border-right-color:#0c64eb}.tooltip-primary.tooltip.left .tooltip-arrow{border-left-color:#0c64eb}.tooltip-primary.tooltip.bottom .tooltip-arrow{border-bottom-color:#0c64eb}.tooltip-primary.tooltip.bottom-left .tooltip-arrow{border-bottom-color:#0c64eb}.tooltip-primary.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#0c64eb}.tooltip-success .tooltip-inner{background-color:#00da88}.tooltip-success.tooltip.top .tooltip-arrow{border-top-color:#00da88}.tooltip-success.tooltip.top-left .tooltip-arrow{border-top-color:#00da88}.tooltip-success.tooltip.top-right .tooltip-arrow{border-top-color:#00da88}.tooltip-success.tooltip.right .tooltip-arrow{border-right-color:#00da88}.tooltip-success.tooltip.left .tooltip-arrow{border-left-color:#00da88}.tooltip-success.tooltip.bottom .tooltip-arrow{border-bottom-color:#00da88}.tooltip-success.tooltip.bottom-left .tooltip-arrow{border-bottom-color:#00da88}.tooltip-success.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#00da88}.tooltip-info .tooltip-inner{background-color:#2196f3}.tooltip-info.tooltip.top .tooltip-arrow{border-top-color:#2196f3}.tooltip-info.tooltip.top-left .tooltip-arrow{border-top-color:#2196f3}.tooltip-info.tooltip.top-right .tooltip-arrow{border-top-color:#2196f3}.tooltip-info.tooltip.right .tooltip-arrow{border-right-color:#2196f3}.tooltip-info.tooltip.left .tooltip-arrow{border-left-color:#2196f3}.tooltip-info.tooltip.bottom .tooltip-arrow{border-bottom-color:#2196f3}.tooltip-info.tooltip.bottom-left .tooltip-arrow{border-bottom-color:#2196f3}.tooltip-info.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#2196f3}.tooltip-warning .tooltip-inner{background-color:#ff9800}.tooltip-warning.tooltip.top .tooltip-arrow{border-top-color:#ff9800}.tooltip-warning.tooltip.top-left .tooltip-arrow{border-top-color:#ff9800}.tooltip-warning.tooltip.top-right .tooltip-arrow{border-top-color:#ff9800}.tooltip-warning.tooltip.right .tooltip-arrow{border-right-color:#ff9800}.tooltip-warning.tooltip.left .tooltip-arrow{border-left-color:#ff9800}.tooltip-warning.tooltip.bottom .tooltip-arrow{border-bottom-color:#ff9800}.tooltip-warning.tooltip.bottom-left .tooltip-arrow{border-bottom-color:#ff9800}.tooltip-warning.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#ff9800}.tooltip-danger .tooltip-inner{background-color:#ff5d5d}.tooltip-danger.tooltip.top .tooltip-arrow{border-top-color:#ff5d5d}.tooltip-danger.tooltip.top-left .tooltip-arrow{border-top-color:#ff5d5d}.tooltip-danger.tooltip.top-right .tooltip-arrow{border-top-color:#ff5d5d}.tooltip-danger.tooltip.right .tooltip-arrow{border-right-color:#ff5d5d}.tooltip-danger.tooltip.left .tooltip-arrow{border-left-color:#ff5d5d}.tooltip-danger.tooltip.bottom .tooltip-arrow{border-bottom-color:#ff5d5d}.tooltip-danger.tooltip.bottom-left .tooltip-arrow{border-bottom-color:#ff5d5d}.tooltip-danger.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#ff5d5d}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:300px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:4px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover.no-arrow.top{margin-top:0}.popover.no-arrow.right{margin-left:0}.popover.no-arrow.bottom{margin-top:0}.popover.no-arrow.left{margin-left:0}.modal .popover,.popover-in-modal{z-index:1050}.popover-title{padding:8px 14px;margin:0;font-size:13px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{content:"";border-width:10px}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom .arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left .arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-primary{border-color:#0c64eb}.popover-primary .popover-title{color:#fff;background-color:#0c64eb}.popover-primary.popover.top .arrow{border-top-color:#0c64eb}.popover-primary.popover.right .arrow{border-right-color:#0c64eb}.popover-primary.popover.left .arrow{border-left-color:#0c64eb}.popover-primary.popover.bottom .arrow,.popover-primary.popover.bottom .arrow:after{border-bottom-color:#0c64eb}.popover-success{border-color:#00da88}.popover-success .popover-title{color:#fff;background-color:#00da88}.popover-success.popover.top .arrow{border-top-color:#00da88}.popover-success.popover.right .arrow{border-right-color:#00da88}.popover-success.popover.left .arrow{border-left-color:#00da88}.popover-success.popover.bottom .arrow,.popover-success.popover.bottom .arrow:after{border-bottom-color:#00da88}.popover-info{border-color:#2196f3}.popover-info .popover-title{color:#fff;background-color:#2196f3}.popover-info.popover.top .arrow{border-top-color:#2196f3}.popover-info.popover.right .arrow{border-right-color:#2196f3}.popover-info.popover.left .arrow{border-left-color:#2196f3}.popover-info.popover.bottom .arrow,.popover-info.popover.bottom .arrow:after{border-bottom-color:#2196f3}.popover-warning{border-color:#ff9800}.popover-warning .popover-title{color:#fff;background-color:#ff9800}.popover-warning.popover.top .arrow{border-top-color:#ff9800}.popover-warning.popover.right .arrow{border-right-color:#ff9800}.popover-warning.popover.left .arrow{border-left-color:#ff9800}.popover-warning.popover.bottom .arrow,.popover-warning.popover.bottom .arrow:after{border-bottom-color:#ff9800}.popover-danger{border-color:#ff5d5d}.popover-danger .popover-title{color:#fff;background-color:#ff5d5d}.popover-danger.popover.top .arrow{border-top-color:#ff5d5d}.popover-danger.popover.right .arrow{border-right-color:#ff5d5d}.popover-danger.popover.left .arrow{border-left-color:#ff5d5d}.popover-danger.popover.bottom .arrow,.popover-danger.popover.bottom .arrow:after{border-bottom-color:#ff5d5d}.caret{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}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:100px;padding:5px 0;margin:2px 0 0;font-size:13px;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #b6bdcc;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)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#eee}.dropdown-menu>li>a{display:block;padding:5px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#3c4353;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#fff;text-decoration:none;background-color:#0c64eb}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#0c64eb;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#cbd0db}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.dropdown-hover .dropdown-menu{margin:-1px 0}.dropdown-hover:hover>.dropdown-menu,.open>.dropdown-menu{display:block;opacity:1}.dropdown-hover:hover>a,.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;font-weight:700;line-height:1.42857143;color:#838a9d}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0 dotted;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;border-radius:4px}.dropdown-submenu.open>.dropdown-menu,.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;border-radius:4px}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;content:" ";border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu>a{min-width:100px}.dropdown-submenu>.dropdown-menu.pull-left{right:100%;left:auto}.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0c64eb}.messager{display:table;margin:10px;overflow:hidden;color:#fff;pointer-events:auto;background-color:#3c4353;background-color:rgba(0,0,0,.8);border-radius:20px;-webkit-transition-property:opacity,-webkit-transform!important;-o-transition-property:opacity,-o-transform!important;transition-property:opacity,-webkit-transform!important;transition-property:opacity,transform!important;transition-property:opacity,transform,-webkit-transform,-o-transform!important}.messager-icon{display:table-cell;padding:10px 0 10px 15px;line-height:20px;text-align:center;vertical-align:top}.messager-content{display:table-cell;padding:10px 15px;vertical-align:top}.messager-content a{font-weight:700;color:inherit}.messager-title{font-size:14px;font-weight:700}.messager-title+.messager-text{margin-top:10px}.messager-actions{display:table-cell;vertical-align:top}.messager-actions>.action{min-width:40px;height:40px;padding:0 12px;color:#fafafa;color:rgba(255,255,255,.6);text-align:center;text-shadow:none;background:0 0;border:none}.messager-actions>.action.close{padding-bottom:5px;font-size:20px;font-weight:400;opacity:1}.messager-actions>.action:hover{color:#fff;background:rgba(0,0,0,.1)}.messager-actions .action-icon+.action-text{margin-left:8px}.messagers-holder{position:fixed;z-index:99999;padding:10px;pointer-events:none}.messagers-holder.top{top:0}.messagers-holder.top-left{top:0;left:0}.messagers-holder.top-right{top:0;right:0}.messagers-holder.bottom{bottom:0}.messagers-holder.bottom-left{bottom:0;left:0}.messagers-holder.bottom-right{right:0;bottom:0}.messagers-holder.bottom-right .messager,.messagers-holder.top-right .messager{margin-left:auto}.messagers-holder.center{top:0}.messagers-holder.bottom,.messagers-holder.center,.messagers-holder.top{right:0;left:0}.messagers-holder.bottom .messager,.messagers-holder.center .messager,.messagers-holder.top .messager{margin:10px auto}.messager-notification{min-width:250px;max-width:400px;border-radius:4px}.messager-notification .messager-icon{width:42px;vertical-align:middle}.messager-notification .messager-content{vertical-align:middle}.messager-text>p:last-child{margin:0}.messager-primary{background-color:#0c64eb}.messager-success{background-color:#00da88}.messager-info{background-color:#2196f3}.messager-warning{background-color:#ff9800}.messager-danger{background-color:#ff5d5d}.messager-important{background-color:#bd7b46}.messager-special{background-color:#8666b8}.article{padding:20px}.article>header h1,.article>header h2,.article>header h3{margin-bottom:20px;line-height:1.5}.article>header>.abstract,.article>header>dl{padding:10px 15px;font-size:12px;color:#67738e;background-color:#f1f1f1}.article>header>.abstract>p:last-child,.article>header>dl>p:last-child{margin-bottom:0}.article>header>dl{margin:0;border-bottom:1px solid #e9e9e9}.article>header>dl.pull-right{background-color:transparent;border:none}.article>footer{border-top:1px dashed #d8d8d8}.article>footer>p{padding:10px 15px}.article-content,.article>.content{padding:20px 0;font-size:14px;line-height:1.57142857}.article-content h1,.article>.content h1{font-size:20px}.article-content h2,.article>.content h2{font-size:18px}.article-content h3,.article>.content h3{font-size:16px}.article-content h4,.article>.content h4{margin-top:15px;font-size:14px}.article-content h5,.article>.content h5{margin-top:15px;font-size:13px}.article-content h6,.article>.content h6{margin-top:15px;font-size:11px}.article-content img,.article>.content img{margin:10px 0}.article-content p>img+img,.article>.content p>img+img{margin-left:10px}.article-content p>img[align=right],.article>.content p>img[align=right]{margin-left:10px}.article-content dl,.article>.content dl{padding-right:2em;padding-left:2em}.article-content table,.article>.content table{margin-bottom:20px}.article-content table td,.article-content table th,.article>.content table td,.article>.content table th{padding:8px 10px;line-height:1.42857143;vertical-align:top;border-bottom:1px solid #cbd0db}.article-content table>thead>tr>th,.article>.content table>thead>tr>th{vertical-align:bottom;background-color:transparent}.article-content p{margin-bottom:0}.article>.content table td,.article>.content table th,.article>.content table>thead>tr>th{border:1px solid #cbd0db}body.article-content{padding:8px}.article-condensed{padding:20px 0}.article-condensed>header{padding:0 20px}.article-condensed>header>.abstract,.article-condensed>header>dl{padding:10px 15px;margin:0 -20px}.article-condensed>.article-content,.article-condensed>.content{padding:20px}.article-condensed>.article-content>img,.article-condensed>.article-content>pre,.article-condensed>.content>img,.article-condensed>.content>pre{margin-right:-20px;margin-left:-20px;border-radius:0}.article-condensed>.article-content>pre,.article-condensed>.content>pre{border-right:none;border-left:none}.article-condensed>footer{border-top:1px dashed #d8d8d8}.article-condensed>footer>p{padding:10px 15px}.article-condensed>footer>.pager-justify>.previous>a{border-left:none;border-radius:0}.article-condensed>footer>.pager-justify>.next>a{border-right:none;border-radius:0}/*! * Datetimepicker for Bootstrap @@ -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-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:unset;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}.picker>.picker-selections>.picker-selection{text-overflow:unset;white-space:unset!important}.picker>.picker-selections>.picker-selection>.picker-selection-text{word-break:break-word}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li,.picker-drop-menu>.picker-option-list>.picker-option{text-overflow:unset;white-space:unset!important}.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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:unset;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;text-overflow:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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.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-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:unset;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}.picker>.picker-selections>.picker-selection{text-overflow:unset;white-space:unset!important}.picker>.picker-selections>.picker-selection>.picker-selection-text{word-break:break-word}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li,.picker-drop-menu>.picker-option-list>.picker-option{text-overflow:unset;white-space:unset!important}.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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:unset;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;text-overflow:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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:unset;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} From 8641c4cc0a48c4c1c95e068c744bc29d7fc140be Mon Sep 17 00:00:00 2001 From: wangzemei Date: Wed, 14 Sep 2022 03:15:06 +0000 Subject: [PATCH 127/168] * Finish task #68931 --- www/theme/default/style.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 53efc0b64e..43f93eb50b 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -111,3 +111,8 @@ body.xxc-embed.m-productplan-view,body.xxc-embed.m-bug-browse,body.xxc-embed.m-p #downloadMobile .dropdown-menu .mobile-qrcode iframe {width: 110px; height: 120px; text-align: center;} #downloadMobile .dropdown-menu .mobile-version {text-align: center;} #downloadMobile .dropdown-menu .mobile-version span {color: #0c64eb; font-size: 12px; font-weight: 700;} + +#mainMenu > .btn-toolBar > .btn-link > .label-light, +#mainMenu > .btn-toolbar > .btn-link > .label-light { + background: #fff; +} From a5b9544795bdec5dd1d777fd2c0fcca3bc2f18c1 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Wed, 14 Sep 2022 03:21:39 +0000 Subject: [PATCH 128/168] * modify #68931 --- www/theme/default/style.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 43f93eb50b..2795ade661 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -114,5 +114,11 @@ body.xxc-embed.m-productplan-view,body.xxc-embed.m-bug-browse,body.xxc-embed.m-p #mainMenu > .btn-toolBar > .btn-link > .label-light, #mainMenu > .btn-toolbar > .btn-link > .label-light { + color: #203362; background: #fff; } + +#mainMenu > .btn-toolBar > .btn-active-text, +#mainMenu > .btn-toolbar > .btn-active-text { + background: #E6EAF1; +} From 910850d4d93f27d040c18842df53f7ae973911de Mon Sep 17 00:00:00 2001 From: dingyongliang Date: Wed, 14 Sep 2022 03:24:54 +0000 Subject: [PATCH 129/168] * tash #68926, optimize the global avatar drop-down menu. --- www/theme/default/style.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 53efc0b64e..922629b38a 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -74,9 +74,10 @@ a.showMoreImage:hover {opacity: 1;} #userNav>li.open>a:before, #userNav>li>a:hover:before {position: absolute; bottom: 0px; left: calc(50% - 10px); width: 0; height: 0; content: ' '; border-color: transparent transparent #fff transparent; border-style: solid; border-width: 0 10px 10px 10px;} #userNav .dropdown-menu {z-index: 2000;} #userNav .dropdown-menu:hover + .dropdown-toggle:before {position: absolute; bottom: 0px; left: calc(50% - 10px); width: 0; height: 0; content: ' '; border-color: transparent transparent #fff transparent; border-style: solid; border-width: 0 10px 10px 10px;} -#userNav .dropdown-menu .dropdown-menu:hover:before {content: none;} #userNav .dropdown-menu, #userNav .create-list {margin-right: -15px !important; border-top: 0px;} #userNav .dropdown-menu .dropdown-submenu>ul {margin-right: 0px !important;} +#userNav .dropdown-menu .dropdown-submenu>ul::before {position: absolute; content: ''; top: -60px; bottom: -40px; left: -40px; right: 0;} +#userNav .dropdown-menu>li>a::before {position: absolute; content: ''; top: -4px; bottom: -4px; left: -10px; right: -10px;} #userNav .create-list:hover:before {right: 21.5% !important;} #modules li>a, #modules ul>li>a {overflow: hidden; white-space: nowrap;} From 1deda7b09a5fad640fe043333d273e5f57c832a1 Mon Sep 17 00:00:00 2001 From: Guan Xiying Date: Wed, 14 Sep 2022 11:32:51 +0800 Subject: [PATCH 130/168] * Add dtable class. --- lib/dtable/dtable.class.php | 166 ++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 lib/dtable/dtable.class.php diff --git a/lib/dtable/dtable.class.php b/lib/dtable/dtable.class.php new file mode 100644 index 0000000000..6e587f1075 --- /dev/null +++ b/lib/dtable/dtable.class.php @@ -0,0 +1,166 @@ + + * @package + * @license LGPL + * @version $Id$ + * @Link https://www.zentao.net + */ +class dtable +{ + /** + * Options of dtable. + */ + public $options; + + /** + * cols of dtable options. + */ + public $cols; + + /** + * data of dtable options. + */ + public $data; + + /** + * Init cols. + * + * @param array $cols + * @access public + * @return object $this + */ + public function colInit($cols) + { + $this->cols = $cols; + return $this; + } + + /** + * colSet + * + * @param string $colName + * @param object $col + * @access public + * @return object $this + */ + public function colSet($colName, $col) + { + $this->cols->$colName = $col; + return $this; + } + + /** + * Delete one col. + * + * @param string $colName + * @access public + * @return object + */ + public function colDelete($colName) + { + unset($this->cols->$colName); + return $this; + } + + /** + * set col attr. + * + * @param string $colName + * @param string $property + * @param mixed $value + * @access public + * @return object + */ + public function colAttr($colName, $property, $value) + { + if(!isset($this->cols->$colName)) $this->cols->$colName = new stdClass; + $this->cols->{$colName}->{$property} = $value; + return $this; + } + + /** + * dataInit + * + * @param array $data + * @access public + * @return object + */ + public function dataInit($data) + { + $this->data = $data; + return $this; + } + + /** + * dataAappend + * + * @param object $row + * @access public + * @return object + */ + public function dataAappend($row) + { + $this->data[] = $row; + return $this; + } + + /** + * dataSet + * + * @param string $index + * @param object $data + * @access public + * @return object + */ + public function dataSet($index, $data) + { + $this->data[$index] = $data; + return $this; + } + + /** + * dataBatchSet + * + * @param mixed $scope [1,2,3,4] | all + * @param object $data + * @access public + * @return object + */ + public function dataBatchSet($scope, $data) + { + if($scope == 'all') $scope = array_keys($this->data); + + foreach($scope as $index) $this->data[$index] = $data; + + return $this; + } + + /** + * Get dtable options. + * + * @access public + * @return object + */ + public function getOptions($extra) + { + $this->options = new stdClass; + $this->options->cols = $this->cols; + $this->options->data = $this->data; + return $this->options; + } + + /** + * Get final js code. + * + * @access public + * @return string + */ + public function exportJS() + { + + } +} From 9e84862b3f2e81b7f8d2df6ac8c7e07bb1db2bb4 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Wed, 14 Sep 2022 11:49:02 +0800 Subject: [PATCH 131/168] * Fix the problem that Kanban cannot be loaded. --- module/kanban/js/view.js | 1 + 1 file changed, 1 insertion(+) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 58be339456..29c29ed155 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -1559,6 +1559,7 @@ $(function() distance = 0; radiusWidth = 10; $(window).on('resize', initRegionTabs); + if(window.navigator.userAgent.indexOf("Chrome") == -1) initRegionTabs(); $('.leftBtn').click(function() { From 2b75baa00456953ff7082900c067e476c2a5c692 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 14 Sep 2022 13:39:40 +0800 Subject: [PATCH 132/168] * fix bug #27472. --- module/task/view/recordestimate.html.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/task/view/recordestimate.html.php b/module/task/view/recordestimate.html.php index 1dbb626960..dfc05fb33b 100644 --- a/module/task/view/recordestimate.html.php +++ b/module/task/view/recordestimate.html.php @@ -21,7 +21,11 @@ if(!empty($members) && $task->mode == 'linear') $isCurrent = false; foreach($task->team as $taskTeam) { - if($isCurrent) $nextAccount = $taskTeam->account; + if($isCurrent) + { + $nextAccount = $taskTeam->account; + break; + } if($task->assignedTo == $taskTeam->account and $taskTeam->account == $app->user->account and $taskTeam->status != 'done') $isCurrent = true; } if($nextAccount) $confirmRecord = sprintf($lang->task->confirmTransfer, zget($users, $nextAccount)); From 5ceb75a7c2031a551aa5b1238f61e29a18f2f3ac Mon Sep 17 00:00:00 2001 From: dingyongliang Date: Wed, 14 Sep 2022 06:04:57 +0000 Subject: [PATCH 133/168] * tash #68929, center the kanban title. --- module/execution/css/taskkanban.css | 4 ++-- module/kanban/css/view.css | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/module/execution/css/taskkanban.css b/module/execution/css/taskkanban.css index 09efcb06c9..c9adfef160 100644 --- a/module/execution/css/taskkanban.css +++ b/module/execution/css/taskkanban.css @@ -16,7 +16,7 @@ .kanban-card > .actions > a {display: block; float: left; width: 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; opacity: .7;} .kanban-card > .actions > a:hover {background-color: rgba(0,0,0,.075); opacity: 1;} -.kanban-header-col > .actions {padding-top: 22px} +.kanban-header-col > .actions {top: auto!important; right: 5px!important;} .kanban-header-parent-col .kanban-header-col > .actions {padding-top: 6px; padding-right: 2px;} .kanban-header-col > .actions > a {display: block; float: left; width: 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; opacity: .7;} .kanban-header-col > .actions > a:hover {background-color: rgba(0,0,0,.075); opacity: 1;} @@ -46,6 +46,7 @@ #kanbans .kanban-card[data-scale-size="2"] > .infos > .info-pri {transform: scale(.8); vertical-align: top;} #kanbans .kanban-card[data-scale-size="2"] > .infos > .avatar {display: inline-block; transform: scale(.8); position: relative; top: -2px; vertical-align: top; margin-right: -1px;} #kanbans .kanban-card[data-scale-size="2"] > .infos > .info-estimate {top: -1px;} +#kanbans .kanban-col {padding: 0px !important;} #kanbanScaleControl {width: 100px;} #kanbanScaleControl .input-group-addon {background: #fff; padding: 5px;} @@ -61,7 +62,6 @@ .c-group {width: 190px !important; overflow: unset;} .c-type {margin-left: 0px !important;} -.createButton {margin-right: 5px;} .headerTop {top: 0px !important;} .kanban-header-col>.actions>a {padding: 0px !important;} diff --git a/module/kanban/css/view.css b/module/kanban/css/view.css index d841043f41..6ea368cdcc 100644 --- a/module/kanban/css/view.css +++ b/module/kanban/css/view.css @@ -42,7 +42,6 @@ .region .kanban-header-col > .title > .count {opacity: .5; font-weight: bold; color: #8b91a2;} .region .kanban-header-col > .title > .error {color: #333333; padding-left: 2px; font-size: 10px; padding-top: 1px; padding-right: 2px;} .kanban-affixed .kanban-header-col > .title > .text {color: #fff!important} -.region .kanban-header-col > .actions {position: inherit; top: 0px;} .region .kanban-header-parent-col > .actions {position: absolute; right: 0px; top: 0px !important;} .region .kanban-header-sub-cols .actions {position: absolute; right: 0px; top: 0px !important;} @@ -106,7 +105,7 @@ .region-header > .icon{padding: 6px; margin-left:2px;} .kanban-col[data-type=ADD] {display: none;} .kanban-col[data-type=EMPTY] {display: none;} -.kanban-col {padding-right: 0px !important;} +.kanban-col {padding: 0px !important;} .kanban-col.drag-shadow {background-color: #ededed !important; border-color: #ededed!important; box-shadow: 0 4px 10px 0 rgb(0,0,0, 0.05), 0 4px 20px 0 rgb(0,0,0, .3); min-height: 30px!important;} .kanban-col.drag-shadow .kanban-header-col {min-height: 30px!important;} .kanban-header-has-parent .kanban-header-cols > .kanban-col.drag-shadow, From 714dffe615371323abf7848e05cea6c59e935ac7 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Wed, 14 Sep 2022 14:42:44 +0800 Subject: [PATCH 134/168] * Fix bug for bug export. --- module/bug/model.php | 2 +- module/port/model.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index 98f11bebb6..029d351d5f 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -3638,7 +3638,7 @@ class bugModel extends model public function getRelatedObjects($object, $pairs = '') { /* Get bugs. */ - $bugs = $this->dao->select('*')->from(TABLE_BUG)->where($this->session->bugQueryCondition)->fetchAll('id'); + $bugs = $this->loadModel('port')->getQueryDatas('bug'); /* Get related objects id lists. */ $relatedObjectIdList = array(); diff --git a/module/port/model.php b/module/port/model.php index 118b19b2da..635ec9507a 100644 --- a/module/port/model.php +++ b/module/port/model.php @@ -695,7 +695,7 @@ class portModel extends model $lists[$listName] = $fieldList[$field]['values']; if(strpos($this->config->$model->sysLangFields, $field)) $lists[$listName] = join(',', $fieldList[$field]['values']); } - $this->config->excel->sysDataField[] = $field; + if(is_array($lists[$listName])) $this->config->excel->sysDataField[] = $field; } $lists['listStyle'] = $listFields; From 7dbf59d067ae0f790564616381685ad2a7e26924 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 14 Sep 2022 15:53:32 +0800 Subject: [PATCH 135/168] * Ajax refresh view page when close effort modal. --- module/task/js/recordestimate.js | 13 ------------- module/task/js/view.js | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/module/task/js/recordestimate.js b/module/task/js/recordestimate.js index d3a3326679..bac93375f7 100644 --- a/module/task/js/recordestimate.js +++ b/module/task/js/recordestimate.js @@ -1,18 +1,5 @@ $(function() { - var parentLink = parent.location.href; - if(parentLink.indexOf('view') > 0) - { - $.get(parentLink, function(data) - { - $data = $(data); - parent.$('#actionbox ol.histories-list').html($data.find('#actionbox ol.histories-list').html()); - parent.$('.side-col').html($data.find('.side-col').html()); - - if(parent.$('#actionbox ol.histories-list #lastComment').length > 0) $(initKindeditor); - }); - } - $('.form-date').datetimepicker('setEndDate', today); $("#recordForm #submit").click(function(e, confirmed) diff --git a/module/task/js/view.js b/module/task/js/view.js index 111813487d..28768c9858 100644 --- a/module/task/js/view.js +++ b/module/task/js/view.js @@ -13,4 +13,19 @@ function assign(taskID, assignedTo) $(document).ready(function() { limitIframeLevel(); + /* Ajax refresh view page when close effort modal. */ + $(document).on('mousedown', '#triggerModal .modal-header button.close', function() + { + var href = $(this).closest('#triggerModal').attr('ref').toLowerCase(); + if(href.indexOf('recordestimate') < 0 && href.indexOf('createforobject') < 0) return; + + $.get(location.href, function(data) + { + $data = $(data); + $('#actionbox ol.histories-list').html($data.find('#actionbox ol.histories-list').html()); + $('.side-col').html($data.find('.side-col').html()); + + if($('#actionbox ol.histories-list #lastComment').length > 0) $('#actionbox ol.histories-list #lastComment').kindeditor(); + }); + }) }); From 8e476913586c27ffba2d975f5e465c9b5126549c Mon Sep 17 00:00:00 2001 From: liyang Date: Wed, 14 Sep 2022 09:03:22 +0000 Subject: [PATCH 136/168] * Fix unit test config. --- test/config/config.php | 2 +- test/lib/init.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/config/config.php b/test/config/config.php index f2dad7e19c..4efef6361d 100644 --- a/test/config/config.php +++ b/test/config/config.php @@ -1,7 +1,7 @@ test = new stdclass; $config->test->dbPrefix = "db_"; //复制数据库的数据库前缀,便于区分复制数据库 -$config->test->rawDB = ''; //要复制的数据库,也就是ztest init初始化的数据库,例子:zentaounittest +$config->test->rawDB = 'zentaounittest'; //要复制的数据库,也就是ztest init初始化的数据库,例子:zentaounittest $config->test->dbNum = 10; //复制数据库的数量,可以根据自己的需要自行调节 $config->test->base = ''; //api测试基准路径,例子:http://liyang.oop.cc:8072/max/api.php/v1 diff --git a/test/lib/init.php b/test/lib/init.php index 6295833f11..5aaf6c2d42 100644 --- a/test/lib/init.php +++ b/test/lib/init.php @@ -62,9 +62,9 @@ include $testPath . 'config/config.php'; include $testPath. 'lib/db.class.php'; include $testPath. 'lib/rest.php'; $db = new db(); -$rest = new rest($config->test->base); +if($config->test->base) $rest = new rest($config->test->base); -if(isset($config->test->account, $config->test->password)) +if(!empty($config->test->account) and !empty($config->test->password)) { $token = $rest->post('/tokens', array('account' => $config->test->account, 'password' => $config->test->password)); $token = $token->body; From c87c77b709e4398a0df26031c8df00fe40a41b71 Mon Sep 17 00:00:00 2001 From: liyang Date: Wed, 14 Sep 2022 09:14:48 +0000 Subject: [PATCH 137/168] * Fix init. --- test/lib/init.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/lib/init.php b/test/lib/init.php index 5aaf6c2d42..4d610614da 100644 --- a/test/lib/init.php +++ b/test/lib/init.php @@ -62,10 +62,10 @@ include $testPath . 'config/config.php'; include $testPath. 'lib/db.class.php'; include $testPath. 'lib/rest.php'; $db = new db(); -if($config->test->base) $rest = new rest($config->test->base); -if(!empty($config->test->account) and !empty($config->test->password)) +if(!empty($config->test->account) and !empty($config->test->password) and !empty($config->test->base)) { + $rest = new rest($config->test->base); $token = $rest->post('/tokens', array('account' => $config->test->account, 'password' => $config->test->password)); $token = $token->body; } From c71e749a6992b7a90d96059bfd4504f24e96f59d Mon Sep 17 00:00:00 2001 From: liyang Date: Wed, 14 Sep 2022 09:17:30 +0000 Subject: [PATCH 138/168] * Fix init. --- test/lib/init.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lib/init.php b/test/lib/init.php index 4d610614da..ea50a9dc84 100644 --- a/test/lib/init.php +++ b/test/lib/init.php @@ -65,7 +65,7 @@ $db = new db(); if(!empty($config->test->account) and !empty($config->test->password) and !empty($config->test->base)) { - $rest = new rest($config->test->base); + $rest = new rest($config->test->base); $token = $rest->post('/tokens', array('account' => $config->test->account, 'password' => $config->test->password)); $token = $token->body; } From bb9aa91422b807300a8e6772ab96f9045d5b904b Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 14 Sep 2022 17:34:28 +0800 Subject: [PATCH 139/168] * adjust for finish page style. --- module/task/control.php | 6 ++--- module/task/js/view.js | 31 ++++++++++++------------- module/task/view/finish.html.php | 40 +++++++++++++++++++++++--------- 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index 0862950065..e5dc0d5de7 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -1152,7 +1152,7 @@ class task extends control $kanbanData = $this->loadModel('kanban')->getRDKanban($task->execution, $execLaneType, 'id_desc', 0, $execGroupBy, $rdSearchValue); $kanbanData = json_encode($kanbanData); - return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)")); + return print(js::reload('parent') . js::execute("parent.parent.updateKanban($kanbanData)")); } if($from == 'taskkanban') { @@ -1162,9 +1162,9 @@ class task extends control $kanbanData = $kanbanData[$kanbanType]; $kanbanData = json_encode($kanbanData); - return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban(\"task\", $kanbanData)")); + return print(js::reload('parent') . js::execute("parent.parent.updateKanban(\"task\", $kanbanData)")); } - return print(js::reload('parent')); + return print(js::reload('parent') . js::execute("if(typeof(parent.parent.ajaxRefresh) == 'function') parent.parent.ajaxRefresh()")); } return print(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); } diff --git a/module/task/js/view.js b/module/task/js/view.js index 28768c9858..45c9d15b55 100644 --- a/module/task/js/view.js +++ b/module/task/js/view.js @@ -1,6 +1,7 @@ $(function() { if(config.onlybody == 'yes') $('.main-actions').css('width', '100%'); + limitIframeLevel(); }); function assign(taskID, assignedTo) @@ -10,22 +11,20 @@ function assign(taskID, assignedTo) $('.assign').load(createLink('user', 'ajaxGetUser', 'taskID=' + taskID + '&assignedTo=' + assignedTo)); } -$(document).ready(function() +/** + * Ajax refresh + * + * @access public + * @return void + */ +function ajaxRefresh() { - limitIframeLevel(); - /* Ajax refresh view page when close effort modal. */ - $(document).on('mousedown', '#triggerModal .modal-header button.close', function() + $.get(location.href, function(data) { - var href = $(this).closest('#triggerModal').attr('ref').toLowerCase(); - if(href.indexOf('recordestimate') < 0 && href.indexOf('createforobject') < 0) return; + $data = $(data); + $('#actionbox ol.histories-list').html($data.find('#actionbox ol.histories-list').html()); + $('.side-col').html($data.find('.side-col').html()); - $.get(location.href, function(data) - { - $data = $(data); - $('#actionbox ol.histories-list').html($data.find('#actionbox ol.histories-list').html()); - $('.side-col').html($data.find('.side-col').html()); - - if($('#actionbox ol.histories-list #lastComment').length > 0) $('#actionbox ol.histories-list #lastComment').kindeditor(); - }); - }) -}); + if($('#actionbox ol.histories-list #lastComment').length > 0) $('#actionbox ol.histories-list #lastComment').kindeditor(); + }); +} diff --git a/module/task/view/finish.html.php b/module/task/view/finish.html.php index 8ed4fbaf2a..42f5af056e 100644 --- a/module/task/view/finish.html.php +++ b/module/task/view/finish.html.php @@ -47,7 +47,7 @@ team)):?> - task->hasConsumed;?> + task->my . $lang->task->hasConsumed;?> myConsumed;?> workingHour;?> @@ -56,19 +56,23 @@
    task->hour;?>
    - - - team) ? $lang->task->consumed : $lang->task->myConsumed;?> - team) ? $task->consumed : (float)$task->myConsumed;?> - " . (float)$consumed . "
    " . $lang->workingHour . html::hidden('consumed', $consumed); - js::set('consumed', $consumed); - ?> +
    +
    team) ? $lang->task->consumed : $lang->task->myConsumed;?>
    +
    + team) ? $task->consumed : (float)$task->myConsumed;?> + " . (float)$consumed . " " . $lang->workingHour . html::hidden('consumed', $consumed); + js::set('consumed', $consumed); + ?> +
    +
    + + '> - team) and $task->mode == 'linear') ? $lang->task->transferTo : $lang->task->assign;?> + task->assign;?> team) and $task->mode == 'linear') @@ -84,7 +88,21 @@ task->realStarted;?> -
    realStarted != '0000-00-00 00:00:00' ? $task->realStarted : '', "class='form-control form-datetime'");?>
    + +
    + realStarted; + $readonly = 'readonly'; + if(helper::isZeroDate($realStarted)) + { + $realStarted = ''; + $readonly = ''; + } + ?> + +
    + + task->finishedDate;?> From 1782693e3169c839e38afd6f9acf6f73330afa1f Mon Sep 17 00:00:00 2001 From: tianshujie Date: Thu, 15 Sep 2022 08:23:42 +0800 Subject: [PATCH 140/168] * Restore code. --- test/lib/init.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/lib/init.php b/test/lib/init.php index 5aaf6c2d42..6295833f11 100644 --- a/test/lib/init.php +++ b/test/lib/init.php @@ -62,9 +62,9 @@ include $testPath . 'config/config.php'; include $testPath. 'lib/db.class.php'; include $testPath. 'lib/rest.php'; $db = new db(); -if($config->test->base) $rest = new rest($config->test->base); +$rest = new rest($config->test->base); -if(!empty($config->test->account) and !empty($config->test->password)) +if(isset($config->test->account, $config->test->password)) { $token = $rest->post('/tokens', array('account' => $config->test->account, 'password' => $config->test->password)); $token = $token->body; From ae2f8881c5a38b4aa95dc395d8968c7567cec0cc Mon Sep 17 00:00:00 2001 From: Guan Xiying Date: Thu, 15 Sep 2022 09:07:43 +0800 Subject: [PATCH 141/168] * Rename exportJS to show. --- lib/dtable/dtable.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dtable/dtable.class.php b/lib/dtable/dtable.class.php index 6e587f1075..aa419f345a 100644 --- a/lib/dtable/dtable.class.php +++ b/lib/dtable/dtable.class.php @@ -154,12 +154,12 @@ class dtable } /** - * Get final js code. + * Show dtable codes. * * @access public * @return string */ - public function exportJS() + public function show() { } From 202d334ef9887d829324087d98970136b94b5727 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Thu, 15 Sep 2022 01:51:15 +0000 Subject: [PATCH 142/168] * Format --- www/theme/default/style.css | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 2795ade661..2d1049e5ec 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -113,12 +113,6 @@ body.xxc-embed.m-productplan-view,body.xxc-embed.m-bug-browse,body.xxc-embed.m-p #downloadMobile .dropdown-menu .mobile-version span {color: #0c64eb; font-size: 12px; font-weight: 700;} #mainMenu > .btn-toolBar > .btn-link > .label-light, -#mainMenu > .btn-toolbar > .btn-link > .label-light { - color: #203362; - background: #fff; -} - +#mainMenu > .btn-toolbar > .btn-link > .label-light {color: #203362; background: #fff;} #mainMenu > .btn-toolBar > .btn-active-text, -#mainMenu > .btn-toolbar > .btn-active-text { - background: #E6EAF1; -} +#mainMenu > .btn-toolbar > .btn-active-text {background: #E6EAF1;} From c1642ca43a7d53b8e9e155be5558293b4dd594e0 Mon Sep 17 00:00:00 2001 From: sunguangming Date: Thu, 15 Sep 2022 10:33:29 +0800 Subject: [PATCH 143/168] * Fix task error. --- 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 66317937d1..301f650360 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -2454,7 +2454,7 @@ class taskModel extends model ->beginIF($type == 'assignedtome')->andWhere("(t1.assignedTo = '{$this->app->user->account}' or (t1.mode = 'multi' and t4.`account` = '{$this->app->user->account}') )")->fi() ->beginIF($type == 'finishedbyme') ->andWhere('t1.finishedby', 1)->eq($this->app->user->account) - ->orWhere('t5.status')->eq("done") + ->orWhere('t4.status')->eq("done") ->markRight(1) ->fi() ->beginIF($type == 'delayed')->andWhere('t1.deadline')->gt('1970-1-1')->andWhere('t1.deadline')->lt(date(DT_DATE1))->andWhere('t1.status')->in('wait,doing')->fi() From a497bafb9fa9aab9060c51b9194df60214bbf227 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 15 Sep 2022 10:49:40 +0800 Subject: [PATCH 144/168] * fix bug. --- 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 66317937d1..301f650360 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -2454,7 +2454,7 @@ class taskModel extends model ->beginIF($type == 'assignedtome')->andWhere("(t1.assignedTo = '{$this->app->user->account}' or (t1.mode = 'multi' and t4.`account` = '{$this->app->user->account}') )")->fi() ->beginIF($type == 'finishedbyme') ->andWhere('t1.finishedby', 1)->eq($this->app->user->account) - ->orWhere('t5.status')->eq("done") + ->orWhere('t4.status')->eq("done") ->markRight(1) ->fi() ->beginIF($type == 'delayed')->andWhere('t1.deadline')->gt('1970-1-1')->andWhere('t1.deadline')->lt(date(DT_DATE1))->andWhere('t1.status')->in('wait,doing')->fi() From 18c3f1637fb59fe695dd0142e76a779edffb4ecd Mon Sep 17 00:00:00 2001 From: liuyongkai Date: Thu, 15 Sep 2022 03:14:23 +0000 Subject: [PATCH 145/168] * Finish story 35042. --- module/weekly/css/index.css | 1 + module/weekly/lang/de.php | 2 ++ module/weekly/lang/en.php | 2 ++ module/weekly/lang/fr.php | 2 ++ module/weekly/lang/vi.php | 2 ++ module/weekly/lang/zh-cn.php | 2 ++ module/weekly/lang/zh-tw.php | 2 ++ module/weekly/view/index.html.php | 12 +++++++++--- 8 files changed, 22 insertions(+), 3 deletions(-) diff --git a/module/weekly/css/index.css b/module/weekly/css/index.css index fe916f0ecb..ecb9d045b5 100644 --- a/module/weekly/css/index.css +++ b/module/weekly/css/index.css @@ -1,3 +1,4 @@ #mainContent td.projectName {white-space: nowrap; overflow-x: hidden;} .main-table tbody>tr:nth-child(odd) {background-color:#fff;} #pageNav .angle-btn:first-child a.btn {max-width: 300px; overflow: hidden;} +.totalCount {margin-top: 15px !important; font-weight: bold; text-align: right; padding: 8px 50px 8px 8px;} diff --git a/module/weekly/lang/de.php b/module/weekly/lang/de.php index 8f87280b74..c34bd92dc5 100644 --- a/module/weekly/lang/de.php +++ b/module/weekly/lang/de.php @@ -37,3 +37,5 @@ $lang->weekly->ev = 'Earned Value(EV)'; $lang->weekly->ac = 'Actual Cost(AC)'; $lang->weekly->sv = 'Schedule Variance(SV%)'; $lang->weekly->cv = 'Cost Variance(CV%)'; + +$lang->weekly->totalCount = 'Total : %u tasks'; diff --git a/module/weekly/lang/en.php b/module/weekly/lang/en.php index 18608dd719..cd0a4ff031 100644 --- a/module/weekly/lang/en.php +++ b/module/weekly/lang/en.php @@ -37,3 +37,5 @@ $lang->weekly->ev = 'Earned Value(EV)'; $lang->weekly->ac = 'Actual Cost(AC)'; $lang->weekly->sv = 'Schedule Variance(SV%)'; $lang->weekly->cv = 'Cost Variance(CV%)'; + +$lang->weekly->totalCount = 'Total : %u tasks'; diff --git a/module/weekly/lang/fr.php b/module/weekly/lang/fr.php index 8f87280b74..c34bd92dc5 100644 --- a/module/weekly/lang/fr.php +++ b/module/weekly/lang/fr.php @@ -37,3 +37,5 @@ $lang->weekly->ev = 'Earned Value(EV)'; $lang->weekly->ac = 'Actual Cost(AC)'; $lang->weekly->sv = 'Schedule Variance(SV%)'; $lang->weekly->cv = 'Cost Variance(CV%)'; + +$lang->weekly->totalCount = 'Total : %u tasks'; diff --git a/module/weekly/lang/vi.php b/module/weekly/lang/vi.php index 18608dd719..cd0a4ff031 100644 --- a/module/weekly/lang/vi.php +++ b/module/weekly/lang/vi.php @@ -37,3 +37,5 @@ $lang->weekly->ev = 'Earned Value(EV)'; $lang->weekly->ac = 'Actual Cost(AC)'; $lang->weekly->sv = 'Schedule Variance(SV%)'; $lang->weekly->cv = 'Cost Variance(CV%)'; + +$lang->weekly->totalCount = 'Total : %u tasks'; diff --git a/module/weekly/lang/zh-cn.php b/module/weekly/lang/zh-cn.php index a57fd3b190..53364d712c 100644 --- a/module/weekly/lang/zh-cn.php +++ b/module/weekly/lang/zh-cn.php @@ -37,3 +37,5 @@ $lang->weekly->ev = '实际完成的工作(EV)'; $lang->weekly->ac = '实际花费的成本(AC)'; $lang->weekly->sv = '进度偏差率(SV%)'; $lang->weekly->cv = '成本偏差率(CV%)'; + +$lang->weekly->totalCount = '总计 : %u 个任务'; diff --git a/module/weekly/lang/zh-tw.php b/module/weekly/lang/zh-tw.php index 68dfbf19ae..45bdcfe74b 100644 --- a/module/weekly/lang/zh-tw.php +++ b/module/weekly/lang/zh-tw.php @@ -37,3 +37,5 @@ $lang->weekly->ev = '實際完成的工作(EV)'; $lang->weekly->ac = '實際花費的成本(AC)'; $lang->weekly->sv = '進度偏差率(SV%)'; $lang->weekly->cv = '成本偏差率(CV%)'; + +$lang->weekly->totalCount = '總計 : %u 個任務'; diff --git a/module/weekly/view/index.html.php b/module/weekly/view/index.html.php index 9ccb5ec4e5..aa0882abc2 100644 --- a/module/weekly/view/index.html.php +++ b/module/weekly/view/index.html.php @@ -74,10 +74,11 @@ + - id);?> + id); $totalCount++;?> createLink('task', 'view', 'id=' . $task->id), $task->name); ?> @@ -90,6 +91,7 @@ +
    weekly->totalCount, $totalCount);?>

    weekly->postponed;?>

    @@ -105,10 +107,11 @@ +
    - id);?> + id); $totalCount++;?> createLink('task', 'view', 'id=' . $task->id), $task->name); ?> @@ -122,6 +125,7 @@
    +
    weekly->totalCount, $totalCount);?>

    weekly->nextWeek;?>

    @@ -135,10 +139,11 @@ +
    - id);?> + id); $totalCount++;?> createLink('task', 'view', 'id=' . $task->id), $task->name); ?> @@ -150,6 +155,7 @@
    +
    weekly->totalCount, $totalCount);?>

    weekly->workloadByType;?>

    From 5bdea0af1d34551f64a75dee31caba89bde33781 Mon Sep 17 00:00:00 2001 From: liuyongkai Date: Thu, 15 Sep 2022 05:57:31 +0000 Subject: [PATCH 146/168] * Finish stroy 35042. --- module/weekly/view/index.html.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/module/weekly/view/index.html.php b/module/weekly/view/index.html.php index aa0882abc2..31227aa807 100644 --- a/module/weekly/view/index.html.php +++ b/module/weekly/view/index.html.php @@ -74,11 +74,10 @@ -
    - id); $totalCount++;?> + id);?> createLink('task', 'view', 'id=' . $task->id), $task->name); ?> @@ -91,7 +90,7 @@
    -
    weekly->totalCount, $totalCount);?>
    +
    weekly->totalCount, count($finished));?>

    weekly->postponed;?>

    @@ -107,11 +106,10 @@ -
    - id); $totalCount++;?> + id);?> createLink('task', 'view', 'id=' . $task->id), $task->name); ?> @@ -125,7 +123,7 @@
    -
    weekly->totalCount, $totalCount);?>
    +
    weekly->totalCount, count($postponed));?>

    weekly->nextWeek;?>

    @@ -139,11 +137,10 @@ -
    - id); $totalCount++;?> + id);?> createLink('task', 'view', 'id=' . $task->id), $task->name); ?> @@ -155,7 +152,7 @@
    -
    weekly->totalCount, $totalCount);?>
    +
    weekly->totalCount, count($nextWeek));?>

    weekly->workloadByType;?>

    From f25ff4605b1327fbfe61c33391b80e47f1ee3c0a Mon Sep 17 00:00:00 2001 From: wangzemei Date: Thu, 15 Sep 2022 06:10:54 +0000 Subject: [PATCH 147/168] * Finish #68935 --- module/product/view/browse.html.php | 2 ++ module/story/model.php | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index 67099b3ebe..ba33aa17a7 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -41,6 +41,8 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : ''; .btn-group a i.icon-plus, .btn-group a i.icon-link {font-size: 16px;} .btn-group a.btn-secondary, .btn-group a.btn-primary {border-right: 1px solid rgba(255,255,255,0.2);} .btn-group button.dropdown-toggle.btn-secondary, .btn-group button.dropdown-toggle.btn-primary {padding:6px;} +#productStoryForm #storyList .c-actions {overflow: visible;} +#productStoryForm #storyList .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #E4E4E4; margin: 0 4px 0 0;} - + @@ -115,7 +115,7 @@ - + From d6f395cc1b1bef8ce74c40c201253031aa561176 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 16 Sep 2022 15:00:21 +0800 Subject: [PATCH 159/168] * fix bug #27012. --- module/task/view/create.html.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/task/view/create.html.php b/module/task/view/create.html.php index 995fb04143..a4b271b2e0 100644 --- a/module/task/view/create.html.php +++ b/module/task/view/create.html.php @@ -165,6 +165,7 @@ foreach(explode(',', $config->task->create->requiredFields) as $field) 30) break;?> +
    title=todo->pri;?>> priAB);?> todo->name);?> todo->assignedBy);?> todo->assignedTo);?> todo->beginAB);?> todo->endAB);?> todo->status);?>todo->typeList, $todo->type, '');?> pri;?>' title='todo->priList, $todo->pri, $todo->pri);?>'>todo->priList, $todo->pri)?> createLink('todo', 'view', "id=$todo->id&from=my", '', true), $todo->name, '', "data-toggle='modal' data-width='80%' data-type='iframe' data-title='" . $lang->todo->view . "' data-icon='check'");?>assignedBy);?>assignedTo);?> begin;?> end;?> todo->statusList[$todo->status];?>
    From 3c27ea607fed78296c28ac177bffcc5cc2930f09 Mon Sep 17 00:00:00 2001 From: liuhong Date: Sun, 18 Sep 2022 13:21:03 +0000 Subject: [PATCH 160/168] *Fix bug #27291 for show duplicate requirements. --- module/story/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/control.php b/module/story/control.php index 16b4b7158b..d0194d3ce5 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -847,7 +847,7 @@ class story extends control 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, ''); + $productStories = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, '', $story->type); $this->view->title = $this->lang->story->edit . "STORY" . $this->lang->colon . $this->view->story->title; $this->view->position[] = $this->lang->story->edit; From 104787503b308182fd330c49596e0983c65b3aee Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 19 Sep 2022 00:19:56 +0000 Subject: [PATCH 161/168] * Fix bug#27528. --- module/story/model.php | 2 +- module/task/config.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 148c1a957e..daa164f99b 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -4273,7 +4273,7 @@ class storyModel extends model { $menu .= "
    "; } - + $menu .= $this->buildMenu('story', 'edit', $params . "&kanbanGroup=default&storyType=$story->type", $story, $type, '', '', 'showinonlybody'); $tab = $this->app->tab == 'project' ? 'project' : 'qa'; diff --git a/module/task/config.php b/module/task/config.php index 6a67b81f84..884370394a 100644 --- a/module/task/config.php +++ b/module/task/config.php @@ -48,7 +48,7 @@ $config->task->custom->createFields = $config->task->customCreateFields; $config->task->custom->batchCreateFields = 'module,story,assignedTo,estimate,desc,pri'; $config->task->custom->batchEditFields = 'module,assignedTo,status,pri,estimate,record,left'; -$config->task->excludeCheckFileds = ',pri,estStartedDitto,deadlineDitto,parent,regions,lanes,'; +$config->task->excludeCheckFileds = ',pri,estStartedDitto,deadlineDitto,parent,regions,lanes,vision,region,'; $config->task->datatable = new stdclass(); $config->task->datatable->defaultField = array('id', 'pri', 'name', 'status', 'assignedTo', 'finishedBy', 'estimate', 'consumed', 'left', 'progress', 'deadline', 'actions'); From c3a1bedeefecb3ebb1880045c254c68e44ffaee9 Mon Sep 17 00:00:00 2001 From: liuhong Date: Mon, 19 Sep 2022 00:27:43 +0000 Subject: [PATCH 162/168] *Fix bug #27291. --- module/story/control.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index d0194d3ce5..05a1eb0a1f 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -750,6 +750,7 @@ class story extends control $this->loadModel('file'); $this->app->loadLang('bug'); $story = $this->story->getById($storyID, 0, true); + $this->commonAction($storyID); if(!empty($_POST)) { @@ -793,8 +794,6 @@ class story extends control return print(js::locate($this->createLink($this->app->rawModule, 'view', $params), 'parent')); } - $this->commonAction($storyID); - /* Sort products. */ $myProducts = array(); $othersProducts = array(); From 86f4412952694d459bea2bb84177c846b69d308b Mon Sep 17 00:00:00 2001 From: denghongtao Date: Mon, 19 Sep 2022 00:57:08 +0000 Subject: [PATCH 163/168] * Fix set null qusetion. --- test/lib/controlapi.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lib/controlapi.php b/test/lib/controlapi.php index ca160059b4..23b4aa8beb 100755 --- a/test/lib/controlapi.php +++ b/test/lib/controlapi.php @@ -15,7 +15,7 @@ class apiCheckModel global $argv; $path = $argv[1]; $entries = ''; - if($argv[2]) $entries = $argv[2]; + if(isset($argv[2])) $entries = $argv[2]; $this->run($argv[1], $entries); } From 624c000f7dd095146c54134f1e6910b7540b153d Mon Sep 17 00:00:00 2001 From: liuhong Date: Mon, 19 Sep 2022 02:15:34 +0000 Subject: [PATCH 164/168] *Fix bug #27183 for newline when kanban create task. --- module/task/css/create.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/css/create.css b/module/task/css/create.css index b1d4fbd6ee..c668eb1d93 100644 --- a/module/task/css/create.css +++ b/module/task/css/create.css @@ -14,7 +14,7 @@ #testStoryBox table tr td input {border: 0px;} #testStoryBox table tr td .input-group .input-group-addon {border-left: 1px solid #dcdcdc; border-right: 1px solid #dcdcdc;} #testStoryBox table button.btn {border: 0px;} -#testStoryBox .c-name {width: 300px;} +#testStoryBox .c-name {width: 120px;} #testStoryBox .c-pri, #testStoryBox .c-estimate, #testStoryBox .c-actions {width: 70px;} #testStoryBox .c-date {width: 140px;} #testStoryBox .c-assignedTo {width: 100px; padding: 7px;} From f206391ee693426c22ed92a2b8b3dc4c6c6d20c8 Mon Sep 17 00:00:00 2001 From: mayue Date: Mon, 19 Sep 2022 13:54:34 +0800 Subject: [PATCH 165/168] * Fix bug #27535. --- module/story/control.php | 2 +- module/story/model.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/story/control.php b/module/story/control.php index 05a1eb0a1f..4f2d88331f 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -606,7 +606,7 @@ class story extends control /* Init vars. */ $planID = $plan; - $pri = 0; + $pri = 3; $estimate = ''; $title = ''; $spec = ''; diff --git a/module/story/model.php b/module/story/model.php index daa164f99b..da1161f4a3 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -497,11 +497,12 @@ class storyModel extends model { if(empty($title)) continue; + $stories->reviewer[$i] = array_filter($stories->reviewer[$i]); if(empty($stories->reviewer[$i]) and empty($stories->reviewerDitto[$i])) $stories->reviewer[$i] = array(); $reviewers = (isset($stories->reviewDitto[$i])) ? $reviewers : $stories->reviewer[$i]; $stories->reviewer[$i] = $reviewers; $_POST['reviewer'][$i] = $reviewers; - if(empty(array_filter($stories->reviewer[$i])) and $forceReview) + if(empty($stories->reviewer[$i]) and $forceReview) { dao::$errors[] = $this->lang->story->errorEmptyReviewedBy; return false; From 4b5987fd29191a262691ff63af5ab68bded060f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=BB=B6=E4=B9=89?= Date: Mon, 19 Sep 2022 14:17:13 +0800 Subject: [PATCH 166/168] * Modify bug import. --- module/common/view/noticeimport.html.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/module/common/view/noticeimport.html.php b/module/common/view/noticeimport.html.php index a3a5b3a8b5..b24f3affc6 100644 --- a/module/common/view/noticeimport.html.php +++ b/module/common/view/noticeimport.html.php @@ -21,6 +21,9 @@
    +