Merge branch 'sprint/205'

This commit is contained in:
wangyidong
2022-06-22 17:21:32 +08:00
66 changed files with 591 additions and 175 deletions
@@ -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>
@@ -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);?>
@@ -41,10 +42,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
*
+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 = '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 = '';
+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';
+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');
+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
@@ -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}
@@ -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';?>'>
+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>
+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;
+1 -1
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>
+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;}
-4
View File
@@ -5,7 +5,3 @@ $('.ajaxCollect').click(function()
window.location.reload();
}
})
$(function()
{
$('#pageActions .btn-toolbar').prepend("<a class='btn btn-link querybox-toggle querybox-opened' id='bysearchTab'><i class='icon icon-search muted'></i>" + docLang.search + "</a>");
});
-2
View File
@@ -19,8 +19,6 @@ $(function()
$('.menu-actions > a').blur(function() {$(this).css('background', 'none');})
$('#pageActions .btn-toolbar').prepend("<a class='btn btn-link querybox-toggle' id='bysearchTab'><i class='icon icon-search muted'></i>" + docLang.search + "</a>");
/* Make modules tree sortable. */
$('#modules').sortable(
{
+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 = '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. */
+1 -4
View File
@@ -2159,10 +2159,7 @@ class docModel extends model
$html .= html::submitButton("<i class='icon icon-search'></i>", '', "btn btn-icon btn-link input-control-icon-right");
$html .= '</form></div>';
}
else
{
$html = '';
}
$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'>";
+4 -3
View File
@@ -65,9 +65,10 @@
?>
</td>
<?php else:?>
<?php if(common::hasPriv('doc', 'view')):?>
<td class="c-id"><?php echo html::a($this->createLink('doc', 'view', "docID=$doc->id&version=0", '', true), $doc->id, '', "title='{$doc->id}' class='iframe' data-width='90%'");?></td>
<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 if(common::hasPriv('doc', 'objectLibs')):?>
<?php $objectID = $doc->{$type};?>
<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>
+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';?>
+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. */
+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>
+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 = '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.";
+1 -1
View File
@@ -90,7 +90,7 @@ $lang->kanban->mine = 'Mine';
/* 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
@@ -90,7 +90,7 @@ $lang->kanban->mine = 'Mine';
/* 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';
+6
View File
@@ -114,5 +114,11 @@ $lang->mail->ztCloudNotice = <<<EOD
EOD;
$lang->mail->forgetPassword = <<<EOT
<p>Hello:</p>
<p>You are applying to reset your ZenTao password. The link is valid for three minutes. If it expires, please apply again.</p>
<p><a href="%s" target="_blank">Click here to jump</a></p>
EOT;
$lang->mail->placeholder = new stdclass();
$lang->mail->placeholder->password = 'Manche Mail Server benötigen einen AUTH CODE. Bitte prüfen Sie das bei Ihrem Mailprovider.';
+6
View File
@@ -114,5 +114,11 @@ $lang->mail->ztCloudNotice = <<<EOD
EOD;
$lang->mail->forgetPassword = <<<EOT
<p>Hello:</p>
<p>You are applying to reset your ZenTao password. The link is valid for three minutes. If it expires, please apply again.</p>
<p><a href="%s" target="_blank">Click here to jump</a></p>
EOT;
$lang->mail->placeholder = new stdclass();
$lang->mail->placeholder->password = "Certains serveurs de mails demandent un code d'autorisation, consultez le service d'Emails de votre provider.";
+1 -1
View File
@@ -185,7 +185,7 @@ EOD;
$lang->mr->noChanges = "Currently there are no changes in this merge request's source branch. Please push new commits or use a different branch.";
$lang->mr->linkTask = "Link task";
$lang->mr->linkTask = 'Link Tasks';
$lang->mr->unlinkTask = "Remove task";
$lang->mr->linkedTasks = 'Task';
$lang->mr->unlinkedTasks = 'Task not linked';
+1 -1
View File
@@ -185,7 +185,7 @@ EOD;
$lang->mr->noChanges = "Currently there are no changes in this merge request's source branch. Please push new commits or use a different branch.";
$lang->mr->linkTask = "Link task";
$lang->mr->linkTask = 'Link Tasks';
$lang->mr->unlinkTask = "Remove task";
$lang->mr->linkedTasks = 'Task';
$lang->mr->unlinkedTasks = 'Task not linked';
+2
View File
@@ -2,3 +2,5 @@
.datepicker-wrapper .form-control {max-width: 110px; line-height: 25px; height: 26px !important;}
.btn-group button.dropdown-toggle.btn-primary {padding: 6px;}
.btn-group a.btn-primary {border-right: 1px solid rgba(255,255,255,0.2);}
.btn-toolbar .space {min-height: 1px; margin: 0 -3px 0 10px;}
.iconCenter {top: -2px !important;}
+1 -1
View File
@@ -43,7 +43,7 @@
<th class='c-user'><?php echo $lang->team->role;?></th>
<th class='c-date'><?php echo $lang->team->join;?></th>
<th class='c-hours'><?php echo $lang->my->hours;?></th>
<th class='c-user'><?php echo $lang->execution->assignedToMe;?></th>
<th class='c-user'><?php echo $lang->execution->myTask;?></th>
<th class='c-progress'><?php echo $lang->execution->progress;?></th>
</tr>
</thead>
+2 -2
View File
@@ -172,9 +172,9 @@
$actionLink = $this->createLink('todo', 'import2Today');
echo "<div class='input-control has-icon-right space'>";
echo '<input type="text" name="date" id="importDate" value="' . date('Y-m-d') . '" class="form-control form-date">';
echo '<label for="importDate" class="input-control-icon-right"><i class="icon icon-delay"></i></label>';
echo '<label for="importDate" class="input-control-icon-right iconCenter"><i class="icon icon-delay"></i></label>';
echo '</div>';
echo html::commonButton($lang->todo->import, "onclick=\"setFormAction('$actionLink')\"");
echo html::commonButton($lang->todo->changeDate, "onclick=\"setFormAction('$actionLink')\"");
}
?>
</div>
+1 -1
View File
@@ -95,7 +95,7 @@ $lang->productplan->childrenAB = "C";
$lang->productplan->order = "Rank";
$lang->productplan->deleted = "Deleted";
$lang->productplan->mailto = "Mailto";
$lang->productplan->status = "Plan Status";
$lang->productplan->status = 'Status';
$lang->productplan->planStatus = "Status";
$lang->productplan->statusList['wait'] = 'Wait';
+1 -1
View File
@@ -95,7 +95,7 @@ $lang->productplan->childrenAB = "C";
$lang->productplan->order = "Order";
$lang->productplan->deleted = "Deleted";
$lang->productplan->mailto = "Mailto";
$lang->productplan->status = "Plan Status";
$lang->productplan->status = 'Status';
$lang->productplan->planStatus = "Status";
$lang->productplan->statusList['wait'] = 'Wait';
+1
View File
@@ -216,6 +216,7 @@ class productplanModel extends model
->beginIF($branch !== '')->andWhere('branch')->eq($branch)->fi()
->andWhere('parent')->le(0)
->andWhere('deleted')->eq(0)
->orderBy('id_desc')
->fetchPairs();
if($exclude) unset($planPairs[$exclude]);
+1 -1
View File
@@ -39,7 +39,7 @@ $lang->program->auth = 'Auth';
$lang->program->path = 'Path';
$lang->program->grade = 'Grade';
$lang->program->realBegan = 'RealBegan';
$lang->program->realEnd = 'RealEnd';
$lang->program->realEnd = 'Actual End';
$lang->program->version = 'Version';
$lang->program->parentVersion = 'ParentVersion';
$lang->program->planDuration = 'PlanDuration';
+1 -1
View File
@@ -39,7 +39,7 @@ $lang->program->auth = 'Auth';
$lang->program->path = 'Path';
$lang->program->grade = 'Grade';
$lang->program->realBegan = 'RealBegan';
$lang->program->realEnd = 'RealEnd';
$lang->program->realEnd = 'Actual End';
$lang->program->version = 'Version';
$lang->program->parentVersion = 'ParentVersion';
$lang->program->planDuration = 'PlanDuration';
+2 -2
View File
@@ -47,7 +47,7 @@ class repo extends control
{
$tab = $this->app->tab;
$this->repos = $this->repo->getRepoPairs($tab, $objectID);
$this->reposGroup = $this->repo->getRepoGroup($tab, $objectID);
$this->repoGroup = $this->repo->getRepoGroup($tab, $objectID);
if($tab == 'project')
{
@@ -480,7 +480,7 @@ class repo extends control
$this->view->title = $this->lang->repo->common;
$this->view->repo = $repo;
$this->view->reposGroup = $this->reposGroup;
$this->view->repoGroup = $this->repoGroup;
$this->view->repos = $this->repos;
$this->view->revisions = $revisions;
$this->view->revision = $revision;
+1 -1
View File
@@ -26,7 +26,7 @@
<div class="table-col col-left">
<div class="list-group" id="repoList">
<ul class='tree tree-angles' data-ride='tree'>
<?php foreach($reposGroup as $groupName => $group):?>
<?php foreach($repoGroup as $groupName => $group):?>
<?php if(empty($group)) continue;?>
<li data-idx='<?php echo $groupName;?>' data-id='<?php echo $groupName;?>' class='has-list open in' style='cursor: pointer;'><i class='list-toggle icon'></i>
<div class='hide-in-search'><a class='text-muted'><?php echo $groupName;?></a><span class='label label-outline' style='margin-left:5px;'><?php echo $lang->repo->type;?></span></div>
+1 -1
View File
@@ -122,7 +122,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>
+1
View File
@@ -6,3 +6,4 @@
#mainContent .detail .form-actions {padding-bottom: 20px;}
#mainContent .main-header h2 .input-group {margin-top: 1px;}
.c-name {max-width: 100px;}
#profile {vertical-align: unset;}
+1
View File
@@ -1 +1,2 @@
.c-name {max-width: 100px;}
#profile {vertical-align: unset;}
+1
View File
@@ -8,3 +8,4 @@
#cases .pager {margin: 0px;}
#cases .pager li .btn.dropdown-toggle {border: 0px; padding-top: 3px;}
#profile {vertical-align: unset;}
+1 -1
View File
@@ -78,7 +78,7 @@
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->testreport->profile?></th>
<th id='profile'><?php echo $lang->testreport->profile?></th>
<td colspan='2'>
<?php
echo '<div>' . $storySummary . '</div>';
+1 -1
View File
@@ -66,7 +66,7 @@
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->testreport->profile?></th>
<th id='profile'><?php echo $lang->testreport->profile?></th>
<td colspan='2'>
<?php
echo '<p>' . $storySummary . '</p>';
+1 -1
View File
@@ -73,7 +73,7 @@
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->testreport->profile?></th>
<th id='profile'><?php echo $lang->testreport->profile?></th>
<td colspan='2'>
<?php
echo '<p>' . $storySummary . '</p>';
+1
View File
@@ -36,6 +36,7 @@ $lang->todo->cycleConfig = "Recurrence";
$lang->todo->project = "Project";
$lang->todo->product = "Product";
$lang->todo->execution = $lang->executionCommon;
$lang->todo->changeDate = "Change Date";
$lang->todo->reasonList['story'] = "Convert to Story";
$lang->todo->reasonList['task'] = "Convert to Task";
+1
View File
@@ -36,6 +36,7 @@ $lang->todo->cycleConfig = "周期设置";
$lang->todo->project = "所属项目";
$lang->todo->product = "所属产品";
$lang->todo->execution = "所属{$lang->execution->common}";
$lang->todo->changeDate = "修改日期";
$lang->todo->reasonList['story'] = "{$lang->SRCommon}";
$lang->todo->reasonList['task'] = "转任务";
+3
View File
@@ -184,6 +184,9 @@ $config->upgrade->liteVersion['lite1_0'] = '16_5_beta1';
$config->upgrade->liteVersion['lite1_1'] = '16_5';
$config->upgrade->liteVersion['lite1_2'] = '17_1';
$config->upgrade->liteVersion['liteVIP1_1'] = 'biz6_5';
$config->upgrade->liteVersion['liteVIP1_2'] = 'biz7_1';
$config->upgrade->lowerTables = array();
$config->upgrade->lowerTables[$config->db->prefix . 'caseStep'] = $config->db->prefix . 'casestep';
$config->upgrade->lowerTables[$config->db->prefix . 'docLib'] = $config->db->prefix . 'doclib';
+2
View File
@@ -161,9 +161,11 @@ $lang->upgrade->fromVersions['17_0_beta2'] = '17.0.beta2';
$lang->upgrade->fromVersions['17_0'] = '17.0';
$lang->upgrade->fromVersions['17_1'] = '17.1';
global $config;
/* Lite. */
$lang->upgrade->fromVersions['lite1_0'] = 'Lite1.0';
$lang->upgrade->fromVersions['lite1_1'] = 'Lite1.1';
if($config->edition != 'open') $lang->upgrade->fromVersions['liteVIP1_1'] = 'LiteVIP1.1';
/* Pro. */
$lang->upgrade->fromVersions['pro1_0'] = 'Pro1.0';
+4 -1
View File
@@ -11,10 +11,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-name a {color: #838A9D;}
+17
View File
@@ -18,6 +18,7 @@ $lang->user->dept = 'Abteilung';
$lang->user->account = 'Konto';
$lang->user->password = 'Passwort';
$lang->user->password2 = 'Passwort wiederholen';
$lang->user->password2AB = 'Repeat Password';
$lang->user->role = 'Rolle';
$lang->user->group = 'Gruppe';
$lang->user->realname = 'Name';
@@ -74,6 +75,9 @@ $lang->user->projects = 'Project';
$lang->user->sprints = $lang->execution->common;
$lang->user->identity = 'Identity';
$lang->user->switchVision = 'Switch to %s';
$lang->user->submit = 'Submit';
$lang->user->resetPWD = 'Reset Password';
$lang->user->resetTitle = 'Admin reset the password';
$lang->user->legendBasic = 'Basic Information';
$lang->user->legendContribution = 'Contribution';
@@ -111,6 +115,8 @@ $lang->user->applyTemplate = 'Templates';
$lang->user->confirmDeleteTemplate = 'Do you want to delete this template?';
$lang->user->setPublicTemplate = 'Set as Public Template';
$lang->user->tplContentNotEmpty = 'Vorlageninhalt darf nicht leer sein!';
$lang->user->sendEmailSuccess = 'An email has been sent to your mailbox. Please check it.';
$lang->user->linkExpired = 'The link has expired, please apply again.';
$lang->user->profile = 'Profil';
$lang->user->project = $lang->executionCommon;
@@ -147,6 +153,7 @@ $lang->user->loginLocked = "Bitte kontaktieren Sie den Administrator um Ihr Kon
$lang->user->weakPassword = "Ihr Passwort entspricht nicht den Anforderungen.";
$lang->user->errorWeak = "Passwords cannot use [%s] these commonly used weak passwords.";
$lang->user->errorCaptcha = "Captcha Error";
$lang->user->loginExpired = 'System login has expired, please log in again :)';
$lang->user->roleList[''] = '';
$lang->user->roleList['dev'] = 'Developer';
@@ -212,6 +219,7 @@ $lang->user->placeholder->verify = 'Bitte geben Sie Ihr Login Passwort ein.';
$lang->user->placeholder->loginPassword = 'Enter your password';
$lang->user->placeholder->loginAccount = 'Enter your account';
$lang->user->placeholder->loginUrl = 'Enter your ZenTao address';
$lang->user->placeholder->email = 'Enter your email';
$lang->user->placeholder->passwordStrength[1] = 'Buchstaben und Ziffern. Mindestens 6 Zeichen';
$lang->user->placeholder->passwordStrength[2] = 'Buchstaben, Ziffern und Sonderzeichen. Mindestens 10 Zeichen';
@@ -233,6 +241,13 @@ $lang->user->error->verifyPassword = "Verifikation fehlgeschlagen. Bitte geben
$lang->user->error->originalPassword = "Altes Passwort ist falsch.";
$lang->user->error->companyEmpty = "Company name must be not empty.";
$lang->user->error->noAccess = "This user is not from your department. You have no access to this user information.";
$lang->user->error->accountEmpty = 'Account must be not empty !';
$lang->user->error->emailEmpty = 'Email must be not empty !';
$lang->user->error->noUser = 'Invalid account.';
$lang->user->error->noEmail = 'The user does not register email. Please get in touch with the administrator to reset the password.';
$lang->user->error->errorEmail = 'The account does not match the email. Please enter a new one.';
$lang->user->error->emailSetting = 'No email is configured in the system. Contact the admin to reset the email.';
$lang->user->error->sendMailFail = 'Message sending failed, please try again!';
$lang->user->contactFieldList['phone'] = $lang->user->phone;
$lang->user->contactFieldList['mobile'] = $lang->user->mobile;
@@ -293,3 +308,5 @@ $lang->user->mkdirLinux = <<<EOT
<div style='margin-bottom:8px;'>Commond: <strong style='color:#ed980f'>chmod 777 -R %s</strong>.</div>
</td></tr></table></body></html>
EOT;
$lang->user->jumping = "This page will redirect to the previous page in <span id='time'>3</span> seconds. <a href='%s' class='btn btn-primary btn-xs'>Redirect Now</a>";
+17
View File
@@ -18,6 +18,7 @@ $lang->user->dept = 'Compartiment';
$lang->user->account = 'Compte';
$lang->user->password = 'Mot de Passe';
$lang->user->password2 = 'Répétez Password';
$lang->user->password2AB = 'Repeat Password';
$lang->user->role = 'Rôle';
$lang->user->group = 'Groupe de Privilèges';
$lang->user->realname = 'Nom';
@@ -74,6 +75,9 @@ $lang->user->projects = 'Project';
$lang->user->sprints = $lang->execution->common;
$lang->user->identity = 'Identity';
$lang->user->switchVision = 'Switch to %s';
$lang->user->submit = 'Submit';
$lang->user->resetPWD = 'Reset Password';
$lang->user->resetTitle = 'Admin reset the password';
$lang->user->legendBasic = 'Informations de Base';
$lang->user->legendContribution = 'Contribution';
@@ -111,6 +115,8 @@ $lang->user->applyTemplate = 'Modèles';
$lang->user->confirmDeleteTemplate = 'Voulez-vous vraiment supprimer ce modèle ?';
$lang->user->setPublicTemplate = 'Définir comme Modèle Public';
$lang->user->tplContentNotEmpty = 'Le contenu du modèle ne peut pas être vide !';
$lang->user->sendEmailSuccess = 'An email has been sent to your mailbox. Please check it.';
$lang->user->linkExpired = 'The link has expired, please apply again.';
$lang->user->profile = 'Profil';
$lang->user->project = $lang->executionCommon . 's';
@@ -147,6 +153,7 @@ $lang->user->loginLocked = "Votre compte est bloqué. Contactez l'administrateu
$lang->user->weakPassword = "Votre mot de passe ne respecte pas les règles de sécurité.";
$lang->user->errorWeak = "Les mots de passe ne peuvent pas utiliser ces [%s] mots de passe faibles couramment utilisés.";
$lang->user->errorCaptcha = "Captcha Error";
$lang->user->loginExpired = 'System login has expired, please log in again :)';
$lang->user->roleList[''] = '';
$lang->user->roleList['dev'] = 'Développeur';
@@ -212,6 +219,7 @@ $lang->user->placeholder->verify = 'Entrez votre Mot de passe.';
$lang->user->placeholder->loginPassword = 'Enter your password';
$lang->user->placeholder->loginAccount = 'Enter your account';
$lang->user->placeholder->loginUrl = 'Enter your ZenTao address';
$lang->user->placeholder->email = 'Enter your email';
$lang->user->placeholder->passwordStrength[1] = '>= 6 lettres et chiffres';
$lang->user->placeholder->passwordStrength[2] = '>= 10 lettres, chiffres et caractères spéciaux';
@@ -233,6 +241,13 @@ $lang->user->error->verifyPassword = "Vérification en échec. Entrez votre Mo
$lang->user->error->originalPassword = "Ancien Mot de Passe incorrect.";
$lang->user->error->companyEmpty = "Company name must be not empty.";
$lang->user->error->noAccess = "This user is not from your department. You have no access to this user information.";
$lang->user->error->accountEmpty = 'Account must be not empty !';
$lang->user->error->emailEmpty = 'Email must be not empty !';
$lang->user->error->noUser = 'Invalid account.';
$lang->user->error->noEmail = 'The user does not register email. Please get in touch with the administrator to reset the password.';
$lang->user->error->errorEmail = 'The account does not match the email. Please enter a new one.';
$lang->user->error->emailSetting = 'No email is configured in the system. Contact the admin to reset the email.';
$lang->user->error->sendMailFail = 'Message sending failed, please try again!';
$lang->user->contactFieldList['phone'] = $lang->user->phone;
$lang->user->contactFieldList['mobile'] = $lang->user->mobile;
@@ -293,3 +308,5 @@ $lang->user->mkdirLinux = <<<EOT
<div style='margin-bottom:8px;'>Commond: <strong style='color:#ed980f'>chmod 777 -R %s</strong>.</div>
</td></tr></table></body></html>
EOT;
$lang->user->jumping = "This page will redirect to the previous page in <span id='time'>3</span> seconds. <a href='%s' class='btn btn-primary btn-xs'>Redirect Now</a>";
+2 -2
View File
@@ -53,9 +53,9 @@
<span class="timeline-text">
<?php echo zget($users, $action->actor);?>
<span class='label-action'><?php echo ' ' . $action->actionLabel;?></span>
<span class="text-muted"><?php echo $action->objectLabel;?></span>
<span><?php echo $action->objectLabel;?></span>
<span class="label label-id"><?php echo $action->objectID;?></span>
<?php if($action->objectName) echo html::a($action->objectLink, $action->objectName);?>
<?php if($action->objectName) echo "<sapn class='label-name'>" . html::a($action->objectLink, $action->objectName) . '</span>';?>
</span>
</div>
</li>
+26 -8
View File
@@ -291,12 +291,7 @@ class webhook extends control
$response = $dingapi->getDeptTree();
}
if($webhook->type == 'feishuuser')
{
$this->app->loadClass('feishuapi', true);
$feishuApi = new feishuapi($webhook->secret->appId, $webhook->secret->appSecret);
$response = $feishuApi->getDeptTree();
}
if($webhook->type == 'feishuuser') $response = array('result' => 'success', 'data' => array());
if($response['result'] == 'fail')
{
@@ -315,11 +310,34 @@ class webhook extends control
$this->view->title = $this->lang->webhook->chooseDept;
$this->view->position[] = $this->lang->webhook->chooseDept;
$this->view->deptTree = $response['data'];
$this->view->webhookID = $id;
$this->view->webhookType = $webhook->type;
$this->view->deptTree = $response['data'];
$this->view->webhookID = $id;
$this->display();
}
public function ajaxGetFeishuDeptList($webhookID)
{
$webhook = $this->webhook->getById($webhookID);
$webhook->secret = json_decode($webhook->secret);
if($_POST)
{
$this->app->loadClass('feishuapi', true);
$feishuApi = new feishuapi($webhook->secret->appId, $webhook->secret->appSecret);
$departmentID = $_POST['departmentID'] ? $_POST['departmentID'] : '';
$depts = $feishuApi->getChildDeptTree($departmentID);
echo json_encode($depts, true);
}
else
{
$this->app->loadClass('feishuapi', true);
$feishuApi = new feishuapi($webhook->secret->appId, $webhook->secret->appSecret);
$depts = $feishuApi->getDeptTree();
echo json_encode($depts, true);
}
}
/**
* Send data by async.
*
+3
View File
@@ -0,0 +1,3 @@
#notice {margin-bottom: 0px;}
#deptList {padding: 15px 0px;}
#loadPrompt {border: none;}
+6 -3
View File
@@ -87,6 +87,8 @@ $lang->webhook->paramsList['comment'] = 'Comment';
$lang->webhook->paramsList['text'] = 'Action Description';
$lang->webhook->confirmDelete = 'Do you want to delete this hook?';
$lang->webhook->friendlyTips = 'Friendly reminder: Click on a department to expand the sub-departments under the department.';
$lang->webhook->loadPrompt = 'There is a lot of data and the loading is slow, please wait.';
$lang->webhook->trimWords = '';
@@ -104,6 +106,7 @@ $lang->webhook->note->typeList['dingding'] = 'Add a customized bot in dingding
$lang->webhook->note->typeList['weixin'] = 'Add a customized bot in WeChat and get the webhook url.';
$lang->webhook->note->typeList['default'] = 'Get a webhook url from others';
$lang->webhook->error = new stdclass();
$lang->webhook->error->curl = 'Load php-curl in php.ini.';
$lang->webhook->error->noDept = 'There is no department selected. Please choose department first.';
$lang->webhook->error = new stdclass();
$lang->webhook->error->curl = 'Load php-curl in php.ini.';
$lang->webhook->error->noDept = 'There is no department selected. Please choose department first.';
$lang->webhook->error->requestError = 'Request error!';
+6 -3
View File
@@ -87,6 +87,8 @@ $lang->webhook->paramsList['comment'] = '备注';
$lang->webhook->paramsList['text'] = '操作内容';
$lang->webhook->confirmDelete = '您确认要删除该webhook吗?';
$lang->webhook->friendlyTips = '友情提示:点击部门,可以展开该部门下的子部门。';
$lang->webhook->loadPrompt = '数据较多,加载缓慢,请稍等。';
$lang->webhook->trimWords = '了';
@@ -104,6 +106,7 @@ $lang->webhook->note->typeList['dingding'] = '请在钉钉中添加一个自定
$lang->webhook->note->typeList['weixin'] = '请在企业微信中添加一个自定义机器人,并将其webhook填写到此处。';
$lang->webhook->note->typeList['default'] = '从第三方系统获取webhook并填写到此处。';
$lang->webhook->error = new stdclass();
$lang->webhook->error->curl = '需要加载php-curl扩展。';
$lang->webhook->error->noDept = '没有选择部门,请先选择同步部门。';
$lang->webhook->error = new stdclass();
$lang->webhook->error->curl = '需要加载php-curl扩展。';
$lang->webhook->error->noDept = '没有选择部门,请先选择同步部门。';
$lang->webhook->error->requestError = '请求错误!';
+142 -14
View File
@@ -17,6 +17,12 @@
<div class='main-header'>
<h2><?php echo $lang->webhook->chooseDept?></h2>
</div>
<?php if($webhookType == 'feishuuser'):?>
<div id="notice" class="alert alert-info">
<div class="content"><i class="icon-exclamation-sign"></i> <?php echo $lang->webhook->friendlyTips;?></div>
</div>
<div id='loadPrompt' class="table-empty-tip"><p><span class="text-muted"><?php echo $lang->webhook->loadPrompt;?></span></p></div>
<?php endif;?>
<ul id='deptList' class="ztree"></ul>
<div class='actions'>
<?php echo html::commonButton($lang->save, '', 'btn btn-primary save');?>
@@ -25,27 +31,149 @@
</div>
</div>
<?php js::set('deptTree', $deptTree);?>
<?php js::set('webhookType', $webhookType);?>
<?php js::set('webhookID', $webhookID);?>
<?php js::set('requestError', $lang->webhook->error->requestError);?>
<?php js::set('feishuUrl', $this->createLink('webhook', 'ajaxGetFeishuDeptList', array('webhookID' => $webhookID)));?>
<script>
$(function()
{
var ztreeSettings =
if(webhookType == 'feishuuser')
{
view:
var setting =
{
showIcon: false
},
check:
view:
{
showIcon: false,
dblClickExpand: false,
},
check:
{
enable: true,
chkStyle: "checkbox",
chkboxType: {"Y" : "s", "N" : "s"}
},
data:
{
simpleData: {enable: true}
},
async:
{
enable: true,
url: feishuUrl,
autoParam:["id", "name=name"],
type: 'get',
dataFilter: filter
},
callback:
{
beforeClick: ztreeBeforeClick,
beforeAsync: ztreeBeforeAsync,
onClick: ztreeOnAsyncSuccess,
onAsyncSuccess: zTreeOnAsyncSuccess
}
};
function filter(treeId, parentNode, childNodes)
{
enable: true,
chkStyle: "checkbox",
chkboxType: {"Y":"s", "N":"s"}
},
data:
{
simpleData: {enable: true}
if(!childNodes) return null;
for(var i = 0, l = childNodes.length; i < l; i++)
{
childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
}
return childNodes;
}
};
ztreeObj = $.fn.zTree.init($("#deptList"), ztreeSettings, deptTree);
function ztreeBeforeClick(treeId, treeNode)
{
if(treeNode.isParent)
{
return false;
}
else
{
return true;
}
}
function ztreeBeforeAsync(treeId, treeNode)
{
return true;
}
function ztreeOnAsyncSuccess(event, treeId, treeNode)
{
if(treeNode == undefined)
{
departmentID = "0";
}
else
{
departmentID = treeNode.id;
}
var url = createLink('webhook', 'ajaxGetFeishuDeptList', 'webhookID=' + webhookID);
$.ajax(
{
type: "post",
url: url,
data: {departmentID: departmentID},
dataType: "json",
async: true,
success: function(jsonData)
{
if(jsonData != null)
{
var data = jsonData;
if(data != null && data.length != 0)
{
if(treeNode == undefined)
{
ztreeObj.addNodes(null, data, true);
}
else
{
ztreeObj.addNodes(treeNode, data, true);
}
}
ztreeObj.expandNode(treeNode, true, false, false);
}
},
error: function()
{
alert(requestError);
}
});
}
function zTreeOnAsyncSuccess()
{
$("#loadPrompt").remove();
}
var ztreeObj = $.fn.zTree.init($("#deptList"), setting);
}
else
{
var ztreeSettings =
{
view:
{
showIcon: false
},
check:
{
enable: true,
chkStyle: "checkbox",
chkboxType: {"Y":"s", "N":"s"}
},
data:
{
simpleData: {enable: true}
}
};
ztreeObj = $.fn.zTree.init($("#deptList"), ztreeSettings, deptTree);
}
$('.actions .save').click(function()
{