Merge branch 'master' of github.com:easysoft/zentaopms
This commit is contained in:
+3
-3
@@ -17,7 +17,7 @@ if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* Basic settings. */
|
||||
$config = new config();
|
||||
$config->version = '4.2'; // The version of zentaopms. Don't change it.
|
||||
$config->version = '5.0.beta1'; // The version of zentaopms. Don't change it.
|
||||
$config->charset = 'UTF-8'; // The charset of zentaopms.
|
||||
$config->cookieLife = time() + 2592000; // The cookie life time.
|
||||
$config->timezone = 'Asia/Shanghai'; // The time zone setting, for more see http://www.php.net/manual/en/timezones.php
|
||||
@@ -134,7 +134,7 @@ define('TABLE_FILE', '`' . $config->db->prefix . 'file`');
|
||||
define('TABLE_HISTORY', '`' . $config->db->prefix . 'history`');
|
||||
define('TABLE_EXTENSION', '`' . $config->db->prefix . 'extension`');
|
||||
define('TABLE_WEBAPP', '`' . $config->db->prefix . 'webapp`');
|
||||
define('TABLE_CUSTOM', '`' . $config->db->prefix . 'custom`');
|
||||
define('TABLE_LANG', '`' . $config->db->prefix . 'lang`');
|
||||
|
||||
$config->objectTables['product'] = TABLE_PRODUCT;
|
||||
$config->objectTables['story'] = TABLE_STORY;
|
||||
@@ -151,7 +151,7 @@ $config->objectTables['user'] = TABLE_USER;
|
||||
$config->objectTables['doc'] = TABLE_DOC;
|
||||
$config->objectTables['doclib'] = TABLE_DOCLIB;
|
||||
$config->objectTables['todo'] = TABLE_TODO;
|
||||
$config->objectTables['custom'] = TABLE_CUSTOM;
|
||||
$config->objectTables['custom'] = TABLE_LANG;
|
||||
|
||||
/* Include extension config files. */
|
||||
$extConfigFiles = glob($configRoot . 'ext/*.php');
|
||||
|
||||
+1
-2
@@ -1,4 +1,4 @@
|
||||
CREATE TABLE IF NOT EXISTS `zt_custom` (
|
||||
CREATE TABLE IF NOT EXISTS `zt_lang` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
`lang` varchar(30) NOT NULL,
|
||||
`module` varchar(30) NOT NULL,
|
||||
@@ -9,4 +9,3 @@ CREATE TABLE IF NOT EXISTS `zt_custom` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
|
||||
+15
-4
@@ -139,12 +139,10 @@ CREATE TABLE IF NOT EXISTS `zt_company` (
|
||||
`zipcode` char(10) default NULL,
|
||||
`website` char(120) default NULL,
|
||||
`backyard` char(120) default NULL,
|
||||
`pms` char(120) default NULL,
|
||||
`guest` enum('1','0') NOT NULL default '0',
|
||||
`admins` char(255) default NULL,
|
||||
`deleted` enum('0','1') NOT NULL default '0',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `pms` (`pms`)
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_config`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_config` (
|
||||
@@ -157,6 +155,18 @@ CREATE TABLE IF NOT EXISTS `zt_config` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `unique` (`owner`,`module`,`section`,`key`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_lang`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_lang` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
`lang` varchar(30) NOT NULL,
|
||||
`module` varchar(30) NOT NULL,
|
||||
`section` varchar(30) NOT NULL,
|
||||
`key` varchar(60) NOT NULL,
|
||||
`value` text NOT NULL,
|
||||
`system` enum('0','1') NOT NULL default '1',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_dept`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_dept` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
@@ -225,8 +235,9 @@ CREATE TABLE IF NOT EXISTS `zt_extension` (
|
||||
`license` text NOT NULL,
|
||||
`type` varchar(20) NOT NULL default 'extension',
|
||||
`site` varchar(150) NOT NULL,
|
||||
`zentaoVersion` varchar(100) NOT NULL,
|
||||
`zentaoCompatible` varchar(100) NOT NULL,
|
||||
`installedTime` datetime NOT NULL,
|
||||
`depends` varchar(100) NOT NULL,
|
||||
`dirs` text NOT NULL,
|
||||
`files` text NOT NULL,
|
||||
`status` varchar(20) NOT NULL,
|
||||
|
||||
@@ -1369,7 +1369,7 @@ class router
|
||||
/* Set the files to include. */
|
||||
if(!is_file($mainConfigFile))
|
||||
{
|
||||
if($exitIfNone) self::error("config file $mainConfigFile not found", __FILE__, __LINE__, true);
|
||||
if($exitIfNone) self::triggerError("config file $mainConfigFile not found", __FILE__, __LINE__, true);
|
||||
if(empty($extConfigFiles) and !isset($config->system->$moduleName)) return false; // and no extension file or extension in db, exit.
|
||||
$configFiles = $extConfigFiles;
|
||||
}
|
||||
@@ -1505,7 +1505,7 @@ class router
|
||||
*/
|
||||
private function connectByPDO($params)
|
||||
{
|
||||
if(!isset($params->driver)) self::error('no pdo driver defined, it should be mysql or sqlite', __FILE__, __LINE__, $exit = true);
|
||||
if(!isset($params->driver)) self::triggerError('no pdo driver defined, it should be mysql or sqlite', __FILE__, __LINE__, $exit = true);
|
||||
if(!isset($params->user)) return false;
|
||||
if($params->driver == 'mysql')
|
||||
{
|
||||
@@ -1530,7 +1530,7 @@ class router
|
||||
}
|
||||
catch (PDOException $exception)
|
||||
{
|
||||
self::error($exception->getMessage(), __FILE__, __LINE__, $exit = true);
|
||||
self::triggerError($exception->getMessage(), __FILE__, __LINE__, $exit = true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -221,6 +221,7 @@ class bug extends control
|
||||
{
|
||||
$this->view->users = $this->user->getPairs('nodeleted,devfirst');
|
||||
if(empty($this->products)) $this->locate($this->createLink('product', 'create'));
|
||||
$this->app->loadLang('release');
|
||||
|
||||
if(!empty($_POST))
|
||||
{
|
||||
@@ -237,7 +238,9 @@ class bug extends control
|
||||
|
||||
$actionID = $this->action->create('bug', $bugID, 'Opened');
|
||||
$this->sendmail($bugID, $actionID);
|
||||
$response['locate'] = $this->createLink('bug', 'browse', "productID={$this->post->product}&type=byModule¶m={$this->post->module}");
|
||||
|
||||
$location = $this->createLink('bug', 'browse', "productID={$this->post->product}&type=byModule¶m={$this->post->module}");
|
||||
$response['locate'] = isset($_SESSION['bugList']) ? $this->session->bugList : $location;
|
||||
$this->send($response);
|
||||
}
|
||||
|
||||
@@ -305,9 +308,10 @@ class bug extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$builds = $this->loadModel('build')->getProductBuildPairs($productID, 'noempty');
|
||||
$builds = $this->loadModel('build')->getProductBuildPairs($productID, 'noempty,release');
|
||||
$stories = $this->story->getProductStoryPairs($productID);
|
||||
}
|
||||
|
||||
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->create;
|
||||
$this->view->position[] = html::a($this->createLink('bug', 'browse', "productID=$productID"), $this->products[$productID]);
|
||||
$this->view->position[] = $this->lang->bug->create;
|
||||
|
||||
+28
-18
@@ -5,12 +5,14 @@ $(function()
|
||||
if(typeof page == 'undefined') page = '';
|
||||
if(page == 'create')
|
||||
{
|
||||
productID = $('#product').val();
|
||||
changeProductConfirmed = true;
|
||||
oldStoryID = 0;
|
||||
oldProjectID = 0;
|
||||
oldOpenedBuild = '';
|
||||
oldTaskID = 0;
|
||||
setAssignedTo();
|
||||
setAssignedTo(0,productID);
|
||||
notice();
|
||||
}
|
||||
|
||||
if(page == 'create' || page == 'edit' || page == 'assignedto' || page == 'confirmbug')
|
||||
@@ -42,10 +44,9 @@ function loadAll(productID)
|
||||
$('#taskIdBox').innerHTML = '<select id="task"></select>'; // Reset the task.
|
||||
$('#task').chosen({no_results_text: noResultsMatch});
|
||||
loadProductModules(productID);
|
||||
loadProductStories(productID);
|
||||
loadProductProjects(productID);
|
||||
loadProductBuilds(productID);
|
||||
loadProductPlans(productID);
|
||||
loadProductStories(productID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +102,7 @@ function loadProductBuilds(productID)
|
||||
|
||||
if(page == 'create')
|
||||
{
|
||||
$('#buildBox').load(link);
|
||||
$('#buildBox').load(link, function(){ notice(); });
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -161,20 +162,6 @@ function loadProjectStories(projectID)
|
||||
$('#storyIdBox').load(link, function(){$('#story').chosen({no_results_text:noResultsMatch});});
|
||||
}
|
||||
|
||||
/**
|
||||
* Load product plans.
|
||||
*
|
||||
* @param int $productID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadProductPlans(productID)
|
||||
{
|
||||
if(typeof(planID) == 'undefined') planID = 0;
|
||||
link = createLink('product', 'ajaxGetPlans', 'productID=' + $('#product').val() + '&planID=' + planID);
|
||||
$('#planIdBox').load(link, function(){$('#story').chosen({no_results_text:noResultsMatch});});
|
||||
}
|
||||
|
||||
/**
|
||||
* Load builds of a project.
|
||||
*
|
||||
@@ -221,3 +208,26 @@ function setStories(moduleID, productID)
|
||||
$("#story").chosen({no_results_text: ''});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* notice for create build.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function notice()
|
||||
{
|
||||
if($('#openedBuild').find('option').length <= 1)
|
||||
{
|
||||
if($('#project').val() == '')
|
||||
{
|
||||
$('#buildBox').append('<a href="' + createLink('release', 'create','productID=' + $('#product').val()) + '" target="_blank">' + createRelease + '</a>');
|
||||
$('#buildBox').append('<a href="javascript:loadProductBuilds(' + $('#product').val() + ')">' + refresh + '</a>');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#buildBox').append('<a href="' + createLink('build', 'create','projectID=' + $('#project').val()) + '" target="_blank">' + createBuild + '</a>');
|
||||
$('#buildBox').append('<a href="javascript:loadProjectBuilds(' + $('project').val() + ')">' + refresh + '</a>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ $lang->bug->assignTo = 'Assign';
|
||||
$lang->bug->browse = 'Browse Bug';
|
||||
$lang->bug->view = 'Bug Info';
|
||||
$lang->bug->resolve = 'Resolve';
|
||||
$lang->bug->barchResolve = 'batchResolve';
|
||||
$lang->bug->batchResolve = 'Batch resolve';
|
||||
$lang->bug->close = 'Close';
|
||||
$lang->bug->activate = 'Activate';
|
||||
$lang->bug->reportChart = 'Report';
|
||||
|
||||
@@ -73,16 +73,18 @@ $lang->bug->index = '首頁';
|
||||
$lang->bug->create = '提Bug';
|
||||
$lang->bug->batchCreate = '批量添加';
|
||||
$lang->bug->confirmBug = '確認';
|
||||
$lang->bug->batchConfirm = '批量確認';
|
||||
$lang->bug->edit = '編輯';
|
||||
$lang->bug->batchEdit = '批量編輯';
|
||||
$lang->bug->batchEdit = '批量編輯';
|
||||
$lang->bug->assignTo = '指派';
|
||||
$lang->bug->browse = 'Bug列表';
|
||||
$lang->bug->view = 'Bug詳情';
|
||||
$lang->bug->resolve = '解決';
|
||||
$lang->bug->batchResolve = '批量解決';
|
||||
$lang->bug->close = '關閉';
|
||||
$lang->bug->activate = '激活';
|
||||
$lang->bug->reportChart = '報表統計';
|
||||
$lang->bug->export = '導出';
|
||||
$lang->bug->export = '導出數據';
|
||||
$lang->bug->delete = '刪除';
|
||||
$lang->bug->saveTemplate = '保存模板';
|
||||
$lang->bug->deleteTemplate = '刪除模板';
|
||||
|
||||
@@ -18,6 +18,9 @@ include '../../common/view/alert.html.php';
|
||||
include '../../common/view/kindeditor.html.php';
|
||||
js::set('holders', $lang->bug->placeholder);
|
||||
js::set('page', 'create');
|
||||
js::set('createRelease', $lang->release->create);
|
||||
js::set('createBuild', $lang->build->create);
|
||||
js::set('refresh', $lang->refresh);
|
||||
?>
|
||||
|
||||
<form method='post' enctype='multipart/form-data' id='dataform' class='ajaxForm'>
|
||||
@@ -26,7 +29,7 @@ js::set('page', 'create');
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->bug->lblProductAndModule;?></th>
|
||||
<td>
|
||||
<?php echo html::select('product', $products, $productID, "onchange=loadAll(this.value) class='select-3'");?>
|
||||
<?php echo html::select('product', $products, $productID, "onchange=loadAll(this.value) class='select-3' autocomplete='off'");?>
|
||||
<span id='moduleIdBox'>
|
||||
<?php
|
||||
echo html::select('module', $moduleOptionMenu, $moduleID, "onchange='loadModuleRelated()'");
|
||||
@@ -41,20 +44,13 @@ js::set('page', 'create');
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->bug->project;?></th>
|
||||
<td><span id='projectIdBox'><?php echo html::select('project', $projects, $projectID, 'class=select-3 onchange=loadProjectRelated(this.value)');?></span></td>
|
||||
<td><span id='projectIdBox'><?php echo html::select('project', $projects, $projectID, 'class=select-3 onchange=loadProjectRelated(this.value) autocomplete="off"');?></span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->bug->openedBuild;?></th>
|
||||
<td>
|
||||
<span id='buildBox'>
|
||||
<?php
|
||||
echo html::select('openedBuild[]', $builds, $buildID, 'size=3 multiple=multiple class=select-3');
|
||||
if(count($builds) == 1 and $projectID)
|
||||
{
|
||||
echo html::a($this->createLink('build', 'create', "projectID=$projectID"), $lang->build->create, '_blank');
|
||||
echo html::a("javascript:loadProjectsBuilds($projectID)", $lang->refresh);
|
||||
}
|
||||
?>
|
||||
<?php echo html::select('openedBuild[]', $builds, $buildID, 'size=4 multiple=multiple class=select-3');?>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -39,13 +39,23 @@ class build extends control
|
||||
$this->project->setMenu($this->project->getPairs(), $projectID);
|
||||
|
||||
/* Get stories and bugs. */
|
||||
$orderBy = 'status_asc, stage_asc, id_desc';
|
||||
$stories = $this->story->getProjectStories($projectID, $orderBy);
|
||||
$bugs = $this->bug->getProjectBugs($projectID);
|
||||
foreach($bugs as $key => $bug)
|
||||
$orderBy = 'status_asc, stage_asc, id_desc';
|
||||
$stories = $this->story->getProjectStories($projectID, $orderBy);
|
||||
$projectBugs = $this->bug->getProjectBugs($projectID);
|
||||
$bugs = array();
|
||||
foreach($projectBugs as $key => $bug)
|
||||
{
|
||||
if($bug->status == 'closed') unset($bugs[$key]);
|
||||
if($bug->status == 'resolved')
|
||||
{
|
||||
$bugs[$key] = $bug;
|
||||
unset($projectBugs[$key]);
|
||||
}
|
||||
else if($bug->status == 'closed')
|
||||
{
|
||||
unset($projectBugs[$key]);
|
||||
}
|
||||
}
|
||||
$bugs += $projectBugs;
|
||||
|
||||
/* Assign. */
|
||||
$project = $this->loadModel('project')->getById($projectID);
|
||||
@@ -197,9 +207,9 @@ class build extends control
|
||||
*/
|
||||
public function ajaxGetProductBuilds($productID, $varName, $build = '', $index = 0)
|
||||
{
|
||||
if($varName == 'openedBuild' ) die(html::select($varName . '[]', $this->build->getProductBuildPairs($productID, 'noempty'), $build, 'size=4 class=select-3 multiple'));
|
||||
if($varName == 'openedBuilds' ) die(html::select($varName . "[$index][]", $this->build->getProductBuildPairs($productID, 'noempty'), $build, 'size=4 class=select-3 multiple'));
|
||||
if($varName == 'resolvedBuild') die(html::select($varName, $this->build->getProductBuildPairs($productID, 'noempty'), $build, 'class=select-3'));
|
||||
if($varName == 'openedBuild' ) die(html::select($varName . '[]', $this->build->getProductBuildPairs($productID, 'noempty,release'), $build, 'size=4 class=select-3 multiple'));
|
||||
if($varName == 'openedBuilds' ) die(html::select($varName . "[$index][]", $this->build->getProductBuildPairs($productID, 'noempty,release'), $build, 'size=4 class=select-3 multiple'));
|
||||
if($varName == 'resolvedBuild') die(html::select($varName, $this->build->getProductBuildPairs($productID, 'noempty,release'), $build, 'class=select-3'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -217,7 +227,7 @@ class build extends control
|
||||
{
|
||||
if($varName == 'openedBuild')
|
||||
{
|
||||
$builds = $this->build->getProjectBuildPairs($projectID, $productID, 'noempty');
|
||||
$builds = $this->build->getProjectBuildPairs($projectID, $productID, 'noempty,release');
|
||||
$output = html::select($varName . '[]', $builds , $build, 'size=4 class=select-3 multiple');
|
||||
if(count($builds) == 1 and $needCreate)
|
||||
{
|
||||
|
||||
+19
-2
@@ -96,10 +96,27 @@ class buildModel extends model
|
||||
if(strpos($params, 'noempty') === false) $sysBuilds = array('' => '');
|
||||
if(strpos($params, 'notrunk') === false) $sysBuilds = $sysBuilds + array('trunk' => 'Trunk');
|
||||
|
||||
$builds = $this->dao->select('id,name')->from(TABLE_BUILD)
|
||||
$productBuilds = $this->dao->select('id,name,project')->from(TABLE_BUILD)
|
||||
->where('product')->in($products)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->orderBy('date desc, id desc')->fetchPairs();
|
||||
->orderBy('date desc, id desc')->fetchAll('id');
|
||||
$releases = $this->dao->select('build,name,deleted')->from(TABLE_RELEASE)
|
||||
->where('product')->in($products)
|
||||
->fetchAll('build');
|
||||
|
||||
$builds = array();
|
||||
foreach($productBuilds as $key => $build)
|
||||
{
|
||||
if($build->project)
|
||||
{
|
||||
$builds[$key] = isset($releases[$key]) ? $releases[$key]->name : $build->name;
|
||||
}
|
||||
else if(isset($releases[$key]) and !$releases[$key]->deleted)
|
||||
{
|
||||
$builds[$key] = $releases[$key]->name;
|
||||
}
|
||||
}
|
||||
|
||||
if(!$builds) return $sysBuilds;
|
||||
return $sysBuilds + $builds;
|
||||
}
|
||||
|
||||
@@ -316,6 +316,7 @@ $lang->menugroup->dept = 'company';
|
||||
$lang->menugroup->todo = 'my';
|
||||
$lang->menugroup->action = 'admin';
|
||||
$lang->menugroup->extension = 'admin';
|
||||
$lang->menugroup->custom = 'admin';
|
||||
$lang->menugroup->editor = 'admin';
|
||||
$lang->menugroup->mail = 'admin';
|
||||
$lang->menugroup->sso = 'admin';
|
||||
|
||||
@@ -272,24 +272,27 @@ $lang->admin = new stdclass();
|
||||
$lang->admin->menu = new stdclass();
|
||||
$lang->admin->menu->index = array('link' => '首頁|admin|index');
|
||||
$lang->admin->menu->extension = array('link' => '擴展|extension|browse', 'subModule' => 'extension,editor');
|
||||
$lang->admin->menu->custom = array('link' => '自定義|custom|index', 'subModule' => 'custom');
|
||||
$lang->admin->menu->mail = array('link' => '發信|mail|index', 'subModule' => 'mail');
|
||||
$lang->admin->menu->clearData = array('link' => '清除數據|admin|cleardata');
|
||||
$lang->admin->menu->convert = array('link' => '導入|convert|index', 'subModule' => 'convert');
|
||||
$lang->admin->menu->trashes = array('link' => '資源回收筒|action|trash', 'subModule' => 'action');
|
||||
$lang->admin->menu->sso = array('link' => '單點登錄|sso|browse', 'subModule' => 'sso');
|
||||
|
||||
$lang->convert = new stdclass();
|
||||
$lang->upgrade = new stdclass();
|
||||
$lang->action = new stdclass();
|
||||
$lang->extension = new stdclass();
|
||||
$lang->editor = new stdclass();
|
||||
$lang->mail = new stdclass();
|
||||
$lang->sso = new stdclass();
|
||||
$lang->convert = new stdclass();
|
||||
$lang->upgrade = new stdclass();
|
||||
$lang->action = new stdclass();
|
||||
$lang->extension = new stdclass();
|
||||
$lang->custom = new stdclass();
|
||||
$lang->editor = new stdclass();
|
||||
$lang->mail = new stdclass();
|
||||
$lang->sso = new stdclass();
|
||||
|
||||
$lang->convert->menu = $lang->admin->menu;
|
||||
$lang->upgrade->menu = $lang->admin->menu;
|
||||
$lang->action->menu = $lang->admin->menu;
|
||||
$lang->extension->menu = $lang->admin->menu;
|
||||
$lang->custom->menu = $lang->admin->menu;
|
||||
$lang->editor->menu = $lang->admin->menu;
|
||||
$lang->mail->menu = $lang->admin->menu;
|
||||
$lang->sso->menu = $lang->admin->menu;
|
||||
@@ -313,6 +316,7 @@ $lang->menugroup->dept = 'company';
|
||||
$lang->menugroup->todo = 'my';
|
||||
$lang->menugroup->action = 'admin';
|
||||
$lang->menugroup->extension = 'admin';
|
||||
$lang->menugroup->custom = 'admin';
|
||||
$lang->menugroup->editor = 'admin';
|
||||
$lang->menugroup->mail = 'admin';
|
||||
$lang->menugroup->sso = 'admin';
|
||||
|
||||
@@ -126,6 +126,7 @@ class commonModel extends model
|
||||
*/
|
||||
public function loadCustomFromDB()
|
||||
{
|
||||
if(defined('IN_UPGRADE')) return;
|
||||
if(!$this->config->db->name) return;
|
||||
$records = $this->loadModel('custom')->getAll();
|
||||
if(!$records) return;
|
||||
@@ -153,7 +154,7 @@ class commonModel extends model
|
||||
if(stripos($method, 'downnotify') !== false) return true;
|
||||
}
|
||||
|
||||
if(stripos($method, 'ajaxgetdropmenu') !== false) return true;
|
||||
if(stripos($method, 'ajaxgetdropmenu') !== false and $this->app->user->account == 'guest') return true;
|
||||
if($module == 'misc' and $method == 'qrcode') return true;
|
||||
if($module == 'misc' and $method == 'about') return true;
|
||||
if($module == 'misc' and $method == 'checkupdate') return true;
|
||||
@@ -611,13 +612,14 @@ class commonModel extends model
|
||||
if(empty($queryCondition) or $this->session->$typeOnlyCondition)
|
||||
{
|
||||
$objects = $this->dao->select('*')->from($table)
|
||||
->beginIF($queryCondition != false)->where($queryCondition)->fi()
|
||||
->where('id')->eq($objectID)
|
||||
->beginIF($queryCondition != false)->orWhere($queryCondition)->fi()
|
||||
->beginIF($orderBy != false)->orderBy($orderBy)->fi()
|
||||
->fetchAll();
|
||||
}
|
||||
else
|
||||
{
|
||||
$objects = $this->dbh->query($queryCondition . " ORDER BY $orderBy")->fetchAll();
|
||||
$objects = $this->dbh->query($queryCondition . "OR id=$objectID ORDER BY $orderBy")->fetchAll();
|
||||
}
|
||||
|
||||
$tmpObjectIDs = array();
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
$lang->custom->common = '自定義';
|
||||
$lang->custom->index = '首頁';
|
||||
$lang->custom->set = '自定義配置';
|
||||
$lang->custom->restore = '恢復預設';
|
||||
$lang->custom->key = '鍵';
|
||||
$lang->custom->value = '值';
|
||||
|
||||
$lang->custom->story = '需求';
|
||||
$lang->custom->task = '任務';
|
||||
$lang->custom->bug = 'Bug';
|
||||
$lang->custom->testcase = '測試用例';
|
||||
$lang->custom->testtask = '測試任務';
|
||||
$lang->custom->todo = '待辦';
|
||||
$lang->custom->user = '用戶';
|
||||
|
||||
$lang->custom->currentLang = '適用當前語言';
|
||||
$lang->custom->allLang = '適用所有語言';
|
||||
|
||||
$lang->custom->confirmRestore = '是否要恢復預設語言配置?';
|
||||
@@ -19,7 +19,7 @@ class customModel extends model
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
$allCustomLang = $this->dao->select('*')->from(TABLE_CUSTOM)->orderBy('lang,id')->fetchAll('id');
|
||||
$allCustomLang = $this->dao->select('*')->from(TABLE_LANG)->orderBy('lang,id')->fetchAll('id');
|
||||
|
||||
$currentLang = $this->app->getClientLang();
|
||||
$processedLang = array();
|
||||
@@ -59,7 +59,7 @@ class customModel extends model
|
||||
$item->value = $value;
|
||||
$item->system = $system;
|
||||
|
||||
$this->dao->replace(TABLE_CUSTOM)->data($item)->exec();
|
||||
$this->dao->replace(TABLE_LANG)->data($item)->exec();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -116,7 +116,7 @@ class customModel extends model
|
||||
*/
|
||||
public function createDAO($params, $method = 'select')
|
||||
{
|
||||
return $this->dao->$method('*')->from(TABLE_CUSTOM)->where('1 = 1')
|
||||
return $this->dao->$method('*')->from(TABLE_LANG)->where('1 = 1')
|
||||
->beginIF($params['lang'])->andWhere('lang')->in($params['lang'])->fi()
|
||||
->beginIF($params['module'])->andWhere('module')->in($params['module'])->fi()
|
||||
->beginIF($params['section'])->andWhere('section')->in($params['section'])->fi()
|
||||
|
||||
@@ -903,3 +903,39 @@ $lang->changelog['4.0'][] = 'action-hideOne';
|
||||
$lang->changelog['4.0'][] = 'action-hideAll';
|
||||
$lang->changelog['4.0'][] = 'task-editEstimate';
|
||||
$lang->changelog['4.0'][] = 'task-deleteEstimate';
|
||||
|
||||
$lang->changelog['4.1'][] = 'todo-batchFinish';
|
||||
$lang->changelog['4.1'][] = 'productplan-batchUnlinkStory';
|
||||
$lang->changelog['4.1'][] = 'company-view';
|
||||
$lang->changelog['4.1'][] = 'user-story';
|
||||
$lang->changelog['4.1'][] = 'user-testTask';
|
||||
$lang->changelog['4.1'][] = 'user-testCase';
|
||||
|
||||
$lang->changelog['4.2.beta'][] = 'tree-browseTask';
|
||||
|
||||
$lang->changelog['4.3.beta'][] = 'product-batchEdit';
|
||||
$lang->changelog['4.3.beta'][] = 'project-batchEdit';
|
||||
$lang->changelog['4.3.beta'][] = 'story-batchReview';
|
||||
$lang->changelog['4.3.beta'][] = 'story-batchChangePlan';
|
||||
$lang->changelog['4.3.beta'][] = 'story-batchChangeStage';
|
||||
$lang->changelog['4.3.beta'][] = 'productplan-linkBug';
|
||||
$lang->changelog['4.3.beta'][] = 'productplan-unlinkBug';
|
||||
$lang->changelog['4.3.beta'][] = 'productplan-batchUnlinkBug';
|
||||
$lang->changelog['4.3.beta'][] = 'bug-batchCreate';
|
||||
$lang->changelog['4.3.beta'][] = 'testcase-exportTemplet';
|
||||
$lang->changelog['4.3.beta'][] = 'testcase-import';
|
||||
$lang->changelog['4.3.beta'][] = 'testcase-showImport';
|
||||
$lang->changelog['4.3.beta'][] = 'testcase-confirmChange';
|
||||
$lang->changelog['4.3.beta'][] = 'mail-reset';
|
||||
$lang->changelog['4.3.beta'][] = 'sso-browse';
|
||||
$lang->changelog['4.3.beta'][] = 'sso-create';
|
||||
$lang->changelog['4.3.beta'][] = 'sso-edit';
|
||||
$lang->changelog['4.3.beta'][] = 'sso-delete';
|
||||
$lang->changelog['4.3.beta'][] = 'api-debug';
|
||||
$lang->changelog['4.3.beta'][] = 'action-editComment';
|
||||
|
||||
$lang->changelog['5.0.beta1'][] = 'bug-batchConfirm';
|
||||
$lang->changelog['5.0.beta1'][] = 'bug-batchResolve';
|
||||
$lang->changelog['5.0.beta1'][] = 'custom-index';
|
||||
$lang->changelog['5.0.beta1'][] = 'custom-set';
|
||||
$lang->changelog['5.0.beta1'][] = 'custom-restore';
|
||||
|
||||
@@ -487,9 +487,9 @@ class product extends control
|
||||
* Drop menu page.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param int $module
|
||||
* @param int $method
|
||||
* @param int $extra
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param string $extra
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
|
||||
@@ -140,11 +140,10 @@ var browseType = '<?php echo $browseType;?>';
|
||||
<td colspan='<?php echo $columns;?>'>
|
||||
<div class='f-left'>
|
||||
<?php
|
||||
$canBatchEdit = common::hasPriv('task', 'batchEdit');
|
||||
$canBatchClose = common::hasPriv('task', 'batchClose') and strtolower($browseType) != 'closedBy';
|
||||
if(count($tasks))
|
||||
{
|
||||
$canBatchEdit = common::hasPriv('task', 'batchEdit');
|
||||
$canBatchClose = common::hasPriv('task', 'batchClose') and strtolower($browseType) != 'closedBy';
|
||||
|
||||
echo "<div class='groupButton'>";
|
||||
echo html::selectAll() . html::selectReverse();
|
||||
echo "</div>";
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
$config->sso = new stdclass();
|
||||
$config->sso->create = new stdclass();
|
||||
$config->sso->create->requiredFields = 'title,code,key,ip';
|
||||
$config->sso->edit = new stdclass();
|
||||
|
||||
@@ -28,7 +28,7 @@ $lang->story->tasks = "相關任務";
|
||||
$lang->story->taskCount = '任務數';
|
||||
$lang->story->bugs = "Bug";
|
||||
$lang->story->linkStory = '關聯需求';
|
||||
$lang->story->export = "導出";
|
||||
$lang->story->export = "導出數據";
|
||||
$lang->story->reportChart = "統計報表";
|
||||
$lang->story->batchChangePlan = "批量修改計劃";
|
||||
$lang->story->batchChangeStage = "批量修改階段";
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
<table class='table-1 fixed'>
|
||||
<tr>
|
||||
<td>
|
||||
<?php
|
||||
<?php
|
||||
foreach($story->tasks as $projectTasks)
|
||||
{
|
||||
foreach($projectTasks as $task)
|
||||
|
||||
@@ -25,7 +25,7 @@ $lang->task->close = "關閉";
|
||||
$lang->task->batchClose = "批量關閉";
|
||||
$lang->task->cancel = "取消";
|
||||
$lang->task->activate = "激活";
|
||||
$lang->task->export = "導出";
|
||||
$lang->task->export = "導出數據";
|
||||
$lang->task->reportChart = "報表統計";
|
||||
$lang->task->fromBug = '來源Bug';
|
||||
$lang->task->confirmStoryChange = "確認需求變動";
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
$config->testcase = new stdclass();
|
||||
$config->testcase->defaultSteps = 3;
|
||||
$config->testcase->batchCreate = 10;
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ $lang->testcase->import = "導入";
|
||||
$lang->testcase->importID = "行號";
|
||||
$lang->testcase->showImport = "顯示導入內容";
|
||||
$lang->testcase->exportTemplet = "導出模板";
|
||||
$lang->testcase->export = "導出";
|
||||
$lang->testcase->export = "導出數據";
|
||||
$lang->testcase->confirmChange = '確認用例變動';
|
||||
$lang->testcase->confirmStoryChange = '確認需求變動';
|
||||
|
||||
@@ -135,13 +135,6 @@ $lang->testcase->stageList['system'] = '系統測試階段';
|
||||
$lang->testcase->stageList['smoke'] = '冒煙測試階段';
|
||||
$lang->testcase->stageList['bvt'] = '版本驗證階段';
|
||||
|
||||
$lang->testcase->stageListAB['unittest'] = '單元';
|
||||
$lang->testcase->stageListAB['feature'] = '功能';
|
||||
$lang->testcase->stageListAB['intergrate'] = '整合';
|
||||
$lang->testcase->stageListAB['system'] = '系統';
|
||||
$lang->testcase->stageListAB['smoke'] = '冒煙';
|
||||
$lang->testcase->stageListAB['bvt'] = '版本';
|
||||
|
||||
$lang->testcase->statusList[''] = '';
|
||||
$lang->testcase->statusList['normal'] = '正常';
|
||||
$lang->testcase->statusList['blocked'] = '被阻塞';
|
||||
|
||||
@@ -303,7 +303,14 @@ class tree extends control
|
||||
*/
|
||||
public function ajaxGetOptionMenu($rootID, $viewType = 'story', $rootModuleID = 0, $returnType = 'html', $needManage = false)
|
||||
{
|
||||
$optionMenu = $this->tree->getOptionMenu($rootID, $viewType, $rootModuleID);
|
||||
if($viewType = 'task')
|
||||
{
|
||||
$optionMenu = $this->tree->getTaskOptionMenu($rootID);
|
||||
}
|
||||
else
|
||||
{
|
||||
$optionMenu = $this->tree->getOptionMenu($rootID, $viewType, $rootModuleID);
|
||||
}
|
||||
if($returnType == 'html')
|
||||
{
|
||||
$output = html::select("module", $optionMenu, '', "onchange=loadModuleRelated()");
|
||||
|
||||
@@ -72,3 +72,4 @@ $lang->upgrade->fromVersions['4_0'] = '4.0';
|
||||
$lang->upgrade->fromVersions['4_0_1'] = '4.0.1';
|
||||
$lang->upgrade->fromVersions['4_1'] = '4.1';
|
||||
$lang->upgrade->fromVersions['4_2_beta'] = '4.2.beta';
|
||||
$lang->upgrade->fromVersions['4_3_beta'] = '4.3.beta';
|
||||
|
||||
@@ -72,3 +72,4 @@ $lang->upgrade->fromVersions['4_0'] = '4.0';
|
||||
$lang->upgrade->fromVersions['4_0_1'] = '4.0.1';
|
||||
$lang->upgrade->fromVersions['4_1'] = '4.1';
|
||||
$lang->upgrade->fromVersions['4_2_beta'] = '4.2.beta';
|
||||
$lang->upgrade->fromVersions['4_3_beta'] = '4.3.beta';
|
||||
|
||||
@@ -72,3 +72,4 @@ $lang->upgrade->fromVersions['4_0'] = '4.0';
|
||||
$lang->upgrade->fromVersions['4_0_1'] = '4.0.1';
|
||||
$lang->upgrade->fromVersions['4_1'] = '4.1';
|
||||
$lang->upgrade->fromVersions['4_2_beta'] = '4.2.beta';
|
||||
$lang->upgrade->fromVersions['4_3_beta'] = '4.3.beta';
|
||||
|
||||
@@ -92,6 +92,8 @@ class upgradeModel extends model
|
||||
$this->deleteCompany();
|
||||
case '4_2_beta':
|
||||
$this->execSQL($this->getUpgradeFile('4.2'));
|
||||
case '4_3_beta':
|
||||
$this->execSQL($this->getUpgradeFile('4.3'));
|
||||
|
||||
default: if(!$this->isError()) $this->setting->updateVersion($this->config->version);
|
||||
}
|
||||
@@ -143,6 +145,7 @@ class upgradeModel extends model
|
||||
case '4_0_1': $confirmContent .= file_get_contents($this->getUpgradeFile('4.0.1'));
|
||||
case '4_1': $confirmContent .= file_get_contents($this->getUpgradeFile('4.1'));
|
||||
case '4_2_beta': $confirmContent .= file_get_contents($this->getUpgradeFile('4.2'));
|
||||
case '4_3_beta': $confirmContent .= file_get_contents($this->getUpgradeFile('4.3'));
|
||||
}
|
||||
return str_replace('zt_', $this->config->db->prefix, $confirmContent);
|
||||
}
|
||||
|
||||
@@ -53,6 +53,9 @@ $whiteList[] = 'story-commonaction';
|
||||
$whiteList[] = 'story-sendmail';
|
||||
$whiteList[] = 'webapp-ajaxaddview';
|
||||
$whiteList[] = 'report-remind';
|
||||
$whiteList[] = 'sso-auth';
|
||||
$whiteList[] = 'sso-depts';
|
||||
$whiteList[] = 'sso-users';
|
||||
|
||||
/* checking actions of every module. */
|
||||
echo '-------------action checking-----------------' . "\n";
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
/* Judge my.php exists or not. */
|
||||
define('IN_UPGRADE', true);
|
||||
$myConfig = dirname(dirname(__FILE__)) . '/config/my.php';
|
||||
if(!file_exists($myConfig))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user