Merge branch 'master' into 'sprint/206_liumengyi_58288'

# Conflicts:
#   db/update17.1.sql
This commit is contained in:
王怡栋
2022-06-23 01:46:35 +00:00
194 changed files with 2116 additions and 485 deletions
+2
View File
@@ -186,7 +186,9 @@ $config->openMethods[] = 'user.login';
$config->openMethods[] = 'user.logout';
$config->openMethods[] = 'user.deny';
$config->openMethods[] = 'user.reset';
$config->openMethods[] = 'user.forgetpassword';
$config->openMethods[] = 'user.refreshrandom';
$config->openMethods[] = 'user.resetpassword';
$config->openMethods[] = 'api.getsessionid';
$config->openMethods[] = 'misc.checktable';
$config->openMethods[] = 'misc.qrcode';
+2 -2
View File
@@ -1,8 +1,8 @@
ALTER TABLE `zt_user` ADD `resetToken` varchar(50) NOT NULL AFTER `scoreLevel`;
CREATE TABLE `zt_riskissue` (
`risk` mediumint(8) unsigned NOT NULL,
`issue` mediumint(8) unsigned NOT NULL,
UNIQUE KEY `risk_issue` (`risk`,`issue`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE `zt_kanban` ADD `alignment` varchar(10) NOT NULL DEFAULT 'center' AFTER `object`;
ALTER TABLE `zt_kanban` ADD `alignment` varchar(10) NOT NULL DEFAULT 'center' AFTER `object`;
+1
View File
@@ -1718,6 +1718,7 @@ CREATE TABLE IF NOT EXISTS `zt_user` (
`ranzhi` char(30) NOT NULL default '',
`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',
PRIMARY KEY (`id`),
UNIQUE KEY `account` (`account`),
@@ -13,6 +13,9 @@
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/datepicker.html.php';?>
<?php include $app->getExtensionRoot() . 'biz/common/ext/view/calendar.html.php';?>
<style>
#date {float: left; margin-right: 10px; margin-left: 0px;}
</style>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php if(common::hasPriv('my', 'todo')) echo html::a(helper::createLink('my', 'todo', "type=all"), $lang->todo->all . " <span class='label label-light label-badge'>{$todoCount}</span>", '', "class='btn btn-link'");?>
@@ -34,10 +37,10 @@
<div id="effortCalendar" class="calendar">
<header class="calender-header table-row">
<div class="btn-toolbar col-4 table-col text-middle">
<button type="button" class="btn btn-info btn-icon btn-mini btn-prev"><i class="icon-chevron-left"></i></button>
<button type="button" class="btn btn-info btn-mini btn-today"><?php echo $lang->today;?></button>
<button type="button" class="btn btn-info btn-icon btn-mini btn-prev"><i class="icon-chevron-left"></i></button>
<span id="date" class="calendar-caption"></span>
<button type="button" class="btn btn-info btn-icon btn-mini btn-next"><i class="icon-chevron-right"></i></button>
<span class="calendar-caption"></span>
</div>
<div class="col-4 text-center table-col">
<ul class="nav nav-primary">
@@ -551,6 +551,8 @@ $lang->resource->task->recordEstimate = 'recordEstimateAction';
$lang->resource->task->editEstimate = 'editEstimate';
$lang->resource->task->deleteEstimate = 'deleteEstimate';
$lang->resource->task->report = 'reportChart';
$lang->resource->task->exportTemplet = 'exportTemplet';
$lang->resource->task->import = 'import';
$lang->task->methodOrder[5] = 'create';
$lang->task->methodOrder[10] = 'batchCreate';
@@ -575,6 +577,8 @@ $lang->task->methodOrder[100] = 'editEstimate';
$lang->task->methodOrder[105] = 'deleteEstimate';
$lang->task->methodOrder[110] = 'report';
$lang->task->methodOrder[115] = 'batchChangeModule';
$lang->task->methodOrder[120] = 'exportTemplet';
$lang->task->methodOrder[125] = 'import';
/* Doc. */
$lang->resource->doc = new stdclass();
@@ -114,7 +114,7 @@
<div class='input-group'>
<?php echo html::select("story[$i]", $stories, $currentStory, "class='form-control chosen' onchange='setStoryRelated($i)'");?>
<span class='input-group-btn'>
<a id='preview<?php echo $i;?>' href='#' class='btn iframe btn-link btn-icon btn-copy' disabled='disabled' title='<?php echo $lang->preview; ?>'><i class='icon-search'></i></a>
<a id='preview<?php echo $i;?>' href='#' class='btn iframe btn-link btn-icon btn-copy' disabled='disabled' title='<?php echo $lang->preview; ?>'><i class='icon-eye'></i></a>
<a href='javascript:copyStoryTitle(<?php echo $i;?>)' class='btn btn-link btn-icon btn-copy' title='<?php echo $lang->task->copyStoryTitle; ?>'><i class='icon-arrow-right'></i></a>
<?php echo html::hidden("storyEstimate$i") . html::hidden("storyDesc$i") . html::hidden("storyPri$i");?>
</span>
+15 -4
View File
@@ -19,6 +19,7 @@
#sidebar > .sidebar-toggle {left: 3px; right: auto;}
.hide-sidebar #sidebar > .cell {display: none;}
.hide-sidebar #sidebar > .sidebar-toggle > .icon:before {content: "\e314";}
#date {float: left; margin-right: 10px; margin-left: 0px;}
</style>
<?php js::set('moreLang', $this->lang->side->more);?>
<?php js::set('moduleList', $config->todo->moduleList);?>
@@ -31,8 +32,18 @@
</div>
<div class="btn-toolbar pull-right">
<?php if(common::hasPriv('todo', 'export')) echo html::a('javascript:exportCalendar("' . helper::createLink('todo', 'export', "userID={$this->app->user->id}&orderBy=id_desc&date=_date_") . '")', "<i class='icon-export muted'> </i> " . $lang->todo->export, '', "class='btn btn-link'");?>
<?php common::printLink('todo', 'batchCreate', '', "<i class='icon icon-plus'></i> " . $lang->todo->batchCreate, '', "class='btn btn-secondary' id='batchCreate'", '', true);?>
<?php common::printLink('todo', 'create', '', "<i class='icon icon-plus'></i> " . $lang->todo->create, '', "id='create' class='btn btn-primary iframe' data-width='80%'", '', 'true');?>
<?php if(common::hasPriv('todo', 'create') or common::hasPriv('todo', 'batchCreate')):?>
<div class='btn-group dropdown'>
<?php common::printLink('todo', common::hasPriv('todo', 'create') ? 'create' : 'batchCreate', '', "<i class='icon icon-plus'></i> " . (common::hasPriv('todo', 'create') ? $lang->todo->create : $lang->todo->batchCreate), '', "id='create' class='btn btn-primary iframe' data-width='80%' data-app='my'", '', 'true');?>
<?php if(common::hasPriv('todo', 'create') and common::hasPriv('todo', 'batchCreate')):?>
<button type='button' class='btn btn-primary dropdown-toggle' data-toggle='dropdown'><span class='caret'></span></button>
<ul class='dropdown-menu pull-right'>
<li><?php echo html::a($this->createLink('todo', 'create', '', '', true), $lang->todo->create, '', "class='iframe' data-width='80%'");?></li>
<li><?php echo html::a($this->createLink('todo', 'batchCreate', '', '', true), $lang->todo->batchCreate, '', "class='iframe' data-width='80%'");?></li>
</ul>
<?php endif;?>
</div>
<?php endif;?>
</div>
</div>
<div class="main-row">
@@ -41,10 +52,10 @@
<div id="todoCalendar" class="calendar">
<header class="calender-header table-row">
<div class="btn-toolbar col-4 table-col text-middle">
<button type="button" class="btn btn-info btn-icon btn-mini btn-prev"><i class="icon-chevron-left"></i></button>
<button type="button" class="btn btn-info btn-mini btn-today"><?php echo $lang->today;?></button>
<button type="button" class="btn btn-info btn-icon btn-mini btn-prev"><i class="icon-chevron-left"></i></button>
<span id="date" class="calendar-caption"></span>
<button type="button" class="btn btn-info btn-icon btn-mini btn-next"><i class="icon-chevron-right"></i></button>
<span class="calendar-caption"></span>
</div>
<div class="col-4 text-center table-col">
<ul class="nav nav-primary">
+127 -14
View File
@@ -150,30 +150,24 @@ class feishuapi
* @access public
* @return array
*/
public function getDeptTree()
public function getChildDeptTree($departmentID)
{
$depts = array('result' => 'success', 'data' => array());
/* Gets the enterprise name. */
$response = $this->queryAPI($this->apiUrl . "tenant/v2/tenant/query", '', array(CURLOPT_CUSTOMREQUEST => "GET"));
$company = array('id' => '1', 'pId' => '0', 'name' => $response->data->tenant->name, 'open' => 1);
$data = array($company);
/* Get depts by parent dept. */
$depts = array();
$pageToken = '';
$index = 0;
while(true)
{
$response = $this->queryAPI($this->apiUrl . "contact/v3/departments?parent_department_id=0" . ($pageToken ? "&page_token={$pageToken}" : '') . "&fetch_child=true&page_size=50", '', array(CURLOPT_CUSTOMREQUEST => "GET"));
$response = $this->queryAPI($this->apiUrl . "contact/v3/departments?parent_department_id={$departmentID}" . ($pageToken ? "&page_token={$pageToken}" : '') . "&fetch_child=true&page_size=50", '', array(CURLOPT_CUSTOMREQUEST => "GET"));
if(isset($response->data->items))
{
foreach($response->data->items as $key => $dept)
{
$depts[$index]['id'] = $dept->open_department_id;
$depts[$index]['pId'] = empty($dept->parent_department_id) ? 1 : $dept->parent_department_id;
$depts[$index]['name'] = $dept->name;
$depts[$index]['open'] = 1;
$index++;
$data[$index]['id'] = $dept->open_department_id;
$data[$index]['pId'] = empty($dept->parent_department_id) ? 1 : $dept->parent_department_id;
$data[$index]['name'] = $dept->name;
$data[$index]['open'] = 1;
}
}
@@ -181,10 +175,129 @@ class feishuapi
$pageToken = $response->data->page_token;
}
$depts['data'] = $data;
return $depts;
}
/**
* Get the first tier department.
*
* @access public
* @return array
*/
public function getDeptTree()
{
$depts = array('data' => array());
/* Gets the enterprise name. */
$response = $this->queryAPI($this->apiUrl . "tenant/v2/tenant/query", '', array(CURLOPT_CUSTOMREQUEST => "GET"));
$company = array('id' => '1', 'pId' => '0', 'name' => $response->data->tenant->name, 'open' => 1);
$depts = array($company);
$departmentIdList = $this->getScopes();
$urls = array();
foreach($departmentIdList as $departmentID) $urls[] = $this->apiUrl . "contact/v3/departments/{$departmentID}";
$datas = $this->multiRequest($urls);
foreach($datas as $index => $dept)
{
$index += 1;
$dept = json_decode($dept);
$memberCount = $dept->data->department->member_count;
$status = $dept->data->department->status->is_deleted;
$depts[$index]['id'] = $dept->data->department->open_department_id;
$depts[$index]['pId'] = empty($dept->data->department->parent_department_id) ? 1 : $dept->data->department->parent_department_id;
$depts[$index]['name'] = $dept->data->department->name;
$depts[$index]['open'] = 1;
}
return $depts;
}
/**
* Get the visible range of the application.
*
* @access public
* @return array
*/
public function getScopes()
{
$pageToken = '';
$departmentIdList = array();
while(true)
{
$response = $this->queryAPI($this->apiUrl . "contact/v3/scopes" . "?user_id_type=open_id&department_id_type=open_department_id&page_token={$pageToken}&page_size=100", '', array(CURLOPT_CUSTOMREQUEST => "GET"));
$departmentIds = isset($response->data->department_ids) ? $response->data->department_ids : array();
foreach($departmentIds as $id) $departmentIdList[] = $id;
if(!isset($response->data->page_token)) break;
$pageToken = $response->data->page_token;
}
return $departmentIdList;
}
/**
* Handle the concurrency of requests.
*
* @access public
* @return array
*/
public function multiRequest($urls)
{
$curl = curl_multi_init();
$urlHandlers = array();
$urlData = array();
/* Set request header information. */
$headers = array();
$headers[] = "Content-Type: application/json";
if($this->token) $headers[] = "Authorization:Bearer {$this->token}";
/* Initialize multiple request handles to one. */
foreach($urls as $url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$urlHandlers[] = $ch;
curl_multi_add_handle($curl, $ch);
}
$active = null;
do
{
$mrc = curl_multi_exec($curl, $active);
}
while($mrc == CURLM_CALL_MULTI_PERFORM);
while($active && $mrc == CURLM_OK)
{
usleep(50000);
if(curl_multi_select($curl) != -1)
{
do
{
$mrc = curl_multi_exec($curl, $active);
}
while($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
foreach($urlHandlers as $index => $ch)
{
$urlData[$index] = curl_multi_getcontent($ch);
curl_multi_remove_handle($curl, $ch);
}
curl_multi_close($curl);
return $urlData;
}
/**
* Send message
*
+12 -2
View File
@@ -167,6 +167,7 @@ class gitlab
$params['per_page'] = '100';
$branches = array();
$default = array();
for($page = 1; true; $page ++)
{
$params['page'] = $page;
@@ -176,15 +177,24 @@ class gitlab
foreach($branchList as $branch)
{
if(!isset($branch->name)) continue;
$branches[$branch->name] = $branch->name;
if($branch->default)
{
$default[$branch->name] = $branch->name;
}
else
{
$branches[$branch->name] = $branch->name;
}
}
/* Last page. */
if(count($branchList) < $params['per_page']) break;
}
if(empty($branches)) $branches['master'] = 'master';
if(empty($branches) and empty($default)) $branches['master'] = 'master';
asort($branches);
$branches = $default + $branches;
return $branches;
}
+11 -3
View File
@@ -125,6 +125,9 @@ class GitRepo
$list = execCmd($cmd . ' 2>&1', 'array', $result);
if($result) return array();
/* Get default branch. */
$defaultBranch = execCmd("$this->client symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'");
$branches = array();
foreach($list as $localBranch)
{
@@ -132,9 +135,12 @@ class GitRepo
$localBranch = trim($localBranch);
if(empty($localBranch))continue;
$branches[$localBranch] = $localBranch;
if($localBranch != $defaultBranch) $branches[$localBranch] = $localBranch;
}
asort($branches);
$branches = array($defaultBranch => $defaultBranch) + $branches;
return $branches;
}
@@ -552,8 +558,10 @@ class GitRepo
else
{
$file = explode(' ', $commit);
$file = end($file);
list($action, $path) = explode("\t", $file);
$file = explode("\t", end($file));
if(!isset($file[1])) $file[1] = '';
list($action, $path) = $file;
$parsedFile = new stdclass();
$parsedFile->revision = $hash;
$parsedFile->path = '/' . trim($path);
+18
View File
@@ -355,4 +355,22 @@ class admin extends control
$this->dao->delete()->from(TABLE_LOG)->where('date')->lt($date)->exec();
return !dao::isError();
}
/**
* Reset password setting.
*
* @access public
* @return void
*/
public function resetPWDSetting()
{
if($_POST)
{
$this->loadModel('setting')->setItem('system.common.resetPWDByMail', $this->post->resetPWDByMail);
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
}
$this->view->title = $this->lang->admin->resetPWDSetting;
$this->display();
}
}
+29 -24
View File
@@ -9,23 +9,25 @@
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Datenbank prüfen';
$lang->admin->sso = 'SSO';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Sicherheit';
$lang->admin->checkWeak = 'Schwache Passwörter prüfen';
$lang->admin->certifyMobile = 'Prüfen Sie die Mobilnummer';
$lang->admin->certifyEmail = 'Prüfen Sie die Emailadresse';
$lang->admin->ztCompany = 'Prüfen Sie das Unternehmen';
$lang->admin->captcha = 'Bestätigungscode';
$lang->admin->getCaptcha = 'Bestätigungscode anfordern';
$lang->admin->register = 'Register';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Datenbank prüfen';
$lang->admin->sso = 'SSO';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Sicherheit';
$lang->admin->checkWeak = 'Schwache Passwörter prüfen';
$lang->admin->certifyMobile = 'Prüfen Sie die Mobilnummer';
$lang->admin->certifyEmail = 'Prüfen Sie die Emailadresse';
$lang->admin->ztCompany = 'Prüfen Sie das Unternehmen';
$lang->admin->captcha = 'Bestätigungscode';
$lang->admin->getCaptcha = 'Bestätigungscode anfordern';
$lang->admin->register = 'Register';
$lang->admin->resetPWDSetting = 'Reset password Setting';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Einstellungen';
$lang->admin->days = 'Gültige Tage';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Einstellungen';
$lang->admin->days = 'Gültige Tage';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'Aktuelle Version ist %s. ';
@@ -53,14 +55,14 @@ $lang->admin->bind->caption = 'Konto verknüpfen';
$lang->admin->bind->success = "Konto wurde verknüpft!";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Sicherheits-Regeln';
$lang->admin->safe->set = 'PasswortStärke';
$lang->admin->safe->password = 'Passwort Stärke';
$lang->admin->safe->weak = 'Schwache Passwörter';
$lang->admin->safe->reason = 'Typ';
$lang->admin->safe->checkWeak = 'Schwache Passwörter prüfen';
$lang->admin->safe->changeWeak = 'Ihr Passwort ist schwach. Bitte ändern.';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->common = 'Sicherheits-Regeln';
$lang->admin->safe->set = 'PasswortStärke';
$lang->admin->safe->password = 'Passwort Stärke';
$lang->admin->safe->weak = 'Schwache Passwörter';
$lang->admin->safe->reason = 'Typ';
$lang->admin->safe->checkWeak = 'Schwache Passwörter prüfen';
$lang->admin->safe->changeWeak = 'Ihr Passwort ist schwach. Bitte ändern.';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->modifyPasswordFirstLogin = 'Passwort nach der ersten Anmeldung ändern';
$lang->admin->safe->modeList[0] = 'N/A';
@@ -82,5 +84,8 @@ $lang->admin->safe->modifyPasswordList[0] = 'Nein';
$lang->admin->safe->loginCaptchaList[1] = 'Ja';
$lang->admin->safe->loginCaptchaList[0] = 'Nein';
$lang->admin->safe->resetPWDList[1] = 'ON';
$lang->admin->safe->resetPWDList[0] = 'Off';
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
$lang->admin->safe->noticeStrong = '';
+29 -24
View File
@@ -9,23 +9,25 @@
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Security';
$lang->admin->checkWeak = 'Check Weak Password';
$lang->admin->certifyMobile = 'Verify your cellphone';
$lang->admin->certifyEmail = 'Verify your Email';
$lang->admin->ztCompany = 'Verify your company';
$lang->admin->captcha = 'Verification Code';
$lang->admin->getCaptcha = 'Send Verification Code';
$lang->admin->register = 'Register';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Security';
$lang->admin->checkWeak = 'Check Weak Password';
$lang->admin->certifyMobile = 'Verify your cellphone';
$lang->admin->certifyEmail = 'Verify your Email';
$lang->admin->ztCompany = 'Verify your company';
$lang->admin->captcha = 'Verification Code';
$lang->admin->getCaptcha = 'Send Verification Code';
$lang->admin->register = 'Register';
$lang->admin->resetPWDSetting = 'Reset password Setting';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Setting';
$lang->admin->days = 'Valid Day';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Setting';
$lang->admin->days = 'Valid Day';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'Current Version is %s. ';
@@ -53,14 +55,14 @@ $lang->admin->bind->caption = 'Link Account';
$lang->admin->bind->success = "Account is linked!";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Security Policy';
$lang->admin->safe->set = 'Password Settings';
$lang->admin->safe->password = 'Password Strength';
$lang->admin->safe->weak = 'Common Weak Passwords';
$lang->admin->safe->reason = 'Type';
$lang->admin->safe->checkWeak = 'Weak Password Scan';
$lang->admin->safe->changeWeak = 'Force to change weak password';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->common = 'Security Policy';
$lang->admin->safe->set = 'Password Settings';
$lang->admin->safe->password = 'Password Strength';
$lang->admin->safe->weak = 'Common Weak Passwords';
$lang->admin->safe->reason = 'Type';
$lang->admin->safe->checkWeak = 'Weak Password Scan';
$lang->admin->safe->changeWeak = 'Force to change weak password';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->modifyPasswordFirstLogin = 'Force to change password after first login';
$lang->admin->safe->modeList[0] = 'I don\'t care.';
@@ -82,5 +84,8 @@ $lang->admin->safe->modifyPasswordList[0] = 'No';
$lang->admin->safe->loginCaptchaList[1] = 'Yes';
$lang->admin->safe->loginCaptchaList[0] = 'No';
$lang->admin->safe->resetPWDList[1] = 'ON';
$lang->admin->safe->resetPWDList[0] = 'Off';
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
$lang->admin->safe->noticeStrong = '';
+29 -24
View File
@@ -9,23 +9,25 @@
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Sécurité';
$lang->admin->checkWeak = 'Contrôle niveau de sécurité des mots de passe';
$lang->admin->certifyMobile = 'Vérifier votre smartphone';
$lang->admin->certifyEmail = 'Vérifier votre Email';
$lang->admin->ztCompany = 'Vérifier votre entreprise';
$lang->admin->captcha = 'Code de vérification';
$lang->admin->getCaptcha = 'Obtenir le Code de vérification';
$lang->admin->register = 'Register';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
$lang->admin->ssoAction = 'Link Zdoo';
$lang->admin->safeIndex = 'Sécurité';
$lang->admin->checkWeak = 'Contrôle niveau de sécurité des mots de passe';
$lang->admin->certifyMobile = 'Vérifier votre smartphone';
$lang->admin->certifyEmail = 'Vérifier votre Email';
$lang->admin->ztCompany = 'Vérifier votre entreprise';
$lang->admin->captcha = 'Code de vérification';
$lang->admin->getCaptcha = 'Obtenir le Code de vérification';
$lang->admin->register = 'Register';
$lang->admin->resetPWDSetting = 'Reset password Setting';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Paramétrage';
$lang->admin->days = 'Durée de conservation';
$lang->admin->api = 'API';
$lang->admin->log = 'Log';
$lang->admin->setting = 'Paramétrage';
$lang->admin->days = 'Durée de conservation';
$lang->admin->resetPWDByMail = 'Reset the password via the email';
$lang->admin->info = new stdclass();
$lang->admin->info->version = 'La version actuelle est %s customisée. ';
@@ -53,14 +55,14 @@ $lang->admin->bind->caption = 'Lier au compte';
$lang->admin->bind->success = "Le compte est associé !";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = 'Politique de sécurité';
$lang->admin->safe->set = 'Paramétrages du Mot de passe';
$lang->admin->safe->password = 'Force du Mot de passe';
$lang->admin->safe->weak = 'Mots de passes non sécurisés courrants';
$lang->admin->safe->reason = 'Type';
$lang->admin->safe->checkWeak = 'Balayage des mots de passe faibles';
$lang->admin->safe->changeWeak = 'Forcer le changement des mots de passe faibles';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->common = 'Politique de sécurité';
$lang->admin->safe->set = 'Paramétrages du Mot de passe';
$lang->admin->safe->password = 'Force du Mot de passe';
$lang->admin->safe->weak = 'Mots de passes non sécurisés courrants';
$lang->admin->safe->reason = 'Type';
$lang->admin->safe->checkWeak = 'Balayage des mots de passe faibles';
$lang->admin->safe->changeWeak = 'Forcer le changement des mots de passe faibles';
$lang->admin->safe->loginCaptcha = 'Login using CAPTCHA';
$lang->admin->safe->modifyPasswordFirstLogin = 'Forcer le changement du mot de passe après la première connexion';
$lang->admin->safe->modeList[0] = "Contrôle Modéré";
@@ -82,5 +84,8 @@ $lang->admin->safe->modifyPasswordList[0] = 'Non';
$lang->admin->safe->loginCaptchaList[1] = 'Yes';
$lang->admin->safe->loginCaptchaList[0] = 'Non';
$lang->admin->safe->resetPWDList[1] = 'ON';
$lang->admin->safe->resetPWDList[0] = 'Off';
$lang->admin->safe->noticeMode = "Le mot de passe sera vérifié quand un utilisateur se connectera ou qu'un utilisateur sera créé ou modifier.";
$lang->admin->safe->noticeStrong = '';
+29 -24
View File
@@ -9,23 +9,25 @@
* @version $Id: zh-cn.php 4767 2013-05-05 06:10:13Z wwccss $
* @link http://www.zentao.net
*/
$lang->admin->index = '后台管理首页';
$lang->admin->checkDB = '检查数据库';
$lang->admin->sso = 'ZDOO集成';
$lang->admin->ssoAction = 'ZDOO集成';
$lang->admin->safeIndex = '安全';
$lang->admin->checkWeak = '弱口令检查';
$lang->admin->certifyMobile = '认证手机';
$lang->admin->certifyEmail = '认证邮箱';
$lang->admin->ztCompany = '认证公司';
$lang->admin->captcha = '验证码';
$lang->admin->getCaptcha = '获取验证码';
$lang->admin->register = '登记';
$lang->admin->index = '后台管理首页';
$lang->admin->checkDB = '检查数据库';
$lang->admin->sso = 'ZDOO集成';
$lang->admin->ssoAction = 'ZDOO集成';
$lang->admin->safeIndex = '安全';
$lang->admin->checkWeak = '弱口令检查';
$lang->admin->certifyMobile = '认证手机';
$lang->admin->certifyEmail = '认证邮箱';
$lang->admin->ztCompany = '认证公司';
$lang->admin->captcha = '验证码';
$lang->admin->getCaptcha = '获取验证码';
$lang->admin->register = '登记';
$lang->admin->resetPWDSetting = '重置密码设置';
$lang->admin->api = '接口';
$lang->admin->log = '日志';
$lang->admin->setting = '设置';
$lang->admin->days = '日志保存天数';
$lang->admin->api = '接口';
$lang->admin->log = '日志';
$lang->admin->setting = '设置';
$lang->admin->days = '日志保存天数';
$lang->admin->resetPWDByMail = '通过邮箱重置密码';
$lang->admin->info = new stdclass();
$lang->admin->info->version = '当前系统的版本是%s,';
@@ -53,14 +55,14 @@ $lang->admin->bind->caption = '关联社区帐号';
$lang->admin->bind->success = "关联账户成功";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = '安全策略';
$lang->admin->safe->set = '密码安全设置';
$lang->admin->safe->password = '密码安全';
$lang->admin->safe->weak = '常用弱口令';
$lang->admin->safe->reason = '类型';
$lang->admin->safe->checkWeak = '弱口令扫描';
$lang->admin->safe->changeWeak = '修改弱口令密码';
$lang->admin->safe->loginCaptcha = '登录使用验证码';
$lang->admin->safe->common = '安全策略';
$lang->admin->safe->set = '密码安全设置';
$lang->admin->safe->password = '密码安全';
$lang->admin->safe->weak = '常用弱口令';
$lang->admin->safe->reason = '类型';
$lang->admin->safe->checkWeak = '弱口令扫描';
$lang->admin->safe->changeWeak = '修改弱口令密码';
$lang->admin->safe->loginCaptcha = '登录使用验证码';
$lang->admin->safe->modifyPasswordFirstLogin = '首次登录修改密码';
$lang->admin->safe->modeList[0] = '不检查';
@@ -82,5 +84,8 @@ $lang->admin->safe->modifyPasswordList[0] = '不强制';
$lang->admin->safe->loginCaptchaList[1] = '是';
$lang->admin->safe->loginCaptchaList[0] = '否';
$lang->admin->safe->resetPWDList[1] = '开启';
$lang->admin->safe->resetPWDList[0] = '关闭';
$lang->admin->safe->noticeMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
+1
View File
@@ -18,6 +18,7 @@
<?php
echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set);
echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak, '', "class='active'");
echo html::a($this->createLink('admin', 'resetPWDSetting'), $lang->admin->resetPWDSetting);
?>
</div>
</div>
@@ -0,0 +1,61 @@
<?php
/**
* The resetpwdsetting view file of admin module of ZenTaoPMS.
*
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Shujie Tian <tianshujie@easycorp.ltd>
* @package admin
* @version $Id$
* @link https://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<style>
<?php if(!common::checkNotCN()):?>
.mailBox {width: 45px !important;}
<?php else:?>
.mailBox {width: 109px !important;}
<?php endif;?>
.heading {padding-left: 15px;}
</style>
<div class="main-row">
<div class='side-col' id='sidebar'>
<div class='cell'>
<div class='list-group'>
<?php
echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set);
echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak);
echo html::a($this->createLink('admin', 'resetPWDSetting'), $lang->admin->resetPWDSetting, '', "class='active'");
?>
</div>
</div>
</div>
<div id='mainContent' class='main-col main-content'>
<div class='center-block'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->admin->resetPWDSetting;?></strong>
</div>
</div>
<table class='table table-form'>
<tr>
<th class='mailBox'><?php echo $lang->admin->resetPWDByMail;?></th>
<td class='w-300px text-left'>
<?php $checkedKey = isset($config->resetPWDByMail) ? $config->resetPWDByMail : 0;?>
<?php foreach($lang->admin->safe->resetPWDList as $key => $value):?>
<label class="radio-inline"><input type="radio" name="resetPWDByMail" value="<?php echo $key?>"<?php echo $key == $checkedKey ? " checked='checked'" : ''?> id="resetPWDByMail<?php echo $key;?>"><?php echo $value;?></label>
<?php endforeach;?>
</td>
</tr>
<tr>
<th></th>
<td class='form-actions'><?php echo html::submitButton();?></td>
</tr>
</table>
</form>
</div>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -24,6 +24,7 @@
<?php
echo html::a($this->createLink('admin', 'safe'), $lang->admin->safe->set, '', "class='active'");
echo html::a($this->createLink('admin', 'checkWeak'), $lang->admin->safe->checkWeak);
echo html::a($this->createLink('admin', 'resetPWDSetting'), $lang->admin->resetPWDSetting);
?>
</div>
</div>
+26
View File
@@ -27,3 +27,29 @@ $config->api->editor->edit = array('id' => 'desc', 'tools' => 'simpleTo
$config->api->editor->createRelease = array('id' => 'desc', 'tools' => 'simpleTools');
$config->api->editor->createstruct = array('id' => 'desc', 'tools' => 'simpleTools');
$config->api->editor->editstruct = array('id' => 'desc', 'tools' => 'simpleTools');
global $lang;
$config->api->search['module'] = 'api';
$config->api->search['fields']['title'] = $lang->api->title;
$config->api->search['fields']['id'] = $lang->api->id;
$config->api->search['fields']['lib'] = $lang->api->lib;
$config->api->search['fields']['path'] = $lang->api->path;
$config->api->search['fields']['method'] = $lang->api->method;
$config->api->search['fields']['status'] = $lang->api->status;
$config->api->search['fields']['addedBy'] = $lang->api->addedBy;
$config->api->search['fields']['addedDate'] = $lang->api->addedDate;
$config->api->search['fields']['editedBy'] = $lang->api->editedBy;
$config->api->search['fields']['editedDate'] = $lang->api->editedDate;
$config->api->search['fields']['version'] = $lang->api->version;
$config->api->search['params']['title'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
$config->api->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
$config->api->search['params']['lib'] = array('operator' => '=', 'control' => 'select', 'values' => '');
$config->api->search['params']['path'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
$config->api->search['params']['method'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '') + $lang->api->methodOptions);
$config->api->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '') + $lang->api->statusOptions);
$config->api->search['params']['addedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
$config->api->search['params']['addedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
$config->api->search['params']['editedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
$config->api->search['params']['editedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
$config->api->search['params']['version'] = array('operator' => '>=', 'control' => 'input', 'values' => '');
+22 -1
View File
@@ -28,10 +28,12 @@ class api extends control
* @param int $version
* @param int $release
* @param int $appendLib
* @param int $queryID
* @param string $param
* @access public
* @return void
*/
public function index($libID = 0, $moduleID = 0, $apiID = 0, $version = 0, $release = 0, $appendLib = 0)
public function index($libID = 0, $moduleID = 0, $apiID = 0, $version = 0, $release = 0, $appendLib = 0, $queryID = 0, $param = '')
{
/* Get an api doc. */
if($apiID > 0)
@@ -71,6 +73,19 @@ class api extends control
if($libs) $this->lang->modulePageNav = $this->generateLibsDropMenu($libs, $libID, $release);
$this->setMenu($libID, $moduleID);
if($apiID == 0) $this->lang->TRActions = '<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> ' . $this->lang->api->search . '</a>' . $this->lang->TRActions;
/* Build the search form. */
$queryID = $param == 'bySearch' ? (int)$queryID : 0;
$actionURL = $this->createLink('api', 'index', "libID=$libID&moduleID=$moduleID&apiID=$apiID&version=$version&release=$release&appendLib=$appendLib&queryID=myQueryID&param=bySearch");
$this->api->buildSearchForm($lib,$queryID, $actionURL);
if($param == 'bySearch')
{
$apiList = $this->api->getApiListBySearch($libID, $queryID);
$this->view->apiList = $apiList;
$this->view->typeList = $this->api->getTypeList($libID);
}
$this->view->lib = $lib;
$this->view->isRelease = $release > 0;
@@ -79,6 +94,7 @@ class api extends control
$this->view->libID = $libID;
$this->view->apiID = $apiID;
$this->view->libs = $libs;
$this->view->param = $param;
$this->view->moduleTree = $libID ? $this->doc->getApiModuleTree($libID, $apiID, $release, $moduleID) : '';
$this->view->users = $this->user->getPairs('noclosed,noletter');
@@ -675,6 +691,11 @@ EOT;
$selected = $key == $libID ? 'selected' : '';
$output .= html::a(inlink($methodName, "libID=$key"), $lib->name, '', "class='$selected' data-app='{$this->app->tab}'");
}
if(count($libs) >= 2 and common::hasPriv('doc', 'sortLibs'))
{
$output .= '<li class="divider"></li>';
$output .= html::a($this->createLink('doc', 'sortLibs', "type=api&objectID=0", '', true), "<i class='icon-move'></i> {$this->lang->doc->sortLibs}", '', "data-title='{$this->lang->doc->sortLibs}' data-toggle='modal' data-type='iframe' data-width='400px' data-app='{$this->app->tab}'");
}
$output .= "</div></div></div></div></div>";
/* Get lib version */
+1 -1
View File
@@ -35,7 +35,7 @@
.article-content {width: 100%; display: inline-block;}
.outline {position: relative;}
.outline .outline-toggle i.icon-angle-right, i.icon-angle-left {width: 18px; height: 18px; background: #efefef; border-radius: 50%; position: absolute; padding-left: 2px; padding-top: 1px;}
.outline .outline-toggle i.icon-angle-right, i.icon-angle-left {width: 18px; height: 18px; border-radius: 50%; position: absolute; padding-left: 2px; padding-top: 1px;}
.outline .outline-toggle i.icon-angle-right:before {content: "\e314"; cursor: pointer;}
.outline .outline-toggle i.icon-angle-left:before {content: "\e315"; cursor: pointer;}
.outline ul li {list-style: none;}
+8
View File
@@ -60,6 +60,8 @@ $lang->api->confirmDeleteLib = "Do you want to delete this interface library?";
$lang->api->filterStruct = "use struct";
$lang->api->defaultVersion = "Current Version";
$lang->api->zentaoAPI = "Zentao API v1";
$lang->api->search = "Search";
$lang->api->allLibs = "AllLibs";
/* Common access control lang. */
$lang->api->whiteList = 'Whitelist';
@@ -124,6 +126,12 @@ $lang->api->query = 'Parameter';
$lang->api->params = 'Request Body';
$lang->api->response = 'Response';
$lang->api->responseExample = 'Response Example';
$lang->api->id = 'ID';
$lang->api->addedBy = 'AddedBy';
$lang->api->addedDate = 'AddedDate';
$lang->api->editedBy = 'EditedBy';
$lang->api->editedDate = 'EditedDate';
$lang->api->version = 'Version';
$lang->api->res = new stdClass();
$lang->api->res->name = 'Name';
$lang->api->res->desc = 'Description';
+8
View File
@@ -60,6 +60,8 @@ $lang->api->confirmDeleteLib = "Do you want to delete this interface library?";
$lang->api->filterStruct = "use struct";
$lang->api->defaultVersion = "Current Version";
$lang->api->zentaoAPI = "Zentao API v1";
$lang->api->search = "Search";
$lang->api->allLibs = "AllLibs";
/* Common access control lang. */
$lang->api->whiteList = 'Whitelist';
@@ -124,6 +126,12 @@ $lang->api->query = 'Parameter';
$lang->api->params = 'Request Body';
$lang->api->response = 'Response';
$lang->api->responseExample = 'Response Example';
$lang->api->id = 'ID';
$lang->api->addedBy = 'AddedBy';
$lang->api->addedDate = 'AddedDate';
$lang->api->editedBy = 'EditedBy';
$lang->api->editedDate = 'EditedDate';
$lang->api->version = 'Version';
$lang->api->res = new stdClass();
$lang->api->res->name = 'Name';
$lang->api->res->desc = 'Description';
+8
View File
@@ -60,6 +60,8 @@ $lang->api->confirmDeleteLib = "Do you want to delete this interface library?";
$lang->api->filterStruct = "use struct";
$lang->api->defaultVersion = "Current Version";
$lang->api->zentaoAPI = "Zentao API v1";
$lang->api->search = "Search";
$lang->api->allLibs = "AllLibs";
/* Common access control lang. */
$lang->api->whiteList = 'Whitelist';
@@ -124,6 +126,12 @@ $lang->api->query = 'Parameter';
$lang->api->params = 'Request Body';
$lang->api->response = 'Response';
$lang->api->responseExample = 'Response Example';
$lang->api->id = 'ID';
$lang->api->addedBy = 'AddedBy';
$lang->api->addedDate = 'AddedDate';
$lang->api->editedBy = 'EditedBy';
$lang->api->editedDate = 'EditedDate';
$lang->api->version = 'Version';
$lang->api->res = new stdClass();
$lang->api->res->name = 'Name';
$lang->api->res->desc = 'Description';
+8
View File
@@ -60,6 +60,8 @@ $lang->api->confirmDeleteLib = "您确定删除该接口库吗?";
$lang->api->filterStruct = "使用数据结构填充";
$lang->api->defaultVersion = "当前版本";
$lang->api->zentaoAPI = "禅道API文档v1";
$lang->api->search = "搜索";
$lang->api->allLibs = "全部接口库";
/* Common access control lang. */
$lang->api->whiteList = '白名单';
@@ -124,6 +126,12 @@ $lang->api->query = '请求参数';
$lang->api->params = '请求体';
$lang->api->response = '请求响应';
$lang->api->responseExample = '响应示例';
$lang->api->id = '接口编号';
$lang->api->addedBy = '由谁添加';
$lang->api->addedDate = '添加时间';
$lang->api->editedBy = '由谁更新';
$lang->api->editedDate = '更新时间';
$lang->api->version = '版本号';
$lang->api->res = new stdClass();
$lang->api->res->name = '名称';
$lang->api->res->desc = '描述';
+59
View File
@@ -895,4 +895,63 @@ class apiModel extends model
$file = $this->app->getAppRoot() . 'db' . DS . 'api' . DS . $version . DS . $table;
return unserialize(preg_replace_callback('#s:(\d+):"(.*?)";#s', function($match){return 's:'.strlen($match[2]).':"'.$match[2].'";';}, file_get_contents($file)));
}
/**
* Build search form.
*
* @param object $lib
* @param string $queryID
* @param string $actionURL
* @access public
* @return void
*/
public function buildSearchForm($lib, $queryID, $actionURL)
{
$lib = array($lib->id => $lib->name);
$this->config->api->search['module'] = 'api';
$this->config->api->search['queryID'] = $queryID;
$this->config->api->search['actionURL'] = $actionURL;
$this->config->api->search['params']['lib']['values'] = $lib + array('all' => $this->lang->api->allLibs);
$this->loadModel('search')->setSearchParams($this->config->api->search);
}
/**
* Get api by search.
*
* @param string $libID
* @param int $queryID
* @access public
* @return array
*/
public function getApiListBySearch($libID, $queryID)
{
if($queryID)
{
$query = $this->loadModel('search')->getQuery($queryID);
if($query)
{
$this->session->set('apiQuery', $query->sql);
$this->session->set('apiForm', $query->form);
}
else
{
$this->session->set('apiQuery', ' 1 = 1');
}
}
else
{
if($this->session->apiQuery == false) $this->session->set('apiQuery', ' 1 = 1');
}
$apiQuery = $this->session->apiQuery;
$list = $this->dao->select('*')
->from(TABLE_API)
->where('deleted')->eq(0)
->andWhere(str_replace("`lib` = 'all'", '1', $apiQuery))
->beginIF(strpos($apiQuery, "`lib` = 'all'") === false)->andWhere('lib')->eq($libID)->fi()
->fetchAll();
return $list;
}
}
+1
View File
@@ -12,6 +12,7 @@
?>
<?php include '../../common/view/header.html.php';?>
<?php js::set('confirmDelete', $lang->api->confirmDelete);?>
<div class="cell<?php if($param == 'bySearch') echo ' show';?>" id="queryBox" data-module=<?php echo 'api';?>></div>
<div class="fade main-row split-row" id="mainRow">
<?php if($libID):?>
<?php $sideWidth = common::checkNotCN() ? '270' : '238';?>
+3 -3
View File
@@ -326,8 +326,8 @@ $lang->block->default['full']['my']['10']['source'] = 'project';
$lang->block->default['full']['my']['10']['grid'] = 8;
if($config->systemMode == 'classic')
{
$lang->block->default['full']['my']['10']['block'] = 'execution';
$lang->block->default['full']['my']['10']['source'] = 'execution';
$lang->block->default['full']['my']['10']['block'] = 'project';
$lang->block->default['full']['my']['10']['source'] = 'project';
}
$lang->block->default['full']['my']['10']['params']['orderBy'] = 'id_desc';
@@ -567,7 +567,7 @@ $lang->block->flowchart['admin'] = array('Administrator', 'Abteilung erstellen
if($config->systemMode == 'new') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
$lang->block->flowchart['product'] = array($lang->productCommon . ' Besitzer', $lang->productCommon . ' erstellen', 'Module pflegen', 'Pläne pflegen', 'Storys pflegen', 'Release erstellen');
$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
if($config->systemMode == 'new') $lang->block->flowchart['project'] = array('Project Manager', 'Add ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
if($config->systemMode == 'new') $lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
$lang->block->flowchart['dev'] = array('Entwickler', 'Aufgabe/Bugs anfordern', 'Update Status', 'Aufgaben/Bugs abschließen');
$lang->block->flowchart['tester'] = array('QS Team', 'Fälle erstellen', 'Fälle ausführen', 'Bug Berichte', 'Bugs überprüfen', 'Bugs schließen');
+2 -2
View File
@@ -90,8 +90,8 @@ $lang->block->remove = 'Remove';
$lang->block->refresh = 'Refresh';
$lang->block->nbsp = ' ';
$lang->block->hidden = 'Hide';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->noLinkDynamic = "<span class='timeline-tag'>%s</span> <span class='timeline-text' title='%s'>%s <em>%s</em> %s %s</span>";
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <span class='label-action'>%s</span> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->noLinkDynamic = "<span class='timeline-tag'>%s</span> <span class='timeline-text' title='%s'>%s <span class='label-action'>%s</span> %s <span class='label-name'>%s</span></span>";
$lang->block->cannotPlaceInLeft = 'Cannot place the block at left side.';
$lang->block->cannotPlaceInRight = 'Cannot place the block at right side.';
+3 -3
View File
@@ -326,8 +326,8 @@ $lang->block->default['full']['my']['10']['source'] = 'project';
$lang->block->default['full']['my']['10']['grid'] = 8;
if($config->systemMode == 'classic')
{
$lang->block->default['full']['my']['10']['block'] = 'execution';
$lang->block->default['full']['my']['10']['source'] = 'execution';
$lang->block->default['full']['my']['10']['block'] = 'project';
$lang->block->default['full']['my']['10']['source'] = 'project';
}
$lang->block->default['full']['my']['10']['params']['orderBy'] = 'id_desc';
@@ -567,7 +567,7 @@ $lang->block->flowchart['admin'] = array('Administrateur', 'Ajoute Compartimen
if($config->systemMode == 'new') $lang->block->flowchart['program'] = array('Program Owner', 'Create Program', 'Link Product', "Create Project", "Budgeting and planning", 'Add Stakeholder');
$lang->block->flowchart['product'] = array($lang->productCommon . ' Owner', 'Ajoute ' . $lang->productCommon . '/Modules', 'Ajoute ' . $lang->executionCommon . 's', 'Ajoute Stories', 'Maintient Plans', 'Crée Releases');
$lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
if($config->systemMode == 'new') $lang->block->flowchart['project'] = array('Project Manager', 'Add ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
if($config->systemMode == 'new') $lang->block->flowchart['project'] = array('Project Manager', 'Add projects and ' . $lang->executionCommon . 's', 'Maintain Teams', 'Link Stories', 'Create Tasks', 'Track');
$lang->block->flowchart['dev'] = array('Développeurs', 'Réclament Tâches/Bugs', 'Effectuent Tâches', 'Corrigent Bugs', 'MàJ Statuts', 'Terminent Tâches/Bugs');
$lang->block->flowchart['tester'] = array('Testeurs', 'Rédigent CasTests', 'Jouent CasTests', 'Détectent Bugs', 'Vérifient Corrections', 'Ferment Bugs');
+1 -1
View File
@@ -91,7 +91,7 @@ $lang->block->refresh = '刷新';
$lang->block->nbsp = '';
$lang->block->hidden = '隐藏';
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <span class='label-action'>%s</span> %s <a href='%s' title='%s'>%s</a></span>";
$lang->block->noLinkDynamic = "<span class='timeline-tag'>%s</span> <span class='timeline-text' title='%s'>%s <em>%s</em> %s %s</span>";
$lang->block->noLinkDynamic = "<span class='timeline-tag'>%s</span> <span class='timeline-text' title='%s'>%s <span class='label-action'>%s</span> %s <span class='label-name'>%s</span></span>";
$lang->block->cannotPlaceInLeft = '此区块无法放置在左侧。';
$lang->block->cannotPlaceInRight = '此区块无法放置在右侧。';
+2 -1
View File
@@ -5,7 +5,8 @@
.block-dynamic .timeline > li .timeline-text {max-width: 600px; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-height: 20px;}
.block-dynamic .panel-body {padding-top: 0;}
.block-dynamic .label-action {margin-left: 12px;}
.block-dynamic .label-action + a {color: #838A9D;}
.block-dynamic .label-action + a,
.block-dynamic .label-name {color: #838A9D;}
</style>
<div class='panel-body scrollbar-hover'>
<ul class="timeline timeline-tag-left no-margin">
+1 -1
View File
@@ -18,7 +18,7 @@
.flow-item > div:after {left: auto; right: -10px; z-index: 2}
.flow-item > div > span {display: flow-root; overflow: hidden;}
.ie-8 .flow-item > div {margin-right: 10px}
.flow-item-0 > div {color: #838A9D; font-weight: bold; padding-left: 0;}
.flow-item-0 > div {color: #3C4353; font-weight: bold; padding-left: 0;}
.flow-item-0 > div:before {display: none}
.flow-item-1 > div {background: #E3F2FD}
.flow-item-1 > div:after {border-left-color: #E3F2FD}
@@ -4,6 +4,8 @@
<style>
.timeline > li .timeline-text {display: block; overflow: hidden; text-overflow: ellipsis; max-height: 20px; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; }
.panel-body {padding-top: 0;}
.block-projectdynamic .label-action {margin-left: 12px;}
.block-projectdynamic .label-action + a {color: #838A9D;}
</style>
<div class='panel-body scrollbar-hover'>
<ul class="timeline timeline-tag-left no-margin">
@@ -61,11 +61,11 @@ html[lang="en"] .product-info .type-info {color: #A6AAB8; text-align: center; po
.block-statistic .project-info .col-xs-5 {padding-left: 0;}
.block-statistic .data {width: 40%; text-align: left; padding: 10px 0px; font-size: 14px; font-weight: 700;}
.block-statistic .dataTitle {width: 60%; text-align: right; padding: 10px 0px; font-size: 14px;}
.block-statistic .dataTitle {width: 60%; text-align: left; padding: 10px 0px; font-size: 14px;}
.block-statistic .executionName {padding: 2px 10px; font-size: 14px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
.block-statistic .lastIteration {padding-top: 6px;}
.block-statistic .progress-text-left {margin-right: 90px}
.block-statistic .progress-text-left .progress-text {padding-top: 2px; font-size: 14px; padding-right:5px; left: -45px;}
.block-statistic .progress-text-left .progress-text {padding-top: 2px; font-size: 14px; padding-right:5px; left: -50px;}
.status-count {margin: auto;}
.status-count tr:first-child td:last-child {color: #000; font-weight: bold;}
@@ -86,6 +86,26 @@ html[lang="en"] .product-info .type-info {color: #A6AAB8; text-align: center; po
.block-statistic .col-12 .waterfall-title .col {padding-right: 0px; padding-left: 0px;}
.forty-percent {width: 40%;}
.block-statistic .statistic-title{font-weight: 700; line-height: 1.1; color: inherit; font-size: 14px; margin-top: 10px; margin-bottom: 10px; width: 60%; text-align: left; padding: 0px;}
.block-statistic .statistic-title>div{width: 40%; margin-left: 64%; padding: 0px 10px; text-align: left;}
.block-statistic .dataTitle>div {width: 40%; text-align: left; font-size: 14px; padding: 0px 10px; margin-left: 64%; text-align-last: justify;}
.block-statistic.block-sm .statistic-title>div {width: 94%; margin-left: 10%;}
.block-statistic.block-sm .dataTitle>div {width: 94%; margin-left: 10%;}
[lang^='en'] .block-statistic .statistic-title>div {width: 62%; margin-left: 42%;}
[lang^='en'] .block-statistic .dataTitle>div {width: 62%; margin-left: 42%;}
[lang^='en'] .block-statistic.block-sm .statistic-title>div {width: 94%; margin-left: 10%;}
[lang^='en'] .block-statistic.block-sm .dataTitle>div {width: 94%; margin-left: 10%;}
@media screen and (max-width: 1366px){.block-statistic .statistic-title>div {width: 74%; margin-left: 30%;}}
@media screen and (max-width: 1366px){.block-statistic .dataTitle>div {width: 74%; margin-left: 30%;}}
@media screen and (max-width: 1366px){[lang^='en'] .block-statistic .statistic-title>div {width: 70%; margin-left: 34%;}}
@media screen and (max-width: 1366px){[lang^='en'] .block-statistic .dataTitle>div {width: 70%; margin-left: 34%;}}
@media screen and (max-width: 1366px){.block-statistic.block-sm .statistic-title>div {width: 102%; margin-left: 2%;}}
@media screen and (max-width: 1366px){.block-statistic.block-sm .dataTitle>div {width: 102%; margin-left: 2%;}}
</style>
<script>
<?php $blockNavId = 'nav-' . uniqid(); ?>
@@ -137,48 +157,57 @@ $(function()
<?php if($project->model == 'scrum' or $project->model == 'kanban'):?>
<div class='table-row'>
<div class="col-4 text-center">
<div><h4><?php echo $lang->block->story;?></h4></div>
<div>
<div class="col dataTitle"><?php echo $lang->project->allStories . ":";?></div>
<div class="col data"><?php echo $project->allStories;?></div>
<div class="col statistic-title"><div><?php echo $lang->block->story;?></div></div>
<div class="col data"></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->project->doneStories . ":";?></div>
<div class="col data"><?php echo $project->doneStories;?></div>
<div class="col dataTitle"><div><?php echo $lang->project->allStories;?></div></div>
<div class="col data"><?php echo ":" . $project->allStories;?></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->project->surplus . ":";?></div>
<div class="col data"><?php echo $project->leftStories;?></div>
<div class="col dataTitle"><div><?php echo $lang->project->doneStories;?></div></div>
<div class="col data"><?php echo ":" . $project->doneStories;?></div>
</div>
<div>
<div class="col dataTitle"><div><?php echo $lang->project->surplus;?></div></div>
<div class="col data"><?php echo ":" . $project->leftStories;?></div>
</div>
</div>
<div class="col-4 text-center">
<div><h4><?php echo $lang->block->investment;?></h4></div>
<div>
<div class="col dataTitle"><?php echo $lang->block->totalPeople . ":";?></div>
<div class="col data"><?php echo $project->teamCount;?></div>
<div class="col statistic-title"><div><?php echo $lang->block->investment;?></div></div>
<div class="col data"></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->block->estimate . ":";?></div>
<div class="col data"><?php echo $project->estimate;?></div>
<div class="col dataTitle"><div><?php echo $lang->block->totalPeople;?></div></div>
<div class="col data"><?php echo ":" . $project->teamCount;?></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->block->consumedHours . ":";?></div>
<div class="col data"><?php echo $project->consumed;?></div>
<div class="col dataTitle"><div><?php echo $lang->block->estimate;?></div></div>
<div class="col data"><?php echo ":" . $project->estimate;?></div>
</div>
<div>
<div class="col dataTitle"><div><?php echo $lang->block->consumedHours;?></div></div>
<div class="col data"><?php echo ":" . $project->consumed;?></div>
</div>
</div>
<div class="col-4 text-center">
<div><h4><?php echo $lang->bug->common;?></h4></div>
<div>
<div class="col dataTitle"><?php echo $lang->block->totalBug . ":";?></div>
<div class="col data"><?php echo $project->allBugs;?></div>
<div class="col statistic-title"><div><?php echo $lang->block->common;?></div></div>
<div class="col data"></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->bug->statusList['resolved'] . ":";?></div>
<div class="col data"><?php echo $project->doneBugs;?></div>
<div class="col dataTitle"><div><?php echo $lang->block->totalBug;?></div></div>
<div class="col data"><?php echo ":" . $project->allBugs;?></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->bug->unResolved . ":";?></div>
<div class="col data"><?php echo $project->leftBugs;?></div>
<div class="col dataTitle"><div><?php echo $lang->bug->statusList['resolved'];?></div></div>
<div class="col data"><?php echo ":" . $project->doneBugs;?></div>
</div>
<div>
<div class="col dataTitle"><div><?php echo $lang->bug->unResolved;?></div></div>
<div class="col data"><?php echo ":" . $project->leftBugs;?></div>
</div>
</div>
</div>
@@ -17,12 +17,12 @@
#cards .project-infos > span {display: inline-block; line-height: 12px;}
#cards .project-infos > span > .icon {font-size: 12px; display: inline-block; position: relative; top: -1px}
#cards .project-infos > span + span {margin-left: 10px;}
#cards .project-detail {position: absolute; bottom: 16px; left: 16px; right: 16px; font-size: 12px; padding-left: 10px;}
#cards .project-detail {position: absolute; bottom: 27px; left: 16px; right: 16px; font-size: 12px; padding-left: 10px;}
#cards .project-detail > p {margin-bottom: 8px;}
#cards .project-detail .progress {height: 4px;}
#cards .project-detail .progress-text-left .progress-text {width: 50px; left: -50px;}
#cards .panel-heading {cursor: pointer;}
#cards .project-stages-container {margin: 0 0 -16px 0; padding: 0 4px; height: 46px; overflow-x: auto; position: relative;}
#cards .project-stages-container {margin: 0 0 -16px 0; padding: 0 4px; height: 40px; overflow-x: auto; position: relative;}
#cards .project-stages:after {content: ' '; width: 30px; display: block; right: -5px; top: 16px; bottom: -5px; z-index: 1; background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%); position: absolute;}
#cards .project-stages-row {position: relative; height: 30px; z-index: 0;}
#cards .project-stage-item {white-space: nowrap; position: absolute; top: 0; min-width: 48px; padding-top: 13px; color: #838A9D;}
@@ -33,6 +33,7 @@
#cards .project-stage-item.is-going::before {background-color: #0C64EB;}
#dashboard .block-recentproject .panel-body {padding: 0;}
.execution-name {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.scrollbar::-webkit-scrollbar:horizontal {height: 5px;}
</style>
<div class="panel-body">
<?php if(empty($projects)):?>
@@ -83,7 +84,7 @@
<div class='label label-outline'><?php echo zget($lang->project->statusList, $project->status);?></div>
<?php else: ?>
<p class='text-muted'><?php echo $lang->project->ongoingStage;?></p>
<div class='project-stages-container scrollbar-hover'>
<div class='project-stages-container scrollbar-hover scrollbar'>
<div class='project-stages-row'>
<?php foreach ($projectProjects as $project):?>
<div class='project-stage-item is-<?php echo $project->status;?><?php if($project->status !== 'wait') echo ' is-going';?>'>
+26 -10
View File
@@ -21,10 +21,10 @@ if(!$selfCall) die(include('./todolist.html.php'));
.block-todoes .todoes {padding: 0 10px 10px 10px; margin: 0 -20px; max-height: 350px; overflow: auto; overflow-x:hidden}
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden;}
.block-todoes .todoes > li:hover {background-color: #e9f2fb;}
.block-todoes .todo-title {padding: 5px 15px 5px 5px;}
.block-todoes .todo-title {padding: 0px;}
.titleBox {max-width: 700px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block;}
.block-todoes .todo-pri {margin: 0 5px;}
.block-todoes .todo-time {display: inline-block; padding: 0 5px; font-size: 12px; color: #8e939a; width: 95px;}
.block-todoes .todo-time {display: inline-block; padding: 0 5px; font-size: 12px; color: #8e939a; width: 95px; min-width: 95px;}
.block-todoes .todo-check {position: absolute; top: 5px; left: 10px; display: block; width: 20px; height: 20px; font-size: 20px; color: transparent; cursor: pointer; background: #fff; border: 2px solid #eee; border-radius: 50%;}
.block-todoes .todo-check:hover {border-color: #8e939a;}
.block-todoes .active > .todo-check {color: #00da88; background: transparent;border: none;}
@@ -34,6 +34,10 @@ if(!$selfCall) die(include('./todolist.html.php'));
.block-todoes .todoes-form > .form-group:last-child {margin-bottom: 0;}
.block-todoes .todoes-form > h3 {padding: 0 20px 15px; margin: 0 -20px 5px; font-size: 14px; line-height: 20px;}
.block-todoes.show-form .todoes-form {visibility: visible; opacity: 1;}
.block-todoes .todo-flexbetween {display: flex; justify-content: space-between;}
.block-todoes #todoList {display: flex; overflow: hidden;}
.block-todoes .label-todo {width: 50px; min-width: 50px!important; border: none; color: #43A047;}
[lang^='en'] .block-todoes .todo-pri {width: 60px; min-width: 60px;}
</style>
<div class='block-todoes'>
<div class='panel-body'>
@@ -97,14 +101,17 @@ if(!$selfCall) die(include('./todolist.html.php'));
?>
<li data-id='<?php echo $todo->id?>' class='titleBox'>
<span class="todo-check icon icon-check-circle"></span>
<a href="<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink);?>" class='iframe' data-width='1000px' data-toggle='modal' <?php echo $appid?>>
<?php if ($todo->date == '2030-01-01') :?>
<span class="todo-time"><?php echo $lang->todo->periods['future'] ?></span>
<?php else:?>
<span class="todo-time"><?php echo date(DT_DATE4, strtotime($todo->date)) . ' ' . $todo->begin;?></span>
<?php endif;?>
<span class="todo-pri label-pri label-pri-<?php echo $todo->pri?>" title="<?php echo zget($lang->todo->priList, $todo->pri);?>"><?php echo zget($lang->todo->priList, $todo->pri);?></span>
<span class="todo-title" title='<?php echo $todo->name;?>'><?php echo $todo->name;?></span>
<a href="<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink);?>" class='iframe todo-flexbetween' data-width='1000px' data-toggle='modal' <?php echo $appid?>>
<div id='todoList'>
<?php if ($todo->date == '2030-01-01') :?>
<div class="todo-time"><?php echo $lang->todo->periods['future'] ?></div>
<?php else:?>
<div class="todo-time"><?php echo date(DT_DATE4, strtotime($todo->date)) . ' ' . $todo->begin;?></div>
<?php endif;?>
<div class="todo-pri label-pri label-pri-<?php echo $todo->pri?>" title="<?php echo zget($lang->todo->priList, $todo->pri);?>"><?php echo zget($lang->todo->priList, $todo->pri);?></div>
<div class="todo-title text-ellipsis" title='<?php echo $todo->name;?>'><?php echo $todo->name;?></div>
</div>
<span class="label label-id label-todo hidden"><?php echo $lang->block->done;?></span>
</a>
</li>
<?php endforeach;?>
@@ -166,6 +173,15 @@ if(!$selfCall) die(include('./todolist.html.php'));
if(!isFinished) $liTag.addClass('active');
if(isFinished) $liTag.removeClass('active');
});
if(isFinished)
{
$(this).next().find('.label-todo').addClass('hidden');
}
else
{
$(this).next().find('.label-todo').removeClass('hidden');
}
});
});
+19 -9
View File
@@ -14,9 +14,8 @@
.block-welcome .col-left {width: 25%;}
.block-welcome .col-left > h4 {margin: 5px 0;line-height: 30px;}
.block-welcome .col-left .timeline {margin: 10px 0 0;font-size: 12px;}
.block-welcome .col-right > h4 {font-weight: normal;}
.block-welcome .col-right > h4 small {display: inline-block;margin-right: 8px;font-size: 14px;}
.block-welcome .col-right .tiles {padding: 10px 0 0 16px;border-left: 1px solid #e5e8ec;}
.block-welcome .col-right .tiles {padding: 10px 0 0 16px;}
.block-welcome .col-right .tile {width: 33%;}
.block-welcome .panel-body {padding-top: 15px;}
.block-welcome .user-notification-icon {position: relative;display: inline-block;margin-left: 5px;}
@@ -24,17 +23,28 @@
.block-welcome.block-sm .col-right {padding: 0;}
.block-welcome.block-sm .col-right .tiles {border-left: none; padding-left: 0}
.block-welcome.block-sm .tile-title {font-size: 12px; margin: 0 -10px;}
.block-welcome .progress-group{margin-top: 20px;}
.block-welcome .progress-group{margin-top: 42px;}
.block-welcome .progress{margin-top: 10px; width: 85%}
.block-welcome .user-welcome{margin-top: 28px !important;}
.block-welcome .col-right{border-left: 1px solid #e5e8ec;}
.block-welcome.block-sm .col-right {border: none;}
.block-welcome .left-today{margin-left: 36px;}
.block-welcome .done-progress{display: inline-block; color: #5B606E; font-weight: 500;}
.block-welcome .welcome-label{background: #ffebee; border: none;}
.block-welcome.block-sm .left-today {margin-left: 0px;}
</style>
<?php $progress = $tasks == 0 ? 0 : round($doneTasks / $tasks, 3) * 100;?>
<div class='panel-move-handler'></div>
<div class="panel-body conatiner-fluid">
<div class="table-row">
<div class="col col-left hide-in-sm">
<h4><?php printf($lang->block->welcomeList[$welcomeType], $app->user->realname)?></h4>
<div class='progress-group'>
<span class="progress-num"><strong><?php echo $lang->block->assignToMe . ' ' . $lang->block->done . " $progress" . '%';?></strong></span>
<h4><small class="text-muted"><?php echo date(DT_DATE3)?></small></h4>
<h4 class="user-welcome"><?php printf($lang->block->welcomeList[$welcomeType], $app->user->realname)?></h4>
<div class="progress-group">
<span class="progress-num">
<strong><?php echo $lang->block->assignToMe;?></strong>
<div class="done-progress"><?php echo $lang->block->done . " $progress" . '%';?></div>
</span>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="82" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $progress;?>%">
</div>
@@ -42,14 +52,14 @@
</div>
</div>
<div class="col col-right">
<h4><small class="text-muted"><?php echo date(DT_DATE3)?></small> <?php echo $lang->block->leftToday?></h4>
<h4 class="left-today"><?php echo $lang->block->leftToday?></h4>
<div class="row tiles">
<div class="col tile">
<div class="tile-title"><?php echo $lang->block->myTask?></div>
<div class="tile-amount"><?php echo empty($tasks) ? 0 : html::a($this->createLink('my', 'work', 'mode=task'), (int)$tasks);?></div>
<?php if(!empty($delay['task'])):?>
<div class="tile-info">
<span class="label label-danger label-outline"><?php echo $lang->block->delayed . ' ' . $delay['task']?></span>
<span class="label label-danger label-outline welcome-label"><?php echo $lang->block->delayed . ' ' . $delay['task']?></span>
</div>
<?php endif;?>
</div>
@@ -58,7 +68,7 @@
<div class="tile-amount"><?php echo empty($bugs) ? 0 : html::a($this->createLink('my', 'work', 'mode=bug'), (int)$bugs);?></div>
<?php if(!empty($delay['bug'])):?>
<div class="tile-info">
<span class="label label-danger label-outline"><?php echo $lang->block->delayed . ' ' . $delay['bug']?></span>
<span class="label label-danger label-outline welcome-label"><?php echo $lang->block->delayed . ' ' . $delay['bug']?></span>
</div>
<?php endif;?>
</div>
+1 -1
View File
@@ -53,7 +53,7 @@ js::set('page', 'confirmbug');
<?php $this->printExtendFields($bug, 'table');?>
<tr>
<th><?php echo $lang->bug->mailto;?></th>
<td colspan='2'><?php echo html::select('mailto[]', $users, str_replace(' ' , '', $bug->mailto), 'class="form-control chosen" multiple');?></td>
<td colspan='2'><?php echo html::select('mailto[]', $users, str_replace(' ' , '', $bug->mailto), 'class="form-control picker-select" multiple');?></td>
</tr>
<tr>
<th><?php echo $lang->comment;?></th>
+1 -1
View File
@@ -333,7 +333,7 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
<td>
<div class='input-group' id='contactListGroup'>
<?php
echo html::select('mailto[]', $users, str_replace(' ', '', $mailto), "class='form-control chosen' multiple");
echo html::select('mailto[]', $users, str_replace(' ', '', $mailto), "class='form-control picker-select' multiple");
echo $this->fetch('my', 'buildContactLists');
?>
</div>
+1 -1
View File
@@ -186,7 +186,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
<th><?php echo $lang->bug->mailto;?></th>
<td>
<div class='input-group'>
<?php echo html::select('mailto[]', $users, str_replace(' ', '', $bug->mailto), 'class="form-control chosen" multiple');?>
<?php echo html::select('mailto[]', $users, str_replace(' ', '', $bug->mailto), 'class="form-control picker-select" multiple');?>
<?php echo $this->fetch('my', 'buildContactLists');?>
</div>
</td>
+8 -1
View File
@@ -12,11 +12,18 @@ class ciModel extends model
/**
* Set menu.
*
* @param int $repoID
* @access public
* @return void
*/
public function setMenu()
public function setMenu($repoID = 0)
{
if($repoID)
{
if(!session_id()) session_start();
$this->session->set('repoID', $repoID);
session_write_close();
}
common::setMenuVars('devops', $this->session->repoID);
}
+1 -1
View File
@@ -396,7 +396,7 @@ $lang->qa->dividerMenu = ',bug,testtask,caselib,';
$lang->devops->menu = new stdclass();
$lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit');
$lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse", 'subModule' => 'compile,job');
$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse");
$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse|repoID=%s");
$lang->devops->menu->gitlab = array('link' => "GitLab|gitlab|browse", 'alias' => 'create,edit');
$lang->devops->menu->sonarqube = array('link' => "SonarQube|sonarqube|browse");
$lang->devops->menu->jenkins = array('link' => "Jenkins|jenkins|browse", 'alias' => 'create,edit');
+1 -1
View File
@@ -2353,7 +2353,7 @@ EOD;
$module == 'tutorial' ||
$module == 'install' ||
$module == 'upgrade' ||
($module == 'user' && strpos('|login|deny|logout|reset|', "|{$method}|") !== false) ||
($module == 'user' && strpos('|login|deny|logout|reset|forgetpassword|resetpassword|', "|{$method}|") !== false) ||
($module == 'my' && strpos('|changepassword|preference|', "|{$method}|") !== false) ||
($module == 'file' && strpos('|read|download|uploadimages|ajaxwopifiles|', "|{$method}|") !== false) ||
($module == 'sso' && $method == 'login') ||
+9
View File
@@ -224,6 +224,15 @@ class company extends control
/* Get executions' list.*/
$executions = $this->loadModel('execution')->getPairs(0, 'all', 'nocode');
$executionsIDList = array_keys($executions);
$executionsList = $this->execution->getByIdList($executionsIDList);
foreach($executionsList as $executionsID => $executionObj)
{
foreach($projects as $projectsID => $projectsName)
{
if($executionObj->project == $projectsID) $executions[$executionObj->id] = $projectsName . '/' . $executionObj->name;
}
}
$executions = array($this->lang->execution->common) + $executions;
$this->view->executions = $executions;
+5 -1
View File
@@ -10,7 +10,7 @@
.dynamic .timeline-tag {left: -75px; font-size: 14px; color: #838A9D;}
.dynamic .timeline-text {color: #3C4353;}
.dynamic .text-muted {color: #838A9D;}
.dynamic .label-id {top: -1px;}
.dynamic .label-id {top: -1px; border: 1px solid rgba(131,138,157,0.25); color: #838A9D;}
.dynamic.active .timeline,
.dynamic.active .dynamic-date {border-color: #00a9fc;}
.dynamic.active .dynamic-date:before {background-color: #00a9fc;}
@@ -21,3 +21,7 @@
.c-project, .c-product, .c-execution {width: 110px !important; overflow: unset;}
.c-user, .c-order {width: 96px !important; overflow: unset;}
.c-date {width: 200px;}
.dynamic .label-action {margin-left: 12px;}
.dynamic .label-name,
.dynamic .label-name a {color: #838A9D;}
+6 -4
View File
@@ -35,7 +35,7 @@
<?php if($config->systemMode == 'new'):?>
<div class="input-control space c-project"><?php echo html::select('project', $projects, $projectID, 'class="form-control chosen" data-max_drop_width="215"');?></div>
<?php endif;?>
<div class="input-control space c-execution"><?php echo html::select('execution', $executions, $executionID, 'class="form-control chosen" data-max_drop_width="215"'); ?></div>
<div class="input-control space c-execution"><?php echo html::select('execution', $executions, $executionID, 'class="form-control chosen" data-max_drop_width="350"'); ?></div>
<div class="input-control space c-order"><?php echo html::select('orderBy', $lang->company->order, $orderBy, 'class="form-control chosen" data-max_drop_width="215" data-disable_search="true"'); ?></div>
<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> <?php echo $lang->action->dynamic->search;?></a>
</div>
@@ -73,8 +73,12 @@
<span class='label-action'><?php echo ' ' . $action->actionLabel;?></span>
<?php if($action->action != 'login' and $action->action != 'logout'):?>
<span class="text"><?php echo $action->objectLabel;?></span>
<?php if($action->objectID):?>
<span class="label label-id"><?php echo $action->objectID;?></span>
<?php endif;?>
<?php $tab = '';?>
<?php if($action->objectType == 'meeting') $tab = $action->project ? "data-app='project'" : "data-app='my'";?>
<span class="label-name">
<?php
if(empty($action->objectName) and $action->objectID)
{
@@ -93,9 +97,7 @@
echo html::a($action->objectLink, $action->objectName, '', $tab);
}
?>
<?php if($action->objectID):?>
<span class="label label-id"><?php echo $action->objectID;?></span>
<?php endif;?>
</span>
<?php endif;?>
</span>
</div>
+8
View File
@@ -118,6 +118,14 @@ class custom extends control
if(strtolower($this->server->request_method) == "post")
{
$postArray = fixer::input('post');
$keys = array();
foreach($postArray->data->keys as $key)
{
if(in_array($key, $keys)) return $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->custom->notice->repeatKey, $key)));;
$keys[] = $key;
}
if($module == 'project' and $field == 'unitList')
{
$data = fixer::input('post')->join('unitList', ',')->get();
+1
View File
@@ -206,6 +206,7 @@ $lang->custom->notice->confirmDelete = 'Are you sure you want to delete it
$lang->custom->notice->confirmReviewCase = 'Set the case in Wait to Normal?';
$lang->custom->notice->storyReviewTip = 'After selecting by individual, position, and department, take the union of these three filters. ';
$lang->custom->notice->selectAllTip = 'After selecting all people, the reviewers will be emptied and grayed out while hiding their positions and departments.';
$lang->custom->notice->repeatKey = 'Repeat Key %s';
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Homepage. Do you want to go to Product Homepage?";
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Homepage. Do you want to go to Project Homepage?";
+1
View File
@@ -206,6 +206,7 @@ $lang->custom->notice->confirmDelete = 'Are you sure you want to delete it
$lang->custom->notice->confirmReviewCase = 'Set the case in Wait to Normal?';
$lang->custom->notice->storyReviewTip = 'After selecting by individual, position, and department, take the union of these three filters. ';
$lang->custom->notice->selectAllTip = 'After selecting all people, the reviewers will be emptied and grayed out while hiding their positions and departments.';
$lang->custom->notice->repeatKey = 'Repeat Key %s';
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Home. Do you want to go to Product Home?";
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Home. Do you want to go to Project Home?";
+1
View File
@@ -206,6 +206,7 @@ $lang->custom->notice->confirmDelete = 'Are you sure you want to delete it
$lang->custom->notice->confirmReviewCase = 'Set the case in Wait to Normal?';
$lang->custom->notice->storyReviewTip = 'After selecting by individual, position, and department, take the union of these three filters. ';
$lang->custom->notice->selectAllTip = 'After selecting all people, the reviewers will be emptied and grayed out while hiding their positions and departments.';
$lang->custom->notice->repeatKey = 'Repeat Key %s';
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ possède une page d'accueil. Voulez-vous consulter la page d'accueil du produit ?";
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ possède une page d'accueil. Voulez-vous consulter la page d'accueil du produit ?";
+1
View File
@@ -206,6 +206,7 @@ $lang->custom->notice->confirmDelete = '您确定要删除吗?';
$lang->custom->notice->confirmReviewCase = '是否将待评审的用例修改为正常状态?';
$lang->custom->notice->storyReviewTip = '按人员、职位、部门勾选后,取所有人员的并集。';
$lang->custom->notice->selectAllTip = '勾选所有人员后,会清空并置灰评审人员,同时隐藏职位、部门。';
$lang->custom->notice->repeatKey = '%s键重复';
$lang->custom->notice->indexPage['product'] = "从8.2版本起增加了产品主页视图,是否默认进入产品主页?";
$lang->custom->notice->indexPage['project'] = "从8.2版本起增加了项目主页视图,是否默认进入项目主页?";
+10 -10
View File
@@ -92,7 +92,7 @@ EOT;
</tr>
<tr>
<th class="thWidth"><?php echo $lang->custom->superReviewers;?></th>
<td><?php echo html::select('superReviewers[]', $users, $superReviewers, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('superReviewers[]', $users, $superReviewers, "class='form-control picker-select' multiple");?></td>
</tr>
<tr>
<td colspan='2' class='text-center'><?php echo html::submitButton();?></td>
@@ -112,39 +112,39 @@ EOT;
</tr>
<tr id='userBox' class='forceReview<?php if($needReview) echo " hidden"?>'>
<th><?php echo $lang->custom->forceReview . $space . $lang->custom->account;?></th>
<td><?php echo html::select('forceReview[]', $users, $forceReview, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceReview[]', $users, $forceReview, "class='form-control picker-select' multiple");?></td>
</tr>
<tr id='roleBox' class='forceReview<?php if($needReview) echo " hidden"?>'>
<th><?php echo $lang->custom->forceReview . $space . $lang->custom->role;?></th>
<td><?php echo html::select('forceReviewRoles[]', $lang->user->roleList, $forceReviewRoles, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceReviewRoles[]', $lang->user->roleList, $forceReviewRoles, "class='form-control picker-select' multiple");?></td>
</tr>
<tr id='deptBox' class='forceReview<?php if($needReview) echo " hidden"?>'>
<th><?php echo $lang->custom->forceReview . $space . $lang->custom->dept;?></th>
<td><?php echo html::select('forceReviewDepts[]', $depts, $forceReviewDepts, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceReviewDepts[]', $depts, $forceReviewDepts, "class='form-control picker-select' multiple");?></td>
</tr>
<tr id='userBox' class='forceNotReview<?php if(!$needReview) echo " hidden"?>'>
<th><?php echo $lang->custom->forceNotReview . $space . $lang->custom->account;?></th>
<td><?php echo html::select('forceNotReview[]', $users, $forceNotReview, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceNotReview[]', $users, $forceNotReview, "class='form-control picker-select' multiple");?></td>
</tr>
<tr id='roleBox' class='forceNotReview<?php if(!$needReview) echo " hidden"?>'>
<th><?php echo $lang->custom->forceNotReview . $space . $lang->custom->role;?></th>
<td><?php echo html::select('forceNotReviewRoles[]', $lang->user->roleList, $forceNotReviewRoles, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceNotReviewRoles[]', $lang->user->roleList, $forceNotReviewRoles, "class='form-control picker-select' multiple");?></td>
</tr>
<tr id='deptBox' class='forceNotReview<?php if(!$needReview) echo " hidden"?>'>
<th><?php echo $lang->custom->forceNotReview . $space . $lang->custom->dept;?></th>
<td><?php echo html::select('forceNotReviewDepts[]', $depts, $forceNotReviewDepts, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceNotReviewDepts[]', $depts, $forceNotReviewDepts, "class='form-control picker-select' multiple");?></td>
</tr>
<?php endif;?>
<?php if($module == 'testcase'):?>
<?php js::set('oldNeedReview', $needReview);?>
<tr <?php if($needReview) echo "class='hidden'"?>>
<th><?php echo $lang->custom->forceReview;?></th>
<td><?php echo html::select('forceReview[]', $users, $forceReview, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceReview[]', $users, $forceReview, "class='form-control picker-select' multiple");?></td>
<td style='width:300px'><?php printf($lang->custom->notice->forceReview, $lang->$module->common);?></td>
</tr>
<tr <?php if(!$needReview) echo "class='hidden'"?>>
<th><?php echo $lang->custom->forceNotReview;?></th>
<td><?php echo html::select('forceNotReview[]', $users, $forceNotReview, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('forceNotReview[]', $users, $forceNotReview, "class='form-control picker-select' multiple");?></td>
<td style='width:300px'><?php printf($lang->custom->notice->forceNotReview, $lang->$module->common);?></td>
</tr>
<?php endif;?>
@@ -212,7 +212,7 @@ EOT;
<table class='table table-form mw-800px'>
<tr>
<th class='w-150px'><?php echo $lang->custom->user->fields['contactField'];?></th>
<td><?php echo html::select('contactField[]', $lang->user->contactFieldList, $config->user->contactField, "class='form-control chosen' multiple");?></td>
<td><?php echo html::select('contactField[]', $lang->user->contactFieldList, $config->user->contactField, "class='form-control picker-select' multiple");?></td>
</tr>
<tr>
<td></td>
+64 -16
View File
@@ -482,6 +482,7 @@ class doc extends control
$this->view->doc = $doc;
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($libID, 'doc', $startModuleID = 0);
$this->view->type = $type;
$this->view->lib = $lib;
$this->view->libs = $this->doc->getLibs('all', $extra = 'withObject|noBook', $libID, $objectID);
$this->view->groups = $this->loadModel('group')->getPairs();
$this->view->users = $this->user->getPairs('noletter|noclosed|nodeleted', $doc->users);
@@ -896,13 +897,13 @@ class doc extends control
/**
* Show files.
*
* @param string $type
* @param int $objectID
* @param string $viewType
* @param string $orderBy
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @param string $type
* @param int $objectID
* @param string $viewType
* @param string $orderBy
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
@@ -1151,13 +1152,18 @@ class doc extends control
/**
* Show the catalog of the doc library.
*
* @param string $type
* @param int $objectID
* @param int $libID
* @param string $type
* @param int $objectID
* @param int $libID
* @param int $queryID
* @param string $param
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function tableContents($type, $objectID = 0, $libID = 0)
public function tableContents($type, $objectID = 0, $libID = 0, $queryID = 0, $param = '', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
list($libs, $libID, $object, $objectID) = $this->doc->setMenuByType($type, $objectID, $libID);
$this->session->set('createProjectLocate', $this->app->getURI(true), 'doc');
@@ -1168,15 +1174,39 @@ class doc extends control
$title = ($type == 'book' or $type == 'custom') ? $this->lang->doc->tableContents : $object->name . $this->lang->colon . $this->lang->doc->tableContents;
/* Build the search form. */
$queryID = $param == 'bySearch' ? (int)$queryID : 0;
$actionURL = $this->createLink('doc', 'tableContents', "type=$type&objectID=$objectID&libID=$libID&queryID=myQueryID&param=bySearch");
$this->doc->buildSearchForm($libID, $libs, $queryID, $actionURL, $type);
$this->view->title = $title;
$this->view->type = $type;
$this->view->libs = $libs;
$this->view->objectID = $objectID;
$this->view->libID = $libID;
$this->view->moduleTree = $moduleTree;
$this->view->param = $param;
$this->view->queryID = $queryID;
$this->view->users = $this->user->getPairs('noletter');
if($param == 'bySearch')
{
/* Load pager. */
$rawMethod = $this->app->rawMethod;
$this->app->rawMethod = 'tableContents';
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
$this->app->rawMethod = $rawMethod;
$this->display();
$this->view->docs = $this->doc->getDocsBySearch($type, $objectID, $libID, $queryID, $pager);
$this->view->browseType = 'bySearch';
$this->view->pager = $pager;
$this->display('doc', 'browse', "browseType=bySearch&param=$queryID");
}
else
{
$this->view->libs = $libs;
$this->view->objectID = $objectID;
$this->view->libID = $libID;
$this->view->moduleTree = $moduleTree;
$this->display();
}
}
/**
@@ -1199,4 +1229,22 @@ class doc extends control
unset($this->lang->doc->libTypeList['book']);
$this->display();
}
/**
* Sort libs.
*
* @access public
* @return void
*/
public function sortLibs($type, $objectID)
{
if(!empty($_POST))
{
$this->doc->updateLibOrder();
return print(js::reload('parent.parent'));
}
$this->view->title = $this->lang->doc->sortLibs;
$this->view->libs = $this->doc->getLibs($type, '', '', $objectID);
$this->display();
}
}
+2 -1
View File
@@ -1 +1,2 @@
#pageActions ul.dropdown-menu {left: 67px !important;}
#mainContent .c-id {width: 70px;}
#mainContent .c-id > a {color: #0c60e1;}
+1
View File
@@ -103,3 +103,4 @@ ol, ul {margin-bottom: 0}
.fullscreen-close {top: 8px !important;}
#subHeader .list-group>a.selected {color: #e9f2fb !important; background-color: #0c64eb !important;}
#pageNav #dropMenu .table-col .list-group .icon-move {display:block; float: left; font-size: 12px; padding: 3px 4px 3px 1px;}
+1 -1
View File
@@ -32,7 +32,7 @@
.article-content {width: 100%; display: inline-block;}
.outline {position: relative;}
.outline .outline-toggle i.icon-angle-right, i.icon-angle-left {width: 18px; height: 18px; background: #efefef; border-radius: 50%; position: absolute; padding-left: 2px; padding-top: 1px;}
.outline .outline-toggle i.icon-angle-right, i.icon-angle-left {width: 18px; height: 18px; border-radius: 50%; position: absolute; padding-left: 2px; padding-top: 1px;}
.outline .outline-toggle i.icon-angle-right:before {content: "\e314"; cursor: pointer;}
.outline .outline-toggle i.icon-angle-left:before {content: "\e315"; cursor: pointer;}
.outline ul li {list-style: none;}
+5
View File
@@ -0,0 +1,5 @@
#mainContent .doclib-name {font-size: 13px; font-weight: 550; padding: 10px 0px;}
#mainContent #libs {padding-bottom: 10px;}
#mainContent #libs .lib {padding-bottom: 5px;}
#mainContent #libs .lib .lib-name{cursor: pointer;}
#mainContent #libs .lib .icon-move {padding-left: 4px; font-size:13px; vertical-align: text-top; cursor: pointer;}
+40
View File
@@ -0,0 +1,40 @@
$(function()
{
/* Make libs sortable. */
$('#libs').sortable(
{
trigger: '.lib > .icon-move, .lib > .lib-name',
dropToClass: 'sort-to',
stopPropagation: true,
nested: true,
selector: 'div',
dragCssClass: 'drop-here',
canMoveHere: function($ele, $target)
{
var maxTop = $('#libs .libList').height() - $ele.height();
if(parseFloat($('.drag-shadow').css('top')) < 0) $('.drag-shadow').css('top', '0');
if(parseFloat($('.drag-shadow').css('left')) != 0) $('.drag-shadow').css('left', '0');
if(parseFloat($('.drag-shadow').css('top')) > maxTop) $('.drag-shadow').css('top', maxTop + 'px');
if(parseFloat($('.drag-shadow').css('bottom')) > $('#libs').height()) $('.drag-shadow').css('bottom', '0');
return true;
},
targetSelector: function($ele, $root)
{
var $libs = $ele.closest('#libs .libList');
return $libs.children('div.lib');
},
always: function()
{
$('#libs,#libs .is-sorting').removeClass('is-sorting');
},
finish: function(e)
{
var orders = ',';
$('#libs .libList').find('div.lib').each(function()
{
orders += $(this).attr('data-id') + ',';
});
$('#libs #libIdList').attr('value', orders);
}
});
});
+4
View File
@@ -96,3 +96,7 @@ $(function()
}
});
})
$(document).on("click", '#bysearchTab', function()
{
$('.main-content > .cell > .detail > .menu-actions').remove();
});
+1
View File
@@ -151,6 +151,7 @@ $lang->doc->removeMenu = 'Vom Menü entfernen';
$lang->doc->search = 'Suche';
$lang->doc->allCollections = 'All Collections';
$lang->doc->keywordsTips = 'Please use commas to separate multiple keywords.';
$lang->doc->sortLibs = 'Sort Libs';
global $config;
/* Query condition list. */
+1
View File
@@ -151,6 +151,7 @@ $lang->doc->removeMenu = 'Remove from Menu';
$lang->doc->search = 'Search';
$lang->doc->allCollections = 'All Collections';
$lang->doc->keywordsTips = 'Please use commas to separate keywords.';
$lang->doc->sortLibs = 'Sort Libs';
global $config;
/* Query condition list. */
+1
View File
@@ -151,6 +151,7 @@ $lang->doc->removeMenu = 'Décoller du Menu';
$lang->doc->search = 'Rechercher';
$lang->doc->allCollections = 'All Collections';
$lang->doc->keywordsTips = 'Please use commas to separate multiple keywords.';
$lang->doc->sortLibs = 'Sort Libs';
global $config;
/* Query condition list. */
+2 -1
View File
@@ -45,7 +45,7 @@ $lang->doclib->nameList['custom'] = '自定义文档库名称';
/* 字段列表。*/
$lang->doc->common = '文档';
$lang->doc->id = '编号';
$lang->doc->id = '文档编号';
$lang->doc->product = '所属' . $lang->productCommon;
$lang->doc->project = '所属项目';
$lang->doc->execution = '所属' . $lang->execution->common;
@@ -151,6 +151,7 @@ $lang->doc->removeMenu = '从菜单栏移除';
$lang->doc->search = '搜索';
$lang->doc->allCollections = '查看全部收藏文档';
$lang->doc->keywordsTips = '多个关键字请用逗号分隔。';
$lang->doc->sortLibs = '文档库排序';
global $config;
/* 查询条件列表 */
+175 -18
View File
@@ -48,7 +48,7 @@ class docModel extends model
->where('deleted')->eq(0)
->andWhere('type')->eq('api')
->beginIF(!empty($appendLib))->orWhere('id')->eq($appendLib)->fi()
->orderBy('id_desc')
->orderBy('`order`_asc, id_desc')
->fetchAll('id');
$libs = array_filter($libs, array($this, 'checkPrivLib'));
return $libs;
@@ -61,6 +61,7 @@ class docModel extends model
* @param string $extra
* @param string $appendLibs
* @param int $projectID
*
* @access public
* @return array
*/
@@ -72,7 +73,7 @@ class docModel extends model
->where('type')->ne('api')
->beginIF($type == 'all')->andWhere('deleted')->eq(0)->fi()
->andWhere('vision')->eq($this->config->vision)
->orderBy('id_desc')
->orderBy('`order` asc, id_desc')
->query();
}
else
@@ -83,7 +84,7 @@ class docModel extends model
->beginIF($type)->andWhere('type')->eq($type)->fi()
->beginIF(!$type)->andWhere('type')->ne('api')->fi()
->beginIF($objectID and strpos(',product,project,execution,', ",$type,") !== false)->andWhere($type)->eq($objectID)->fi()
->orderBy('`order`, id desc')->query();
->orderBy("`order` asc, id_desc")->query();
}
$products = $this->loadModel('product')->getPairs();
@@ -128,7 +129,7 @@ class docModel extends model
if(!empty($appendLibs))
{
$stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where('id')->in($appendLibs)->orderBy('`order`, id desc')->query();
$stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where('id')->in($appendLibs)->orderBy("`order` asc, id_desc")->query();
while($lib = $stmt->fetch())
{
if(!isset($libPairs[$lib->id]) and $this->checkPrivLib($lib, $extra)) $libPairs[$lib->id] = $lib->name;
@@ -931,19 +932,29 @@ class docModel extends model
$this->config->doc->search['params']['project']['values'] = array('' => '') + $this->loadModel('project')->getPairsByProgram() + array('all' => $this->lang->doc->allProjects);
$this->config->doc->search['params']['execution']['values'] = array('' => '') + $this->loadModel('execution')->getPairs() + array('all' => $this->lang->doc->allExecutions);
$this->config->doc->search['params']['lib']['values'] = array('' => '') + $this->loadModel('doc')->getLibs('all', 'withObject') + array('all' => $this->lang->doclib->all);
$this->config->doc->search['params']['product']['values'] = array('' => '') + $products + array('all' => $this->lang->doc->allProduct);
unset($this->config->doc->search['fields']['module']);
}
elseif(in_array($type, array('product', 'project', 'execution', 'custom', 'book')))
{
$queryName = $type . 'Doc';
$this->config->doc->search['module'] = $queryName;
$this->config->doc->search['params']['lib']['values'] = array('' => '', $libID => (isset($libs[$libID]) ? $libs[$libID]->name : $libID), 'all' => $this->lang->doclib->all);
unset($this->config->doc->search['fields']['product']);
unset($this->config->doc->search['fields']['execution']);
unset($this->config->doc->search['fields']['module']);
}
else
{
$products = $this->product->getPairs('nocode', $this->session->project);
$this->config->doc->search['params']['execution']['values'] = array('' => '') + $this->loadModel('execution')->getPairs($this->session->project, 'all', 'noclosed') + array('all' => $this->lang->doc->allExecutions);
$this->config->doc->search['params']['lib']['values'] = array('' => '', $libID => ($libID ? $libs[$libID] : 0), 'all' => $this->lang->doclib->all);
$this->config->doc->search['params']['product']['values'] = array('' => '') + $products + array('all' => $this->lang->doc->allProduct);
}
$this->config->doc->search['actionURL'] = $actionURL;
$this->config->doc->search['queryID'] = $queryID;
$this->config->doc->search['params']['product']['values'] = array('' => '') + $products + array('all' => $this->lang->doc->allProduct);
$this->config->doc->search['actionURL'] = $actionURL;
$this->config->doc->search['queryID'] = $queryID;
/* Get the modules. */
$moduleOptionMenu = $this->loadModel('tree')->getOptionMenu($libID, 'doc', $startModuleID = 0);
@@ -1401,8 +1412,8 @@ class docModel extends model
->andWhere('vision')->eq($this->config->vision)
->andWhere('type')->eq($type)
->beginIF(!empty($appendLib))->orWhere('id')->eq($appendLib)->fi()
->beginIF($type == 'custom')->orderBy('`order`, id')->fi()
->beginIF($type == 'book')->orderBy('id_desc')->fi()
->beginIF($type == 'custom')->orderBy('`order` asc, id_desc')->fi()
->beginIF($type == 'book')->orderBy('`order` asc, id_desc')->fi()
->fetchAll('id');
}
elseif($type != 'product' and $type != 'project' and $type != 'execution')
@@ -1417,7 +1428,7 @@ class docModel extends model
->andWhere($type)->eq($objectID)
->beginIF(!empty($appendLib))->orWhere('id')->eq($appendLib)->fi()
->beginIF($type == 'project')->andWhere('execution')->eq(0)->fi()
->orderBy('`order`, id')
->orderBy('`order` asc, id_desc')
->fetchAll('id');
}
@@ -1432,10 +1443,24 @@ class docModel extends model
->fetchPairs('product', 'projectCount');
}
$docCountPairs = $this->dao->select('lib, count(id) as docCount')->from(TABLE_DOC)
->where('lib')->in(array_keys($objectLibs))
->andWhere('vision')->eq($this->config->vision)
->andWhere('type')->notin('chapter')
->andWhere('deleted')->eq(0)
->groupBy('lib')
->fetchPairs('lib');
$libs = array();
foreach($objectLibs as $lib)
{
if($this->checkPrivLib($lib)) $libs[$lib->id] = $lib;
if($this->checkPrivLib($lib))
{
$docCount = zget($docCountPairs, $lib->id, 0);
$lib->docCount = $docCount > 99 ? '99+' : $docCount;
$libs[$lib->id] = $lib;
}
}
$itemCounts = $this->statLibCounts(array_keys($libs));
@@ -1638,7 +1663,7 @@ class docModel extends model
$idList = array_keys($docs);
$docIdList = $this->dao->select('id')->from(TABLE_DOC)->where($type)->eq($objectID)->andWhere('id')->in($idList)->get();
$searchTitle = $this->get->title;
$searchTitle = $this->post->title;
if($type == 'product')
{
$storyIdList = $this->dao->select('id')->from(TABLE_STORY)->where('product')->eq($objectID)->andWhere('deleted')->eq('0')->andWhere('product')->in($userView)->get();
@@ -1699,7 +1724,7 @@ class docModel extends model
->orWhere("(objectType = 'build' and objectID in ($buildIdList))")
->fi()
->markRight(1)
->beginIF($searchTitle)->andWhere('title')->like("%{$searchTitle}%")->fi()
->beginIF($searchTitle !== false)->andWhere('title')->like("%{$searchTitle}%")->fi()
->orderBy($orderBy)
->page($pager)
->fetchAll('id');
@@ -2141,7 +2166,21 @@ class docModel extends model
->limit($favoritesLimit)
->fetchAll();
$html = "<div class='btn-group dropdown-hover'>";
$html = '';
$rawMethod = $this->app->rawMethod;
if($this->app->rawMethod == 'showfiles')
{
$html = '<div class="btn-group">';
$html .= '<form class="input-control has-icon-right table-col" method="post">';
$html .= html::input('title', $this->post->title, "class='form-control' placeholder='{$this->lang->doc->fileTitle}'");
$html .= html::submitButton("<i class='icon icon-search'></i>", '', "btn btn-icon btn-link input-control-icon-right");
$html .= '</form></div>';
}
elseif(in_array($rawMethod, array('tablecontents', 'objectlibs', 'product', 'project', 'execution', 'book', 'custom')))
{
$html = '<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i>' . $this->lang->doc->search . '</a>';
}
$html .= "<div class='btn-group dropdown-hover'>";
$html .= "<a href='javascript:;' class='btn btn-link' data-toggle='dropdown'>{$this->lang->doc->myCollection}</a>";
$html .= "<ul class='dropdown-menu pull-right' id='collection-menu'>";
@@ -2353,12 +2392,20 @@ EOT;
foreach($libs as $key => $lib)
{
$selected = $key == $libID ? 'selected' : '';
$output .= html::a(inlink($methodName, "type=$type&objectID=$objectID&libID=$key"), $lib->name, '', "class='$selected' data-app='{$this->app->tab}'");
$docCount = isset($lib->docCount) ? $lib->docCount : 0;
$output .= html::a(inlink($methodName, "type=$type&objectID=$objectID&libID=$key"), "<span style='display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;'>$lib->name</span>&nbsp;<span>($docCount)</span>", '', "class='$selected' data-app='{$this->app->tab}' title='$lib->name ($docCount)' style='display: flex; justify-content: start;'");
}
if($type != 'custom' and $type != 'book')
{
$selected = empty($libID) ? 'selected' : '';
$output .= html::a(inlink('showFiles', "type=$type&objectID=$objectID"), $this->lang->doclib->files, '', "class='$selected' data-app='{$this->app->tab}'");
$files = $this->getLibFiles($type, $objectID, 't1.id_desc');
$fileCount = count($files) > 99 ? '99+' : count($files);
$selected = empty($libID) ? 'selected' : '';
$output .= html::a(inlink('showFiles', "type=$type&objectID=$objectID"), "{$this->lang->doclib->files} ($fileCount)", '', "class='$selected' data-app='{$this->app->tab}' title='{$this->lang->doclib->files} ($fileCount)'");
}
if(count($libs) >= 2 and common::hasPriv('doc', 'sortLibs'))
{
$output .= '<li class="divider"></li>';
$output .= html::a(inlink('sortLibs', "type=$type&objectID=$objectID", '', true), "<i class='icon-move'></i> {$this->lang->doc->sortLibs}", '', "data-title='{$this->lang->doc->sortLibs}' data-toggle='modal' data-type='iframe' data-width='400px' data-app='{$this->app->tab}'");
}
$output .= "</div></div></div></div></div>";
}
@@ -2767,7 +2814,7 @@ EOT;
$table = $this->config->objectTables[$type];
$libs = $this->getLibsByObject($type, $objectID, '', $appendLib);
if($libID == 0) $libID = key($libs);
if($libID == 0) $libID = reset($libs)->id;
$this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID);
if($this->app->tab == 'doc') $this->app->rawMethod = $type;
@@ -2812,4 +2859,114 @@ EOT;
return $autoloadPage;
}
/**
* Get docs by search.
*
* @param string $type
* @param int $objectID
* @param int $libID
* @param int $queryID
* @param object $pager
*
* @access public
* @return array
*/
public function getDocsBySearch($type, $objectID, $libID, $queryID, $pager)
{
$queryName = $type . 'DocQuery';
$queryForm = $type . 'DocForm';
if($queryID)
{
$query = $this->loadModel('search')->getQuery($queryID);
if($query)
{
$this->session->set($queryName, $query->sql);
$this->session->set($queryForm, $query->form);
}
else
{
$this->session->set($queryName, ' 1 = 1');
}
}
else
{
if($this->session->$queryName == false) $this->session->set($queryName, ' 1 = 1');
}
$libs = $this->getLibsByObject($type, $objectID);
$query = $this->session->$queryName;
$docs = $this->dao->select('*')->from(TABLE_DOC)
->where('deleted')->eq(0)
->andWhere(str_replace("`lib` = 'all'", '1', $query))
->beginIF(strpos($query, "`lib` = 'all'") === false)->andWhere('lib')->eq($libID)->fi()
->andWhere('lib')->in(array_keys($libs))
->beginIF($this->config->doc->notArticleType)->andWhere('type')->notIN($this->config->doc->notArticleType)->fi()
->orderBy('id_desc')
->page($pager)
->fetchAll('id');
$docContents = $this->dao->select('*')->from(TABLE_DOCCONTENT)->where('doc')->in(array_keys($docs))->orderBy('version,doc')->fetchAll('doc');
$files = $this->dao->select('*')->from(TABLE_FILE)
->where('objectType')->eq('doc')
->andWhere('objectID')->in(array_keys($docs))
->fetchGroup('objectID');
foreach($docs as $docID => $doc)
{
$docs[$docID]->fileSize = 0;
if(isset($files[$docID]))
{
$docContent = $docContents[$docID];
$fileSize = 0;
foreach($files[$docID] as $file)
{
if(strpos(",{$docContent->files},", ",{$file->id},") === false) continue;
$fileSize += $file->size;
}
if($fileSize < 1024)
{
$fileSize .= 'B';
}
elseif($fileSize < 1024 * 1024)
{
$fileSize = round($fileSize / 1024, 2) . 'KB';
}
elseif($fileSize < 1024 * 1024 * 1024)
{
$fileSize = round($fileSize / 1024 / 1024, 2) . 'MB';
}
else
{
$fileSize = round($fileSize / 1024 / 1024 / 1024, 2) . 'G';
}
$docs[$docID]->fileSize = $fileSize;
}
}
return $docs;
}
/**
* Update Lib orders.
*
* @access public
* @return void
*/
public function updateLibOrder()
{
$libIdList = $this->post->libIdList;
$libIdList = explode(',', $libIdList);
$order = 1;
foreach($libIdList as $libID)
{
if(!$libID) continue;
$this->dao->update(TABLE_DOCLIB)->set('`order`')->eq($order * 10)->where('id')->eq($libID)->exec();
$order++;
}
}
}
+20
View File
@@ -13,7 +13,11 @@
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/datepicker.html.php';?>
<?php js::set('browseType', $browseType);?>
<?php js::set('docLang', $lang->doc);?>
<?php js::set('confirmDelete', $lang->doc->confirmDelete)?>
<?php if($browseType == 'bySearch'):?>
<div class="cell<?php if($browseType == 'bySearch') echo ' show';?>" id="queryBox" data-module=<?php echo $type . 'Doc';?>></div>
<?php endif;?>
<div class="main-row fade" id="mainRow">
<div id="mainContent">
<div class="panel block-files block-sm no-margin">
@@ -26,8 +30,13 @@
<table class="table table-borderless table-hover table-files table-fixed no-margin">
<thead>
<tr>
<?php if($browseType !== 'bySearch'):?>
<th class="c-name"><?php echo $lang->doc->title;?></th>
<th class="w-200px c-name"><?php echo $lang->doc->object;?></th>
<?php else:?>
<th class="c-id"><?php echo $lang->doc->id;?></th>
<th class="c-name"><?php echo $lang->doc->title;?></th>
<?php endif;?>
<th class="c-num"><?php echo $lang->doc->size;?></th>
<th class="c-user"><?php echo $lang->doc->addedBy;?></th>
<th class="c-datetime"><?php echo $lang->doc->addedDate;?></th>
@@ -40,6 +49,7 @@
<?php $star = strpos($doc->collector, ',' . $this->app->user->account . ',') !== false ? 'icon-star text-yellow' : 'icon-star-empty';?>
<?php $collectTitle = strpos($doc->collector, ',' . $this->app->user->account . ',') !== false ? $lang->doc->cancelCollection : $lang->doc->collect;?>
<tr>
<?php if($browseType !== 'bySearch'):?>
<?php if(common::hasPriv('doc', 'view')):?>
<td class="c-name"><?php echo html::a($this->createLink('doc', 'view', "docID=$doc->id&version=0", '', true), "<i class='icon icon-file-text text-muted'></i> &nbsp;" . $doc->title, '', "title='{$doc->title}' class='iframe' data-width='90%'");?></td>
<?php else:?>
@@ -54,6 +64,16 @@
}
?>
</td>
<?php else:?>
<?php if(common::hasPriv('doc', 'objectLibs')):?>
<?php $objectID = isset($doc->{$type}) ? $doc->{$type} : 0;?>
<td class="c-id"><?php echo html::a($this->createLink('doc', 'objectLibs', "type=$type&objectID=$objectID&libID=$doc->lib&docID=$doc->id"), $doc->id, '', "title='{$doc->id}' data-app='{$this->app->tab}'");?></td>
<td class="c-name"><?php echo html::a($this->createLink('doc', 'objectLibs', "type=$type&objectID=$objectID&libID=$doc->lib&docID=$doc->id"), "<i class='icon icon-file-text text-muted'></i> &nbsp;" . $doc->title, '', "title='{$doc->title}' data-app='{$this->app->tab}'");?></td>
<?php else:?>
<td class='c-id' title='<?php echo $doc->id;?>'><?php echo "<i class='icon icon-file-text text-muted'></i> {$doc->id}";?></td>
<td class='c-name' title='<?php echo $doc->title;?>'><?php echo "<i class='icon icon-file-text text-muted'></i> {$doc->title}";?></td>
<?php endif;?>
<?php endif;?>
<td class="c-num"><?php echo $doc->fileSize ? $doc->fileSize : '-';?></td>
<td class="c-user"><?php echo zget($users, $doc->addedBy);?></td>
<td class="c-datetime"><?php echo formatTime($doc->addedDate, 'y-m-d');?></td>
+3 -3
View File
@@ -99,7 +99,7 @@ $("a[href^='###']").click(function()
<td colspan="2">
<div class="input-group">
<?php
echo html::select('mailto[]', $users, '', "multiple class='form-control chosen'");
echo html::select('mailto[]', $users, '', "multiple class='form-control picker-select' data-dropDirection='top'");
echo $this->fetch('my', 'buildContactLists');
?>
</div>
@@ -118,11 +118,11 @@ $("a[href^='###']").click(function()
<td colspan='2'>
<div class='input-group'>
<span class='input-group-addon groups-addon'><?php echo $lang->doclib->group?></span>
<?php echo html::select('groups[]', $groups, '', "class='form-control chosen' multiple")?>
<?php echo html::select('groups[]', $groups, '', "class='form-control picker-select' multiple data-dropDirection='top'")?>
</div>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->doclib->user?></span>
<?php echo html::select('users[]', $users, '', "class='form-control chosen' multiple")?>
<?php echo html::select('users[]', $users, '', "class='form-control picker-select' multiple data-dropDirection='top'")?>
</div>
</td>
</tr>
+2 -2
View File
@@ -69,11 +69,11 @@
<td>
<div id='groupBox' class='input-group'>
<span class='input-group-addon groups-addon'><?php echo $lang->doclib->group?></span>
<?php echo html::select('groups[]', $groups, '', "class='form-control chosen' multiple")?>
<?php echo html::select('groups[]', $groups, '', "class='form-control picker-select' multiple")?>
</div>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->doclib->user?></span>
<?php echo html::select('users[]', $users, '', "class='form-control chosen' multiple")?>
<?php echo html::select('users[]', $users, '', "class='form-control picker-select' multiple")?>
</div>
</td>
</tr>
+3 -4
View File
@@ -26,7 +26,6 @@
<?php echo html::a($this->createLink('doc', 'view', "docID=$doc->id"), $doc->title, '', "title='$doc->title'");?>
<small> <?php echo $lang->arrow . ' ' . $lang->doc->edit;?></small>
</h2>
<div class='pull-right'><?php echo html::a('###', $lang->save, '', 'id="top-submit" class="btn btn-primary"');?></div>
</div>
<form class='load-indicator main-form form-ajax' method='post' enctype='multipart/form-data' id='dataform'>
<table class='table table-form'>
@@ -75,7 +74,7 @@
<td colspan="2">
<div class="input-group">
<?php
echo html::select('mailto[]', $users, $doc->mailto, "multiple class='form-control chosen'");
echo html::select('mailto[]', $users, $doc->mailto, "multiple class='form-control picker-select'");
echo $this->fetch('my', 'buildContactLists');
?>
</div>
@@ -94,11 +93,11 @@
<td colspan='2'>
<div class='input-group w-p100'>
<span class='input-group-addon groups-addon'><?php echo $lang->doclib->group?></span>
<?php echo html::select('groups[]', $groups, $doc->groups, "class='form-control chosen' multiple")?>
<?php echo html::select('groups[]', $groups, $doc->groups, "class='form-control picker-select' multiple")?>
</div>
<div class='input-group w-p100'>
<span class='input-group-addon'><?php echo $lang->doclib->user?></span>
<?php echo html::select('users[]', $users, $doc->users, "class='form-control chosen' multiple")?>
<?php echo html::select('users[]', $users, $doc->users, "class='form-control picker-select' multiple")?>
</div>
</td>
</tr>
+2 -2
View File
@@ -66,11 +66,11 @@
<td>
<div id='groupBox' class='input-group'>
<span class='input-group-addon groups-addon'><?php echo $lang->doclib->group?></span>
<?php echo html::select('groups[]', $groups, $lib->groups, "class='form-control chosen' multiple")?>
<?php echo html::select('groups[]', $groups, $lib->groups, "class='form-control picker-select' multiple")?>
</div>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->doclib->user?></span>
<?php echo html::select('users[]', $users, $lib->users, "class='form-control chosen' multiple")?>
<?php echo html::select('users[]', $users, $lib->users, "class='form-control picker-select' multiple")?>
</div>
</td>
</tr>
+1
View File
@@ -14,6 +14,7 @@
<?php if($app->tab == 'execution'):;?>
<style>.panel-body{min-height: 180px}</style>
<?php endif;?>
<div class="cell<?php if($type == 'bySearch') echo ' show';?>" id="queryBox" data-module=<?php echo $type . 'Doc';?>></div>
<div class="fade main-row split-row" id="mainRow">
<?php if($libID):?>
<?php include './side.html.php';?>
+35
View File
@@ -0,0 +1,35 @@
<?php
/**
* The sortlibs view file of doc module of ZenTaoPMS.
*
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Mengyi Liu <liumengyi@easycorp.ltd>
* @package doc
* @version $Id: sorlibs.html.php 958 2022-06-21 14:20:42Z $
* @link https://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<div id="main">
<div class='main-header'>
<h2><?php echo $lang->doc->order;?></h2>
</div>
<div id='mainContent' class='main-content'>
<div class='doclib-name'><?php echo $lang->doclib->name?></div>
<?php $libIdList = ',';?>
<form id='libs' class='load-indicator main-form' method='post' target='hiddenwin'>
<div class='libList'>
<?php foreach($libs as $libID => $libName):?>
<?php $libIdList .= "$libID,";?>
<div class='lib' data-id='<?php echo $libID;?>'>
<span class='lib-name'><?php echo $libName;?></span><i class='icon-move'></i>
</div>
<?php endforeach;?>
</div>
<?php echo html::hidden('libIdList', trim($libIdList, ','));?>
<div class='text-center'><?php echo html::submitButton($lang->save);?></div>
</form>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>
+2
View File
@@ -12,6 +12,7 @@
?>
<?php include '../../common/view/header.html.php';?>
<?php js::set('moduleTree', $moduleTree);?>
<?php js::set('docLang', $lang->doc);?>
<?php
$sideLibs = array();
foreach($lang->doclib->tabList as $libType => $typeName) $sideLibs[$libType] = $this->doc->getLimitLibs($libType);
@@ -27,6 +28,7 @@ if($this->methodName != 'browse')
}
if(empty($type)) $type = 'product';
?>
<div class="cell<?php if($param == 'bySearch') echo ' show';?>" id="queryBox" data-module=<?php echo $type . 'Doc';?>></div>
<div class="main-content">
<div class="cell" id="<?php echo $type;?>">
<div class="detail">
+2 -2
View File
@@ -2924,8 +2924,8 @@ class execution extends control
if(!empty($_POST))
{
$this->execution->linkStory($objectID, array(), array(), $extra);
if($object->type != 'project' and $object->project != 0) $this->execution->linkStory($object->project);
$this->execution->linkStory($objectID, array(), array(), $extra);
if(isonlybody())
{
@@ -3232,7 +3232,7 @@ class execution extends control
$users = $this->loadModel('user')->getPairs('nodeleted|noclosed');
$members = $this->user->getTeamMemberPairs($objectID, $type);
return print(html::select('teamMembers[]', $users, array_keys($members), "class='form-control chosen' multiple"));
return print(html::select('teamMembers[]', $users, array_keys($members), "class='form-control picker-select' multiple"));
}
/**
+4 -1
View File
@@ -12,10 +12,13 @@
.dynamic .timeline-tag {left: -75px; font-size: 14px; color: #838A9D;}
.dynamic .timeline-text {color: #3C4353;}
.dynamic .text-muted {color: #838A9D;}
.dynamic .label-id {top: -1px;}
.dynamic .label-id {top: -1px; border: 1px solid rgba(131,138,157,0.25); color: #838A9D;}
.dynamic.active .timeline,
.dynamic.active .dynamic-date {border-color: #00a9fc;}
.dynamic.active .dynamic-date:before {background-color: #00a9fc;}
.dynamic.collapsed .timeline {max-height: 58px;}
.dynamic.collapsed .timeline > li + li {display: none;}
.dynamic.collapsed .dynamic-btn > .icon:before {content: '\f0d8';}
.dynamic .label-action {margin-left: 12px;}
.dynamic .label-id + a {color: #838A9D;}
+1 -1
View File
@@ -72,7 +72,7 @@ $(function()
$.get(createLink('execution', 'ajaxGetTeamMembers', 'objectID=' + objectID), function(data)
{
$('#teamMembers').parent().html(data);
$('#teamMembers').chosen();
$('#teamMembers').picker({chosenMode: true});
});
})
+1
View File
@@ -134,6 +134,7 @@ $lang->execution->sortColumn = 'Kanban Card Sorting';
$lang->execution->batchCreateStory = "Batch create {$lang->SRCommon}";
$lang->execution->batchCreateTask = 'Batch create task';
$lang->execution->kanbanNoLinkProduct = "Kanban not linked {$lang->productCommon}";
$lang->execution->myTask = "My Task";
$lang->execution->list = 'List';
/* Fields of zt_team. */
+1
View File
@@ -134,6 +134,7 @@ $lang->execution->sortColumn = '看板列卡片排序';
$lang->execution->batchCreateStory = "批量新建{$lang->SRCommon}";
$lang->execution->batchCreateTask = '批量建任务';
$lang->execution->kanbanNoLinkProduct = "看板没有关联{$lang->productCommon}";
$lang->execution->myTask = "我的任务";
$lang->execution->list = '列表';
/* Fields of zt_team. */
+4 -1
View File
@@ -167,7 +167,10 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
<div class='table-footer'>
<?php if($canBatchEdit):?>
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
<div class="table-actions btn-toolbar"><?php echo html::submitButton($lang->execution->batchEdit, '', 'btn');?></div>
<div class="table-actions btn-toolbar">
<?php echo html::submitButton($lang->execution->batchEdit, '', 'btn');?>
<div class="table-statistic"></div>
</div>
<?php endif;?>
<?php $pager->show('right', 'pagerjs');?>
</div>
+2 -2
View File
@@ -217,7 +217,7 @@
</tr>
<tr>
<th><?php echo $lang->execution->team;?></th>
<td colspan='3'><?php echo html::select('teamMembers[]', $users, '', "class='form-control chosen' multiple"); ?></td>
<td colspan='3'><?php echo html::select('teamMembers[]', $users, '', "class='form-control picker-select' multiple"); ?></td>
</tr>
<tr>
<th><?php echo $lang->kanban->columnWidth;?></th>
@@ -246,7 +246,7 @@
<th><?php echo $lang->whitelist;?></th>
<td colspan='2'>
<div class='input-group'>
<?php echo html::select('whitelist[]', $users, $whitelist, 'class="form-control chosen" multiple');?>
<?php echo html::select('whitelist[]', $users, $whitelist, 'class="form-control picker-select" multiple');?>
<?php echo $this->fetch('my', 'buildContactLists', "dropdownName=whitelist");?>
</div>
</td>
+2 -2
View File
@@ -191,7 +191,7 @@
<?php endif; ?>
<tr>
<th><?php echo $lang->execution->team;?></th>
<td colspan='2'><?php echo html::select('teamMembers[]', $users, array_keys($teamMembers), "class='form-control chosen' multiple"); ?></td>
<td colspan='2'><?php echo html::select('teamMembers[]', $users, array_keys($teamMembers), "class='form-control picker-select' multiple"); ?></td>
</tr>
<tr>
<th><?php echo $lang->kanban->columnWidth;?></th>
@@ -221,7 +221,7 @@
<th><?php echo $lang->whitelist;?></th>
<td>
<div class='input-group'>
<?php echo html::select('whitelist[]', $users, $execution->whitelist, 'class="form-control chosen" multiple');?>
<?php echo html::select('whitelist[]', $users, $execution->whitelist, 'class="form-control picker-select" multiple');?>
<?php echo $this->fetch('my', 'buildContactLists', "dropdownName=whitelist");?>
</div>
</td>
+2 -2
View File
@@ -27,7 +27,7 @@
<table class='table table-form'>
<tbody>
<tr>
<th class='w-80px'><?php echo $lang->execution->dateRange;?></th>
<th class='c-date'><?php echo $lang->execution->dateRange;?></th>
<td colspan='2'>
<div class='input-group'>
<?php echo html::input('begin', $execution->begin, "class='form-control form-date' onchange='computeWorkDays()' placeholder='" . $lang->execution->begin . "'");?>
@@ -43,7 +43,7 @@
</div>
</div>
</td>
<td class='w-100px'></td>
<td class='c-date'></td>
</tr>
<tr>
<th><?php echo $lang->execution->days;?></th>
+5 -6
View File
@@ -35,24 +35,23 @@ $account = $this->app->user->account;
</div>
<?php endif;?>
<div class='btn-group'>
<?php common::printIcon('story', 'export', "productID=$productID&orderBy=id_desc", '', 'button', '', '', 'export', '', "data-group='execution'");?>
</div>
<?php if($canBeChanged and $productID and !$this->loadModel('story')->checkForceReview()) common::printLink('story', 'create', "productID=$productID&branch=&moduleID=0&story=0&execution=$execution->id", "<i class='icon icon-plus'></i> " . $lang->execution->createStory, '', "class='btn btn-secondary' class='btn btn-link export' data-group='execution'");?>
<?php
common::printIcon('story', 'export', "productID=$productID&orderBy=id_desc", '', 'button', '', '', 'export', '', "data-group='execution'");
if($canBeChanged)
{
if(commonModel::isTutorialMode())
{
$wizardParams = helper::safe64Encode("execution=$execution->id");
echo html::a($this->createLink('tutorial', 'wizard', "module=execution&method=linkStory&params=$wizardParams"), "<i class='icon-link'></i> {$lang->execution->linkStory}",'', "class='btn btn-link link-story-btn'");
echo html::a($this->createLink('tutorial', 'wizard', "module=execution&method=linkStory&params=$wizardParams"), "<i class='icon-link'></i> {$lang->execution->linkStory}", '', "class='btn btn-primary'");
}
else
{
common::printIcon('execution', 'linkStory', "execution=$execution->id", '', 'button', 'link', '', 'btn-link link-story-btn');
common::printLink('execution', 'linkStory', "execution=$execution->id", "<i class='icon icon-link'></i> " . $lang->execution->linkStory, '', "class='btn btn-primary'");
}
}
?>
</div>
<?php if($canBeChanged and $productID and !$this->loadModel('story')->checkForceReview()) common::printLink('story', 'create', "productID=$productID&branch=&moduleID=0&story=0&execution=$execution->id", "<i class='icon icon-plus'></i> " . $lang->execution->createStory, '', "class='btn btn-primary' class='btn btn-link export' data-group='execution'");?>
</div>
</div>
<div id="kanban" class="main-table" data-ride="table" data-checkable="false" data-group="true">
+12 -7
View File
@@ -1209,6 +1209,7 @@ $lang->resource->doc->collect = 'collectAction';
$lang->resource->doc->tableContents = 'tableContents';
$lang->resource->doc->showFiles = 'showFiles';
$lang->resource->doc->updateOrder = 'updateOrder';
$lang->resource->doc->sortLibs = 'sortLibs';
$lang->doc->methodOrder[0] = 'index';
$lang->doc->methodOrder[5] = 'browse';
@@ -1225,6 +1226,8 @@ $lang->doc->methodOrder[55] = 'objectLibs';
$lang->doc->methodOrder[60] = 'collect';
$lang->doc->methodOrder[65] = 'tableContents';
$lang->doc->methodOrder[70] = 'showFiles';
$lang->doc->methodOrder[75] = 'updateOrder';
$lang->doc->methodOrder[80] = 'sortLibs';
/* Mail. */
$lang->resource->mail = new stdclass();
@@ -1580,13 +1583,14 @@ $lang->search->methodOrder[35] = 'buildIndex';
/* Admin. */
$lang->resource->admin = new stdclass();
$lang->resource->admin->index = 'index';
$lang->resource->admin->checkDB = 'checkDB';
$lang->resource->admin->safe = 'safeIndex';
$lang->resource->admin->checkWeak = 'checkWeak';
$lang->resource->admin->sso = 'ssoAction';
$lang->resource->admin->register = 'register';
$lang->resource->admin->ztCompany = 'ztCompany';
$lang->resource->admin->index = 'index';
$lang->resource->admin->checkDB = 'checkDB';
$lang->resource->admin->safe = 'safeIndex';
$lang->resource->admin->checkWeak = 'checkWeak';
$lang->resource->admin->sso = 'ssoAction';
$lang->resource->admin->register = 'register';
$lang->resource->admin->ztCompany = 'ztCompany';
$lang->resource->admin->resetPWDSetting = 'resetPWDSetting';
$lang->admin->methodOrder[0] = 'index';
$lang->admin->methodOrder[5] = 'checkDB';
@@ -1595,6 +1599,7 @@ $lang->admin->methodOrder[15] = 'checkWeak';
$lang->admin->methodOrder[20] = 'sso';
$lang->admin->methodOrder[25] = 'register';
$lang->admin->methodOrder[30] = 'ztCompany';
$lang->admin->methodOrder[35] = 'resetPWDSetting';
/* Extension. */
$lang->resource->extension = new stdclass();
+4 -4
View File
@@ -52,7 +52,7 @@
<td>
<?php if($programs):?>
<div class='input-group'>
<?php echo html::select("actions[programs][]", $programs, isset($group->acl['programs']) ? join(',', $group->acl['programs']) : '', "class='form-control chosen' multiple")?>
<?php echo html::select("actions[programs][]", $programs, isset($group->acl['programs']) ? join(',', $group->acl['programs']) : '', "class='form-control picker-select' multiple")?>
<span class='input-group-addon strong'><?php echo $lang->group->noticeVisit?></span>
</div>
<?php else:?>
@@ -65,7 +65,7 @@
<td>
<?php if($products):?>
<div class='input-group'>
<?php echo html::select("actions[products][]", $products, isset($group->acl['products']) ? join(',', $group->acl['products']) : '', "class='form-control chosen' multiple")?>
<?php echo html::select("actions[products][]", $products, isset($group->acl['products']) ? join(',', $group->acl['products']) : '', "class='form-control picker-select' multiple")?>
<span class='input-group-addon strong'><?php echo $lang->group->noticeVisit?></span>
</div>
<?php else:?>
@@ -78,7 +78,7 @@
<td>
<?php if($projects):?>
<div class='input-group'>
<?php echo html::select("actions[projects][]", $projects, isset($group->acl['projects']) ? join(',', $group->acl['projects']) : '', "class='form-control chosen' drop_direction='down' multiple")?>
<?php echo html::select("actions[projects][]", $projects, isset($group->acl['projects']) ? join(',', $group->acl['projects']) : '', "class='form-control picker-select' data-dropDirection='bottom' multiple")?>
<span class='input-group-addon strong'><?php echo $lang->group->noticeVisit?></span>
</div>
<?php else:?>
@@ -91,7 +91,7 @@
<td>
<?php if($executions):?>
<div class='input-group'>
<?php echo html::select("actions[sprints][]", $executions, isset($group->acl['sprints']) ? join(',', $group->acl['sprints']) : '', "class='form-control chosen' drop_direction='down' multiple")?>
<?php echo html::select("actions[sprints][]", $executions, isset($group->acl['sprints']) ? join(',', $group->acl['sprints']) : '', "class='form-control picker-select' data-dropDirection='bottom' multiple")?>
<span class='input-group-addon strong'><?php echo $lang->group->noticeVisit?></span>
</div>
<?php else:?>
+3 -3
View File
@@ -233,13 +233,13 @@ class install extends control
if(!empty($_POST))
{
$this->install->grantPriv();
if(dao::isError()) return print(js::error(dao::getError()) . js::locate('back'));
if(dao::isError()) return print(js::error(dao::getError()));
$this->install->updateLang();
if(dao::isError()) return print(js::error(dao::getError()) . js::locate('back'));
if(dao::isError()) return print(js::error(dao::getError()));
if($this->post->importDemoData) $this->install->importDemoData();
if(dao::isError()) return print(js::alert($this->lang->install->errorImportDemoData) . js::locate('back'));
if(dao::isError()) return print(js::alert($this->lang->install->errorImportDemoData));
$this->loadModel('setting');
$this->setting->updateVersion($this->config->version);
+2
View File
@@ -1,2 +1,4 @@
.c-company {width: 80px !important;}
.c-company-value {width: 300px !important;}
.mw-table {max-width: 650px !important;}
+2
View File
@@ -1,2 +1,4 @@
.c-company {width: 150px !important;}
.c-company-value {width: 350px !important;}
.mw-table {max-width: 950px !important;}
+3
View File
@@ -161,6 +161,9 @@ $lang->install->company = 'Firmenname';
$lang->install->account = 'Admin Konto';
$lang->install->password = 'Admin Passwort';
$lang->install->placeholder = new stdclass();
$lang->install->placeholder->password = 'Combination of letters, numbers and special symbols, at least 6 characters';
$lang->install->errorEmpty['company'] = "{$lang->install->company} should not be blank.";
$lang->install->errorEmpty['account'] = "{$lang->install->account} should not be blank.";
$lang->install->errorEmpty['password'] = "{$lang->install->password} should not be blank.";
+3
View File
@@ -161,6 +161,9 @@ $lang->install->company = 'Company Name';
$lang->install->account = 'Admin Account';
$lang->install->password = 'Admin Password';
$lang->install->placeholder = new stdclass();
$lang->install->placeholder->password = 'Combination of letters, numbers and special symbols, at least 6 characters';
$lang->install->errorEmpty['company'] = "{$lang->install->company} should not be blank.";
$lang->install->errorEmpty['account'] = "{$lang->install->account} should not be blank.";
$lang->install->errorEmpty['password'] = "{$lang->install->password} should not be blank.";
+3
View File
@@ -161,6 +161,9 @@ $lang->install->company = 'Nom Entreprise';
$lang->install->account = 'Compte Admin';
$lang->install->password = 'Mot de Passe Admin';
$lang->install->placeholder = new stdclass();
$lang->install->placeholder->password = 'Combination of letters, numbers and special symbols, at least 6 characters';
$lang->install->errorEmpty['company'] = "{$lang->install->company} should not be blank.";
$lang->install->errorEmpty['account'] = "{$lang->install->account} should not be blank.";
$lang->install->errorEmpty['password'] = "{$lang->install->password} should not be blank.";
+3
View File
@@ -161,6 +161,9 @@ $lang->install->company = '公司名称';
$lang->install->account = '管理员帐号';
$lang->install->password = '管理员密码';
$lang->install->placeholder = new stdclass();
$lang->install->placeholder->password = '六位及以上,包含数字、字母和特殊字符';
$lang->install->errorEmpty['company'] = "{$lang->install->company}不能为空";
$lang->install->errorEmpty['account'] = "{$lang->install->account}不能为空";
$lang->install->errorEmpty['password'] = "{$lang->install->password}不能为空";
+3 -3
View File
@@ -45,8 +45,8 @@
<strong><?php echo $lang->install->getPriv;?></strong>
</div>
<div class='modal-body'>
<form method='post'>
<table class='table table-form mw-500px' style='margin: 0 auto'>
<form method='post' target='hiddenwin'>
<table class='table table-form mw-table' style='margin: 0 auto'>
<tr>
<th class='c-company'><?php echo $lang->install->company;?></th>
<td class='c-company-value'><?php echo html::input('company', '', "class='form-control'");?></td>
@@ -62,7 +62,7 @@
<tr>
<th><?php echo $lang->install->password;?></th>
<td><?php echo html::input('password', '', "class='form-control' oninput=\"this.value = this.value.replace(/[\u4e00-\u9fa5d]/g, '');\"");?></td>
<td><?php echo $lang->user->placeholder->password1;?></td>
<td><?php echo $lang->install->placeholder->password;?></td>
</tr>
<tr>
<th></th><td><?php echo html::checkBox('importDemoData', $lang->install->importDemoData);?></td>
+1 -1
View File
@@ -91,7 +91,7 @@ $lang->kanban->alignment = 'Alignment';
/* Fields. */
$lang->kanban->space = 'Space';
$lang->kanban->name = 'Name';
$lang->kanban->archived = 'Archive';
$lang->kanban->archived = 'Archived';
$lang->kanban->owner = 'Owner';
$lang->kanban->team = 'Team';
$lang->kanban->desc = 'Description';
+1 -1
View File
@@ -212,7 +212,7 @@ $lang->kanban->error->childLimitEmpty = 'Please set the WIP quantity of the su
$lang->kanban->importList = array();
$lang->kanban->importList['off'] = 'Import is not enabled';
$lang->kanban->importList['on'] = 'Enable the import function, you can only import content that you have permission to view.';
$lang->kanban->importList['on'] = 'Enable import function (You can import content that you have permission to view as cards.)';
$lang->kanban->importObjectList = array();
$lang->kanban->importObjectList['plans'] = 'Product Plan';
+1 -1
View File
@@ -91,7 +91,7 @@ $lang->kanban->alignment = 'Alignment';
/* Fields. */
$lang->kanban->space = 'Space';
$lang->kanban->name = 'Name';
$lang->kanban->archived = 'Archive';
$lang->kanban->archived = 'Archived';
$lang->kanban->owner = 'Owner';
$lang->kanban->team = 'Team';
$lang->kanban->desc = 'Description';
+1 -1
View File
@@ -212,7 +212,7 @@ $lang->kanban->error->childLimitEmpty = '请先设置子列的在制品数量
$lang->kanban->importList = array();
$lang->kanban->importList['off'] = '不启用导入功能';
$lang->kanban->importList['on'] = '启用导入功能,只能导入自己有权限查看的内容';
$lang->kanban->importList['on'] = '启用导入功能(可以导入自己有权查看的内容作为卡片)';
$lang->kanban->importObjectList = array();
$lang->kanban->importObjectList['plans'] = '计划';
+2 -2
View File
@@ -44,7 +44,7 @@
<th><?php echo $lang->kanban->team;?></th>
<td colspan='2'>
<div class="input-group">
<?php echo html::select('team[]', $users, '', "class='form-control chosen' multiple data-drop_direction='down'");?>
<?php echo html::select('team[]', $users, '', "class='form-control picker-select' multiple data-dropDirection='bottom'");?>
</div>
</td>
</tr>
@@ -86,7 +86,7 @@
<?php if($type == 'private'):?>
<tr id="whitelistBox">
<th><?php echo $lang->whitelist;?></th>
<td><?php echo html::select('whitelist[]', $whitelist, '', 'class="form-control chosen" multiple');?></td>
<td><?php echo html::select('whitelist[]', $whitelist, '', 'class="form-control picker-select" multiple');?></td>
</tr>
<?php endif;?>
<tr>
+2 -2
View File
@@ -35,7 +35,7 @@
<th><?php echo $lang->kanbanspace->team;?></th>
<td colspan='2'>
<div class="input-group">
<?php echo html::select('team[]', $users, '', "class='form-control chosen' multiple data-drop_direction='down'");?>
<?php echo html::select('team[]', $users, '', "class='form-control picker-select' multiple data-dropDirection='bottom'");?>
<?php echo $this->fetch('my', 'buildContactLists');?>
</div>
</td>
@@ -48,7 +48,7 @@
</tr>
<tr id="whitelistBox" class="<?php echo $type == 'private' ? '' : 'hidden';?>">
<th><?php echo $lang->whitelist;?></th>
<td><?php echo html::select('whitelist[]', $users, '', 'class="form-control chosen" multiple');?></td>
<td><?php echo html::select('whitelist[]', $users, '', 'class="form-control picker-select" multiple');?></td>
</tr>
<tr>
<td colspan='3' class='text-center form-actions'>
+2 -2
View File
@@ -37,7 +37,7 @@
<th><?php echo $lang->kanban->team;?></th>
<td colspan='2'>
<div class="input-group">
<?php echo html::select('team[]', $users, $kanban->team, "class='form-control chosen' multiple data-drop_direction='down'");?>
<?php echo html::select('team[]', $users, $kanban->team, "class='form-control picker-select' multiple data-dropDirection='bottom'");?>
</div>
</td>
</tr>
@@ -85,7 +85,7 @@
<?php if($type == 'private'):?>
<tr id="whitelistBox">
<th><?php echo $lang->whitelist;?></th>
<td><?php echo html::select('whitelist[]', $whitelist, $kanban->whitelist, 'class="form-control chosen" multiple');?></td>
<td><?php echo html::select('whitelist[]', $whitelist, $kanban->whitelist, 'class="form-control picker-select" multiple');?></td>
</tr>
<?php endif;?>
<tr>

Some files were not shown because too many files have changed in this diff Show More