This commit is contained in:
reneeteng
2019-05-05 15:36:19 +08:00
58 changed files with 521 additions and 302 deletions
+54 -15
View File
@@ -60,6 +60,12 @@ zentaoxx:
cp -r xuan/xxb/module/chat zentaoxx/module/
cp -r xuan/xxb/module/client zentaoxx/module/
cp -r xuan/xxb/module/common/ext/model/hook zentaoxx/module/common/ext/model/
mkdir -p zentaoxx/module/common/view
cp -r xuan/xxb/module/common/view/header.modal.html.php zentaoxx/module/common/view
cp -r xuan/xxb/module/common/view/marked.html.php zentaoxx/module/common/view
cp -r xuan/xxb/module/common/view/footer.modal.html.php zentaoxx/module/common/view
mkdir -p zentaoxx/www/js/
cp -r xuan/xxb/www/js/markedjs zentaoxx/www/js/
mkdir zentaoxx/module/action
cp -r xuan/xxb/module/action/ext zentaoxx/module/action
cp -r xuanxuan/config/* zentaoxx/config/
@@ -79,10 +85,15 @@ zentaoxx:
sed -i "s/'site', //g" zentaoxx/module/chat/config.php
sed -i "s/'reload'/inlink('browse')/g" zentaoxx/module/client/control.php
sed -i 's/tree/dept/' zentaoxx/module/chat/model.php
sed -i 's/im_/zt_im_/' zentaoxx/db/*.sql
sed -i 's/xxb_user/zt_user/' zentaoxx/db/*.sql
sed -i 's/xxb_file/zt_file/' zentaoxx/db/*.sql
sed -i 's/im_/zt_im_/g' zentaoxx/db/*.sql
sed -i 's/xxb_user/zt_user/g' zentaoxx/db/*.sql
sed -i 's/xxb_file/zt_file/g' zentaoxx/db/*.sql
sed -i '/xxb_entry/d' zentaoxx/db/*.sql
sed -i "s/marked\.html\.php';?>/marked\.html\.php';?>\n<div id='mainMenu' class='clearfix'><div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('xuanxuan');?><\/div><\/div>/g" zentaoxx/module/client/view/checkupgrade.html.php
sed -i '/var serverVersions/d' zentaoxx/module/client/js/checkupgrade.js
sed -i '/var currentVersion/d' zentaoxx/module/client/js/checkupgrade.js
sed -i 's/v\.//g' zentaoxx/module/client/js/checkupgrade.js
sed -i 's/xxb_/zt_/g' zentaoxx/db/*.sql
mkdir zentaoxx/tools; cp tools/cn2tw.php zentaoxx/tools; cd zentaoxx/tools; php cn2tw.php
rm -rf zentaoxx/tools
zip -rqm -9 zentaoxx.$(VERSION).zip zentaoxx/*
@@ -109,18 +120,6 @@ pms:
make package
zip -rq -9 ZenTaoPMS.$(VERSION).zip zentaopms
rm -fr zentaopms zentaoxx zentaoxx.*.zip
en:
make common
cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
make package
zip -r -9 ZenTaoPMS.$(VERSION).int.zip zentaopms
rm -fr zentaopms
echo $(VERSION).int > VERSION
make deb
make rpm
echo $(VERSION) > VERSION
deb:
mkdir buildroot
cp -r build/debian/DEBIAN buildroot
@@ -148,6 +147,46 @@ rpm:
rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
cp ~/rpmbuild/RPMS/noarch/zentaopms-${VERSION}-1.noarch.rpm ./
rm -rf ~/rpmbuild
en:
make common
cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
make package
mv zentaopms zentaoalm
zip -r -9 ZenTaoALM.$(VERSION).int.zip zentaoalm
rm -fr zentaoalm
echo $(VERSION).int > VERSION
make endeb
make enrpm
echo $(VERSION) > VERSION
endeb:
mkdir buildroot
cp -r build/debian/DEBIAN buildroot
sed -i '/^Version/cVersion: ${VERSION}' buildroot/DEBIAN/control
mkdir buildroot/opt
mkdir buildroot/etc/apache2/sites-enabled/ -p
cp build/debian/zentaopms.conf buildroot/etc/apache2/sites-enabled/
cp ZenTaoALM.${VERSION}.zip buildroot/opt
cd buildroot/opt; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm zentao; rm ZenTaoALM.${VERSION}.zip
sed -i 's/index.php/\/zentao\/index.php/' buildroot/opt/zentao/www/.htaccess
sudo dpkg -b buildroot/ ZenTaoALM_${VERSION}_1_all.deb
rm -rf buildroot
enrpm:
mkdir ~/rpmbuild/SPECS -p
cp build/rpm/zentaopms.spec ~/rpmbuild/SPECS
sed -i '/^Version/cVersion:${VERSION}' ~/rpmbuild/SPECS/zentaopms.spec
mkdir ~/rpmbuild/SOURCES
cp ZenTaoALM.${VERSION}.zip ~/rpmbuild/SOURCES
mkdir ~/rpmbuild/SOURCES/etc/httpd/conf.d/ -p
cp build/debian/zentaopms.conf ~/rpmbuild/SOURCES/etc/httpd/conf.d/zentaoalm.conf
mkdir ~/rpmbuild/SOURCES/opt/ -p
cd ~/rpmbuild/SOURCES; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm opt/zentao;
sed -i 's/index.php/\/zentao\/index.php/' ~/rpmbuild/SOURCES/opt/zentao/www/.htaccess
cd ~/rpmbuild/SOURCES; tar -czvf zentaoalm-${VERSION}.tar.gz etc opt; rm -rf ZenTaoALM.${VERSION}.zip etc opt;
rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
cp ~/rpmbuild/RPMS/noarch/zentaoalm-${VERSION}-1.noarch.rpm ./
rm -rf ~/rpmbuild
patchphpdoc:
sudo cp misc/doc/phpdoc/*.tpl /usr/share/php/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/phphtmllib/templates/
phpdoc:
+5
View File
@@ -0,0 +1,5 @@
ALTER TABLE `zt_entry` ADD `calledTime` int(10) unsigned NOT NULL DEFAULT '0' AFTER `createdDate`;
ALTER TABLE `zt_story` CHANGE `toBug` `toBug` mediumint(8) unsigned NOT NULL AFTER `closedReason`;
UPDATE `zt_story` SET `stage` = 'closed' WHERE `status` = 'closed';
ALTER TABLE `zt_story` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `stage`;
ALTER TABLE `zt_storystage` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL;
+3 -1
View File
@@ -579,7 +579,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` (
`closedBy` varchar(30) NOT NULL default '',
`closedDate` datetime NOT NULL,
`closedReason` varchar(30) NOT NULL,
`toBug` mediumint(9) NOT NULL,
`toBug` mediumint(8) unsigned NOT NULL,
`childStories` varchar(255) NOT NULL,
`linkStories` varchar(255) NOT NULL,
`duplicateStory` mediumint(8) unsigned NOT NULL,
@@ -604,6 +604,7 @@ CREATE TABLE IF NOT EXISTS `zt_storystage` (
`story` mediumint(8) unsigned NOT NULL,
`branch` mediumint(8) unsigned NOT NULL,
`stage` varchar(50) NOT NULL,
UNIQUE KEY `story_branch` (`story`,`branch`),
KEY `story` (`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_suitecase`;
@@ -899,6 +900,7 @@ CREATE TABLE IF NOT EXISTS `zt_entry` (
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`calledTime` int(10) unsigned NOT NULL DEFAULT '0',
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0', '1') NOT NULL DEFAULT '0',
+6
View File
@@ -129,6 +129,12 @@ $lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>';
/* 子任务修改父任务的历史操作记录 */
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 关联子任务 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrentask = '$date, 由 <strong>$actor</strong> 移除子任务 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkparenttask = '$date, 由 <strong>$actor</strong> 关联父任务 <strong>$extra</strong>。' . "\n";
/* 关联用例和移除用例时的历史操作记录。*/
$lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 关联相关用例 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, 由 <strong>$actor</strong> 移除相关用例 <strong>$extra</strong>。' . "\n";
+13 -5
View File
@@ -36,7 +36,7 @@ class actionModel extends model
$actor = $actor ? $actor : $this->app->user->account;
$actionType = strtolower($actionType);
if($actor == 'guest' and $actionType == 'logout') return false;
$action = new stdclass();
$objectType = str_replace('`', '', $objectType);
@@ -291,7 +291,7 @@ class actionModel extends model
$title = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($action->extra)->fetch('title');
if($title) $action->extra = common::hasPriv('story', 'view') ? html::a(helper::createLink('story', 'view', "storyID=$action->extra"), "#$action->extra " . $title) : "#$action->extra " . $title;
}
elseif($actionName == 'totask')
elseif($actionName == 'totask' or $actionName == 'linkchildtask' or $actionName == 'unlinkchildrentask' or $actionName == 'linkparenttask')
{
$name = $this->dao->select('name')->from(TABLE_TASK)->where('id')->eq($action->extra)->fetch('name');
if($name) $action->extra = common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "taskID=$action->extra"), "#$action->extra " . $name) : "#$action->extra " . $name;
@@ -346,7 +346,11 @@ class actionModel extends model
{
$linkedProducts = $this->dao->select('id,name')->from(TABLE_PRODUCT)->where('id')->in($action->extra)->fetchPairs('id', 'name');
$action->extra = '';
if($linkedProducts) $action->extra = sprintf($this->lang->project->action->extra, '<strong>' . join(', ', $linkedProducts) . '</strong>');
if($linkedProducts)
{
foreach($linkedProducts as $productID => $productName) $linkedProducts[$productID] = html::a(helper::createLink('product', 'browse', "productID=$productID"), "#{$productID} {$productName}");
$action->extra = sprintf($this->lang->project->action->extra, '<strong>' . join(', ', $linkedProducts) . '</strong>');
}
}
$action->history = isset($histories[$actionID]) ? $histories[$actionID] : array();
@@ -365,7 +369,7 @@ class actionModel extends model
if($history->field == 'git') $history->diff = str_replace('+', '%2B', $history->diff);
}
}
$action->comment = $this->file->setImgSize($action->comment, $this->config->action->commonImgSize);
$actions[$actionID] = $action;
}
@@ -623,7 +627,11 @@ class actionModel extends model
if(!$actions) return array();
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'action');
return $this->transformActions($actions);
$actions = $this->transformActions($actions);
$actioned = $this->loadModel('setting')->getItem("owner=system&module=common&section=global&key=setdynamic");
foreach($actions as $index => $action) if(strpos($actioned, $action->action) === false) unset($actions[$index]);
return $actions;
}
/**
+2 -1
View File
@@ -46,7 +46,8 @@ class branchModel extends model
$product = $this->loadModel('product')->getById($productID);
if(!$product or $product->type == 'normal') return array();
$branches = array('0' => $this->lang->branch->all . $this->lang->product->branchName[$product->type]) + $branches;
$space = $this->app->getClientLang() == 'en' ? ' ' : '';
$branches = array('0' => $this->lang->branch->all . $space . $this->lang->product->branchName[$product->type]) + $branches;
}
return $branches;
}
+1 -1
View File
@@ -193,7 +193,7 @@ class bug extends control
$chartFunc = 'getDataOf' . $chart;
$chartData = $this->bug->$chartFunc();
$chartOption = $this->lang->bug->report->$chart;
if(!empty($chartType)) $chartOption->type = $chartType;
if(!empty($chartType) and $chartType != 'default') $chartOption->type = $chartType;
$this->bug->mergeChartOption($chart);
$this->view->charts[$chart] = $chartOption;
+1 -1
View File
@@ -8,6 +8,7 @@
#buildBoxActions {padding-left: 15px;}
#module_chosen.chosen-container .chosen-drop {min-width: 400px; border-top: 1px solid #ddd!important}
#os_chosen.chosen-container .chosen-drop{min-width: 200px}
#openedBuild_chosen.chosen-container .chosen-drop {min-width: 450px; border-top: 1px solid #ddd!important}
#module + .chosen-container-single .chosen-single,
#task + .chosen-container-single .chosen-single,
@@ -37,4 +38,3 @@
.title-group #severity + .chosen-container > .chosen-single {border-radius: 0!important;}
.title-group #pri + .chosen-container > .chosen-single {border-top-left-radius: 0!important; border-bottom-left-radius: 0!important;}
.title-group .has-icon-right{min-width:700px}
#dataform .chosen[name ^= "os"] + .chosen-container .chosen-drop{min-width: 200px}
+8 -5
View File
@@ -468,17 +468,20 @@ function notice()
if($('#openedBuild').find('option').length <= 1)
{
var html = '';
if($('#project').val() == '')
if($('#project').length == 0 || $('#project').val() == '')
{
branch = $('#branch').val();
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
html += '<a href="' + createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch) + '" target="_blank" style="padding-right:5px">' + createRelease + '</a> ';
var link = createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch);
if(typeof(flow) != 'undefined' && flow == 'onlyTest') link = createLink('build', 'create','projectID=' + $('#product').val());
html += '<a href="' + link + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProductBuilds(' + $('#product').val() + ')">' + refresh + '</a>';
}
else
{
html += '<a href="' + createLink('build', 'create','projectID=' + $('#project').val()) + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProjectBuilds(' + $('#project').val() + ')">' + refresh + '</a>';
projectID = $('#project').val();
html += '<a href="' + createLink('build', 'create','projectID=' + projectID) + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProjectBuilds(' + projectID + ')">' + refresh + '</a>';
}
var $bba = $('#buildBoxActions');
if($bba.length)
+6 -1
View File
@@ -1670,7 +1670,12 @@ class bugModel extends model
{
$datas = $this->dao->select('openedBuild as name, count(openedBuild) as value')->from(TABLE_BUG)->where($this->reportCondition())->groupBy('openedBuild')->orderBy('value DESC')->fetchAll('name');
if(!$datas) return array();
$builds = $this->loadModel('build')->getProductBuildPairs($this->session->product, $branch = 0, $params = '');
/* Judge if all product or not. */
$products = $this->session->product;
preg_match('/`product` IN \((?P<productIdList>.+)\)/', $this->reportCondition(), $matchs);
if(!empty($matchs) and isset($matchs['productIdList'])) $products = str_replace('\'', '', $matchs['productIdList']);
$builds = $this->loadModel('build')->getProductBuildPairs($products, $branch = 0, $params = '');
/* Deal with the situation that a bug maybe associate more than one openedBuild. */
foreach($datas as $buildIDList => $data)
{
+1 -1
View File
@@ -19,7 +19,7 @@ js::set('page', 'create');
js::set('createRelease', $lang->release->create);
js::set('createBuild', $lang->build->create);
js::set('refresh', $lang->refresh);
js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
js::set('flow', $config->global->flow);
?>
<div id="mainContent" class="main-content fade">
<div class="center-block">
+2 -9
View File
@@ -21,7 +21,7 @@ $lang->percent = '%';
$lang->dash = '-';
$lang->zentaoPMS = 'ZenTao';
$lang->welcome = "%s";
$lang->welcome = "%s ALM";
$lang->logout = 'Logout';
$lang->login = 'Login';
$lang->help = 'Help';
@@ -94,13 +94,6 @@ $lang->preShortcutKey = '[Shortcut:←]';
$lang->nextShortcutKey = '[Shortcut:→]';
$lang->backShortcutKey = '[Shortcut:Alt+↑]';
$lang->saveTemplate = 'Save as Template';
$lang->setPublic = 'Set as Public Template';
$lang->deleteTemplate = 'Delete Template';
$lang->setTemplateTitle = 'Please enter the title of template.';
$lang->applyTemplate = 'Template';
$lang->confirmDeleteTemplate = 'Do you want to delete this template?';
$lang->select = 'Select';
$lang->selectAll = 'Select All';
$lang->selectReverse = 'Select Inverse';
@@ -518,7 +511,7 @@ $lang->proVersion = "<a href='https://www.zentao.pm/book/zentaopromanual/fre
$lang->downNotify = "Download Desktop Notification";
$lang->downloadClient = "Download Desktop Client";
$lang->clientHelp = "Client Help";
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-open-source-client-214.html";
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/";
$lang->website = "https://www.zentao.pm";
$lang->suhosinInfo = "Warning! Data is reaching the limit. Please change <font color=red>sohusin.post.max_vars</font> and <font color=red>sohusin.request.max_vars</font> (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved.";
-7
View File
@@ -94,13 +94,6 @@ $lang->preShortcutKey = '[快捷键:←]';
$lang->nextShortcutKey = '[快捷键:→]';
$lang->backShortcutKey = '[快捷键:Alt+↑]';
$lang->saveTemplate = '保存模板';
$lang->setPublic = '设为公共模板';
$lang->deleteTemplate = '删除模板';
$lang->setTemplateTitle = '请输入模板标题';
$lang->applyTemplate = '应用模板';
$lang->confirmDeleteTemplate = '您确认要删除该模板吗?';
$lang->select = '选择';
$lang->selectAll = '全选';
$lang->selectReverse = '反选';
+27 -6
View File
@@ -1645,7 +1645,6 @@ EOD;
public function checkEntry()
{
$this->loadModel('entry');
if($this->session->valid_entry)
{
if(!$this->session->entry_code) $this->response('SESSION_CODE_MISSING');
@@ -1661,7 +1660,7 @@ EOD;
if(!$entry->key) $this->response('EMPTY_KEY');
if(empty($entry->account)) $this->response('ACCOUNT_UNBOUND');
if(!$this->checkIP($entry->ip)) $this->response('IP_DENIED');
if(!$this->checkEntryToken($entry->key)) $this->response('INVALID_TOKEN');
if(!$this->checkEntryToken($entry)) $this->response('INVALID_TOKEN');
$this->loadModel('user');
$user = $this->dao->findByAccount($entry->account)->from(TABLE_USER)->fetch();
@@ -1676,6 +1675,14 @@ EOD;
$this->session->set('VALID_ENTRY', md5(md5($this->get->code) . $this->server->remote_addr));
$this->loadModel('entry')->saveLog($entry->id, $this->server->request_uri);
/* Add for task #5384. */
if($_SERVER['REQUEST_METHOD'] == 'POST' and empty($_POST))
{
$post = file_get_contents("php://input");
if(!empty($post)) $post = json_decode($post, true);
if(!empty($post)) $_POST = $post;
}
unset($_GET['code']);
unset($_GET['token']);
}
@@ -1683,16 +1690,30 @@ EOD;
/**
* Check token of an entry.
*
* @param string $key
* @param object $entry
* @access public
* @return void
* @return bool
*/
public function checkEntryToken($key)
public function checkEntryToken($entry)
{
parse_str($this->server->query_String, $queryString);
unset($queryString['token']);
/* Change for task #5384. */
if(isset($queryString['time']))
{
$result = $this->get->token == md5($entry->code . $entry->key . $queryString['time']);
if($result)
{
if($queryString['time'] <= $entry->calledTime) $this->response('CALLED_TIME');
$this->loadModel('entry')->updateTime($entry->code, $queryString['time']);
unset($_GET['time']);
return $result;
}
}
$queryString = http_build_query($queryString);
return $this->get->token == md5(md5($queryString) . $key);
return $this->get->token == md5(md5($queryString) . $entry->key);
}
/**
+25
View File
@@ -323,6 +323,31 @@ class custom extends control
$this->display();
}
/**
*Set dynamic recode what action
*
* @access public
* @return void
*/
public function setDynamic()
{
if($_POST)
{
$actions = $this->post->actions;
$actions = implode(',', array_filter($actions));
$this->loadModel('setting')->setItem('system.common.global.setdynamic', $actions);
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
}
$this->app->loadLang('action');
$this->view->title = $this->lang->custom->setDynamic;
$this->view->position[] = $this->lang->custom->common;
$this->view->position[] = $this->view->title;
$this->view->actions = $this->lang->action->search->label;
$this->view->actioned = $this->loadModel('setting')->getItem("owner=system&module=common&section=global&key=setdynamic");
$this->display();
}
/**
* Timezone.
*
+3 -1
View File
@@ -18,6 +18,8 @@ $lang->custom->required = 'Required';
$lang->custom->score = 'Point';
$lang->custom->timezone = 'Timezone';
$lang->custom->scoreReset = 'Reset Point';
$lang->custom->setDynamic = 'Set Dynamic';
$lang->custom->setAction = 'Set Action';
$lang->custom->object['story'] = 'Story';
$lang->custom->object['task'] = 'Task';
@@ -77,7 +79,7 @@ $lang->custom->user->fields['statusList'] = 'Status';
$lang->custom->user->fields['contactField'] = 'Available Contact';
$lang->custom->user->fields['deleted'] = 'Deleted User';
$lang->custom->system = array('flow', 'working', 'required', 'score');
$lang->custom->system = array('flow', 'working', 'required', 'score', 'setDynamic');
$lang->custom->block->fields['closed'] = 'Closed Block';
+3 -1
View File
@@ -18,6 +18,8 @@ $lang->custom->required = '必填项';
$lang->custom->score = '积分';
$lang->custom->timezone = '时区';
$lang->custom->scoreReset = '重置积分';
$lang->custom->setDynamic = '动态设置';
$lang->custom->setAction = '设置动作';
$lang->custom->object['story'] = '需求';
$lang->custom->object['task'] = '任务';
@@ -77,7 +79,7 @@ $lang->custom->user->fields['statusList'] = '状态';
$lang->custom->user->fields['contactField'] = '可用联系方式';
$lang->custom->user->fields['deleted'] = '列出已删除用户';
$lang->custom->system = array('flow', 'working', 'required', 'score');
$lang->custom->system = array('flow', 'working', 'required', 'score', 'setDynamic');
$lang->custom->block->fields['closed'] = '关闭的区块';
+40
View File
@@ -0,0 +1,40 @@
<?php
/**
* The score view file of custom module of ZenTaoPMS.
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Memory <lvtao@cnezsoft.com>
* @package custom
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include 'header.html.php';?>
<div id='mainContent' class='main-content'>
<form class="load-indicator main-form form-ajax" method='post'>
<div class='main-header'>
<div class='heading'>
<strong><?php echo $lang->custom->setDynamic?></strong>
</div>
</div>
<table class='table table-form'>
<tr>
<th class='w-100px'><?php echo $lang->custom->setAction;?></th>
<td><?php echo html::select("actions[]", $actions, $actioned, "class='form-control chosen' multiple");?></td>
</tr>
<tr>
<th></th>
<td class='form-actions'>
<?php echo html::submitButton();?>
</td>
</tr>
</table>
</form>
</div>
<script>
$(function()
{
$('#mainMenu #setDynamicTab').addClass('btn-active-text');
})
</script>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -1588,6 +1588,7 @@ class docModel extends model
$parantMoudles = $this->dao->select('id, name')->from(TABLE_MODULE)
->where('id')->in($path)
->andWhere('deleted')->eq(0)
->orderBy('`grade`')
->fetchAll('id');
foreach($parantMoudles as $parentID => $moduleName)
+1
View File
@@ -17,3 +17,4 @@ $config->entry->errcode['SESSION_VERIFY_FAILED'] = 401;
$config->entry->errcode['IP_DENIED'] = 403;
$config->entry->errcode['ACCOUNT_UNBOUND'] = 403;
$config->entry->errcode['EMPTY_ENTRY'] = 404;
$config->entry->errcode['CALLED_TIME'] = 405;
+1
View File
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'Session verification failed.';
$lang->entry->errmsg['IP_DENIED'] = 'IP is denied.';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = 'Account is not bound.';
$lang->entry->errmsg['EMPTY_ENTRY'] = 'Entry does not exist.';
$lang->entry->errmsg['CALLED_TIME'] = 'Token has expired';
+1
View File
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'session验证失败';
$lang->entry->errmsg['IP_DENIED'] = '该IP被限制访问';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = '未绑定用户';
$lang->entry->errmsg['EMPTY_ENTRY'] = '应用不存在';
$lang->entry->errmsg['CALLED_TIME'] = 'Token已失效';
+14
View File
@@ -125,6 +125,20 @@ class entryModel extends model
return common::createChanges($oldEntry, $entry);
}
/**
* Update called time.
*
* @param string $code
* @param int $time
* @access public
* @return bool
*/
public function updateTime($code, $time)
{
$this->dao->update(TABLE_ENTRY)->set('calledTime')->eq($time)->where('code')->eq($code)->exec();
return !dao::isError();
}
/**
* Save log of an entry.
*
+1 -23
View File
@@ -287,29 +287,7 @@ class file extends control
*/
public function sendDownHeader($fileName, $fileType, $content)
{
/* Clean the ob content to make sure no space or utf-8 bom output. */
$obLevel = ob_get_level();
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
/* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
setcookie('downloading', 1);
/* Append the extension name auto. */
$extension = '.' . $fileType;
if(strpos($fileName, $extension) === false) $fileName .= $extension;
/* urlencode the filename for ie. */
if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
/* Judge the content type. */
$mimes = $this->config->file->mimes;
$contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
header("Content-type: $contentType");
header("Content-Disposition: attachment; filename=\"$fileName\"");
header("Pragma: no-cache");
header("Expires: 0");
die($content);
$this->file->sendDownHeader($fileName, $fileType, $content);
}
/**
+36
View File
@@ -821,4 +821,40 @@ class fileModel extends model
unset($_SESSION['album'][$uid]);
}
}
/**
* Send the download header to the client.
*
* @param string $fileName
* @param string $fileType
* @param string $content
* @access public
* @return void
*/
public function sendDownHeader($fileName, $fileType, $content)
{
/* Clean the ob content to make sure no space or utf-8 bom output. */
$obLevel = ob_get_level();
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
/* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
setcookie('downloading', 1);
/* Append the extension name auto. */
$extension = '.' . $fileType;
if(strpos($fileName, $extension) === false) $fileName .= $extension;
/* urlencode the filename for ie. */
if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
/* Judge the content type. */
$mimes = $this->config->file->mimes;
$contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
header("Content-type: $contentType");
header("Content-Disposition: attachment; filename=\"$fileName\"");
header("Pragma: no-cache");
header("Expires: 0");
die($content);
}
}
+2 -2
View File
@@ -25,9 +25,9 @@ $lang->install->seeLatestRelease = 'View latest version';
$lang->install->welcome = 'Thanks for choosing ZenTao!';
$lang->install->license = 'ZenTao is under Z PUBLIC LICENSE(ZPL) 1.2';
$lang->install->desc = <<<EOT
ZenTao is an Open Source software released under <a href='http://zpl.pub/page/zplv12.html' target='_blank'>Z Public License</a>. It integrates with Product Management, Project Management, QA Management, Document Management, Todos Management, Company Management etc. ZenTao is the best choice for software project management.
ZenTao ALM is an Open Source software released under <a href='http://zpl.pub/page/zplv12.html' target='_blank'>Z Public License</a>. It integrates with Product Management, Project Management, QA Management, Document Management, Todos Management, Company Management etc. ZenTao is the best choice for software project management.
ZenTao is built on PHP + MySQL and based on ZenTaoPHP framework, an independent framework developed by our team. Third party developers/organizations can develop plug-ins or customize for their requirements.
ZenTao ALM is built on PHP + MySQL and based on ZenTaoPHP framework, an independent framework developed by our team. Third party developers/organizations can develop plug-ins or customize for their requirements.
EOT;
$lang->install->links = <<<EOT
ZenTao is developed by <strong><a href='http://easysoft.ltd' target='_blank' class='text-danger'>Nature Easy Soft Co., LTD</a></strong>.
+1
View File
@@ -273,6 +273,7 @@
foreach($lang->story->stageList as $key => $stage)
{
if(empty($key)) continue;
if(strpos('tested|verified|released|closed', $key) === false) continue;
$actionLink = $this->createLink('story', 'batchChangeStage', "stage=$key");
echo "<li>" . html::a('#', $stage, '', "onclick=\"setFormAction('$actionLink','hiddenwin')\"") . "</li>";
}
+4 -1
View File
@@ -15,6 +15,8 @@
<div id='mainContent' class="main-row">
<div class="col-8 main-col">
<div class="row">
<?php $isRoadmap = common::hasPriv('product', 'roadmap');?>
<?php if($isRoadmap):?>
<div class="col-sm-6">
<div class="panel block-release">
<div class="panel-heading">
@@ -50,7 +52,8 @@
</div>
</div>
</div>
<div class="col-sm-6">
<?php endif;?>
<div class="col-sm-<?php echo $isRoadmap ? 6 : 12?>">
<div class="panel block-dynamic">
<div class="panel-heading">
<div class="panel-title"><?php echo $lang->product->latestDynamic;?></div>
+4 -3
View File
@@ -136,10 +136,11 @@ class release extends control
$release = $this->release->getById((int)$releaseID, true);
if(!$release) die(js::error($this->lang->notFound) . js::locate('back'));
$stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0)
->beginIF($type == 'story')->orderBy($orderBy)->fi()
->fetchAll('id');
->beginIF($type == 'story')->orderBy($orderBy)->fi()
->fetchAll('id');
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story');
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($release->stories)->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage');
foreach($stages as $storyID => $stage)$stories[$storyID]->stage = $stage;
+1 -1
View File
@@ -102,7 +102,7 @@ $config->story->datatable->fieldList['estimate']['required'] = 'no';
$config->story->datatable->fieldList['stage']['title'] = 'stageAB';
$config->story->datatable->fieldList['stage']['fixed'] = 'no';
$config->story->datatable->fieldList['stage']['width'] = '80';
$config->story->datatable->fieldList['stage']['width'] = '95';
$config->story->datatable->fieldList['stage']['required'] = 'no';
$config->story->datatable->fieldList['openedBy']['title'] = 'openedByAB';
+2 -1
View File
@@ -1453,7 +1453,8 @@ class story extends control
}
else
{
$stmt = $this->dbh->query($this->session->storyQueryCondition . ($this->post->exportType == 'selected' ? " AND t1.id IN({$this->cookie->checkedItem})" : '') . " ORDER BY " . strtr($orderBy, '_', ' '));
$field = $projectID ? 't2.id' : 't1.id';
$stmt = $this->dbh->query($this->session->storyQueryCondition . ($this->post->exportType == 'selected' ? " AND $field IN({$this->cookie->checkedItem})" : '') . " ORDER BY " . strtr($orderBy, '_', ' '));
while($row = $stmt->fetch()) $stories[$row->id] = $row;
}
+3 -5
View File
@@ -5,9 +5,7 @@ $(function()
link = createLink('story', 'create', 'productID=' + productID + "&branch=" + branch + '&moduleID=' + moduleID);
$('#modulemenu ul.nav li.right:first').before("<li class='right'><a href='" + link + "'><i class='icon-story-create icon-plus'></i> " + createStory + "</a></li>");
}
if(isonlybody)
{
$('.main-actions').css('width', '100%')
}
/* Add for task #5385. */
if(config.onlybody == 'yes') $('.main-actions').css('width', '100%')
});
+1 -1
View File
@@ -1,6 +1,6 @@
$(function()
{
$('#sourceNote').parent().find('span').remove();
$('#sourceNote').prev('span').remove();
$('#sourceNote').remove();
$('table tbody tr th').addClass('w-70px');
});
+63 -13
View File
@@ -515,6 +515,7 @@ class storyModel extends model
if(empty($_POST['branch'])) $story->branch = 0;
if(!empty($_POST['stages']))
{
$oldStages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->fetchAll('branch');
$this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->exec();
$stageList = join(',', array_keys($this->lang->story->stageList));
@@ -522,7 +523,17 @@ class storyModel extends model
$minStage = '';
foreach($this->post->stages as $branch => $stage)
{
$this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
$newStage = new stdclass();
$newStage->story = $storyID;
$newStage->branch = $branch;
$newStage->stage = $stage;
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
$newStage->stagedBy = $oldStage->stagedBy;
if($stage != $oldStage->stage) $newStage->stagedBy = (strpos('tested|verified|released|closed', $stage) !== false) ? $this->app->user->account : '';
}
$this->dao->insert(TABLE_STORYSTAGE)->data($newStage)->exec();
if(strpos($stageList, $stage) !== false and strpos($stageList, $stage) < $minStagePos)
{
$minStage = $stage;
@@ -531,6 +542,7 @@ class storyModel extends model
}
$story->stage = $minStage;
}
if($oldStory->stage != $story->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : '';
$this->dao->update(TABLE_STORY)
->data($story)
@@ -585,7 +597,7 @@ class storyModel extends model
foreach($storyIDList as $storyID)
{
if($data->pris[$storyID] == 'ditto') $data->pris[$storyID] = isset($prev['pri']) ? $prev['pri'] : 0;
if($data->branches[$storyID] == 'ditto') $data->branches[$storyID] = isset($prev['branch']) ? $prev['branch'] : 0;
if(isset($data->branches) and $data->branches[$storyID] == 'ditto') $data->branches[$storyID] = isset($prev['branch']) ? $prev['branch'] : 0;
if($data->modules[$storyID] == 'ditto') $data->modules[$storyID] = isset($prev['module']) ? $prev['module'] : 0;
if($data->plans[$storyID] == 'ditto') $data->plans[$storyID] = isset($prev['plan']) ? $prev['plan'] : 0;
if($data->sources[$storyID] == 'ditto') $data->sources[$storyID] = isset($prev['source']) ? $prev['source'] : '';
@@ -628,6 +640,7 @@ class storyModel extends model
$story->duplicateStory = isset($data->duplicateStories[$storyID]) ? $data->duplicateStories[$storyID] : $oldStory->duplicateStory;
$story->childStories = isset($data->childStoriesIDList[$storyID]) ? $data->childStoriesIDList[$storyID] : $oldStory->childStories;
$story->version = $story->title == $oldStory->title ? $oldStory->version : $oldStory->version + 1;
if($story->stage != $oldStory->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : '';
if($story->title != $oldStory->title) $story->status = 'changed';
if($story->plan !== false and $story->plan == '') $story->plan = 0;
@@ -854,7 +867,6 @@ class storyModel extends model
->setDefault('assignedDate', $now)
->removeIF($this->post->closedReason != 'duplicate', 'duplicateStory')
->removeIF($this->post->closedReason != 'subdivided', 'childStories')
->setIF($this->post->closedReason == 'done', 'stage', 'released')
->setIF($this->post->closedReason != 'done', 'plan', 0)
->remove('comment')
->get();
@@ -864,7 +876,7 @@ class storyModel extends model
->batchCheck($this->config->story->close->requiredFields, 'notempty')
->checkIF($story->closedReason == 'duplicate', 'duplicateStory', 'notempty')
->where('id')->eq($storyID)->exec();
if(!dao::isError() && $this->post->closedReason == 'done') $this->loadModel('score')->create('story', 'close', $storyID);
if(!dao::isError()) $this->loadModel('score')->create('story', 'close', $storyID);
return common::createChanges($oldStory, $story);
}
@@ -903,7 +915,6 @@ class storyModel extends model
$story->duplicateStory = $data->duplicateStoryIDList[$storyID] ? $data->duplicateStoryIDList[$storyID] : $oldStory->duplicateStory;
$story->childStories = $data->childStoriesIDList[$storyID] ? $data->childStoriesIDList[$storyID] : $oldStory->childStories;
if($story->closedReason == 'done') $story->stage = 'released';
if($story->closedReason != 'done') $story->plan = 0;
$stories[$storyID] = $story;
@@ -929,7 +940,7 @@ class storyModel extends model
{
die(js::error('story#' . $storyID . dao::getError(true)));
}
if(!dao::isError() && $story->stage == 'released') $this->loadModel('score')->create('story', 'close', $storyID);
if(!dao::isError()) $this->loadModel('score')->create('story', 'close', $storyID);
}
return $allChanges;
@@ -1045,6 +1056,7 @@ class storyModel extends model
{
$now = helper::now();
$allChanges = array();
$account = $this->app->user->account;
$oldStories = $this->getByList($storyIDList);
$ignoreStories = '';
foreach($storyIDList as $storyID)
@@ -1057,12 +1069,13 @@ class storyModel extends model
}
$story = new stdclass();
$story->lastEditedBy = $this->app->user->account;
$story->lastEditedBy = $account;
$story->lastEditedDate = $now;
$story->stage = $stage;
$story->stagedBy = $account;
$this->dao->update(TABLE_STORY)->data($story)->autoCheck()->where('id')->eq((int)$storyID)->exec();
$this->dao->update(TABLE_STORYSTAGE)->set('stage')->eq($stage)->where('story')->eq((int)$storyID)->exec();
$this->dao->update(TABLE_STORYSTAGE)->set('stage')->eq($stage)->set('stagedBy')->eq($account)->where('story')->eq((int)$storyID)->exec();
if(!dao::isError()) $allChanges[$storyID] = common::createChanges($oldStory, $story);
}
if($ignoreStories) echo js::alert(sprintf($this->lang->story->ignoreChangeStage, $ignoreStories));
@@ -1165,8 +1178,12 @@ class storyModel extends model
$storyID = (int)$storyID;
/* Get projects which status is doing. */
$oldStages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->fetchAll('branch');
$this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->exec();
$story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch();
$story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch();
if(!empty($story->stagedBy)) return false;
$product = $this->dao->findById($story->product)->from(TABLE_PRODUCT)->fetch();
$projects = $this->dao->select('t1.project,t3.branch')->from(TABLE_PROJECTSTORY)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
@@ -1188,7 +1205,19 @@ class storyModel extends model
{
$this->dao->update(TABLE_STORY)->set('stage')->eq('wait')->where('id')->eq($storyID)->andWhere('plan')->eq('')->exec();
foreach($stages as $branch => $stage) $this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
foreach($stages as $branch => $stage)
{
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
if(!empty($oldStage->stagedBy))
{
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
continue;
}
}
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
}
$this->dao->update(TABLE_STORY)->set('stage')->eq('planned')->where('id')->eq($storyID)->andWhere("(plan != '' AND plan != '0')")->exec();
}
@@ -1210,7 +1239,19 @@ class storyModel extends model
/* No tasks, then the stage is projected. */
if(!$tasks and $projects)
{
foreach($stages as $branch => $stage) $this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq('projected')->exec();
foreach($stages as $branch => $stage)
{
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
if(!empty($oldStage->stagedBy))
{
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
continue;
}
}
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq('projected')->exec();
}
$this->dao->update(TABLE_STORY)->set('stage')->eq('projected')->where('id')->eq($storyID)->exec();
}
@@ -1285,7 +1326,16 @@ class storyModel extends model
$minStage = '';
foreach($stages as $branch => $stage)
{
$this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
if(!empty($oldStage->stagedBy))
{
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
$stage = $oldStage->$stage;
}
}
if(strpos($stageList, $stage) !== false and strpos($stageList, $stage) < $minStagePos)
{
$minStage = $stage;
@@ -2425,7 +2475,7 @@ class storyModel extends model
echo "<ul class='dropdown-menu pull-right'>";
foreach($storyStages[$story->id] as $storyBranch => $storyStage)
{
echo '<li class="text-ellipsis">' . $branches[$storyBranch] . ": " . $this->lang->story->stageList[$storyStage->stage] . '</li>';
if(isset($branches[$storyBranch])) echo '<li class="text-ellipsis">' . $branches[$storyBranch] . ": " . $this->lang->story->stageList[$storyStage->stage] . '</li>';
}
echo "</ul>";
echo '</div>';
-1
View File
@@ -14,7 +14,6 @@
<?php include '../../common/view/kindeditor.html.php';?>
<?php $browseLink = $app->session->storyList != false ? $app->session->storyList : $this->createLink('product', 'browse', "productID=$story->product&branch=$story->branch&moduleID=$story->module");?>
<?php js::set('sysurl', common::getSysUrl());?>
<?php js::set('isonlybody', isonlybody());?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php if(!isonlybody()):?>
+1 -2
View File
@@ -1212,9 +1212,8 @@ class task extends control
$chartFunc = 'getDataOf' . $chart;
$chartData = $this->task->$chartFunc();
$chartOption = $this->lang->task->report->$chart;
if(!empty($chartType)) $chartOption->type = $chartType;
if(!empty($chartType) and $chartType != 'default') $chartOption->type = $chartType;
$this->task->mergeChartOption($chart);
$this->view->charts[$chart] = $chartOption;
$this->view->datas[$chart] = $this->report->computePercent($chartData);
}
+2 -1
View File
@@ -2,6 +2,7 @@
.chosen-container[id^="story"] .chosen-drop {min-width: 450px !important;}
.chosen-container[id^="module"] .chosen-drop {min-width: 400px !important;}
[id^=name] {min-width: 165px;}
#mainContent .main-header h2{max-width:300px}
#batchCreateForm .input-group,
#batchCreateForm .input-group .form-control {position: static;}
@@ -18,4 +19,4 @@
.chosen-results > li.has-task,
.chosen-results > li.has-new-task {position: relative; color: #388E3C;}
.chosen-results > li.has-task.highlighted,
.chosen-results > li.has-new-task.highlighted {color: #fff;}
.chosen-results > li.has-new-task.highlighted {color: #fff;}
-5
View File
@@ -274,8 +274,3 @@ $lang->task->report->tasksPerClosedReason->graph->xAxisName = '关闭原因';
$lang->task->report->finishedTasksPerDay->type = 'bar';
$lang->task->report->finishedTasksPerDay->graph->xAxisName = '日期';
$lang->task->action = new stdclass();
$lang->task->action->batchcreate = array('main' => '$date, 由 <strong>$actor</strong> 创建子任务 。');
$lang->task->action->unlink = array('main' => '$date, 由 <strong>$actor</strong> 取消关联父任务 。');
$lang->task->action->linkto = array('main' => '$date, 由 <strong>$actor</strong> 关联到父任务 。');
+4 -5
View File
@@ -679,10 +679,9 @@ class taskModel extends model
if(isset($task->parent) and $task->parent != $oldTask->parent)
{
$comment = html::a(helper::createLink('task', 'view', 'taskID=' . $taskID), $task->name);
$this->loadModel('action')->create('task', $task->parent, 'linkTo', $comment);
$this->loadModel('action')->create('task', $oldTask->parent, 'unLink', $comment);
$this->loadModel('action')->create('task', $task->parent, 'linkChildTask', '', $taskID);
$this->loadModel('action')->create('task', $oldTask->parent, 'unLinkChildrenTask', '', $taskID);
$this->loadModel('action')->create('task', $taskID, 'linkParentTask', '', $task->parent);
}
$task = $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $this->post->uid);
@@ -751,7 +750,7 @@ class taskModel extends model
if($oldTask->parent > 0)
{
if($task->parent == 0) $this->computeWorkingHours($oldTask->parent);
$this->updateParentStatus($taskID);
$this->updateParentStatus($taskID, false);
$this->computeBeginAndEnd($oldTask->parent);
}
+1 -1
View File
@@ -16,7 +16,7 @@
<div class="main-header clearfix">
<h2 class="pull-left">
<?php if($parent):?>
<span class='pull-left'><?php echo $parentTitle;?></span>
<span class='pull-left'><?php echo $parentTitle . $this->lang->colon;?></span>
<?php echo $lang->task->batchCreateChildren;?>
<?php else:?>
<?php echo $lang->task->batchCreate;?>
+1 -2
View File
@@ -152,6 +152,7 @@
<?php if(!isonlybody()) echo "<div class='divider'></div>";?>
<?php if(!$task->deleted):?>
<?php
if(empty($task->team) or empty($task->children)) common::printIcon('task', 'batchCreate', "project=$task->project&storyID=$task->story&moduleID=$task->module&taskID=$task->id", $task, 'button', 'treemap-alt', '', '', '', "title='{$lang->task->children}'", $lang->task->children);
common::printIcon('task', 'assignTo', "projectID=$task->project&taskID=$task->id", $task, 'button', '', '', 'iframe', true, '', empty($task->team) ? $lang->task->assignTo : $lang->task->transfer);
common::printIcon('task', 'start', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
common::printIcon('task', 'restart', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
@@ -163,11 +164,9 @@
common::printIcon('task', 'cancel', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
if(!isonlybody()) echo "<div class='divider'></div>";
if(empty($task->team) or empty($task->children)) common::printIcon('task', 'batchCreate', "project=$task->project&storyID=$task->story&moduleID=$task->module&taskID=$task->id", $task, 'button', 'plus', '', '', '', "title='{$lang->task->children}'", ' ');
common::printIcon('task', 'edit', "taskID=$task->id", $task, 'button', '', '', 'showinonlybody');
common::printIcon('task', 'create', "projctID={$task->project}&storyID=0&moduleID=0&taskID=$task->id", $task, 'button', 'copy');
common::printIcon('task', 'delete', "projectID=$task->project&taskID=$task->id", $task, 'button', 'trash', 'hiddenwin');
if($task->parent <= 0) common::printIcon('task', 'batchCreate', "project=$task->project&storyID=$task->story&moduleID=$task->module&taskID=$task->id&ifame=0", $task, 'list', 'treemap-alt', '', '', '', '', $this->lang->task->children);
if($task->parent > 0) echo html::a(helper::createLink('task', 'view', "taskID=$task->parent"), "<i class='icon icon-chevron-double-up'></i>", '', "class='btn btn-link' title='{$lang->task->parent}'");
?>
<?php endif;?>
-1
View File
@@ -816,7 +816,6 @@ class testcase extends control
else
{
$this->testcase->delete(TABLE_CASE, $caseID);
/* if ajax request, send result. */
if($this->server->ajax)
{
+9 -1
View File
@@ -499,7 +499,15 @@ class testtaskModel extends model
*/
public function getDataOfTestTaskPerRunResult($taskID)
{
$datas = $this->dao->select('lastRunResult AS name, COUNT(*) AS value')->from(TABLE_TESTRUN)->where('task')->eq($taskID)->groupBy('name')->orderBy('value DESC')->fetchAll('name');
$datas = $this->dao->select("t1.lastRunResult AS name, COUNT('t1.*') AS value")->from(TABLE_TESTRUN)->alias('t1')
->leftJoin(TABLE_CASE)->alias('t2')
->on('t1.case = t2.id')
->where('t1.task')->eq($taskID)
->andWhere('t2.deleted')->eq(0)
->groupBy('name')
->orderBy('value DESC')
->fetchAll('name');
if(!$datas) return array();
foreach($datas as $result => $data) $data->name = isset($this->lang->testcase->resultList[$result])? $this->lang->testcase->resultList[$result] : $this->lang->testtask->unexecuted;
+1 -1
View File
@@ -65,7 +65,7 @@ class todo extends control
if($this->app->getViewType() == 'xhtml') die(js::locate($this->createLink('todo', 'view', "todoID=$todoID"), 'parent'));
if(isonlybody()) die(js::locate($this->createLink('my', 'todo', "type=$date"), 'parent.parent'));
die(js::locate($this->createLink('my', 'todo', "type=all"), 'parent'));
die(js::locate($this->createLink('my', 'todo', "type=all&account=&status=all&orderBy=id_desc"), 'parent'));
}
unset($this->lang->todo->typeList['cycle']);
+1 -1
View File
@@ -1,2 +1,2 @@
#projectModal .modal-dialog, #productModal .modal-dialog {top: auto!important; bottom: 90px;}
.body-modal #projectModal .modal-dialog, .body-modal #productModal .modal-dialog {top: auto!important; bottom: 55px;}
.body-modal #projectModal .modal-dialog, .body-modal #productModal .modal-dialog {top: auto!important; bottom: 55px;}
+1 -3
View File
@@ -243,8 +243,6 @@
<?php echo $lang->todo->thisIsPrivate;?>
<?php endif;?>
<script>
$(function(){
parent.$('body.hide-modal-close').removeClass('hide-modal-close');
})
$(function() { parent.$('body.hide-modal-close').removeClass('hide-modal-close'); })
</script>
<?php include '../../common/view/footer.html.php';?>
+47 -1
View File
@@ -375,7 +375,9 @@ class upgradeModel extends model
$this->saveLogs('Execute 11_4');
$this->execSQL($this->getUpgradeFile('11.4'));
case '11_4_1':
$this->saveLogs('Execute 11_4');
$this->saveLogs('Execute 11_4_1');
$this->execSQL($this->getUpgradeFile('11.4.1'));
$this->addPriv11_5();
if(!isset($this->config->isINT) or !($this->config->isINT))
{
if(!$executeXuanxuan)
@@ -519,6 +521,7 @@ class upgradeModel extends model
case '11_3': $confirmContent .= file_get_contents($this->getUpgradeFile('11.3'));
case '11_4': $confirmContent .= file_get_contents($this->getUpgradeFile('11.4'));
case '11_4_1':
$confirmContent .= file_get_contents($this->getUpgradeFile('11.4.1'));
if(!isset($this->config->isINT) or !($this->config->isINT))
{
$xuanxuanSql = $this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan2.4.0.sql';
@@ -2269,6 +2272,49 @@ class upgradeModel extends model
return true;
}
/**
* Add Priv for 11.5
*
* @access public
* @return bool
*/
public function addPriv11_5()
{
$this->saveLogs('Run Method ' . __FUNCTION__);
$groups = $this->dao->select('`group`')->from(TABLE_GROUPPRIV)->where('module')->eq('bug')->andWhere('method')->eq('setPublic')->fetchPairs('group', 'group');
foreach($groups as $groupID)
{
$data = new stdclass();
$data->group = $groupID;
$data->module = 'user';
$data->method = 'setPublicTemplate';
$this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec();
$this->saveLogs($this->dao->get());
}
return true;
}
/**
* Add unique key for stage.
*
* @access public
* @return bool
*/
public function addUniqueKey4Stage()
{
$this->saveLogs('Run Method ' . __FUNCTION__);
$stmt = $this->dao->select('story,branch')->from(TABLE_STORYSTAGE)->orderBy('story,branch')->query();
$preStage = '';
while($stage = $stmt->fetch())
{
if($preStage == "{$stage->story}_{$stage->branch}") $this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($stage->story)->andWhere('branch')->eq($stage->branch)->exec();
$preStage = "{$stage->story}_{$stage->branch}";
}
$this->dao->exec("ALTER TABLE " . TABLE_STORYSTAGE . " ADD UNIQUE `story_branch` (`story`, `branch`)");
$this->saveLogs($this->dao->get());
return true;
}
/**
* Judge any error occers.
*
+29 -22
View File
@@ -48,28 +48,35 @@ $lang->user->originalPassword = 'Old Password';
$lang->user->verifyPassword = 'Your Login Password';
$lang->user->resetPassword = 'Forgot Password?';
$lang->user->index = "Home";
$lang->user->view = "Overview";
$lang->user->create = "Add User";
$lang->user->batchCreate = "Batch Add";
$lang->user->edit = "Edit";
$lang->user->batchEdit = "Batch Edit";
$lang->user->unlock = "Unlock";
$lang->user->delete = "Delete";
$lang->user->unbind = "Unbind Zdoo";
$lang->user->login = "Login";
$lang->user->mobileLogin = "Mobile";
$lang->user->editProfile = "Edit Profile";
$lang->user->deny = "Your access is denied.";
$lang->user->confirmDelete = "Do you want to delete this user?";
$lang->user->confirmUnlock = "Do you want to unlock this user?";
$lang->user->confirmUnbind = "Do you want to unbind this user from Zdoo?";
$lang->user->relogin = "Login Again";
$lang->user->asGuest = "Guest";
$lang->user->goback = "Back";
$lang->user->deleted = '(Deleted)';
$lang->user->search = 'Search';
$lang->user->setPublicTemplate = 'Set as Public Template';
$lang->user->index = "Home";
$lang->user->view = "Overview";
$lang->user->create = "Add User";
$lang->user->batchCreate = "Batch Add";
$lang->user->edit = "Edit";
$lang->user->batchEdit = "Batch Edit";
$lang->user->unlock = "Unlock";
$lang->user->delete = "Delete";
$lang->user->unbind = "Unbind Zdoo";
$lang->user->login = "Login";
$lang->user->mobileLogin = "Mobile";
$lang->user->editProfile = "Edit Profile";
$lang->user->deny = "Your access is denied.";
$lang->user->confirmDelete = "Do you want to delete this user?";
$lang->user->confirmUnlock = "Do you want to unlock this user?";
$lang->user->confirmUnbind = "Do you want to unbind this user from Zdoo?";
$lang->user->relogin = "Login Again";
$lang->user->asGuest = "Guest";
$lang->user->goback = "Back";
$lang->user->deleted = '(Deleted)';
$lang->user->search = 'Search';
$lang->user->saveTemplate = 'Save as Template';
$lang->user->setPublic = 'Set as Public Template';
$lang->user->deleteTemplate = 'Delete Template';
$lang->user->setTemplateTitle = 'Please enter the title of template.';
$lang->user->applyTemplate = 'Template';
$lang->user->confirmDeleteTemplate = 'Do you want to delete this template?';
$lang->user->setPublicTemplate = 'Set as Public Template';
$lang->user->profile = 'Profile';
$lang->user->project = $lang->projectCommon;
+29 -22
View File
@@ -48,28 +48,35 @@ $lang->user->originalPassword = '原密码';
$lang->user->verifyPassword = '您的系统登录密码';
$lang->user->resetPassword = '忘记密码';
$lang->user->index = "用户视图首页";
$lang->user->view = "用户详情";
$lang->user->create = "添加用户";
$lang->user->batchCreate = "批量添加用户";
$lang->user->edit = "编辑用户";
$lang->user->batchEdit = "批量编辑";
$lang->user->unlock = "解锁用户";
$lang->user->delete = "删除用户";
$lang->user->unbind = "解除然之绑定";
$lang->user->login = "用户登录";
$lang->user->mobileLogin = "手机访问";
$lang->user->editProfile = "修改档案";
$lang->user->deny = "访问受限";
$lang->user->confirmDelete = "您确定删除该用户吗?";
$lang->user->confirmUnlock = "您确定解除该用户的锁定状态吗?";
$lang->user->confirmUnbind = "您确定解除该用户跟然之的绑定吗?";
$lang->user->relogin = "重新登录";
$lang->user->asGuest = "游客访问";
$lang->user->goback = "返回前一页";
$lang->user->deleted = '(已删除)';
$lang->user->search = '搜索';
$lang->user->setPublicTemplate = '设为公共模板';
$lang->user->index = "用户视图首页";
$lang->user->view = "用户详情";
$lang->user->create = "添加用户";
$lang->user->batchCreate = "批量添加用户";
$lang->user->edit = "编辑用户";
$lang->user->batchEdit = "批量编辑";
$lang->user->unlock = "解锁用户";
$lang->user->delete = "删除用户";
$lang->user->unbind = "解除然之绑定";
$lang->user->login = "用户登录";
$lang->user->mobileLogin = "手机访问";
$lang->user->editProfile = "修改档案";
$lang->user->deny = "访问受限";
$lang->user->confirmDelete = "您确定删除该用户吗?";
$lang->user->confirmUnlock = "您确定解除该用户的锁定状态吗?";
$lang->user->confirmUnbind = "您确定解除该用户跟然之的绑定吗?";
$lang->user->relogin = "重新登录";
$lang->user->asGuest = "游客访问";
$lang->user->goback = "返回前一页";
$lang->user->deleted = '(已删除)';
$lang->user->search = '搜索';
$lang->user->saveTemplate = '保存模板';
$lang->user->setPublic = '设为公共模板';
$lang->user->deleteTemplate = '删除模板';
$lang->user->setTemplateTitle = '请输入模板标题';
$lang->user->applyTemplate = '应用模板';
$lang->user->confirmDeleteTemplate = '您确认要删除该模板吗?';
$lang->user->setPublicTemplate = '设为公共模板';
$lang->user->profile = '档案';
$lang->user->project = $lang->projectCommon;
+4 -2
View File
@@ -1332,7 +1332,9 @@ class userModel extends model
$userView = $this->dao->select('*')->from(TABLE_USERVIEW)->where('account')->eq($account)->fetch();
if(empty($userView)) $userView = $this->computeUserView($account);
if(!empty($acls['products']) and !$this->session->user->admin)
if(isset($_SESSION['user']->admin)) $isAdmin = $this->session->user->admin;
if(!isset($isAdmin)) $isAdmin = strpos($this->app->company->admins, ",{$account},") !== false;
if(!empty($acls['products']) and !$isAdmin)
{
$grantProducts = '';
foreach($acls['products'] as $productID)
@@ -1341,7 +1343,7 @@ class userModel extends model
}
$userView->products = $grantProducts;
}
if(!empty($acls['projects']) and !$this->session->user->admin)
if(!empty($acls['projects']) and !$isAdmin)
{
$grantProjects = '';
foreach($acls['projects'] as $projectID)
+21 -15
View File
@@ -3,8 +3,8 @@
foreach($templates as $key => $template)
{
echo "<li id='tplBox$template->id' onmouseover='displayXIcon($template->id)' onmouseout='hideXIcon($template->id)'>";
echo "<a title='{$lang->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
if($template->public) echo "<span class='label label-info label-badge'>{$lang->public}</span> ";
echo "<a title='{$lang->user->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
if($template->public) echo "<span class='label label-info label-badge'>{$lang->user->public}</span> ";
echo $template->title . "</a>";
if(empty($template->public) or $template->account == $app->user->account)echo "<a href='###' onclick='deleteTemplate($template->id)' id='templateID$template->id' class='btn-delete hidden'><i class='icon-close'></i></a>";
echo "<span id='template$template->id' class='hidden'>$template->content</span>";
@@ -14,8 +14,9 @@ foreach($templates as $key => $template)
<?php else:?>
<style>
#tplBoxWrapper {position: relative; z-index: 10;}
#tplBoxWrapper > .btn-toolbar {position: absolute; right: 0px; top: 0px;}
#tplBoxWrapper .btn {padding: 4px 8px}
#tplBoxWrapper > .btn-toolbar {position: absolute; right: 1px; top: 1px;}
#tplBoxWrapper .btn {padding: 4px 8px; border-top:0px; border-bottom:0px;}
#tplBoxWrapper #applyTplBtn {border-right:0px;}
#tplBox li {position: relative;}
#tplBox li .btn-delete {position: absolute; right: 0; top: -5px; display: block; width: 40px; text-align:center;}
#tplBox li:hover .btn-delete {color:#fff;}
@@ -24,15 +25,15 @@ foreach($templates as $key => $template)
<div id='tplBoxWrapper'>
<div class='btn-toolbar'>
<div class='btn-group'>
<button id='saveTplBtn' type='button' class='btn btn-mini' data-toggle='saveTplModal'><?php echo $lang->saveTemplate?></button>
<button type='button' class='btn btn-mini dropdown-toggle' data-toggle='dropdown'><?php echo $lang->applyTemplate?> <span class='caret'></span></button>
<button id='saveTplBtn' type='button' class='btn btn-mini' data-toggle='saveTplModal'><?php echo $lang->user->saveTemplate?></button>
<button id='applyTplBtn' type='button' class='btn btn-mini dropdown-toggle' data-toggle='dropdown'><?php echo $lang->user->applyTemplate?> <span class='caret'></span></button>
<ul id='tplBox' class='dropdown-menu pull-right'>
<?php
foreach($templates as $key => $template)
{
echo "<li id='tplBox$template->id' onmouseover='displayXIcon($template->id)' onmouseout='hideXIcon($template->id)'>";
echo "<a title='{$lang->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
if($template->public) echo "<span class='label label-info label-badge'>{$lang->public}</span> ";
echo "<a title='{$lang->user->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
if($template->public) echo "<span class='label label-info label-badge'>{$lang->user->public}</span> ";
echo $template->title . "</a>";
if(empty($template->public) or $template->account == $app->user->account)echo "<a href='###' onclick='deleteTemplate($template->id)' id='templateID$template->id' class='btn-delete hidden'><i class='icon-close'></i></a>";
echo "<span id='template$template->id' class='hidden'>$template->content</span>";
@@ -48,15 +49,20 @@ foreach($templates as $key => $template)
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><i class="icon icon-close"></i></button>
<h4 class="modal-title"><?php echo $lang->setTemplateTitle;?></h4>
<h4 class="modal-title"><?php echo $lang->user->setTemplateTitle;?></h4>
</div>
<div class="modal-body">
<div class='input-group'>
<?php echo html::input('title', '' , "class='form-control'")?>
<input type="text" id="title" value="" class="form-control" autocomplete="off">
<?php if(common::hasPriv('user', 'setPublicTemplate')):?>
<span class='input-group-addon'><?php echo html::checkbox('public', array('1' => $lang->public))?></span>
<span class="input-group-addon">
<div class="checkbox-primary">
<input type="checkbox" value="1" id="public" />
<label for="public"><?php echo $lang->public;?></label>
</div>
</span>
<?php endif;?>
<span class='input-group-btn'><?php echo html::commonButton($lang->save, "id='submit'", 'btn btn-primary')?></span>
<span class='input-group-btn'><?php echo html::commonButton($lang->save, "id='templateSubmit'", 'btn btn-primary')?></span>
</div>
</div>
</div>
@@ -76,7 +82,7 @@ function setTemplate(templateID)
function deleteTemplate(templateID)
{
if(!templateID) return;
if(confirm(<?php echo json_encode($lang->confirmDeleteTemplate);?>))
if(confirm(<?php echo json_encode($lang->user->confirmDeleteTemplate);?>))
{
hiddenwin.location.href = createLink('user', 'ajaxDeleteTemplate', 'templateID=' + templateID);
$('#tplBox' + templateID).addClass('hidden');
@@ -97,10 +103,10 @@ $(function()
{
$('#saveTplModal').on('hide.zui.modal', function(){$(this).find('#title').val('');});
$('#saveTplBtn').click(function(){$('#saveTplModal').modal('show');});
$('#saveTplModal #submit').click(function()
$('#saveTplModal #templateSubmit').click(function()
{
var $inputGroup = $('#saveTplModal div.input-group');
var $publicBox = $inputGroup.find('input[id^="public"]');
var $publicBox = $inputGroup.find('input#public');
var title = $inputGroup.find('#title').val();
var content = editor['<?php echo $link;?>'].html();
var isPublic = ($publicBox.size() > 0 && $publicBox.prop('checked')) ? $publicBox.val() : 0;
@@ -12,7 +12,7 @@
?>
<?php include '../../../common/view/header.html.php';?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('sso');?></div>
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('xuanxuan');?></div>
</div>
<div id='mainContent' class='main-content'>
<div class='center-block'>
@@ -36,6 +36,11 @@
<th><?php echo $lang->chat->key;?></th>
<td><?php echo zget($config->xuanxuan, 'key', '');?></td>
</tr>
<tr>
<th><?php echo $lang->chat->debug;?></th>
<td><?php echo $type == 'edit' ? html::radio('debug', $lang->chat->debugStatus, zget($config->xuanxuan, 'debug', 0)) : zget($lang->chat->debugStatus, zget($config->xuanxuan, 'debug', 0));?></td>
<td></td>
</tr>
<tr>
<th><?php echo $lang->chat->xxdServer;?></th>
<td><?php echo $type == 'edit' ? html::input('server', $domain, "class='form-control'") : $domain;?></td>
@@ -114,7 +119,6 @@
<?php echo html::a(helper::createLink('admin', 'downloadXXD', 'type=package'), $lang->chat->downloadXXD, 'hiddenwin', "class='btn btn-primary download download-package'");?>
<?php echo html::a(helper::createLink('admin', 'downloadXXD', 'type=config'), $lang->chat->downloadConfig, 'hiddenwin', "class='btn btn-primary download'");?>
<?php echo html::a(helper::createLink('admin', 'xuanxuan', 'type=edit'), $lang->chat->changeSetting, '', "class='btn'");?>
<?php echo html::a(helper::createLink('client', 'browse'), $lang->client->browseVersion, '', "class='btn'");?>
<?php echo html::a('http://www.zentao.net/book/zentaopmshelp/302.html', $lang->chat->help, '_blank', "class='btn'");?>
<?php endif;?>
</td>
@@ -12,12 +12,14 @@
?>
<?php include '../../../common/view/header.html.php';?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('sso');?></div>
<div class="btn-toolbar pull-right"><?php common::printLink('admin', 'xuanxuan', '', $lang->goback, '', "class='btn'");?></div>
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('xuanxuan');?></div>
</div>
<div id='mainContent' class='main-content'>
<div class='main-header'>
<div class='pull-right'><?php common::printLink('client', 'create', '', $lang->client->create, '', "class='btn btn-primary' data-toggle='modal'");?></div>
<div class='pull-right'>
<?php common::printLink('client', 'checkUpgrade', '', $lang->client->checkUpgrade, '', "class='btn'");?>
<?php common::printLink('client', 'create', '', $lang->client->create, '', "class='btn btn-primary' data-toggle='modal'");?>
</div>
<div class='heading'>
<h4><?php echo $lang->client->browseVersion;?></h4>
</div>
@@ -1,17 +1,12 @@
<?php
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => 'ZT Client|admin|xuanxuan', 'subModule' => 'client');
$lang->admin->menu->sso['link'] = 'Integrate|admin|xuanxuan';
if(!isset($lang->admin->menu->sso['alias'])) $lang->admin->menu->sso['alias'] = '';
$lang->admin->menu->sso['alias'] = $lang->admin->menu->sso['alias'] . ',sso';
if(!isset($lang->admin->menu->sso['subModule'])) $lang->admin->menu->sso['subModule'] = '';
$lang->admin->menu->sso['subModule'] = $lang->admin->menu->sso['subModule'] . ',client';
$lang->admin->subMenu->sso->xuanxuan = array('link' => 'ZT Client|admin|xuanxuan', 'subModule' => 'client');
$lang->admin->subMenuOrder->sso[4] = 'xuanxuan';
$lang->client = new stdclass();
$lang->client->menu = $lang->admin->menu;
$lang->admin->subMenu->xuanxuan = new stdclass();
$lang->admin->subMenu->xuanxuan->setting = array('link' => 'Parameter|admin|xuanxuan');
$lang->admin->subMenu->xuanxuan->update = array('link' => 'Update|client|browse', 'subModule' => 'client');
$lang->admin->subMenuOrder->xuanxuan[0] = 'setting';
$lang->admin->subMenuOrder->xuanxuan[5] = 'update';
$lang->menugroup->client = 'admin';
@@ -1,14 +1,12 @@
<?php
$lang->xuanxuan = new stdclass();
$lang->admin->menu->xuanxuan = array('link' => '客户端|admin|xuanxuan', 'subModule' => 'client');
$lang->admin->menu->sso['link'] = '集成|admin|xuanxuan';
if(!isset($lang->admin->menu->sso['alias'])) $lang->admin->menu->sso['alias'] = '';
$lang->admin->menu->sso['alias'] = $lang->admin->menu->sso['alias'] . ',sso';
if(!isset($lang->admin->menu->sso['subModule'])) $lang->admin->menu->sso['subModule'] = '';
$lang->admin->menu->sso['subModule'] = $lang->admin->menu->sso['subModule'] . ',client';
$lang->admin->subMenu->sso->xuanxuan = array('link' => '客户端集成|admin|xuanxuan', 'subModule' => 'client');
$lang->admin->subMenuOrder->sso[4] = 'xuanxuan';
$lang->admin->subMenu->xuanxuan = new stdclass();
$lang->admin->subMenu->xuanxuan->setting = array('link' => '参数|admin|xuanxuan');
$lang->admin->subMenu->xuanxuan->update = array('link' => '更新|client|browse', 'subModule' => 'client');
$lang->admin->subMenuOrder->xuanxuan[0] = 'setting';
$lang->admin->subMenuOrder->xuanxuan[5] = 'update';
$lang->menugroup->client = 'admin';
@@ -1,43 +0,0 @@
<?php
/**
* The common modal footer view file of RanZhi.
*
* @copyright Copyright 2009-2016 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Xiying Guan <guanxiying@xirangit.com>
* @package RanZhi
* @version $Id$
* @link http://www.ranzhico.com
*/
?>
<?php if(helper::isAjaxRequest()):?>
</div>
</div>
</div>
<?php if(isset($pageJS)) js::execute($pageJS);?>
<script>
$(function()
{
var options =
{
language: '<?php echo $this->app->getClientLang(); ?>',
weekStart: 1,
todayBtn: 1,
autoclose: 1,
todayHighlight: 1,
startView: 2,
forceParse: 0,
showMeridian: 1,
format: 'yyyy-mm-dd hh:ii'
}
$('.form-datetime').datetimepicker(options);
$('.form-date').datetimepicker($.extend(options, {minView: 2, format: 'yyyy-mm-dd'}));
$('.form-time').datetimepicker($.extend(options, {eleClass: 'only-pick-time', startView: 1, minView: 0, maxView: 1, format: 'hh:ii'}));
$('.form-month').datetimepicker($.extend(options, {startView: 3, minView: 3, format: 'yyyy-mm'}));
$('.chosen').chosen();
});
</script>
<?php else:?>
<?php include $this->app->getAppRoot() . 'module/common/view/footer.html.php'; ?>
<?php endif;?>
@@ -1,43 +0,0 @@
<?php
/**
* The header.modal view of common module of RanZhi.
*
* @copyright Copyright 2009-2016 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yidong Wang <yidong@cnezsoft.com>
* @package common
* @version $Id$
* @link http://www.ranzhico.com
*/
?>
<?php if(helper::isAjaxRequest()):?>
<?php
$webRoot = $config->webRoot;
$jsRoot = $webRoot . "js/";
$themeRoot = $webRoot . "theme/";
$modalSizeList = array('lg' => '900px', 'sm' => '300px');
if(!isset($modalWidth)) $modalWidth = 700;
if(is_numeric($modalWidth))
{
$modalWidth .= 'px';
}
else if(isset($modalSizeList[$modalWidth]))
{
$modalWidth = $modalSizeList[$modalWidth];
}
if(isset($pageCSS)) css::internal($pageCSS);
?>
<style>
#ajaxForm .table tr:first-child td:nth-child(3){width:5px;}
</style>
<div class="modal-dialog" style="width:<?php echo $modalWidth;?>;">
<div class="modal-content">
<div class="modal-header">
<?php echo html::closeButton();?>
<strong class="modal-title"><?php if(!empty($title)) echo $title; ?></strong>
<?php if(!empty($subtitle)) echo "<label class='text-important'>" . $subtitle . '</label>'; ?>
</div>
<div class="modal-body">
<?php else:?>
<?php include $this->app->getAppRoot() . 'module/common/view/header.html.php';?>
<?php endif;?>
+11 -1
View File
@@ -47,7 +47,17 @@ class entry extends control
$this->user->cleanLocked($user->account);
$user->admin = strpos($this->app->company->admins, ",{$user->account},") !== false;
$user->lastTime = $user->last;
$user->last = date(DT_DATETIME1, $user->last);
$user->admin = strpos($this->app->company->admins, ",{$user->account},") !== false;
$user->modifyPassword = ($user->visits == 0 and !empty($this->config->safe->modifyPasswordFirstLogin));
if($user->modifyPassword) $user->modifyPasswordReason = 'modifyPasswordFirstLogin';
if(!$user->modifyPassword and !empty($this->config->safe->changeWeak))
{
$user->modifyPassword = $this->loadModel('admin')->checkWeak($user);
if($user->modifyPassword) $user->modifyPasswordReason = 'weak';
}
$user->rights = $this->user->authorize($user->account);
$user->groups = $this->user->getGroups($user->account);
$user->view = $this->user->grantUserView($user->account, $user->rights['acls']);