admin->publicClass;?>
- admin->classURL, "{$lang->more} ", '_blank', 'class="more text-muted"');?>
+ admin->classURL, "{$lang->more} ", '_blank', 'class="more text-muted flex align-center"');?>
@@ -87,8 +87,71 @@
-
-
admin->zentaoInfo?>
+
+
+
admin->zentaoInfo?>
+
您已使用禅道05year?>09admin->day?>19日
+
+
+
+
admin->updateDynamics?>
+ admin->extensionURL, "{$lang->more}
", '_blank', 'class="more text-muted flex align-center"');?>
+
+
+
禅道18.0发布,新增自动化测试方案、使用帮助及全新IDE风格
+
2022-03-12
+
+
+
禅道18.0发布,新增自动化测试方案、使用帮助及全新IDE风格
+
2022-03-12
+
+
+
禅道18.0发布,新增自动化测试方案、使用帮助及全新IDE风格
+
2022-03-12
+
+
+
+
+
admin->updatePatch?>
+ admin->extensionURL, "{$lang->more}
", '_blank', 'class="more text-muted flex align-center"');?>
+
+ view->patches as $patch):?>
+
+
+
+
+
+
admin->upgradeRecommend?>
+ admin->extensionURL, "{$lang->more}
", '_blank', 'class="more text-muted flex align-center"');?>
+
+
+
+
工时管理、甘特图、导入导出
+
40+内置统计报表、自定义报表功能
+
强大的自定义工作流、反馈管理功能
+
+
+
+
工时管理、甘特图、导入导出
+
40+内置统计报表、自定义报表功能
+
强大的自定义工作流、反馈管理功能
+
工时管理、甘特图、导入导出
+
+
diff --git a/module/common/lang/common.php b/module/common/lang/common.php
index 4fe8f34a27..5ed798f09b 100644
--- a/module/common/lang/common.php
+++ b/module/common/lang/common.php
@@ -88,6 +88,7 @@ $lang->sonarqube = new stdclass();
$lang->app = new stdclass();
$lang->zahost = new stdclass();
$lang->zanode = new stdclass();
+$lang->holiday = new stdclass();
$lang->projectbuild = new stdclass();
$lang->projectrelease = new stdclass();
diff --git a/module/group/control.php b/module/group/control.php
index 462bd14904..6885e94cde 100644
--- a/module/group/control.php
+++ b/module/group/control.php
@@ -200,6 +200,7 @@ class group extends control
public function managePriv($type = 'byGroup', $param = 0, $menu = '', $version = '')
{
if($type == 'byGroup') $groupID = $param;
+
$this->view->type = $type;
foreach($this->lang->resource as $moduleName => $action)
{
@@ -234,6 +235,9 @@ class group extends control
if(version_compare($currentVersion, $realVersion, '>=')) $changelog[] = join(',', $currentChangeLog);
}
+ $this->lang->custom->common = $this->lang->group->config;
+ if($this->config->edition == 'max') $this->lang->baseline->common = $this->lang->group->docTemplate;
+
$this->view->group = $group;
$this->view->changelogs = ',' . join(',', $changelog) . ',';
$this->view->groupPrivs = $groupPrivs;
diff --git a/module/group/lang/de.php b/module/group/lang/de.php
index 15e565c248..6054a38372 100644
--- a/module/group/lang/de.php
+++ b/module/group/lang/de.php
@@ -64,6 +64,7 @@ $lang->group->outside = 'Andere Benutzer';
$lang->group->limited = 'Limited Users';
$lang->group->other = 'Andere';
$lang->group->all = 'Alle';
+$lang->group->config = 'Config';
$lang->group->copyOptions['copyPriv'] = 'Rechte kopieren';
$lang->group->copyOptions['copyUser'] = 'Benutzer kopieren';
diff --git a/module/group/lang/en.php b/module/group/lang/en.php
index 3f5a031f85..ae6e06027a 100644
--- a/module/group/lang/en.php
+++ b/module/group/lang/en.php
@@ -64,6 +64,7 @@ $lang->group->outside = 'Other Users';
$lang->group->limited = 'Limited Users';
$lang->group->other = 'Others';
$lang->group->all = 'All Privileges';
+$lang->group->config = 'Config';
$lang->group->copyOptions['copyPriv'] = 'Copy Privileges';
$lang->group->copyOptions['copyUser'] = 'Copy Users';
diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php
index 0e0ba4b355..81e58e3c78 100644
--- a/module/group/lang/fr.php
+++ b/module/group/lang/fr.php
@@ -64,6 +64,7 @@ $lang->group->outside = 'Autres utilisateurs';
$lang->group->limited = 'Limited Users';
$lang->group->other = 'Autres';
$lang->group->all = 'Tous les Privilèges';
+$lang->group->config = 'Config';
$lang->group->copyOptions['copyPriv'] = 'Copier Privilèges';
$lang->group->copyOptions['copyUser'] = 'Copier Utilisateurs';
diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php
index 37b350c0d9..53f4afc3e4 100644
--- a/module/group/lang/resource.php
+++ b/module/group/lang/resource.php
@@ -1418,7 +1418,6 @@ $lang->resource->custom->execution = 'execution';
$lang->resource->custom->required = 'required';
$lang->resource->custom->restore = 'restore';
$lang->resource->custom->flow = 'flow';
-$lang->resource->custom->working = 'working';
$lang->resource->custom->setPublic = 'setPublic';
$lang->resource->custom->timezone = 'timezone';
$lang->resource->custom->setStoryConcept = 'setStoryConcept';
@@ -1436,16 +1435,15 @@ $lang->custom->methodOrder[20] = 'execution';
$lang->custom->methodOrder[25] = 'required';
$lang->custom->methodOrder[30] = 'restore';
$lang->custom->methodOrder[35] = 'flow';
-$lang->custom->methodOrder[40] = 'working';
-$lang->custom->methodOrder[45] = 'setPublic';
-$lang->custom->methodOrder[50] = 'timezone';
-$lang->custom->methodOrder[55] = 'setStoryConcept';
-$lang->custom->methodOrder[60] = 'editStoryConcept';
-$lang->custom->methodOrder[65] = 'browseStoryConcept';
-$lang->custom->methodOrder[70] = 'setDefaultConcept';
-$lang->custom->methodOrder[75] = 'deleteStoryConcept';
-$lang->custom->methodOrder[80] = 'kanban';
-$lang->custom->methodOrder[85] = 'code';
+$lang->custom->methodOrder[40] = 'setPublic';
+$lang->custom->methodOrder[45] = 'timezone';
+$lang->custom->methodOrder[50] = 'setStoryConcept';
+$lang->custom->methodOrder[55] = 'editStoryConcept';
+$lang->custom->methodOrder[60] = 'browseStoryConcept';
+$lang->custom->methodOrder[65] = 'setDefaultConcept';
+$lang->custom->methodOrder[70] = 'deleteStoryConcept';
+$lang->custom->methodOrder[75] = 'kanban';
+$lang->custom->methodOrder[80] = 'code';
$lang->resource->datatable = new stdclass();
$lang->resource->datatable->setGlobal = 'setGlobal';
@@ -1917,6 +1915,19 @@ $lang->message->methodOrder[5] = 'index';
$lang->message->methodOrder[10] = 'browser';
$lang->message->methodOrder[15] = 'setting';
+/* Holiday. */
+$lang->resource->holiday = new stdclass();
+$lang->resource->holiday->create = 'createAction';
+$lang->resource->holiday->edit = 'editAction';
+$lang->resource->holiday->delete = 'deleteAction';
+$lang->resource->holiday->browse = 'browse';
+
+$lang->holiday->methodOrder[0] = 'browse';
+$lang->holiday->methodOrder[5] = 'create';
+$lang->holiday->methodOrder[10] = 'edit';
+$lang->holiday->methodOrder[15] = 'delete';
+
+/* Action. */
$lang->resource->action = new stdclass();
$lang->resource->action->trash = 'trash';
$lang->resource->action->undelete = 'undeleteAction';
diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php
index e4d9550abe..1781a61aaf 100644
--- a/module/group/lang/zh-cn.php
+++ b/module/group/lang/zh-cn.php
@@ -64,6 +64,7 @@ $lang->group->outside = '组外用户';
$lang->group->limited = '受限用户组';
$lang->group->other = '其他模块';
$lang->group->all = '所有权限';
+$lang->group->config = '配置';
$lang->group->copyOptions['copyPriv'] = '复制权限';
$lang->group->copyOptions['copyUser'] = '复制用户';
diff --git a/module/program/css/browse.css b/module/program/css/browse.css
index 5b3190538a..fae35ad361 100644
--- a/module/program/css/browse.css
+++ b/module/program/css/browse.css
@@ -10,7 +10,7 @@ tbody.sortable > tr > td.sort-handler {color: #3c4353 !important;}
.has-prefix {position: relative; display: flex; align-items: center;}
.has-prefix > span {flex: none;}
-.has-prefix > a {padding-left: 5px;}
+.has-prefix > .icon-cards-view {padding-right: 4px;}
.has-suffix > a {max-width: calc(100% - 100px); padding-right: 5px; color: #0c60e1; display: inline-block;}
diff --git a/module/story/control.php b/module/story/control.php
index 2c743d9b1e..632789009f 100755
--- a/module/story/control.php
+++ b/module/story/control.php
@@ -73,7 +73,11 @@ class story extends control
if(empty($objectID)) $objectID = $this->session->project;
$projectID = $objectID;
- if(!$this->session->multiple) $projectID = $this->session->project;
+ if(!$this->session->multiple)
+ {
+ $projectID = $this->session->project;
+ $objectID = $this->execution->getNoMultipleID($projectID);
+ }
$projectID = isset($objects[$projectID]) ? $projectID : $this->session->project;
$projectID = $this->project->saveState($projectID, $objects);
$this->project->setMenu($projectID);
diff --git a/module/story/model.php b/module/story/model.php
index 0286aa293e..45ce2b584b 100644
--- a/module/story/model.php
+++ b/module/story/model.php
@@ -910,8 +910,10 @@ class storyModel extends model
if(!empty($_POST['plan'])) $storyPlan = is_array($_POST['plan']) ? array_filter($_POST['plan']) : array($_POST['plan']);
if(count($storyPlan) > 1)
{
- $oldStoryPlan = !empty($oldStory->planTitle) ? array_keys($oldStory->planTitle) : array();
- if(!empty(array_diff($storyPlan, $oldStoryPlan)) or !empty(array_diff($oldStoryPlan, $storyPlan)))
+ $oldStoryPlan = !empty($oldStory->planTitle) ? array_keys($oldStory->planTitle) : array();
+ $oldPlanDiff = array_diff($storyPlan, $oldStoryPlan);
+ $storyPlanDiff = array_diff($oldStoryPlan, $storyPlan);
+ if(!empty($oldPlanDiff) or !empty($storyPlanDiff))
{
dao::$errors[] = $this->lang->story->notice->changePlan;
return false;
diff --git a/module/weekly/control.php b/module/weekly/control.php
index 5c90c1c552..4a9ec4c8e9 100755
--- a/module/weekly/control.php
+++ b/module/weekly/control.php
@@ -79,6 +79,7 @@ class weekly extends control
$projects = $this->dao->select('id, name')->from(TABLE_PROJECT)
->where('deleted')->eq(0)
->andWhere('type')->eq('project')
+ ->andWhere('status')->ne('closed')
->fetchPairs();
$date = helper::today();
diff --git a/module/weekly/model.php b/module/weekly/model.php
index 3277419cc8..8dbbc819be 100755
--- a/module/weekly/model.php
+++ b/module/weekly/model.php
@@ -117,11 +117,11 @@ class weeklyModel extends model
{
$weekStart = $this->getThisMonday($date);
$report = new stdclass();
- $PVEV = $this->getPVEV($project, $date);
+ $PVEV = $this->getPVEV($project, $date, $mode = 'new');
$report->pv = $PVEV['PV'];
$report->ev = $PVEV['EV'];
- $report->ac = $this->getAC($project, $date);
+ $report->ac = $this->getAC($project, $date, $mode = 'new');
$report->sv = $this->getSV($report->ev, $report->pv);
$report->cv = $this->getCV($report->ev, $report->ac);
$report->project = $project;
@@ -372,13 +372,14 @@ class weeklyModel extends model
*
* @param int $project
* @param string $date
+ * @param string $mode
* @access public
* @return array
*/
- public function getPVEV($projectID, $date = '')
+ public function getPVEV($projectID, $date = '', $mode = 'old')
{
$report = $this->getFromDB($projectID, $date);
- if(!empty($report)) return array('PV' => $report->pv, 'EV' => $report->ev);
+ if(!empty($report) && $mode == 'old') return array('PV' => $report->pv, 'EV' => $report->ev);
if(!$date) $date = date('Y-m-d');
$lastDay = $this->getLastDay($date);
@@ -434,13 +435,14 @@ class weeklyModel extends model
*
* @param int $project
* @param string $date
+ * @param string $mode
* @access public
* @return int
*/
- public function getAC($project, $date = '')
+ public function getAC($project, $date = '', $mode = 'old')
{
$report = $this->getFromDB($project, $date);
- if(!empty($report)) return $report->ac;
+ if(!empty($report) && $mode == 'old') return $report->ac;
if(!$date) $date = date('Y-m-d');
$lastDay = $this->getLastDay($date);
diff --git a/module/weekly/view/index.html.php b/module/weekly/view/index.html.php
index 668beb1f1b..a1d6538182 100644
--- a/module/weekly/view/index.html.php
+++ b/module/weekly/view/index.html.php
@@ -72,7 +72,7 @@ $(function(){$('#exportreport').modalTrigger();});
|
weekly->cost;?> |
config->custom, 'cost', 1);?>
-
|
+
|
weekly->finished;?>
diff --git a/tools/prepareupdate.php b/tools/prepareupdate.php
index b58a09dc0c..e63de0e5c2 100755
--- a/tools/prepareupdate.php
+++ b/tools/prepareupdate.php
@@ -6,6 +6,12 @@ class prepareUpdate
public $internalZT;
public $mysqlConfig;
+ /**
+ * Construct.
+ *
+ * @access public
+ * @return void
+ */
public function __construct()
{
$this->initZT();
@@ -21,6 +27,12 @@ class prepareUpdate
$this->checkLang();
}
+ /**
+ * Init mysql config.
+ *
+ * @access public
+ * @return void
+ */
public function initMysql()
{
$this->mysqlConfig = new stdclass();
@@ -29,6 +41,12 @@ class prepareUpdate
$this->mysqlConfig->databaseName = 'zentaostandard';
}
+ /**
+ * Init zentao config.
+ *
+ * @access public
+ * @return void
+ */
public function initZT()
{
$this->internalZT = new stdclass();
@@ -44,6 +62,12 @@ class prepareUpdate
$this->getLatestVersion();
}
+ /**
+ * Get zentao token.
+ *
+ * @access public
+ * @return void
+ */
public function getZTToken()
{
$tokenUrl = "{$this->internalZT->apiRoot}/tokens";
@@ -55,6 +79,12 @@ class prepareUpdate
return $response->token;
}
+ /**
+ * Add the changelog of the newest release.
+ *
+ * @access public
+ * @return void
+ */
public function addChangelog()
{
$relatedStoriesAndBugs = $this->getRelatedStoriesAndBugs();
@@ -62,6 +92,12 @@ class prepareUpdate
file_put_contents('../doc/CHANGELOG', $relatedStoriesAndBugs . "\n" . $oldChangelog);
}
+ /**
+ * Get stories and bugs of the releases for changelog.
+ *
+ * @access public
+ * @return string
+ */
public function getRelatedStoriesAndBugs()
{
$latestReleases = $this->getLatestRelease();
@@ -92,6 +128,12 @@ class prepareUpdate
return $releaseHeader . $doneStories . $fixedBugs;
}
+ /**
+ * Get the title of story or bug.
+ *
+ * @access public
+ * @return string
+ */
public function getStoryOrBugTitle($objectType, $objectID)
{
$type = $objectType == 'story' ? 'stories' : 'bugs';
@@ -104,6 +146,12 @@ class prepareUpdate
return $response ? $response->title : '';
}
+ /**
+ * Get pms, biz and max latest version.
+ *
+ * @access public
+ * @return void
+ */
public function getLatestVersion()
{
$releases = $this->getLatestRelease();
@@ -115,6 +163,13 @@ class prepareUpdate
}
}
+ /**
+ * Get last max version.
+ *
+ * @param object $lastMaxRelease
+ * @access public
+ * @return array
+ */
public function getLastMaxVersion($lastMaxRelease)
{
$releaseParse = explode(' ', $lastMaxRelease->name);
@@ -122,6 +177,12 @@ class prepareUpdate
$this->internalZT->lastMaxVersionAB = str_replace('.', '_', $this->internalZT->lastMaxVersion);
}
+ /**
+ * Get pms, biz and max latest release.
+ *
+ * @access public
+ * @return array
+ */
public function getLatestRelease()
{
$pmsReleases = $this->getReleases($this->internalZT->pmsProductID);
@@ -137,6 +198,13 @@ class prepareUpdate
return array('pms' => $pmsLatestRelease, 'biz' => $bizLatestRelease, 'max' => $maxLatestRelease);
}
+ /**
+ * Get releases by api.
+ *
+ * @param int $productID
+ * @access public
+ * @return array
+ */
public function getReleases($productID)
{
$releaseUrl = "{$this->internalZT->apiRoot}/products/{$productID}/releases";
@@ -148,6 +216,12 @@ class prepareUpdate
return $response->releases;
}
+ /**
+ * Update the newest version.
+ *
+ * @access public
+ * @return void
+ */
public function changeVersion()
{
$lastVersion = file_get_contents('../VERSION');
@@ -160,6 +234,12 @@ class prepareUpdate
`sed -i "s/\$config->version = '$lastVersion'/\$config->version = '{$this->internalZT->pmsVersion}'/" ../config/config.php`;
}
+ /**
+ * Add the release's detail.
+ *
+ * @access public
+ * @return void
+ */
public function addReleaseDetail()
{
$date = date('Y-m-d');
@@ -174,6 +254,12 @@ class prepareUpdate
/* Other lang. */
}
+ /**
+ * Add the last version for update.
+ *
+ * @access public
+ * @return void
+ */
public function addLastVersion()
{
`sed -i "s/ \/\/ pms insert position\.$/\\n\\\$lang->upgrade->fromVersions['{$this->internalZT->pmsVersionAB}'] = '{$this->internalZT->pmsVersion}'; \/\/ pms insert position\./" ../module/upgrade/lang/version.php`;
@@ -181,17 +267,35 @@ class prepareUpdate
`sed -i "s/ \/\/ max insert position\.$/\\n\\\$lang->upgrade->fromVersions['max{$this->internalZT->lastMaxVersionAB}'] = 'Max{$this->internalZT->lastMaxVersion}'; \/\/ max insert position\./" ../module/upgrade/lang/version.php`;
}
+ /**
+ * Add the version correspondence between open source and business.
+ *
+ * @access public
+ * @return void
+ */
public function addVersionCorrespondence()
{
`sed -i "s/ \/\/ biz insert position\.$/\\n\\\$config->upgrade->bizVersion['biz{$this->internalZT->bizVersionAB}'] = '{$this->internalZT->pmsVersionAB}'; \/\/ biz insert position\./" ../module/upgrade/config.php`;
`sed -i "s/ \/\/ max insert position\.$/\\n\\\$config->upgrade->maxVersion['max{$this->internalZT->maxVersionAB}'] = '{$this->internalZT->pmsVersionAB}'; \/\/ max insert position\./" ../module/upgrade/config.php`;
}
+ /**
+ * Add the confirm sql for update.
+ *
+ * @access public
+ * @return void
+ */
public function addConfirmedSql()
{
`sed -i "s/ \/\/ confirm insert position\.$/\\n case '{$this->internalZT->lastPmsVersionAB}':\\n \\\$confirmContent .= file_get_contents(\\\$this->getUpgradeFile('{$this->internalZT->lastPmsVersion}')); \/\/ confirm insert position\./" ../module/upgrade/model.php`;
}
+ /**
+ * Export standard sql.
+ *
+ * @access public
+ * @return void
+ */
public function exportStandardSql()
{
$lastStandardSql = file_get_contents("../db/standard/zentao{$this->internalZT->lastPmsVersion}.sql");
@@ -209,6 +313,12 @@ class prepareUpdate
file_put_contents("../db/standard/zentao{$this->internalZT->pmsVersion}.sql", $content);
}
+ /**
+ * Check whether update sql and install sql are consistent.
+ *
+ * @access public
+ * @return void
+ */
public function checkInstallSql()
{
$updateSql = file_get_contents("../db/update{$this->internalZT->lastPmsVersion}.sql");
@@ -259,6 +369,12 @@ class prepareUpdate
echo $errorSql;
}
+ /**
+ * Check lang.
+ *
+ * @access public
+ * @return void
+ */
public function checkLang()
{
`php check.php`;