* change for upgrade.

This commit is contained in:
wangyidong
2018-02-06 10:42:51 +08:00
parent 0b281d6ed3
commit a623b9016b
23 changed files with 654 additions and 1531 deletions
+4 -4
View File
@@ -115,6 +115,10 @@ if(file_exists($filterConfig)) include $filterConfig;
$dbConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'db.php';
if(file_exists($dbConfig)) include $dbConfig;
/* 引用自定义的配置。 Include the custom config file. */
$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php';
if(file_exists($myConfig)) include $myConfig;
/* 禅道配置文件。zentaopms settings. */
$zentaopmsConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'zentaopms.php';
if(file_exists($zentaopmsConfig)) include $zentaopmsConfig;
@@ -122,7 +126,3 @@ if(file_exists($zentaopmsConfig)) include $zentaopmsConfig;
/* Include extension config files. */
$extConfigFiles = glob(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ext/*.php');
if($extConfigFiles) foreach($extConfigFiles as $extConfigFile) include $extConfigFile;
/* 引用自定义的配置。 Include the custom config file. */
$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php';
if(file_exists($myConfig)) include $myConfig;
-35
View File
@@ -710,10 +710,8 @@ class block extends control
public function printAssignToMeBlock($longBlock = true)
{
if(common::hasPriv('todo', 'view')) $hasViewPriv['todo'] = true;
if(common::hasPriv('story', 'view')) $hasViewPriv['story'] = true;
if(common::hasPriv('task', 'view')) $hasViewPriv['task'] = true;
if(common::hasPriv('bug', 'view')) $hasViewPriv['bug'] = true;
if(common::hasPriv('testcase', 'view')) $hasViewPriv['case'] = true;
$params = $this->get->param;
$params = json_decode(base64_decode($params));
@@ -738,20 +736,6 @@ class block extends control
if(empty($todos)) unset($hasViewPriv['todo']);
$this->view->todos = $todos;
}
if(isset($hasViewPriv['story']))
{
$this->app->loadLang('story');
$stmt = $this->dao->select('*')->from(TABLE_STORY)
->where('assignedTo')->eq($this->app->user->account)
->andWhere('deleted')->eq('0')
->andWhere('status')->ne('closed')
->orderBy('id_desc');
if(isset($params->storyNum)) $stmt->limit($params->storyNum);
$stories = $stmt->fetchAll();
if(empty($stories)) unset($hasViewPriv['story']);
$this->view->stories = $stories;
}
if(isset($hasViewPriv['task']))
{
$this->app->loadLang('task');
@@ -780,25 +764,6 @@ class block extends control
if(empty($bugs)) unset($hasViewPriv['bug']);
$this->view->bugs = $bugs;
}
if(isset($hasViewPriv['case']))
{
$this->app->loadLang('testcase');
$this->app->loadLang('testtask');
$stmt = $this->dao->select('t1.assignedTo AS assignedTo, t2.*')->from(TABLE_TESTRUN)->alias('t1')
->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id')
->leftJoin(TABLE_TESTTASK)->alias('t3')->on('t1.task = t3.id')
->Where('t1.assignedTo')->eq($this->app->user->account)
->andWhere('t1.status')->ne('done')
->andWhere('t3.status')->ne('done')
->andWhere('t3.deleted')->eq(0)
->andWhere('t2.deleted')->eq(0)
->orderBy('id_desc');
if(isset($params->testcaseNum)) $stmt->limit($params->testcaseNum);
$cases = $stmt->fetchAll();
if(empty($cases)) unset($hasViewPriv['case']);
$this->view->cases = $cases;
}
$this->view->hasViewPriv = $hasViewPriv;
$this->view->longBlock = $longBlock;
-2
View File
@@ -269,10 +269,8 @@ $lang->block->orderByList->story['stage_asc'] = 'Stage Ascending';
$lang->block->orderByList->story['stage_desc'] = 'Stage Descending';
$lang->block->todoNum = 'Todo Number';
$lang->block->storyNum = 'Story Number';
$lang->block->taskNum = 'Task Number';
$lang->block->bugNum = 'Bug Number';
$lang->block->testcaseNum = 'Case Number';
$lang->block->typeList = new stdclass();
-2
View File
@@ -269,10 +269,8 @@ $lang->block->orderByList->story['stage_asc'] = '阶段正序';
$lang->block->orderByList->story['stage_desc'] = '阶段倒序';
$lang->block->todoNum = '待办数';
$lang->block->storyNum = '需求数';
$lang->block->taskNum = '任务数';
$lang->block->bugNum = 'Bug数';
$lang->block->testcaseNum = '用例数';
$lang->block->typeList = new stdclass();
-8
View File
@@ -414,10 +414,6 @@ class blockModel extends model
$params->todoNum['default'] = 20;
$params->todoNum['control'] = 'input';
$params->storyNum['name'] = $this->lang->block->storyNum;
$params->storyNum['default'] = 20;
$params->storyNum['control'] = 'input';
$params->taskNum['name'] = $this->lang->block->taskNum;
$params->taskNum['default'] = 20;
$params->taskNum['control'] = 'input';
@@ -426,10 +422,6 @@ class blockModel extends model
$params->bugNum['default'] = 20;
$params->bugNum['control'] = 'input';
$params->testcaseNum['name'] = $this->lang->block->testcaseNum;
$params->testcaseNum['default'] = 20;
$params->testcaseNum['control'] = 'input';
return json_encode($params);
}
@@ -12,7 +12,7 @@
?>
<div id='assigntomeBlock'>
<?php foreach($hasViewPriv as $type => $bool):?>
<div class="tab-pane fade<?php if($type == $active) echo " active in"?>" id="<?php echo $type?>">
<div id="<?php echo $type?>">
<?php include "{$type}block.html.php";?>
</div>
<?php endforeach;?>
+2 -2
View File
@@ -28,7 +28,7 @@
<div class="col-sm-9">
<div class="input-control has-icon-right">
<input type="text" required class="form-control form-date" id="todoDate" name="date" placeholder="(<?php echo $lang->required;?>)">
<label for="inputPasswordExample1" class="input-control-icon-right"><i class="icon icon-delay"></i></label>
<label class="input-control-icon-right"><i class="icon icon-delay"></i></label>
</div>
</div>
</div>
@@ -56,7 +56,7 @@
<div class="col-sm-2"></div>
<div class="col-sm-10">
<?php echo html::hidden('type', 'custom');?>
<?php echo html::submitButton($lang->save, '', "btn btn-primary btn-wide");?>
<?php echo html::commonButton($lang->save, "onclick='ajaxCreateTodo(this)'", "btn btn-primary btn-wide");?>
<button type="button" class="btn btn-default btn-wide todo-form-trigger" data-trigger="false"><?php echo $lang->goback;?></button>
</div>
</div>
+2 -2
View File
@@ -237,7 +237,7 @@ class commonModel extends model
$isGuest = $app->user->account == 'guest';
echo "<a class='dropdown-toggle' data-toggle='dropdown'>";
echo "<div class='avatar avatar-sm bg-info avatar-circle'>" . strtoupper($app->user->account{0}) . '</div>';
echo "<div class='avatar avatar-sm bg-info avatar-circle'>" . strtoupper($app->user->account{0}) . "</div>\n";
echo "<span class='user-name'>" . (empty($app->user->realname) ? $app->user->account : $app->user->realname) . '</span>';
echo "<span class='caret'></span>";
echo '</a>';
@@ -297,7 +297,7 @@ class commonModel extends model
if(!commonModel::isTutorialMode() and $app->user->account != 'guest') echo '<li>' . html::a(helper::createLink('tutorial', 'start'), $lang->tutorial, '', "class='iframe' data-width='800' data-headerless='true' data-backdrop='true' data-keyboard='true'") . "</li>";
echo '<li>' . html::a('javascript:;', $lang->manual, '', "class='open-help-tab'") . '</li>';
echo '<li>' . html::a(helper::createLink('misc', 'changeLog'), $lang->changeLog, '', "class='iframe' data-width='800' data-headerless='true' data-backdrop='true' data-keyboard='true'") . '</li>';
echo "</ul></li>";
echo "</ul></li>\n";
echo '<li>' . html::a(helper::createLink('misc', 'about'), $lang->aboutZenTao, '', "class='about iframe' data-width='900' data-headerless='true' data-backdrop='true' data-keyboard='true' data-class='modal-about'") . '</li>';
echo '</ul>';
}
+6 -2
View File
@@ -8,7 +8,7 @@
<?php if($onlybody != 'yes'):?>
</main><?php /* end '#wrap' in 'header.html.php'. */ ?>
<footer id='footer'>
<div class="container-fixed">
<div class="container">
<?php commonModel::printBreadMenu($this->moduleName, isset($position) ? $position : ''); ?>
<div id='poweredBy'>
<a href='<?php echo $lang->website;?>' target='_blank' class='text-primary'><i class='icon-zentao'></i> <?php echo $lang->zentaoPMS . $config->version;?></a> &nbsp;
@@ -45,7 +45,11 @@ $(function()
}
else
{
if(data && typeof data.message == 'string') notifyMessage(data.message);
if(data)
{
if(typeof data == 'string') data = $.parseJSON(data);
if(typeof data.message == 'string') notifyMessage(data.message);
}
}
});
}, 60 * 1000);
+3 -3
View File
@@ -16,7 +16,7 @@ if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
<?php if(!empty($this->config->sso->redirect)) js::set('ssoRedirect', $this->config->sso->redirect);?>
<header id='header'>
<div id='mainHeader'>
<div class='container-fixed'>
<div class='container'>
<hrgroup id='heading'>
<?php if(empty($this->config->sso->redirect)):?>
<h1 id='companyname' title='<?php printf($lang->welcome, $app->company->name);?>'><?php printf($lang->welcome, $app->company->name);?></h1>
@@ -37,7 +37,7 @@ if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
</div>
</div>
<div id='subHeader'>
<div class='container-fixed'>
<div class='container'>
<div id="pageNav"></div>
<nav id='subNavbar'><?php common::printModuleMenu($this->moduleName);?></nav>
<div id="pageActions"></div>
@@ -54,4 +54,4 @@ if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
<main id='main' <?php if(!empty($this->config->sso->redirect)) echo "class='ranzhiFixedTfootAction'";?> >
<?php endif;?>
<div class='container-fixed'>
<div class='container'>
+4 -6
View File
@@ -55,23 +55,21 @@ EOT;
<div class='help-block text-center'>
<?php
$configRoot = $this->app->getConfigRoot();
$dbConfigFile = $configRoot . 'db.php';
$myConfigFile = $configRoot . 'my.php';
if(is_writable($configRoot))
{
if(@file_put_contents($dbConfigFile, $configContent))
if(@file_put_contents($myConfigFile, $configContent))
{
printf($lang->install->saved2File, $dbConfigFile);
printf($lang->install->saved2File, $myConfigFile);
}
else
{
printf($lang->install->save2File, $dbConfigFile);
printf($lang->install->save2File, $myConfigFile);
}
@file_put_contents($myConfigFile, "<?php\n");
}
else
{
printf($lang->install->save2File, $dbConfigFile);
printf($lang->install->save2File, $myConfigFile);
}
?>
</div>
+2 -2
View File
@@ -83,7 +83,7 @@ class message extends control
$messages .= $message->data . $newline;
$idList[] = $message->id;
}
$this->dao->update(TABLE_NOTIFY)->set('status')->eq('sended')->andWhere('sendTime')->eq(helper::now())->where('id')->in($idList)->exec();
$this->dao->update(TABLE_NOTIFY)->set('status')->eq('sended')->set('sendTime')->eq(helper::now())->where('id')->in($idList)->exec();
foreach($todos as $todo) $messages .= $todo->data . $newline;
if($windowBlur) $messages = strip_tags($messages);
@@ -103,6 +103,6 @@ class message extends control
EOT;
}
$this->dao->delete('*')->from(TABLE_NOTIFY)->where('objectType')->eq('message')->andWhere('status')->eq('sended')->exec();
$this->dao->delete()->from(TABLE_NOTIFY)->where('objectType')->eq('message')->andWhere('status')->ne('wait')->exec();
}
}
+1 -1
View File
@@ -4,5 +4,5 @@ $lang->message->index = 'Index';
$lang->message->setting = 'Setting';
$lang->message->typeList['mail'] = 'Mail';
$lang->message->typeList['message'] = 'Message';
$lang->message->typeList['message'] = 'Browser notifications';
$lang->message->typeList['webhook'] = 'Webhook';
+1 -1
View File
@@ -4,5 +4,5 @@ $lang->message->index = '首页';
$lang->message->setting = '设置';
$lang->message->typeList['mail'] = '邮件';
$lang->message->typeList['message'] = '消息';
$lang->message->typeList['message'] = '浏览器通知';
$lang->message->typeList['webhook'] = 'Webhook';
+47 -14
View File
@@ -774,37 +774,70 @@ class productModel extends model
return $stats;
}
/**
* Get priv products.
*
* @access public
* @return array
*/
public function getPrivProducts()
{
$account = ',' . $this->app->user->account . ',';
static $products;
if($products === null)
{
$groupSql = '';
$groups = '';
if(isset($this->app->user->groups))
{
foreach($this->app->user->groups as $group) $groupSql .= "INSTR(CONCAT(',', t1.whitelist, ','), ',$group,') > 0 OR ";
foreach($this->app->user->groups as $group) $groups .= ",$group,";
}
$groupSql = !empty($groupSql) ? '(' . substr($groupSql, 0, strlen($groupSql) - 4) . ')' : '1 != 1';
$products = $this->dao->select('distinct t1.id')->from(TABLE_PRODUCT)->alias('t1')
$stmt = $this->dao->select('distinct t1.*,t3.account as teamAccount')->from(TABLE_PRODUCT)->alias('t1')
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product')
->leftJoin(TABLE_TEAM)->alias('t3')->on('t2.project = t3.root')
->leftJoin(TABLE_PROJECT)->alias('t4')->on('t2.project = t4.id')
->beginIF($this->app->user->admin)->where('t1.deleted')->eq(0)->fi()
->where('t1.deleted')->eq(0)
->beginIF(!$this->app->user->admin)
->where('t1.acl')->eq('open')
->orWhere("(t1.acl = 'custom' AND $groupSql)")
->orWhere('t1.PO')->eq($this->app->user->account)
->orWhere('t1.QD')->eq($this->app->user->account)
->orWhere('t1.RD')->eq($this->app->user->account)
->orWhere('t1.createdBy')->eq($this->app->user->account)
->orWhere('t3.account')->eq($this->app->user->account)
->andWhere('t1.deleted')->eq(0)
->andWhere('t3.type')->eq('project')
->andWhere('t4.deleted')->eq(0)
->fi()
->fetchAll('id');
->query();
$products = array();
$account = $this->app->user->account;
while($product = $stmt->fetch())
{
$id = $product->id;
if($this->app->user->admin)
{
$products[$id] = $id;
}
else
{
if($product->PO == $account OR $product->QD == $account OR $product->RD == $account OR $product->createdBy != $account OR $product->teamAccount == $account)
{
$products[$id] = $id;
continue;
}
if($product->acl == 'open')
{
$products[$id] = $id;
continue;
}
if($product->acl == 'custom')
{
foreach(explode(',', $product->whitelist) as $whitelist)
{
if(empty($whitelist)) continue;
if(strpos($groups, ",$whitelist,") !== false)
{
$products[$id] = $id;
break;
}
}
}
}
}
}
return $products;
}
+1 -1
View File
@@ -939,7 +939,7 @@ class project extends control
$url = $this->createLink('project', 'create', "projectID=$projectID");
if(!empty($planID))
{
die(js::confirm($this->lang->project->importPlanStory, $url . '&copyProjectID=&planID=' . $planID, $url, 'parent', 'parent'));
die(js::confirm($this->lang->project->importPlanStory, $this->createLink('project', 'create', "projectID=$projectID&copyProjectID=&planID=$planID"), $url, 'parent', 'parent'));
}
else
{
+1 -1
View File
@@ -140,7 +140,7 @@ $lang->project->updateOrder = 'Order';
$lang->project->tree = 'Tree';
$lang->project->storyKanban = 'Story Kanban';
$lang->project->storySort = 'Sort Story';
$lang->project->importPlanStory = 'Import the stories with the plan?';
$lang->project->importPlanStory = 'Create ' . $lang->projectCommon . ' success!\nImport the stories with the plan?';
/* 分组浏览。*/
$lang->project->allTasks = 'All';
+4 -4
View File
@@ -34,9 +34,9 @@ $lang->project->teamname = '团队名称';
$lang->project->order = $lang->projectCommon . '排序';
$lang->project->products = '相关' . $lang->productCommon;
$lang->project->whitelist = '分组白名单';
$lang->project->totalEstimate = '预计';
$lang->project->totalConsumed = '消耗';
$lang->project->totalLeft = '剩余';
$lang->project->totalEstimate = '总预计';
$lang->project->totalConsumed = '总消耗';
$lang->project->totalLeft = '总剩余';
$lang->project->Left = '剩余';
$lang->project->progress = '进度';
$lang->project->hours = '预计 %s 消耗 %s 剩余 %s';
@@ -140,7 +140,7 @@ $lang->project->updateOrder = '排序';
$lang->project->tree = '树状图';
$lang->project->storyKanban = '需求看板';
$lang->project->storySort = '需求排序';
$lang->project->importPlanStory = '是否导入计划关联的相关需求?';
$lang->project->importPlanStory = '创建' . $lang->projectCommon . '成功!\n是否导入计划关联的相关需求?';
/* 分组浏览。*/
$lang->project->allTasks = '所有';
+2 -1
View File
@@ -678,7 +678,7 @@ class taskModel extends model
if($this->post->left == 0)
{
$task->status = 'done';
$task->finishedBy = $oldTask->openedBy; // Fix bug#1341
$task->finishedBy = $this->app->user->account;
$task->finishedDate = helper::now();
$task->assignedTo = $oldTask->openedBy; // Fix bug#1341
}
@@ -1365,6 +1365,7 @@ class taskModel extends model
->leftjoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
->leftjoin(TABLE_STORY)->alias('t3')->on('t1.story = t3.id')
->where('t1.deleted')->eq(0)
->beginIF($type == 'assignedTo')->andWhere('t1.status')->ne('closed')->fi()
->beginIF($type != 'all')->andWhere("t1.`$type`")->eq($account)->fi()
->orderBy($orderBy)
->beginIF($limit > 0)->limit($limit)->fi()
+27 -1
View File
@@ -205,7 +205,9 @@ class upgradeModel extends model
$this->execSQL($this->getUpgradeFile('9.7'));
$this->changeTeamFields();
$this->moveData2Notify();
}
case '9_8':
$this->fixFinishedBy();
}
$this->deletePatch();
}
@@ -308,6 +310,7 @@ class upgradeModel extends model
case '9_6_2':
case '9_6_3': $confirmContent .= file_get_contents($this->getUpgradeFile('9.6.3'));
case '9_7': $confirmContent .= file_get_contents($this->getUpgradeFile('9.7'));
case '9_8':
}
return str_replace('zt_', $this->config->db->prefix, $confirmContent);
}
@@ -2083,4 +2086,27 @@ class upgradeModel extends model
}
return true;
}
/**
* Fix task finishedBy.
*
* @access public
* @return bool
*/
public function fixFinishedBy()
{
$stmt = $this->dao->select('t1.id as historID,t2.objectType,t2.objectID,t2.actor')->from(TABLE_HISTORY)->alias('t1')
->leftJoin(TABLE_ACTION)->alias('t2')->on('t1.action=t2.id')
->where('t1.field')->eq('finishedBy')
->andWhere('t2.objectType')->eq('task')
->andWhere('t2.action')->eq('finished')
->andWhere('t2.actor != t1.`new`')
->query();
while($action = $stmt->fetch())
{
$this->dao->update(TABLE_HISTORY)->set('`new`')->eq($action->actor)->where('id')->eq($action->historID)->exec();
$this->dao->update(TABLE_TASK)->set('`finishedBy`')->eq($action->actor)->where('id')->eq($action->objectID)->exec();
}
return true;
}
}
-716
View File
@@ -58,719 +58,3 @@ tr.text-center > td.text-right, tr.text-center > th.text-right {text-align: righ
/* === Components === */
/* remove outline of links */
a,a:focus,a:active {text-decoration: none; outline:none;}
/* Label */
.label-badge {padding: 2px 6px}
.label-angle {background-color: #d3dff7; line-height: 24px; padding: 0 5px; position: relative; top: 2px; border: 1px solid #c6d2eb; margin-right: 18px; font-size: 13px; transition: margin .2s, padding .2s; color: #114f8e}
.label-angle > a {position: absolute; right: 0; top: 0; filter: alpha(opacity=0); opacity: 0}
.label-angle.with-close:hover {padding-right: 18px; margin-right: 5px}
.label-angle:hover > a {filter: alpha(opacity=100); opacity: 1}
.label-angle:before, .label-angle:after {content: ' '; display: block; width: 0; height: 0; border-style: solid; border-width: 13px 0 13px 13px; border-color: transparent transparent transparent #c6d2eb; position: absolute; right: -13px; top: -1px; z-index: 1}
.label-angle:after {border-width: 12px 0 12px 12px; top: 0px; z-index: 2; right: -11px; border-color: transparent transparent transparent #d3dff7;}
.label-branch {background-color: #dbcaee; border-color: #b29fc7; color: #6931a8}
/* Label in table */
.table .label.label-info {background: #d3dff7; border: 1px solid #c6d2eb; color: #114f8e;}
/* dropdown */
.dropdown-menu {min-width: 80px; padding: 4px 0; z-index:1020;}
.dropdown-menu > li > a, .dropdown-header {font-size: 12px; padding: 5px 25px 5px 15px}
.dropdown-menu > .active {position: relative;}
.dropdown-menu > .active > a:before {content: '\e60d'; font-family: ZentaoIcon; font-size: 14px; position: absolute; right: 8px; top: 4px; display: block; color: #808080; font-weight: normal;}
.dropdown-submenu > a {min-width: 80px;}
.dropdown-menu .divider {margin: 4px 0;}
.dropdown-submenu.left > .dropdown-menu{left: -82px;}
/* hr */
hr.small {margin: 10px 0}
/* Buttons */
.btn.text-danger {color: #D2322D}
.btn.text-info {color: #39B3D7}
.btn.text-success {color: #229F24}
.btn.text-warning {color: #E48600}
.btn.text-primary {color: #3280FC}
.btn.text-important {color: #81511C}
.btn.text-special {color: #8957A1}
/* Table */
.table td .input[type="radio"], .table td input[type="checkbox"] {vertical-align: middle; position: relative; top: -3px}
.table-borderless {border: none!important}
.table tr[data-url] td {cursor: pointer;}
/* Tables sorters */
.tablesorter thead tr th {height:33px;}
.tablesorter thead tr div {padding:0; margin:0}
.tablesorter thead tr .header {cursor:pointer;}
.tablesorter thead tr .header a,.tablesorter thead tr .headerSortUp a,.tablesorter thead tr .headerSortDown a{display: block; text-decoration:none}
.tablesorter thead tr .header a {color:#333;}
.tablesorter thead tr .header > a:after {font-family: ZentaoIcon; font-weight: normal;content: "\e6bd";font-size: 14px; margin-left: -2px;}
.tablesorter thead tr .headerSortUp > a:after {font-family: ZentaoIcon; font-weight: normal;content: "\e6b9";font-size: 14px;color:#03C; margin-left: -2px;}
.tablesorter thead tr .headerSortDown > a:after{font-family: ZentaoIcon; font-weight: normal;content: "\e6b8";font-size: 14px;color:#03C; margin-left: -2px;}
.tablesorter-header-inner {display: inline;}
.tablesorter thead tr .header.sorter-false:after {display: none}
.table tr.active td, .table-hover>tbody>tr.active:hover>td, .table-hover>tbody>tr.active:hover>th, .table-striped>tbody>tr.active:nth-child(odd).active>td, .table-striped>tbody>tr.active:nth-child(odd)>th {background-color: #FCE6A2}
.table tr>td.active, .table tr>th.active, .table tr.active>td, .table tr.active>th {background-color: #FCE6A2}
.table caption {padding: 8px 20px; border: 1px solid #DDD; border-bottom: 0; background: #fafafa;}
.table.table-condensed caption {padding: 6px 15px;}
.table td.td-has-control {padding: 2px 4px; background-color: white!important}
/* Datepicker */
.datepicker-wrapper {position: relative; cursor: pointer;}
.datepicker-wrapper:before {font-family: ZentaoIcon; content: '\e617'; display: block; position: absolute; right: 8px; color: #808080; font-size: 14px; top: 5px;}
.datepicker-wrapper > .form-control {padding-right: 30px; cursor: pointer;}
.datepicker-wrapper.datepicker-date:before {content: '\e66c'}
.datepicker-wrapper:hover:before {color: #145CCD}
/* alert */
.alert>[class*="icon-"]+.content {padding-left: 2em;}
.alert-pure {border: none; background: none}
/* datetime picker */
.datetimepicker {border-radius: 0!important; background: #fafafa; font-size: 12px}
.datetimepicker .datetimepicker-days td, .datetimepicker .datetimepicker-days th {width: 22px!important; padding: 1px 0 !important}
.datetimepicker .datetimepicker-days td, .datetimepicker .datetimepicker-days th.dow {border: 1px solid #ddd !important; border-radius: 0!important}
.datetimepicker .datetimepicker-days thead th {padding-bottom: 5px!important;}
.datetimepicker .datetimepicker-days th.dow {background: #e5e5e5; border-color: #ccc!important}
.datetimepicker th.switch {width: 120px!important}
.datetimepicker .datetimepicker-years table tr td span, .datetimepicker .datetimepicker-months table tr td span {width: 42px; height: 42px; line-height: 42px; border: 1px solid #ddd; margin: -1px 0 0 -1px; border-radius: 0}
/* code */
code {margin-left: 0;}
/* Icons */
i[class^="icon-"],i[class*=" icon-"],.link-icon i[class^="icon-"],.link-icon i[class*=" icon-"]{font-size: 14px}
.dropdown-menu .disabled,i[class^="icon-"].disabled,i[class*=" icon-"].disabled,i[class^="icon-"].disabled:hover,i[class*=" icon-"].disabled:hover,i[class^="icon-"].disabled:before,i[class*=" icon-"].disabled:before {color: #ccc; cursor:not-allowed}
/* Icon rotate */
.icon-rotate-270:before {display: inline-block; -webkit-transform: rotate(270deg); -moz-transform: rotate(270deg); -ms-transform: rotate(270deg); -o-transform: rotate(270deg); transform: rotate(270deg); filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);}
.icon-rotate-180:before {display: inline-block; -webkit-transform: rotate(180deg); -moz-transform: rotate(180deg); -ms-transform: rotate(180deg); -o-transform: rotate(180deg); transform: rotate(180deg); filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);}
.icon-rotate-90:before {display: inline-block; -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -ms-transform: rotate(90deg); -o-transform: rotate(90deg); transform: rotate(90deg); filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);}
/* Button icon */
.btn-icon {border-radius: 2px; display: inline-block; width: 20px; height: 20px; border: none; background: none; padding: 0; color: #4d90fe!important; text-align: center;}
.btn-icon > i {font-size: 18px; line-height: 20px}
.btn-icon:hover {color: #002563!important}
.btn-icon.disabled:hover, .btn-icon.disabled:hover > i {background: none!important; color: #ccc!important; cursor: default}
.btn-icon.text-danger {color: #D2322D!important}
.btn-icon.text-danger:hover {color: #7e0501!important}
/* priority icons. */
.pri1,.pri0,.pri2,.pri3,.pri4,.pri5,.pri6,.pri{display:inline-block;width: 18px;height: 18px;font-size: 12px;line-height: 14px;font-weight: bold; text-align: center; color: #ccc; -moz-border-radius:50%; -webkit-border-radius:50%; border-radius:50%;border: 2px solid #ccc; font-family: arial, helvetica, clean, sans-serif; background-color: #fff}
.pri0 {font-size: 0}
.pri0:before {font-size: 12px}
.pri:before, .pri0:before{content: '?';}
.pri1{border-color: #d71319;color: #d71319;}
.pri2{border-color: #EA644A;color: #EA644A;}
.pri3{border-color: #BD7B46;color: #BD7B46;}
.pri4{border-color: #dcbe1a;color: #dcbe1a;}
.pri5{border-color: #d0d836;color: #d0d836}
.pri6{border-color: #99c323;color: #99c323}
.dropdown-pris > .dropdown-menu {padding: 0 5px;}
.dropdown-pris > .dropdown-menu > li {display: table-cell;}
.dropdown-pris > .dropdown-menu > li > a {opacity: 0.6; transition: all .2s; padding: 6px 5px; display: block}
.dropdown-pris > .dropdown-menu > li.active > a {opacity: 1}
.dropdown-pris > .dropdown-menu > li.active > a:before {display: none}
.dropdown-pris > .dropdown-menu > li > a:hover {background-color: #f5f5f5; opacity: 1}
/* bug severity icons. */
.severity,.severity1,.severity2,.severity3,.severity4,.severity5,.severity6{display:inline-block;width: 16px;height: 16px;line-height: 16px;font-weight: bold; text-align: center; font-size: 12px; color: #fff; -moz-border-radius:50%; -webkit-border-radius:50%; border-radius:50%;font-family: arial, helvetica, clean, sans-serif;}
.severity{background-color: #ccc;}
.severity:before{content: '?'}
.severity1 {background-color: #d71319;}
.severity2 {background-color: #d83615;}
.severity3 {background-color: #db7c12;}
.severity4 {background-color: #dcbe1a;}
.severity5 {background-color: #d0d836;}
.severity6 {background-color: #99c323;}
/* actionbox */
.change-show:before{content: "\e661";}
.change-hide:before{content: "\e662";}
.log-desc:before{content: "\e65d";}
.log-asc:before{content: "\e65c";}
.diff-all:before{content: "\e6a3";}
.diff-short:before{content: "\e633";}
.actionbox .btn-icon {background: #f1f1f1; color: #666!important; border: 1px solid #ccc; padding: 0 1px; height: 18px; line-height: 16px; width: 18px}
.actionbox .btn-icon > .icon- {font-size: 14px!important; line-height: 16px}
.actionbox .btn-icon:hover {color: #333!important; border-color: #aaa; background: #fff}
.actionbox ol {padding-left: 25px; line-height: 20px}
.actionbox .alert {margin:2px 0 8px; padding: 5px 10px; min-height: 34px; min-height: 20px}
.actionbox #historyItem {margin:0}
.actionbox blockquote {margin:0; font-size: 12px; padding: 1px 5px;}
.actionbox > legend > i, .actionbox > .panel-heading > i {display: none}
.actionbox .history {background: #fbfbfb; padding: 4px 10px 6px; min-height: 20px; border: 1px solid #f5f5f5;}
fieldset.actionbox {padding-bottom: 10px;}
/* actionbox, hack for ie8 */
fieldset.actionbox ol {padding-top: 8px\0/;}
@media all and (min-width:0) {fieldset.actionbox ol {padding-top: 8px\9;}}
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){fieldset.actionbox ol {padding-top: 8px;}}
:root fieldset.actionbox ol {padding-top: 8px\9;}
/* stars list */
.stars-list {color: #E48600}
/* status in table */
td.done, .status-done, td[class$="-done"],
td.pass, .status-pass, td[class$="-pass"],
td.resolved, .status-resolved, td[class$="-resolved"],
td.normal, .status-normal, td[class$="-normal"],
td.status-active, .status-status, td[class$="-active"] {color:#229f24;}
td.wait, .status-wait, td[class$="-wait"] {color:#808080;}
td.pause, .status-pause, td[class$="-pause"],
td.suspended, .status-suspended, td[class$="-suspended"] {color:#E48600;}
td.delay, .status-delay, td[class$="-delay"] {color:#e84e0f;}
td.closed, .status-closed, td[class$="-closed"],
td.cancel, .status-cancel, td[class$="-cancel"] {color:#888;}
td.doing, .status-doing, td[class$="-doing"],
td.changed, .status-changed, td[class$="-changed"],
td.investigate, .status-investigate, td[class$="-investigate"] {color:#d2322d;}
td.delayed, .status-delayed, td[class$="-delayed"] {background:#e84e0f!important; color:white;}
td.blocked, .status-blocked, td[class$="-blocked"] {background:yellow!important;}
td.fail, .status-fail, td[class$="-fail"] {color:#d2322d}
td.draft, .status-draft, td[class$="-draft"] {color:#8957a1}
td.bug-active, .bug-active {color: #8957a1}
td.story-active, .testcase-normal, .story-active {color: #333}
/* tabs */
.nav-tabs > li > a {padding: 5px 10px; color: #333; line-height: 20px; max-height: 32px}
.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {color: #333; font-weight: bold; line-height: 20px}
.tab-content {border: 1px solid #ddd; border-top: 0; padding: 10px 10px}
.tab-pane > h6 {margin-top: 0; margin-bottom: 3px;}
/* fieldset */
fieldset {margin-bottom: 15px; border: 1px solid #e5e5e5; padding: 10px 15px 15px;}
fieldset.fieldset-pure {background: none; padding: 0; border: none; padding-top: 5px;}
fieldset > legend {width: auto; margin: 0 0 0 -5px; font-size: 13px; font-weight: bold; border-bottom: none; padding: 0 5px}
fieldset > .form-group {margin-bottom: 0;}
fieldset > .content table, fieldset > .article-content table{table-layout: initial !important; max-width: 100% !important;}
fieldset > .content table th, fieldset > .content table td, fieldset > .article-content table th, fieldset > .article-content table td {border:1px solid #ddd;}
/* placeholder */
.placeholder {color: #999}
/* === Views === */
/* Table form */
.table-form > tbody > tr > th {text-align:right;vertical-align:middle; border-bottom:none}
.table-form > tbody > tr > th.text-left, .table-form > tbody > tr > tr.text-left th {text-align:left;vertical-align:middle; border-bottom:none}
.table-form > tbody > tr > td {vertical-align:middle; border-bottom:none}
.table-form > tbody > tr > th,.table-form > tbody > tr > td {border-bottom:none}
.table th.text-middle, .table td.text-middle, .text-middle {vertical-align: middle;}
.table-form > tbody > tr > td.text-bottom {vertical-align:bottom;}
.table-form > tbody > tr > td .form-control {vertical-align:middle;margin:0;}
.table-form > tbody > tr > td .checkbox,.table-form > tbody > tr > td input[type="radio"] + label {margin-right: 10px;}
.table-form > tbody > tr > td > .row {margin-right: 0;}
.table-form > tbody > tr > td > .row > [class*="col-"] {padding-right: 0;line-height: 34px}
.table-form > tbody > tr > td .checkbox {margin: 0}
.table-form > tbody > tr > td > .radio:first-child {margin-top: 0;}
.table-form > tbody > tr > td > .radio:last-child {margin-bottom: 0;}
.table-form > tbody > tr > td .btn + .btn {margin-left: 8px;}
.table-form > tbody > tr > td .btn-group .btn + .btn {margin-left: -1px;}
.table-form tr > td > .input-group {width: 100%;}
/* Table data */
.table-data th, .table-data td {padding: 5px;}
.table-data th {text-align: right;}
/* Table condensed */
.table-condensed th, .table-condensed td {padding: 6px 5px; line-height: 18px}
.table-condensed th > a, .table-condensed td > a, .table-condensed td > .btn-icon {vertical-align: middle}
.input-group > select.form-control {float:left; margin-left: -1px;}
.input-group-addon {background-color: #f5f5f5;}
/* chosen container in input group */
.input-group > .chosen-container {display: table-cell;}
/* chosen */
.chosen-up.chosen-container .chosen-drop {bottom: 100%; top: inherit; border-radius: 2px 2px 0 0; box-shadow: 0 -3px 5px rgba(0,0,0,.15); margin-top: auto; margin-bottom: -1px;}
.chosen-container-single .chosen-single abbr {top: 6px!important;}
/* Condensed form */
.form-condensed .table-form {margin-bottom: 0;}
.form-condensed .table-form td, .form-condensed .table-form th {padding: 5px; font-size: 12px;}
.form-condensed .table-form > td + td, .form-condensed .table-form > th + th, .form-condensed .table-form > tbody > td + td, .form-condensed .table-form > tbody > th + th {padding-left: 5%;}
.form-condensed .table-form > tfoot td {padding-bottom: 10px!important; border-top: none!important}
.form-condensed .table-form > tfoot td[colspan] {text-align: center;}
.form-condensed .table-form > tfoot td > .btn {margin-right: 10px;}
.form-condensed .chosen-container-single .chosen-single {padding: 4px 10px; height: 30px}
.form-condensed .chosen-container-single .chosen-single div {padding: 4px 10px}
.form-condensed .chosen-container-multi .chosen-choices {min-height: 30px}
.form-condensed .chosen-container-multi .chosen-choices li {margin: 4px 0 0 4px}
.form-condensed .chosen-container-multi .chosen-choices li.search-field {margin-bottom: 4px;}
.form-condensed .table-fixed .form-control {padding: 5px 6px}
.form-condensed .table-fixed select.form-control {padding: 5px}
.form-condensed .chosen-container {font-size: 13px}
.form-condensed .chosen-container-single .chosen-single {padding: 5px 10px}
.form-condensed .chosen-container-single .chosen-search:before {top: 10px}
@-moz-document url-prefix()
{
.form-condensed textarea.form-control {height: 30px;min-height: 30px;}
.form-control[type='file']{padding:0px;}
}
/* chosen container in col-side */
.col-side .chosen-single {max-width: 218px}
/* help in form */
.help-block {margin-bottom: 5px;}
/* Required field */
form .star {display: none;}/* hide star */
.required:after{font-family: arial;font-size: 24px}
[class*="col-"].required {position: relative;}
[class*="col-"].required:after {position: absolute; top: 6px; right: 2px}
.control-label.required:after{right: -10px}
.input-group-required {display: table-cell; width: 100%; float: left; position: relative;}
.input-group-required > .required:after {z-index: 3; right: 6px; top: 2px;}
.input-group-required .form-control {float: none; display: block;}
.fix-pd-right.input-group-required > .required:after {right: 20px;}
.required-wrapper{position: relative;width: 100%; height: 0;overflow: visible;}
.required-wrapper.required:after{right: -13px;top: 4px}
.table-form > thead > tr > th.required:after {top: 2px; padding-left: 4px;}
.table-form > thead > tr > th .required:after {top: -5px; right: -12px}
/* Auto Height textarea */
div.form-control[contenteditable='true'] {height: auto; text-align: left; outline: 0; overflow-x: hidden; overflow-y: auto; min-height: 30px; min-height: 18px\0}
/* Panel */
.panel > .table > thead > tr > th,.panel > form > .table > thead > tr > th {background-color: transparent;}
.panel-pure {box-shadow: none; border: 0; border-radius: 0;}
.panel-pure .panel-heading {background: transparent;}
.panel-actions {display: inline-block; margin-left: 8px;}
.panel-actions .btn-mini {margin-top: -3px;}
.panel-actions.pull-right{display: block; margin-top: -10px;margin-right: -10px;}
.panel-actions.pull-right .btn{margin-top: 3px;}
.panel-actions > .btn.btn-link:hover{background: none; box-shadow: none;}
.panel-actions a {display: inline-block;}
.panel .table {margin-bottom: 0; border: none!important}
.panel .table-bordered {border:none; margin-bottom: 0;}
.panel .table-bordered > thead > tr:first-child th,.panel .table-bordered > tbody > tr:first-child th,.panel .table-bordered > tr:first-child th {border-top: 0;}
.panel .table-bordered tr > td:first-child,.panel .table-bordered tr > th:first-child {border-left: 0;}
.panel .table-bordered tr > td:last-child,.panel .table-bordered tr > th:last-child {border-right: 0;}
.panel > .table tr:last-child > td {border-bottom: 0 !important;}
.panel > .table table tr:last-child > td {border-bottom: 1px solid #e5e5e5 !important;}
/* small panel */
.panel-sm .panel-heading {padding: 6px 10px}
/* list group */
.list-group-item {padding: 8px 15px}
.list-group-item.active,.list-group-item.active:hover {background: #fff; border-color: #ddd; background: #f1f1f1; color: #333; font-weight: bold;}
.list-group-item.active > a {color: #333}
/* progressbar */
.progressbar {display: inline-block; height: 16px; background: #229F24; position: relative; top: -1px}
/* === Layout === */
/* Module menu. */
#modulemenu {background-color: #e5e5e5; margin: 0 -20px; padding: 0 20px; font-size: 14px; position: relative; height: 40px;}
#modulemenu .nav > li {line-height: 30px; padding:5px 0px 1px;display: block; float: left; color: #808080}
#modulemenu .nav > li > .dropdown > a {border: 1px solid transparent;}
#modulemenu .nav > li > .dropdown > .dropdown-menu {border-radius: 0; margin-top: -2px; border-top: 0}
#modulemenu .nav > li > a, #modulemenu .nav > li > .dropdown > a {display: block; padding: 0 7px; color:#003366}
#modulemenu .nav > li > a:hover, #modulemenu .nav > li > .dropdown > a:hover {background: #d1d1d1; color: #000;}
#modulemenu .nav > li.active > a,#modulemenu .nav > li.active > a:hover {color:#21841d; font-weight:bold; }
#modulemenu .nav > li.right {float:right; font-weight:bold;}
#modulemenu .nav > li.right > a {font-weight:bold}
#modulemenu #myname {display: inline-block; line-height: 30px; line-height: 26px\0}
/* Drop menu. */
#dropMenu {background: #fff; position:absolute; display:none; font-size:12px; z-index:9999; -moz-box-shadow: 0 6px 12px rgba(0,0,0,0.175); -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);border: 1px solid #CBCBCB; border: 1px solid rgba(0, 0, 0, 0.15); top: 36px; border-top: none; min-width: 250px; min-width: 218px\0; padding: 10px 15px;}
#dropMenu > .icon-spin {display: block; text-align: center; padding: 10px;}
#currentItem {border: 1px solid transparent; padding: 1px 6px;}
.show > #dropMenu {display: block;}
.show > #currentItem, .show > #currentItem:hover, #modulemenu .nav > li > .dropdown.open > a {background: #fff; border: 1px solid #CBCBCB; -moz-box-shadow: 0 6px 12px rgba(0,0,0,0.175); -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);}
#search {padding: 2px 8px; height: 28px}
#searchResult {display: table; line-height: 20px; color: #808080}
#searchResult > .search-list, #defaultMenu, #moreMenu {display: table-cell; vertical-align: top; min-width: 218px}
#moreMenu {display: none;}
#searchResult.show-more #moreMenu {display: table-cell;}
#searchResult ul {display: block; position: relative; padding: 0; margin: 10px -15px 0 -15px; max-height: 360px; overflow-x: hidden; overflow-y: auto}
#moreMenu > ul {margin-left: 15px;}
#searchResult ul > li:first-child {border-top: 1px dashed #ddd}
#searchResult ul > li:last-child {border-bottom: 1px dashed #ddd}
#searchResult ul > li {display: block; float: none; padding: 2px 15px;}
#searchResult ul > li:hover, #searchResult ul > li.active {background: #e5e5e5}
#searchResult ul > li > a {line-height: 24px; display: block;}
#searchResult ul > li.active:before {}
#moreMenu > ul > li > a {color: #808080}
#searchResult ul > li > a:hover, #defaultMenu > ul > li.heading:hover, #searchResult li.no-result-tip:hover {background: none}
#searchResult li.no-result-tip {border: none!important;}
#defaultMenu > .actions > a {display: block; text-align: right; margin: 0 -15px; padding-right: 15px; line-height: 30px}
#searchResult.show-more #defaultMenu > ul > li, #defaultMenu > .actions > a {border-right: 1px solid #ddd}
#defaultMenu > .actions > a > i, #searchResult ul > li > a > i {font-size: 14px; display: inline-block; margin-right: 5px;}
/*#searchResult > ul {display: block; position: relative; padding: 0; min-width: 218px}*/
#searchResult ul > li > a.closed, #searchResult ul > li > a.done{color:#808080}
#defaultMenu > div {padding-top: 6px;}
#dropMenu.searching #searchResult,
#dropMenu.searching #defaultMenu,
#dropMenu.searching #moreMenu {display: block;}
#dropMenu.searching #defaultMenu > div,
#dropMenu.searching ul > li {display: none}
#dropMenu.searching ul > li.show-search {display: block}
#dropMenu.searching #moreMenu > ul {margin-left: -15px;}
#projectID {background:#e5e5e5; border:1px solid #e5e5e5}
/* Wrapper */
#wrap {padding:0 19px 20px 19px; background:#e5e5e5;}
#wrap .outer {position: relative; text-align:left; background:#fff;border:1px solid #cfcfcf; -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.1);box-shadow: 0 1px 5px rgba(0, 0, 0, 0.1); padding: 20px}
/* Footer. */
#qrcodePopover.show {display: block; position: fixed; right: 5px; bottom: 40px; left: inherit; top: inherit; max-width: 300px}
#qrcodePopover.popover.top .arrow {left: inherit; right: 10px}
.icon-pro-version {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOAQMAAADDr3TWAAAABlBMVEUAAADSMi2DxVCVAAAAAXRSTlMAQObYZgAAACJJREFUCNdjYGFg4GNgkGdgsG9gqD/A8P8BkI2OpBkYBBkAfZQE9VhZ0IgAAAAASUVORK5CYII=") center no-repeat; display: inline-block!important; width: 14px; height: 14px; position: relative; top: 2px}
/* Feature bar. */
#featurebar {margin: -20px -20px 20px; padding: 8px 10px 7px; font-size: 14px; background: #F8FAFE; border-bottom: 1px solid #ddd; line-height: 30px; min-height: 46px; min-height: 30px\0;}
#featurebar:after, #featurebar:before {content: ' '; display: table;}
#featurebar:after {clear:both;}
#featurebar .heading {float: left; padding: 0 5px; color: #666}
#featurebar .heading:after {content: "\e6e1"; font-family: ZentaoIcon; font-size: 14px; color: #999; display: inline-block; margin-left: 5px;}
#featurebar .heading > i {color: #808080}
#featurebar .nav {height: 30px; float: left;}
#featurebar .nav > li {float: left; margin-right: 2px;}
#featurebar .nav > li > .form-control {margin-left: 6px; padding: 1px 8px; height: 30px; height: 26px\0; margin-right: 10px;}
#featurebar .nav > li > .form-control.form-date {width: 110px}
#featurebar .nav > li.datepicker-wrapper:before {right: 15px; top: 0; top: -2px\0;}
#featurebar .nav > li > a {padding: 0px 4px; border-radius: 2px}
#featurebar .nav > li > a:hover {background: #ddd; color: #333}
#featurebar .nav > li.active > a, #featurebar .nav > li.active > a:hover, #featurebar .nav > li.active > a:active, #featurebar .nav > li > a:focus {font-weight: bold; color: #333; background: none}
#featurebar .nav > li.active > a > .caret {border-top-color: #666}
#featurebar .nav > li.active > .form-control, #featurebar .nav > li.active > .form-control:hover, #featurebar .nav > li.active > .form-control:active, #featurebar .nav > li.active > .form-control:focus {border-color: #009900}
#featurebar .btn-group {margin-right: -4px;}
#featurebar .actions > .btn-group:last-child, #featurebar .btn-group > .btn-group {margin-right: 0;}
#featurebar .btn {padding: 4px 12px}
#featurebar .btn > i {display: inline-block; margin-right: 2px; opacity: 0.8}
#featurebar .actions {float: right; margin-top: -2px;}
#featurebar > .heading > .prefix {display: inline-block; margin-right: 5px; color: #666;}
.outer > .alert {border: none; margin: 0}
.outer > .alert + #featurebar {border-top: 1px solid #ddd;}
#featurebar .nav > li > .chosen-container-single {top: -2px;}
#featurebar .nav > li .chosen-drop {font-size: 13px}
#featurebar .nav > li .chosen-single {height: 30px; padding: 3px 10px;}
#featurebar .nav > li .chosen-single abbr {top: 4px;}
#featurebar .nav > li .chosen-single div {top: -2px;}
#featurebar .nav > li.active .chosen-single {border-color: #009900}
#featurebar .nav > li.active > .chosen-container-single.chosen-with-drop .chosen-single {border-color: #ddd}
/* sub featurebar */
.sub-featurebar {border-bottom: 1px solid #ddd; padding: 5px 10px; margin: -20px -20px 20px;}
.sub-featurebar > .nav > li {float: left;}
.sub-featurebar > .nav > li > a {padding: 5px 4px}
.sub-featurebar > .nav > li.active > a {color: #333; font-weight: bold;}
#featurebar.with-sub > .nav > li.active > a {border: 1px solid #ddd; position: relative; border-bottom: none; background: #fff; padding: 2px 15px 5px}
/* Title bar. */
#titlebar {margin: -20px -20px 20px; background: #F8FAFE; border-bottom: 1px solid #e5e5e5; min-height: 46px; min-height: 20px\0; padding: 13px 20px; vertical-align: bottom; position: relative;}
.body-modal #titlebar {margin: 0}
#titlebar > .heading {font-size: 14px; line-height: 20px; font-weight: bold;}
#titlebar > .heading > i {display: none;}
#titlebar > .heading > .prefix {display: inline-block; margin-right: 5px; color: #666;}
#titlebar > .heading > .prefix > strong {font-weight: normal; border: 1px solid #aaa; padding: 0px 4px; background: #fff; text-align: center; min-width: 20px; color: #666; font-size: 12px}
#titlebar > .heading > .prefix > i {font-size: 14px; color: #808080; display: none}
#titlebar > .heading > strong a {color: #333}
#titlebar > .heading:hover > strong a {color: #03c}
#titlebar > .heading > strong a:hover {color: #1A53FF}
#titlebar > .heading > strong > i, #titlebar > .heading > strong > small > i {display: none}
#titlebar > .heading > small > i {position: relative; top: 1px; display: none}
#titlebar > .heading > small {font-size: 14px; color: #333;}
#titlebar > .heading > small:before {content: '\e6e1'; font-family: ZentaoIcon; font-weight: normal;}
#titlebar .actions {position: absolute; right: 20px; top: 8px;}
#titlebar .actions > .btn, #titlebar .actions > .btn-group {margin-left: 8px;}
#titlebar .actions > .text {display: inline-block; margin-left: 8px; line-height: 30px}
/* Button in titlebar and featurebar */
#titlebar > .actions .btn {padding-top: 4px; padding-bottom: 4px;}
#featurebar > .actions .btn:not(.btn-primary), #titlebar > .actions .btn:not(.btn-primary), .main > .actions:not(.actions-form) .btn:not(.btn-primary) {border-color: transparent; background: none; box-shadow: none; padding: 4px 7px; border-radius: 2px; text-shadow: none; color: #036}
#featurebar > .actions .btn:not(.btn-primary):hover, #titlebar > .actions .btn:not(.btn-primary):hover, .main > .actions:not(.actions-form) .btn:not(.btn-primary):hover {background: #ddd; border-color: #ddd; color: #333}
/* Following style to fixed ie8 */
#featurebar > .actions .btn, #titlebar > .actions .btn, .main > .actions .btn {border-color: transparent\0; background: none\0; box-shadow: none\0; padding: 4px 8px\0;; color: #036\0}
#featurebar > .actions .btn:hover, #titlebar > .actions .btn:hover, .main > .actions .btn:hover {background: #ddd\0; border-color: #ddd\0; color: #333\0;}
#featurebar > .actions .btn.btn-primary, #titlebar > .actions .btn.btn-primary, .main > .actions .btn.btn-primary {border-color: #103152\0; background: #1A4F85\0; padding: 4px 8px\0; color: #e5e5e5}
#featurebar > .actions .btn.btn-primary:hover, #titlebar > .actions .btn.btn-primary:hover, .main > .actions .btn.btn-primary:hover {background: #133B63\0; border-color: #0C243C\0; color: #fff}
/* table in outer */
.outer .table {margin-bottom: 0; border: 1px solid #ddd;}
@-moz-document url-prefix()
{
.outer .table.with-border thead > tr > th:first-child,
.outer .table.with-border tfoot > tr > td:first-child,
.outer .table.with-border tbody > tr > td:first-child {border-left: 1px solid #ddd}
.outer .table.with-border thead > tr > th:last-child,
.outer .table.with-border tfoot > tr > td:last-child,
.outer .table.with-border tbody > tr > td:last-child {border-right: 1px solid #ddd}
.outer .table.with-border > *:first-child > tr:first-child > th {border-top: 1px solid #ddd;}
.outer .table.with-border > *:last-child > tr:last-child > td {border-bottom: 1px solid #ddd;}
}
.outer .table thead tr th {text-align: center;}
.outer .table thead tr th.text-left {text-align: left;}
.outer .table tbody td {vertical-align: middle;}
.outer .table th {vertical-align: middle;}
.outer .table.table-form tr > th:last-child, .outer .table.table-form tr > td:last-child {padding-right: 5px}
.outer .table.table-form.table-fixed tr > th:last-child, .outer .table.table-form.table-fixed tr > td:last-child {padding-right: 15px}
.outer .table tbody > tr:last-child td {border-bottom: 1px solid #e5e5e5;}
.outer .table-form .table tr > th:first-child, .outer .table-form .table tr > td:first-child {padding-left: 5px}
.outer .table-form .table tr > th:last-child, .outer .table-form .table tr > td:last-child {padding-right: 5px}
.outer .table-form .table tbody > tr:last-child td {border-bottom: 1px solid #e5e5e5; padding-top: 5px}
.outer .table.table-data.table-borderless tbody > tr:last-child td, .outer .table.table-form tbody > tr:last-child td {border: none}
.outer .table tfoot td {border-top: 1px solid #ddd}
.outer .table tfoot .form-control {padding: 1px 8px; height: 30px}
.outer .table tfoot .btn {padding: 2px 6px; font-size: 13px; line-height: 20px; border: none; }
.outer .table tfoot .btn:not(.btn-primary) {background-color: #FAFAFA; color: #036}
.outer .table tfoot .btn > i {display: inline-block; margin-right: 1px; opacity: 0.8}
.outer .table tfoot .datepicker-wrapper:before {top: 5px}
.outer .table tfoot .form-control.form-date {width: 110px}
.outer .table tfoot .input-wrapper {display: inline-block;}
.outer .table tfoot .chosen-single {padding: 4px 6px; height: 30px; }
.outer .table tfoot .chosen-container-single .chosen-single abbr {top: 4px;}
.table-actions {float: left;}
.table-actions > .checkbox {float: left; margin: 0}
.table-actions > .btn-group, .table-actions > .btn, .table-actions > .input-group, .table-actions > .text {float: left; margin-right: 5px;}
.table-actions > .text {line-height: 24px; color: #808080}
.table-actions > .text strong {color: #333}
.outer .table tfoot .pager {margin: -3px 0;}
.table .cell-id {text-align: left; padding-left: 12px!important;}
.datatable .table > tbody > tr > td.check-btn, .datatable .table > thead > tr > th.check-btn {padding-left: 12px!important; padding-right: 0; text-align: left;}
/* color of a when visited */
.outer .table tbody td > a:visited, #crumbs > a:visited, .side > a:visited {color: #551A8B}
/* Querybox */
#querybox {margin: 5px 0 -7px; background-color: #fff; height: 0; position: relative; z-index: 1000; overflow: visible; display: none; float: left; width: 100%;}
#querybox form {padding: 10px; border-top: 1px solid #ddd; margin: 0 -10px;}
#querybox.show {display: block; height: auto}
#titlebar #querybox {margin: 5px -10px -12px; float: none; width: auto;}
/* Container in outer */
.outer > .container {margin: 0 auto; padding: 0; border: 1px solid #ddd;}
.outer > .container > #featurebar, .outer > .container > #titlebar {margin: 0}
.outer > .container > form, body > .container > form{padding: 10px 40px 10px 20px}
.outer > .container .table-form, .outer > .container .table-data {border: none}
.outer > .container > .table-data {margin: 10px 0}
/* Main content in outer */
.outer .container > .main {padding: 10px 20px}
.outer .main .article-content {font-size: 14px; padding: 0; word-break:break-all}
.outer .main .actions {text-align: center; margin-bottom: 20px;}
.outer .main .actions > .btn, .outer .main .actions > .btn-group {margin: 0 4px}
.outer .main ul.list-unstyled:last-child {margin-bottom: 0;}
.outer .main ul.list-unstyled li {padding: 2px 0}
.outer .main .table tr > th:first-child, .outer .main .table tr > td:first-child {padding-left: 0;}
.outer .main-side > fieldset {padding: 5px 20px 10px 10px;}
.outer .main-side > fieldset > .table {border: none}
.outer .main .tabs {margin-bottom: 15px;}
/* Table data in outer */
.outer .table-data.table-condensed td, .outer .table-data.table-condensed th {padding: 3px 8px}
.outer .table-data.table-condensed th {font-weight: normal; color: #444}
.outer .table-data th.strong, .outer .table-data td.strong, .outer .table-data th > strong {font-weight: bold;}
/* side */
.outer.with-side #featurebar, .outer.with-side #titlebar {margin-bottom: 20px;}
.outer.with-side .main, .outer.with-side .side + form, .outer.with-side .main, .outer.with-side .side + table {margin-left: 212px; margin-right: 0;}
.outer.with-side.with-transition .main, .outer.with-side.with-transition .side + form, .outer.with-side.with-transition .main, .outer.with-side.with-transition .side + table {transition: all 0.3s;}
.outer.with-side .table tr > th:first-child, .outer.with-side .table tr > td:first-child {padding-left: 5px}
.outer.with-side .table tr > th:first-child, .outer.with-side .table tr > td:first-child .table-actions {padding-left: 0;}
.outer.with-side .table tr > th:last-child, .outer.with-side .table tr > td:last-child {padding-right: 5px}
.outer .side {width: 192px; position: absolute; left: 20px;}
.outer .side-body {overflow: hidden;}
.outer .side-body .panel {min-width: 180px;}
.outer .side-body .panel-body {padding: 10px;}
.outer .side-handle {position: absolute; text-align: center; cursor: pointer; right: 0; top: 0; width: 15px; padding: 0; line-height: 32px; border: 1px solid #d1d1d1; background: #d5d5d5; color: #03c; transition: all 0.3s; z-index: 99}
.outer .side-handle:hover {background: #c5c5c5; color: #04f}
.outer.with-transition .side, .outer .side-handle.with-transition {transition: all 0.3s;}
.outer .side, .outer .side + .main {visibility: hidden;}
.outer.with-side .side, .outer.with-side .side + .main {visibility: visible;}
.outer.hide-side .side{width: 0; border: none;}
.outer.hide-side .side .side-handle {right: -15px;}
.outer.hide-side .side .side-body {display:none;}
.outer.with-side.hide-side .main, .outer.with-side.hide-side .side + form, .outer.with-side.hide-side .main, .outer.with-side .side + table {margin-left: 0px}
/* Form in outer */
.outer form > .btn {margin-right: 10px;}
.outer form .panel {margin-bottom: 0;}
/* Color picker in form */
.colorpicker.fix-border-right > .btn {border-right-color: transparent}
.colorpicker.fix-border-left > .btn {border-left-color: transparent}
.colorpicker.fix-border-right > .btn:hover {border-right-color: #bdbdbd}
.colorpicker.fix-border-left > .btn:hover {border-left-color: #bdbdbd}
/* Pager. */
.pager {margin-bottom:0;line-height: 20px; color: #999}
.pager .dropdown {display: inline-block;}
.pager a {color: #444}
.pager a:hover {color: #141414}
.pager > .dropdown > a, .pager > i, .pager > a {display: inline-block; position: relative; padding: 5px; min-width: 25px; text-align: center; margin-left: -5px;}
.pager .dropdown > a:hover, .pager > a:hover {background: #e5e5e5;}
.pager .dropdown-menu {margin-top: 0; width: 212px; margin-left: -5px; padding: 0;}
.pager .dropdown-menu > li {display: block; float: left; width: 70px; border-right: 1px dotted #ddd; border-bottom: 1px dotted #ddd;}
#_pageID, #goto {display: none}
/* modal */
.modal .modal-dialog {border: 8px solid #666; border-color: rgba(0,0,0,.25)}
.modal-title {font-size: 14px;}
.modal-body > #titlebar {margin: -15px -15px 20px}
/* modal with iframe */
.modal-iframe .modal-body {padding: 0;}
.modal.with-titlebar .modal-header, .modal-dialog.hide-header .modal-header{position: relative; height: 0; padding: 0; border: none; z-index: 999; min-height: 0}
.modal.with-titlebar .modal-header .modal-body, .modal-dialog.hide-header .modal-header .modal-body {z-index: 990}
.modal.with-titlebar .modal-header .modal-title, .modal-dialog.hide-header .modal-header .modal-title {display: none}
.modal.with-titlebar .modal-header .close, .modal-dialog.hide-header .modal-header .close {position: absolute; right: 15px; top: 15px}
.body-modal {padding-bottom: 0; overflow: hidden;}
.body-modal .outer > .row {margin: 10px 0 0}
.body-modal .outer > form, .body-modal .outer > .container > form {margin: 10px 20px 10px; padding: 5px 20px 10px 10px;}
.body-modal .outer > form > .table-form, .body-modal .outer > .container > form > .table-form {border:none;}
.body-modal .outer > .main, .body-modal .outer > .container > .main, .body-modal > .main {padding: 10px 20px; margin: 0}
.body-modal > form {padding-bottom: 15px;}
.body-modal .outer > .container, .body-modal > .container{padding: 0; margin: 0; max-width: inherit !important; border: 0}
.body-modal #titlebar .actions {right: 40px}
.body-modal .outer, .body-modal #wrap{padding: 0!important; margin: 0!important;}
.body-modal .row-table {padding: 20px}
.modal-dialog.fullscreen {width: 100% !important; height: 100% !important; margin: 0; border: none !important;}
.modal-dialog.fullscreen .modal-body iframe {height: 100%}
.modal-loading {overflow: hidden;}
.modal-loading .modal-dialog {margin-top: -100%!important;}
.loader {display: none}
.modal-loading .loader{position: absolute; display: block; text-align: center; font-size: 56px; color: #fff; top: 35%; width: 100%}
/* Tree menu. */
.tree li:before {width: 8px; height: 8px; background: #f1f1f1; border: 1px solid #ccc; border-radius: 2px; top: 7px;left: 6px;}
.tree-lines li > a.active{font-weight: bold;}
/* Select all and select reverse. */
#allchecker, #reversechecker {padding-right: 5px;padding-left: 5px;}
/* hide debug panel */
#debugPanel {display: none}
/* === Responsive === */
@media (max-width: 1199px) /* laptop */
{
#mainmenu .nav > li > a {padding: 7px 14px}
}
@media (max-width: 991px) /* taplet */
{
#mainmenu .nav > li > a {padding: 7px 12px}
#searchbox {width: 150px;}
#typeSelector .btn, #objectSwitcher .btn{padding-left: 5px;}
#modulemenu .nav > li > a {padding: 0 5px;}
}
@media (max-width: 767px) /* phone */
{
#mainmenu .nav > li > a {padding: 5px 9px; font-size: 14px}
#mainmenu .nav > li > a > span {display: none}
#searchbox {width: 120px;}
#featurebar .nav {float: none}
#featurebar .nav > li > a {padding: 0 2px; font-size: 13px}
#titlebar .actions {position: static;}
.body-modal #titlebar .actions {position: absolute;}
#titlebar > .heading {padding-right: 0!important;}
}
@media (max-width: 600px) /* small phone */
{
#searchbox {display: none}
}
.warning{color:red;}
.nofixed td{white-space:normal;}
#passwordStrength{display:none;}
.fixedTfootAction {background-color: #f5f5f5; position: fixed; bottom: 40px; box-shadow: 0 -3px 4px rgba(0,0,0,0.05);}
.ranzhiFixedTfootAction .fixedTfootAction {bottom: 0px;}
.table > .fixedTfootAction > tr > td {border-bottom: none}
.table > .fixedTfootAction.scrolled > tr > td {background: #2e6dad; border: none; color: #fff}
.fixedTfootAction.scrolled .btn {border: 1px solid #fff; border-color: rgba(255,255,255,.5); background-color: #2e6dad!important; text-shadow: none; color: #e5e5e5!important;}
.fixedTfootAction.scrolled .btn:hover {background-color: #2e6dad!important;}
.fixedTfootAction.scrolled .pager,
.fixedTfootAction.scrolled .pager > a,
.fixedTfootAction.scrolled .pager > .dropdown > a,
.fixedTfootAction.scrolled .table-actions > .text {color: #e5e5e5}
.fixedTfootAction.scrolled .pager strong,
.fixedTfootAction.scrolled .table-actions > .text strong {color: #fff;}
.fixedTfootAction.scrolled .pager .dropdown > a:hover,
.fixedTfootAction.scrolled .pager > a:hover {background-color: #2e6dad}
.fixedTheadOfList {position: fixed; top: 0px; z-index:1000;}
.datatable.head-fixed > .datatable-head .table > thead > tr > th,
.fixedTheadOfList > thead > tr > th {background-color: #2e6dad; border-bottom-color: #bbb; color: #dedede}
.tablesorter.fixedTheadOfList thead tr .headerSortDown a,
.tablesorter.fixedTheadOfList thead tr .headerSortUp a,
.tablesorter.fixedTheadOfList thead tr .headerSortUp > a:after,
.tablesorter.fixedTheadOfList thead tr .headerSortDown > a:after,
.datatable.head-fixed thead tr .headerSortUp > a:after,
.datatable.head-fixed thead tr .headerSortDown > a:after,
.datatable.head-fixed > .datatable-head .table > thead > tr > th a, .fixedTheadOfList > thead > tr > th a {color: #fff}
.datatable.head-fixed > .datatable-head .table > thead > tr > th .header a, .fixedTheadOfList > thead > tr > th .header a {color: inherit}
/* Help tab iframe */
#helpContent {display: none; position: absolute; left: 0; right: 0; top: 73px; bottom: 40px; background-color: #fff;}
.show-help-tab #wrap {display: none}
.show-help-tab #helpContent {display: block;}
#mainmenu .nav > li.close-help-tab > a {background-color: #2e6dad}
#mainmenu .nav > li > a > .icon-remove {display: none; margin-left: 10px; position: relative; margin-right: -6px; color: #999}
.show-help-tab #mainmenu .nav > li > a > .icon-remove {display: inline-block;}
#mainmenu .nav > li > a > .icon-remove:hover {color: #666}
#helpContent .load-error {padding: 20px; display: none}
#helpContent.show-error .load-error {display: block}
.m-tutorial-wizard #featurebar .nav li{display:none;}
.m-tutorial-wizard #featurebar .nav li:nth-of-type(1),.m-tutorial-wizard #featurebar .nav li:nth-of-type(2),.m-tutorial-wizard #featurebar .nav li:nth-of-type(3),.m-tutorial-wizard #featurebar .nav li:nth-of-type(4){display:block;}
.hl-tutorial {position: relative!important; z-index: 1010!important; box-shadow: 0 0 0 0px #000!important; transition: box-shadow 1s!important;}
.hl-tutorial.hl-in {box-shadow: 0 0 20px 0 #FFF0D5, 0 0 0 2px #F1A325, 0 0 0 2000px rgba(0,0,0,.2)!important}
.hl-tutorial.hl-in:hover {box-shadow: 0 0 30px 0 #FFF0D5, 0 0 0 5px #F1A325, 0 0 0 2000px rgba(0,0,0,.3)!important}
.tooltip-max .tooltip-inner {max-width: 1000px}
/* For new zentao icon. */
@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(fonts/zenicon.eot?v=1.0.0);src:url(fonts/zenicon.eot?#iefix&v=1.0.0) format('embedded-opentype'),url(fonts/zenicon.woff?v=1.0.0) format('woff'),url(fonts/zenicon.ttf?v=1.0.0) format('truetype'),url(fonts/zenicon.svg#regular?v=1.0.0) format('svg')}
.icon-times,.icon-search,.icon-envelope,.icon-heart,.icon-star,.icon-star-empty,.icon-user,.icon-th-large,.icon-th,.icon-check,.icon-off,.icon-cog,.icon-trash,.icon-home,.icon-time,.icon-download-alt,.icon-download,.icon-repeat,.icon-refresh,.icon-list-alt,.icon-lock,.icon-flag,.icon-volume-up,.icon-qrcode,.icon-tags,.icon-bookmark,.icon-print,.icon-align-left,.icon-align-justify,.icon-list,.icon-pencil,.icon-add,.icon-edit,.icon-checked,.icon-move,.icon-step-backward,.icon-play,.icon-pause,.icon-step-forward,.icon-chevron-left,.icon-chevron-right,.icon-plus-sign,.icon-minus-sign,.icon-remove-sign,.icon-ok-sign,.icon-question-sign,.icon-info-sign,.icon-ban-circle,.icon-arrow-left,.icon-arrow-right,.icon-arrow-up,.icon-arrow-down,.icon-sign-plus,.icon-minus,.icon-plus,.icon-eye-open,.icon-eye-close,.icon-calendar,.icon-random,.icon-chevron-up,.icon-chevron-down,.icon-resize-h,.icon-key,.icon-cogs,.icon-comments,.icon-collapse-full,.icon-upload-alt,.icon-check-empty,.icon-bullhorn,.icon-bell,.icon-hand-right,.icon-wrench,.icon-tasks,.icon-expand-full,.icon-group,.icon-link,.icon-cloud,.icon-copy,.icon-paper-clip,.icon-bars,.icon-list-ul,.icon-table,.icon-magic,.icon-caret-down,.icon-caret-up,.icon-caret-left,.icon-caret-right,.icon2-10,.icon-comment-alt,.icon-comments-alt,.icon-sitemap,.icon-lightbulb,.icon-file-text-o,.icon-building,.icon-double-angle-left,.icon-double-angle-right,.icon-double-angle-up,.icon-double-angle-down,.icon-angle-left,.icon-angle-right,.icon-angle-up,.icon-angle-down,.icon-mobile,.icon-spinner,.icon-circle,.icon-folder-close-alt,.icon-folder-open-alt,.icon-expand-alt,.icon-collapse-alt,.icon-smile,.icon-frown,.icon-terminal,.icon-star-half-full,.icon-code-fork,.icon-unlink,.icon-rocket,.icon-chevron-sign-left,.icon-chevron-sign-right,.icon-chevron-sign-up,.icon-chevron-sign-down,.icon-ellipsis-v,.icon-level-up,.icon-file,.icon-file-text,.icon-more,.icon-bug,.icon-branch,.icon-chat-dot,.icon-cube,.icon-stack,.icon-review,.icon-bar-chart,.icon-cubes,.icon-file-pdf,.icon-file-word,.icon-file-excel,.icon-file-powerpoint,.icon-file-archive,.icon-file-audio,.icon-file-movie,.icon-file-code{font-family:ZentaoIcon}
.icon-remove,.change-show,.change-hide,.log-desc,.log-asc,.diff-all,.diff-short,.icon-plus-border{font-family:ZentaoIcon}
.icon-more:before{content: '\e744';}
.icon-plus-border:before{content: '\e663'}
.icon-review:before{content: '\e9b8'}
.icon-checked:before{content: '\e642'}
.icon-file-text:before{content:'\e6d4'}
body.body-modal .ke-container .ke-toolbar .ke-outline[data-name=fullscreen]{display:none;}
.nav-tabs.nav-stacked{border-bottom:0px;}
.nav-tabs.nav-stacked > li{ float: none; margin-right: -1px; margin-bottom: 0;}
.nav-tabs.nav-stacked > li.active > a{
border: 1px solid #ddd;
border-right-color: rgb(221, 221, 221);
border-right-color: transparent;
}
.nav-tabs.nav-stacked > li > a {
margin-right: 0;
border-radius: 4px 0 0 4px;
}
+534 -715
View File
File diff suppressed because it is too large Load Diff
+12 -7
View File
@@ -12,23 +12,28 @@
/* Judge my.php exists or not. */
define('IN_UPGRADE', true);
$dbConfig = dirname(dirname(__FILE__)) . '/config/db.php';
if(!file_exists($dbConfig))
if(file_exists($dbConfig))
{
$myConfig = dirname(dirname(__FILE__)) . '/config/my.php';
if(!file_exists($myConfig))
if(file_exists($myConfig))
{
echo "文件" . $dbConfig . "不存在! 提示:不要重命名原来的禅道安装目录,下载最新的源码包,覆盖即可。" . "<br />";
echo $dbConfig . " doesn't exists! Please don't rename zentao before overriding the source code!";
exit;
$myContent = trim(file_get_contents($myConfig));
$myContent = str_replace('<?php', '', $myContent);
}
if(!@rename($myConfig, $dbConfig))
if(!@rename($dbConfig, $myConfig))
{
$configDir = dirname(dirname(__FILE__)) . '/config/';
echo "请执行命令 chmod 777 $configDir 来修改权限,保证禅道在该目录有操作文件权限" . "<br />";
echo "Please execute the command 'chmod 777 $configDir' to modify the permissions to ensure that the ZenTao has operating file permissions in this directory";
exit;
}
file_put_contents($myConfig, "<?php\n");
if(!empty($myContent))
{
$myContent = file_get_contents($myConfig) . "\n" . $myContent;
file_put_contents($myConfig, $myContent);
}
}
error_reporting(0);