From 2e21fef01e563199151348e8696b2cacefec7eab Mon Sep 17 00:00:00 2001 From: zhaoke Date: Tue, 31 Jan 2023 02:29:51 +0000 Subject: [PATCH 01/71] * Add lost sql. --- db/update18.0.beta3.sql | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/db/update18.0.beta3.sql b/db/update18.0.beta3.sql index 1b89108373..84d6e98de7 100644 --- a/db/update18.0.beta3.sql +++ b/db/update18.0.beta3.sql @@ -1,3 +1,9 @@ +ALTER TABLE `zt_host` ADD `type` varchar(30) NOT NULL DEFAULT 'normal' AFTER `admin`; +ALTER TABLE `zt_host` ADD `secret` varchar(50) NOT NULL DEFAULT '' AFTER `type`; +ALTER TABLE `zt_host` ADD `token` varchar(50) NOT NULL DEFAULT '' AFTER `secret`; +ALTER TABLE `zt_host` ADD `expiredDate` datetime NOT NULL AFTER `token`; +ALTER TABLE `zt_host` ADD `virtualSoftware` varchar(30) NOT NULL DEFAULT '' AFTER `expiredDate`; + ALTER TABLE `zt_host` DROP COLUMN `cabinet`, DROP COLUMN `cpuRate`, @@ -58,7 +64,6 @@ h.`createdDate` = a.`createdDate`, h.`editedBy` = a.`editedBy`, h.`editedDate` = a.`editedDate`, h.`group` = a.`group`, -h.`type` = a.`type`, h.`deleted` = a.`deleted` WHERE h.`assetID` = a.`id`; From e31ddb13815559cb721e16828ee311c862e200db Mon Sep 17 00:00:00 2001 From: zhaoke Date: Tue, 31 Jan 2023 08:33:19 +0000 Subject: [PATCH 02/71] * Fix bug #31841. --- config/zentaopms.php | 2 +- module/zahost/control.php | 9 +++++++-- module/zanode/control.php | 13 +++++++++++-- module/zanode/js/view.js | 8 ++++++++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/config/zentaopms.php b/config/zentaopms.php index 2d3fe90dfa..8f5e56b730 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -227,7 +227,7 @@ $config->openMethods[] = 'doc.createbasicinfo'; $config->openMethods[] = 'project.createguide'; $config->openMethods[] = 'task.editteam'; $config->openMethods[] = 'feedback.mergeproductmodule'; -$config->openMethods[] = 'zahost.introduction'; +$config->openMethods[] = 'zanode.list'; $config->openModules = array(); $config->openModules[] = 'install'; diff --git a/module/zahost/control.php b/module/zahost/control.php index e201c83b2d..504a12eea7 100644 --- a/module/zahost/control.php +++ b/module/zahost/control.php @@ -43,8 +43,13 @@ class zahost extends control $this->loadModel('search')->setSearchParams($this->config->zahost->search); $showFeature = false; - $skipAutomation = !empty($this->config->global->skipAutomation) ? $this->config->global->skipAutomation : ''; - if(strpos(",$skipAutomation,", $this->app->user->account) === false) $showFeature = true; + $accounts = !empty($this->config->global->skipAutomation) ? $this->config->global->skipAutomation : ''; + if(strpos(",$accounts,", $this->app->user->account) === false) + { + $showFeature = true; + $accounts .= ',' . $this->app->user->account; + $this->loadModel('setting')->setItem('system.common.global.skipAutomation', $accounts); + } $this->view->title = $this->lang->zahost->common; $this->view->hostList = $hostList; diff --git a/module/zanode/control.php b/module/zanode/control.php index 54de57f57e..e7cae7beef 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -44,8 +44,13 @@ class zanode extends control $this->loadModel('search')->setSearchParams($this->config->zanode->search); $showFeature = false; - $skipAutomation = !empty($this->config->global->skipAutomation) ? $this->config->global->skipAutomation : ''; - if(strpos(",$skipAutomation,", $this->app->user->account) === false) $showFeature = true; + $accounts = !empty($this->config->global->skipAutomation) ? $this->config->global->skipAutomation : ''; + if(strpos(",$accounts,", $this->app->user->account) === false) + { + $showFeature = true; + $accounts .= ',' . $this->app->user->account; + $this->loadModel('setting')->setItem('system.common.global.skipAutomation', $accounts); + } $this->view->title = $this->lang->zanode->common; $this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted'); @@ -73,6 +78,10 @@ class zanode extends control */ public function list($hostID, $orderBy = 'id_desc') { + if(!commonModel::hasPriv('zahost', 'view')) + { + $this->loadModel('common')->deny('zahost', 'view'); + } $this->view->title = $this->lang->zanode->common; $this->view->nodeList = $this->loadModel("zanode")->getListByHost($hostID, $orderBy); $this->view->orderBy = $orderBy; diff --git a/module/zanode/js/view.js b/module/zanode/js/view.js index c2a562506b..94433b7934 100644 --- a/module/zanode/js/view.js +++ b/module/zanode/js/view.js @@ -160,6 +160,14 @@ $('.btn-pwd-copy').live('click', function() }, 2000) }) +$('#jumpManual').click(function() +{ + var encodedHelpPageUrl = encodeURIComponent('https://www.zentao.net/book/zentaopms/974.html?fullScreen=zentao'); + var urlForNewTab = window.location.origin + '#app=help&url=' + encodedHelpPageUrl; + window.open(urlForNewTab) +}) + + $(function(){ checkServiceStatus(); checkInterval = setInterval(() => { From 04769027c5c2b62ef8d6b34ad9ba8ca927d83b26 Mon Sep 17 00:00:00 2001 From: zhaoke Date: Tue, 31 Jan 2023 09:20:14 +0000 Subject: [PATCH 03/71] * Finish task #83368. --- api/v1/entries/hostheartbeat.php | 3 +++ module/zahost/css/view.css | 1 + module/zahost/view/view.html.php | 10 +++++++++- module/zanode/css/view.css | 1 + module/zanode/view/view.html.php | 4 ++-- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/api/v1/entries/hostheartbeat.php b/api/v1/entries/hostheartbeat.php index b2862521f1..cec8180eca 100644 --- a/api/v1/entries/hostheartbeat.php +++ b/api/v1/entries/hostheartbeat.php @@ -78,6 +78,9 @@ class hostHeartbeatEntry extends baseEntry 'status' => $vm->status, 'extranet' => $vm->ip, ); + + if(!$vm->sshPortOnHost) unset($vmData['ssh']); + if($heartbeat > 0) $vmData['heartbeat'] = date("Y-m-d H:i:s", $heartbeat); $this->dao->update(TABLE_ZAHOST)->data($vmData)->where('mac')->eq($vm->macAddress)->exec(); diff --git a/module/zahost/css/view.css b/module/zahost/css/view.css index a01465a8bb..5d092fc6e2 100644 --- a/module/zahost/css/view.css +++ b/module/zahost/css/view.css @@ -20,3 +20,4 @@ .btn-info {background-color: unset;} .icon-refresh {font-size: 15px;} .load-indicator:after {top: 33%;} +.btn.disabled i {color: #fff;} diff --git a/module/zahost/view/view.html.php b/module/zahost/view/view.html.php index ab54e22f53..d78b9e23d9 100644 --- a/module/zahost/view/view.html.php +++ b/module/zahost/view/view.html.php @@ -131,9 +131,15 @@
zahost->desc;?>
desc) ? htmlspecialchars_decode($zahost->desc) : $lang->noData;?>
- + createLink('action', 'comment', "objectType=zahost&objectID=$zahost->hostID"); + ?> + +
zahost->browseNode;?>
+
createLink('zanode', 'list', "hostID=$zahost->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?>
+ +
noData;?>
osName, "windows") ? $config->zanode->defaultWinAccou
zanode->sshAddress; ?>:
-
ssh ip . ' -p ' . $zanode->ssh; ?>"; ?>
+
ssh ? 'ssh ' . $account . '@' . $zanode->ip . ' -p ' . $zanode->ssh : ''; ?>ssh ? " " : ''; ?>
@@ -96,7 +96,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
zanode->defaultPwd; ?>:
-
zanode->defaultPwd . ' ' . ""; ?>
+
zanode->defaultPwd)) . ' ' . ""; ?>
From d3986931a81c48eb389fda9be7dadf2add093e9c Mon Sep 17 00:00:00 2001 From: zhaoke Date: Wed, 1 Feb 2023 02:34:11 +0000 Subject: [PATCH 04/71] * Fix action list position error. --- module/zahost/view/view.html.php | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/module/zahost/view/view.html.php b/module/zahost/view/view.html.php index d78b9e23d9..61d09e08fe 100644 --- a/module/zahost/view/view.html.php +++ b/module/zahost/view/view.html.php @@ -131,10 +131,6 @@
zahost->desc;?>
desc) ? htmlspecialchars_decode($zahost->desc) : $lang->noData;?>
- createLink('action', 'comment', "objectType=zahost&objectID=$zahost->hostID"); - ?>
@@ -142,35 +138,11 @@
createLink('zanode', 'list', "hostID=$zahost->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?> -
noData;?>
+
- createLink('action', 'comment', "objectType=zahost&objectID=$zahost->hostID"); From 08e10410f1b51eadac2b9d5e09477f4d6e1fae17 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 1 Feb 2023 07:43:49 +0000 Subject: [PATCH 05/71] * Snapshot list,create --- module/zanode/control.php | 54 ++++++++++++++- module/zanode/css/browsesnapshot.css | 6 ++ module/zanode/lang/zh-cn.php | 9 +++ module/zanode/model.php | 76 +++++++++++++++++++++- module/zanode/view/browsesnapshot.html.php | 56 ++++++++++++++++ module/zanode/view/createsnapshot.html.php | 64 ++++++++++++++++++ module/zanode/view/view.html.php | 12 ++++ 7 files changed, 275 insertions(+), 2 deletions(-) create mode 100644 module/zanode/css/browsesnapshot.css create mode 100644 module/zanode/view/browsesnapshot.html.php create mode 100644 module/zanode/view/createsnapshot.html.php diff --git a/module/zanode/control.php b/module/zanode/control.php index e7cae7beef..b1b5a81d91 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -45,7 +45,7 @@ class zanode extends control $showFeature = false; $accounts = !empty($this->config->global->skipAutomation) ? $this->config->global->skipAutomation : ''; - if(strpos(",$accounts,", $this->app->user->account) === false) + if(strpos(",$accounts,", $this->app->user->account) === false) { $showFeature = true; $accounts .= ',' . $this->app->user->account; @@ -164,6 +164,7 @@ class zanode extends control $this->view->token = !empty($vnc->token) ? $vnc->token:''; $this->view->title = $this->lang->zanode->view; $this->view->zanode = $node; + $this->view->snapshotList = $this->zanode->getSnapshotList($id); $this->view->actions = $this->loadModel('action')->getList('zanode', $id); $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->display(); @@ -285,6 +286,37 @@ class zanode extends control $this->display(); } + /** + * Create snapshot. + * + * @param int $zanodeID + * @access public + * @return void + */ + public function createSnapshot($nodeID = 0) + { + $task = ''; + $node = $this->zanode->getNodeByID($nodeID); + + if($_POST) + { + $this->zanode->createSnapshot($nodeID); + + if(dao::isError()) + { + $response['result'] = 'fail'; + $response['message'] = dao::getError(); + return $this->send($response); + } + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload')); + } + + $this->view->task = $task; + $this->view->node = $node; + $this->view->rate = !empty($task->rate) ? $task->rate : 0; + $this->display(); + } + /** * Desctroy node. * @@ -333,6 +365,26 @@ class zanode extends control $this->display(); } + public function browseSnapshot($nodeID, $browseType = 'all', $param = 0, $orderBy = 'id', $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + $this->app->loadLang('zahost'); + $this->app->loadClass('pager', $static = true); + $pager = pager::init($recTotal, $recPerPage, $pageID); + + $snapshotList = $this->zanode->getSnapshotList($nodeID, $browseType, $param, $orderBy, $pager); + + $this->view->title = $this->lang->zanode->browseSnapshot; + $this->view->nodeID = $nodeID; + $this->view->snapshotList = $snapshotList; + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->pager = $pager; + $this->view->param = $param; + $this->view->orderBy = $orderBy; + $this->view->browseType = $browseType; + + $this->display(); + } + /** * Ajax get template pairs by api. * diff --git a/module/zanode/css/browsesnapshot.css b/module/zanode/css/browsesnapshot.css new file mode 100644 index 0000000000..5218ddb6ee --- /dev/null +++ b/module/zanode/css/browsesnapshot.css @@ -0,0 +1,6 @@ +#main{min-width: 0!important;padding:0!important;} +body{background-color: #fff!important;} + +.c-createdBy {width: 100px;} +.c-datetime {width: 130px;} +.c-status {width: 80px;} diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index 30bb81be88..f38ede7cf5 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -79,6 +79,14 @@ $lang->zanode->createImageSuccess = '镜像导出成功,您可以使用此镜 $lang->zanode->createImageFail = '镜像导出失败'; $lang->zanode->createImageButton = '去创建'; +$lang->zanode->snapshotName = '快照名称'; +$lang->zanode->browseSnapshot = '快照列表'; +$lang->zanode->createSnapshot = '创建快照'; +$lang->zanode->editSnapshot = '编辑快照'; +$lang->zanode->restoreSnapshot = '还原快照'; +$lang->zanode->deleteSnapshot = '删除快照'; +$lang->zanode->snapshotEmpty = '无快照'; + $lang->zanode->imageNameEmpty = '名称不能为空'; $lang->zanode->runTimeout = '自动执行失败,请检查宿主机和执行节点状态'; @@ -89,6 +97,7 @@ $lang->zanode->apiError['fail'] = '执行失败,请检查宿主机和执行 $lang->zanode->publicList[0] = '不共享'; $lang->zanode->publicList[1] = '共享'; +$lang->zanode->statusList['creating'] = '创建中'; $lang->zanode->statusList['created'] = '已创建'; $lang->zanode->statusList['launch'] = '运行中'; $lang->zanode->statusList['ready'] = '运行中'; diff --git a/module/zanode/model.php b/module/zanode/model.php index af034bfdfa..7e054b9022 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -28,6 +28,10 @@ class zanodemodel extends model const KVM_EXPORT_PATH = '/api/v1/kvm/exportVm'; const KVM_STATUS_PATH = '/api/v1/task/getStatus'; + const SNAPSHOT_CREATE_PATH = '/api/v1/snaps/addCreateSnap'; + const SNAPSHOT_REVERT_PATH = '/api/v1/snaps/addRevertSnap'; + const SNAPSHOT_REMOVE_PATH = '/api/v1/snaps/removeSnap'; + /** * Set lang; * @@ -167,6 +171,64 @@ class zanodemodel extends model return false; } + /** + * Create Snapshot by zanode. + * + * @param int $zanodeID + * @access public + * @return void + */ + public function createSnapshot($zanodeID = 0) + { + $data = fixer::input('post')->get(); + + if(empty($data->name)) dao::$errors['name'] = $this->lang->zanode->imageNameEmpty; + if(dao::isError()) return false; + + $node = $this->getNodeByID($zanodeID); + + $newSnapshot = new stdClass(); + $newSnapshot->host = $node->id; + $newSnapshot->name = $data->name; + $newSnapshot->desc = $data->desc; + $newSnapshot->status = 'creating'; + $newSnapshot->osName = $node->osName; + $newSnapshot->from = 'snapshot'; + $newSnapshot->createdBy = $this->app->user->account; + $newSnapshot->createdDate = helper::now(); + + $this->dao->insert(TABLE_IMAGE) + ->data($newSnapshot) + ->autoCheck() + ->exec(); + + if(dao::isError()) return false; + + $newID = $this->dao->lastInsertID(); + + /* Prepare create params. */ + $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; + $param = array( + 'name' => $data->name, + 'task' => $newID, + 'type' => 'createSnap', + 'vm' => $node->name + ); + + $result = json_decode(commonModel::http($agnetUrl . static::SNAPSHOT_CREATE_PATH, json_encode($param,JSON_NUMERIC_CHECK), null, array("Authorization:$node->tokenSN"))); + + if(!empty($result) and $result->code == 'success') + { + $this->loadModel('action')->create('zanodesnapshot', $id, 'created'); + return $newID; + } + + $this->dao->delete()->from(TABLE_IMAGE)->where('id')->eq($newID)->exec(); + dao::$errors[] = (!empty($result) and !empty($result->msg)) ? $result->msg : $this->app->lang->fail; + return false; + } + + /** * Action Node. * @@ -212,7 +274,7 @@ class zanodemodel extends model public function destroy($id) { $node = $this->getNodeByID($id); - + if($node) { $req = array( 'name' => $node->name ); @@ -520,6 +582,18 @@ class zanodemodel extends model ->fetch(); } + public function getSnapshotList($nodeID, $browseType = 'all', $param = 0, $orderBy = 'id', $pager = null) + { + $snapshotList = $this->dao->select('*')->from(TABLE_IMAGE) + ->where('host')->eq($nodeID) + ->andWhere('`from`')->eq('snapshot') + ->orderBy($orderBy) + ->page($pager) + ->fetchAll('name'); + + return $snapshotList; + } + /** * Get Node by id. * diff --git a/module/zanode/view/browsesnapshot.html.php b/module/zanode/view/browsesnapshot.html.php new file mode 100644 index 0000000000..9dd54111ed --- /dev/null +++ b/module/zanode/view/browsesnapshot.html.php @@ -0,0 +1,56 @@ + + * @package zahost + * @version $Id$ + * @link http://www.zentao.net + */ +?> +getModuleRoot() . 'common/view/header.html.php';?> + +
+ recTotal}&recPerPage={$pager->recPerPage}";?> + +
+

+ zanode->snapshotEmpty;?> +

+
+ + + + + + + + + + + + + + + status == 'completed' ? zget($snapshot, 'path', '') : '';?> + + + + + + + + +
zahost->image->name);?>zahost->status;?>zahost->createdBy;?>zahost->createdDate;?>actions;?>
name;?>'>zanode->statusList, $snapshot->status, '');?>createdBy, '')?>createdDate;?> + createLink('zanode', 'editsnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->editSnapshot}");?> + createLink('zahost', 'restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->restoreSnapshot}");?> + createLink('zahost', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->deleteSnapshot}");?> +
+ + +
+getModuleRoot() . 'common/view/footer.html.php';?> diff --git a/module/zanode/view/createsnapshot.html.php b/module/zanode/view/createsnapshot.html.php new file mode 100644 index 0000000000..d591de2663 --- /dev/null +++ b/module/zanode/view/createsnapshot.html.php @@ -0,0 +1,64 @@ + + * @package task + * @version + * @link http://www.zentao.net + */ +?> + + + +task);?> +id);?> +zanode); ?> + + +
+
+
+

+ zanode->createSnapshot;?> +

+
+ +
zanode->pending;?>
+
+
+
+
+ parent}"); + $link = str_replace('onlybody=yes', '', $link); + $link = trim($link, '?'); + ?> +
zanode->createSnapshotSuccess . html::a($link, $lang->zanode->createSnapshotButton, "_parent", "style='color:#2e7fff;'");?>
+
zanode->createSnapshotFail;?>
+ +
+ + + + + + + + + + + + + +
zanode->snapshotName;?>
zanode->desc;?>
+ +
+
+ +
+
+ diff --git a/module/zanode/view/view.html.php b/module/zanode/view/view.html.php index 2aec77c69a..168fa86a9f 100644 --- a/module/zanode/view/view.html.php +++ b/module/zanode/view/view.html.php @@ -147,6 +147,14 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
zanode->desc; ?>
desc) ? htmlspecialchars_decode($zanode->desc) : $lang->noData; ?>
+ +
+
zanode->browseSnapshot;?>
+
+ createLink('zanode', 'browseSnapshot', "nodeID=$zanode->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?> +
+
+
printExtendFields($zanode, 'div', "position=left&inForm=0&inCell=1"); ?> @@ -164,6 +172,9 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou $rebootAttr = "title='{$lang->zanode->reboot}' target='hiddenwin'"; $rebootAttr .= $zanode->status == 'shutoff' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmReboot}\")==false) return false;'"; + + $snapshotAttr = "title='{$lang->zanode->createSnapshot}'"; + $snapshotAttr .= $zanode->status != 'running' ? ' class="btn disabled"' : ' class="btn iframe"'; common::printLink('zanode', 'getVNC', "id={$zanode->id}", " " . $lang->zanode->getVNC, in_array($zanode->status ,array('running', 'launch', 'wait')) ? '_blank' : '', "title='{$lang->zanode->getVNC}' class='btn desktop " . (in_array($zanode->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", ''); if($zanode->status == "suspend") @@ -185,6 +196,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou } common::printLink('zanode', 'reboot', "zanodeID={$zanode->id}", " " . $lang->zanode->rebootNode, '', $rebootAttr); + common::printLink('zanode', 'createSnapshot', "zanodeID={$zanode->id}", " " . $lang->zanode->createSnapshot, '', $snapshotAttr, true, true); } ?> From e745eaf3deb4901dcd4c3b24dd7765f385d932ed Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 2 Feb 2023 02:10:04 +0000 Subject: [PATCH 06/71] * Adjust code --- module/zanode/lang/de.php | 8 ++++++++ module/zanode/lang/en.php | 8 ++++++++ module/zanode/lang/fr.php | 8 ++++++++ module/zanode/lang/zh-cn.php | 12 ++++++------ module/zanode/model.php | 2 +- module/zanode/view/browse.html.php | 6 +++++- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/module/zanode/lang/de.php b/module/zanode/lang/de.php index f32d767fbc..483ec50fae 100644 --- a/module/zanode/lang/de.php +++ b/module/zanode/lang/de.php @@ -79,6 +79,14 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; + $lang->zanode->imageNameEmpty = 'Name can not be empty.'; $lang->zanode->runTimeout = 'Network connection timeout, please check the host and execution node status.'; diff --git a/module/zanode/lang/en.php b/module/zanode/lang/en.php index f32d767fbc..483ec50fae 100644 --- a/module/zanode/lang/en.php +++ b/module/zanode/lang/en.php @@ -79,6 +79,14 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; + $lang->zanode->imageNameEmpty = 'Name can not be empty.'; $lang->zanode->runTimeout = 'Network connection timeout, please check the host and execution node status.'; diff --git a/module/zanode/lang/fr.php b/module/zanode/lang/fr.php index f32d767fbc..483ec50fae 100644 --- a/module/zanode/lang/fr.php +++ b/module/zanode/lang/fr.php @@ -79,6 +79,14 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; + $lang->zanode->imageNameEmpty = 'Name can not be empty.'; $lang->zanode->runTimeout = 'Network connection timeout, please check the host and execution node status.'; diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index f38ede7cf5..0aec4d0269 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -79,13 +79,13 @@ $lang->zanode->createImageSuccess = '镜像导出成功,您可以使用此镜 $lang->zanode->createImageFail = '镜像导出失败'; $lang->zanode->createImageButton = '去创建'; -$lang->zanode->snapshotName = '快照名称'; -$lang->zanode->browseSnapshot = '快照列表'; -$lang->zanode->createSnapshot = '创建快照'; -$lang->zanode->editSnapshot = '编辑快照'; +$lang->zanode->snapshotName = '快照名称'; +$lang->zanode->browseSnapshot = '快照列表'; +$lang->zanode->createSnapshot = '创建快照'; +$lang->zanode->editSnapshot = '编辑快照'; $lang->zanode->restoreSnapshot = '还原快照'; -$lang->zanode->deleteSnapshot = '删除快照'; -$lang->zanode->snapshotEmpty = '无快照'; +$lang->zanode->deleteSnapshot = '删除快照'; +$lang->zanode->snapshotEmpty = '无快照'; $lang->zanode->imageNameEmpty = '名称不能为空'; diff --git a/module/zanode/model.php b/module/zanode/model.php index 7e054b9022..6ef70aace1 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -219,7 +219,7 @@ class zanodemodel extends model if(!empty($result) and $result->code == 'success') { - $this->loadModel('action')->create('zanodesnapshot', $id, 'created'); + $this->loadModel('action')->create('zanode', $id, 'createdSnapshot', '', $data->name); return $newID; } diff --git a/module/zanode/view/browse.html.php b/module/zanode/view/browse.html.php index 09bcad7424..8a524ac73f 100644 --- a/module/zanode/view/browse.html.php +++ b/module/zanode/view/browse.html.php @@ -85,6 +85,9 @@ $rebootAttr = "title='{$lang->zanode->reboot}' target='hiddenwin'"; $rebootAttr .= $node->status == 'shutoff' ? ' class="btn disabled"' : "class='btn' target='hiddenwin' onclick='if(confirm(\"{$lang->zanode->confirmReboot}\")==false) return false;'"; + $snapshotAttr = "title='{$lang->zanode->createSnapshot}'"; + $snapshotAttr .= $node->status != 'running' ? ' class="btn disabled"' : ' class="btn iframe"'; + common::printLink('zanode', 'getVNC', "id={$node->id}", " ", (in_array($node->status ,array('running', 'launch', 'wait')) ? '_blank' : ''), "title='{$lang->zanode->getVNC}' class='btn desktop " . (in_array($node->status ,array('running', 'launch', 'wait')) ? '':'disabled') . "'", ''); if($node->status == "suspend") { @@ -105,13 +108,14 @@ } common::printLink('zanode', 'reboot', "zanodeID={$node->id}", " ", '', $rebootAttr); - common::printIcon('zanode', 'edit', "id={$node->id}", $node, 'list'); + common::printLink('zanode', 'createSnapshot', "zanodeID={$node->id}", " ", '', $snapshotAttr, true, true); if(common::hasPriv('zanode', 'createImage') or common::hasPriv('zanode', 'destroy')) { echo "
"; echo ""; echo ""; From 21d3f0a011041466bdc9b96e45a995afa9b01bdc Mon Sep 17 00:00:00 2001 From: zhaoke Date: Thu, 2 Feb 2023 02:28:45 +0000 Subject: [PATCH 07/71] * Fix create snap fail. --- module/zanode/model.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/module/zanode/model.php b/module/zanode/model.php index 6ef70aace1..1cac026889 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -28,9 +28,9 @@ class zanodemodel extends model const KVM_EXPORT_PATH = '/api/v1/kvm/exportVm'; const KVM_STATUS_PATH = '/api/v1/task/getStatus'; - const SNAPSHOT_CREATE_PATH = '/api/v1/snaps/addCreateSnap'; - const SNAPSHOT_REVERT_PATH = '/api/v1/snaps/addRevertSnap'; - const SNAPSHOT_REMOVE_PATH = '/api/v1/snaps/removeSnap'; + const SNAPSHOT_CREATE_PATH = '/api/v1/kvm/addCreateSnap'; + const SNAPSHOT_REVERT_PATH = '/api/v1/kvm/addRevertSnap'; + const SNAPSHOT_REMOVE_PATH = '/api/v1/kvm/removeSnap'; /** * Set lang; @@ -208,12 +208,12 @@ class zanodemodel extends model /* Prepare create params. */ $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; - $param = array( + $param = array(array( 'name' => $data->name, 'task' => $newID, 'type' => 'createSnap', 'vm' => $node->name - ); + )); $result = json_decode(commonModel::http($agnetUrl . static::SNAPSHOT_CREATE_PATH, json_encode($param,JSON_NUMERIC_CHECK), null, array("Authorization:$node->tokenSN"))); From fa4e7b5f119fa825db1466b58074905492ec6a44 Mon Sep 17 00:00:00 2001 From: zhaoke Date: Thu, 2 Feb 2023 05:24:13 +0000 Subject: [PATCH 08/71] * Fix bug #31826. --- module/zahost/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/zahost/control.php b/module/zahost/control.php index 504a12eea7..a6f09f613c 100644 --- a/module/zahost/control.php +++ b/module/zahost/control.php @@ -168,7 +168,7 @@ class zahost extends control return print(js::confirm($this->lang->zahost->confirmDelete, inlink('delete', "hostID=$hostID&confirm=yes"))); } - $this->dao->update(TABLE_ZAHOST)->set('deleted')->eq(1)->where('id')->eq($hostID)->exec(); + $this->zahost->delete(TABLE_ZAHOST, $hostID); $this->loadModel('action')->create('zahost', $hostID, 'deleted'); /* if ajax request, send result. */ From 597b77af82080c72343b90e4343285f21e848f0e Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 2 Feb 2023 08:31:06 +0000 Subject: [PATCH 09/71] * Edit snapshot --- db/update18.0.sql | 1 + db/zentao.sql | 1 + module/action/lang/de.php | 4 ++ module/action/lang/en.php | 4 ++ module/action/lang/fr.php | 4 ++ module/action/lang/zh-cn.php | 4 ++ module/group/lang/resource.php | 30 ++++++++------ module/zanode/control.php | 46 ++++++++++++++++++++-- module/zanode/js/view.js | 12 ++++++ module/zanode/lang/zh-cn.php | 4 +- module/zanode/model.php | 27 ++++++++++++- module/zanode/view/browsesnapshot.html.php | 6 +-- module/zanode/view/createsnapshot.html.php | 18 --------- module/zanode/view/editsnapshot.html.php | 45 +++++++++++++++++++++ module/zanode/view/view.html.php | 1 + 15 files changed, 168 insertions(+), 39 deletions(-) create mode 100644 db/update18.0.sql create mode 100644 module/zanode/view/editsnapshot.html.php diff --git a/db/update18.0.sql b/db/update18.0.sql new file mode 100644 index 0000000000..bfb3415f53 --- /dev/null +++ b/db/update18.0.sql @@ -0,0 +1 @@ +ALTER TABLE `zt_image` ADD `localName` VARCHAR(64) NOT NULL AFTER `name`; diff --git a/db/zentao.sql b/db/zentao.sql index cc434d0cbe..d20b838bc5 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -7353,6 +7353,7 @@ CREATE TABLE `zt_image` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `host` int(11) unsigned NOT NULL DEFAULT 0, `name` varchar(64) NOT NULL DEFAULT '', + `localName` varchar(64) NOT NULL DEFAULT '', `address` varchar(64) NOT NULL DEFAULT '', `path` varchar(64) NOT NULL DEFAULT '', `status` varchar(20) NOT NULL DEFAULT '', diff --git a/module/action/lang/de.php b/module/action/lang/de.php index 3d5e96a9cf..f4a0a74ae1 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -237,6 +237,8 @@ $lang->action->desc->relieved = '$date, relieved by $actoraction->desc->switchtolight = '$date, Switch from ALM mode to light mode by '. $lang->admin->system .'.' . "\n"; $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; +$lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -419,6 +421,8 @@ $lang->action->label->switchtolight = 'switch from ALM mode to light mod $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; +$lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->editsnapshot = 'edit snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 64e5e9169f..dc490dccff 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -237,6 +237,8 @@ $lang->action->desc->relieved = '$date, relieved by $actoraction->desc->switchtolight = '$date, Switch from ALM mode to light mode by '. $lang->admin->system .'.' . "\n"; $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; +$lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -419,6 +421,8 @@ $lang->action->label->switchtolight = 'switch from ALM mode to light mod $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; +$lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->editsnapshot = 'edit snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php index 8327ed0c0d..a3a3fce60a 100644 --- a/module/action/lang/fr.php +++ b/module/action/lang/fr.php @@ -237,6 +237,8 @@ $lang->action->desc->relieved = '$date, relieved by $actoraction->desc->switchtolight = '$date, Switch from ALM mode to light mode by '. $lang->admin->system .'.' . "\n"; $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; +$lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor a créé un sous-tâche $extra。' . "\n"; @@ -419,6 +421,8 @@ $lang->action->label->switchtolight = 'switch from ALM mode to light mod $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; +$lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->editsnapshot = 'edit snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index a68dbd1444..f4ee36d719 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -237,6 +237,8 @@ $lang->action->desc->relieved = '$date, 由 $actor $lang->action->desc->switchtolight = '$date, 由于 '. $lang->admin->system .' 从全生命周期管理模式切换为轻量管理模式,项目访问控制由项目集内公开调整为私有。' . "\n"; $lang->action->desc->getvnc = '$date, $actor对执行节点 $extra 进行了远程操控。' . "\n"; $lang->action->desc->unlinkproduct = '$date, 系统判断由于' . $lang->executionCommon . '所属项目与$extra取消关联,同步将' . $lang->executionCommon . '与$extra取消关联。' . "\n"; +$lang->action->desc->createdsnapshot = '$date, $actor 创建了快照 $extra。' . "\n"; +$lang->action->desc->editsnapshot = '$date, $actor 编辑了快照 $extra。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -419,6 +421,8 @@ $lang->action->label->switchtolight = '从全生命周期管理模式切 $lang->action->label->linkedrepo = '关联代码库到'; $lang->action->label->unlinkedrepo = '取消了项目与代码库的关联'; $lang->action->label->unlinkproduct = '取消了与产品的关联'; +$lang->action->label->createdsnapshot = '创建了快照'; +$lang->action->label->editsnapshot = '编辑了快照'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 37b350c0d9..fc020d0d71 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1239,18 +1239,21 @@ $lang->zahost->methodOrder[30] = 'downloadImage'; $lang->zahost->methodOrder[35] = 'cancelDownload'; $lang->resource->zanode = new stdclass(); -$lang->resource->zanode->browse = 'browse'; -$lang->resource->zanode->create = 'create'; -$lang->resource->zanode->edit = 'edit'; -$lang->resource->zanode->destroy = 'destroy'; -$lang->resource->zanode->reboot = 'reboot'; -$lang->resource->zanode->suspend = 'suspend'; -$lang->resource->zanode->resume = 'resume'; -$lang->resource->zanode->getVNC = 'getVNC'; -$lang->resource->zanode->start = 'boot'; -$lang->resource->zanode->close = 'shutdown'; -$lang->resource->zanode->view = 'view'; -$lang->resource->zanode->createImage = 'createImage'; +$lang->resource->zanode->browse = 'browse'; +$lang->resource->zanode->create = 'create'; +$lang->resource->zanode->edit = 'edit'; +$lang->resource->zanode->destroy = 'destroy'; +$lang->resource->zanode->reboot = 'reboot'; +$lang->resource->zanode->suspend = 'suspend'; +$lang->resource->zanode->resume = 'resume'; +$lang->resource->zanode->getVNC = 'getVNC'; +$lang->resource->zanode->start = 'boot'; +$lang->resource->zanode->close = 'shutdown'; +$lang->resource->zanode->view = 'view'; +$lang->resource->zanode->createImage = 'createImage'; +$lang->resource->zanode->browseSnapshot = 'browseSnapshot'; +$lang->resource->zanode->createSnapshot = 'createSnapshot'; +$lang->resource->zanode->editSnapshot = 'editSnapshot'; $lang->zanode->methodOrder[0] = 'browse'; $lang->zanode->methodOrder[5] = 'create'; @@ -1264,6 +1267,9 @@ $lang->zanode->methodOrder[40] = 'start'; $lang->zanode->methodOrder[45] = 'close'; $lang->zanode->methodOrder[50] = 'view'; $lang->zanode->methodOrder[55] = 'createImage'; +$lang->zanode->methodOrder[60] = 'browseSnapshot'; +$lang->zanode->methodOrder[65] = 'createSnapshot'; +$lang->zanode->methodOrder[70] = 'editSnapshot'; $lang->resource->repo = new stdclass(); $lang->resource->repo->browse = 'browseAction'; diff --git a/module/zanode/control.php b/module/zanode/control.php index b1b5a81d91..75a404d7d6 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -295,7 +295,6 @@ class zanode extends control */ public function createSnapshot($nodeID = 0) { - $task = ''; $node = $this->zanode->getNodeByID($nodeID); if($_POST) @@ -308,12 +307,38 @@ class zanode extends control $response['message'] = dao::getError(); return $this->send($response); } - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload')); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent')); } - $this->view->task = $task; $this->view->node = $node; - $this->view->rate = !empty($task->rate) ? $task->rate : 0; + $this->display(); + } + + /** + * Edit Snapshot. + * + * @param int $snapshotID + * @access public + * @return void + */ + public function editSnapshot($snapshotID) + { + $snapshot = $this->zanode->getImageByID($snapshotID); + if($_POST) + { + $this->zanode->editSnapshot($snapshotID); + + if(dao::isError()) + { + $response['result'] = 'fail'; + $response['message'] = dao::getError(); + return $this->send($response); + } + $this->loadModel('action')->create('zanode', $snapshot->host, 'editSnapshot', '', $snapshot->localName ? $snapshot->localName : $snapshot->name); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent')); + } + + $this->view->snapshot = $snapshot; $this->display(); } @@ -365,6 +390,19 @@ class zanode extends control $this->display(); } + /** + * Browse snapshot. + * + * @param int $nodeID + * @param string $browseType + * @param int $param + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ public function browseSnapshot($nodeID, $browseType = 'all', $param = 0, $orderBy = 'id', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $this->app->loadLang('zahost'); diff --git a/module/zanode/js/view.js b/module/zanode/js/view.js index 94433b7934..4ffb70440e 100644 --- a/module/zanode/js/view.js +++ b/module/zanode/js/view.js @@ -179,3 +179,15 @@ $(function(){ checkServiceStatus(); }, 2000); }) + +/** + * Edit Snapshot. + * + * @param string $link + * @access public + * @return void + */ +function editSnapshot(link) +{ + $('#editSnapshot').attr('href', link).click(); +} diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index 0aec4d0269..1df91949a4 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -87,6 +87,9 @@ $lang->zanode->restoreSnapshot = '还原快照'; $lang->zanode->deleteSnapshot = '删除快照'; $lang->zanode->snapshotEmpty = '无快照'; +$lang->zanode->snapshot->statusList['creating'] = '创建中'; +$lang->zanode->snapshot->statusList['completed'] = '已完成'; + $lang->zanode->imageNameEmpty = '名称不能为空'; $lang->zanode->runTimeout = '自动执行失败,请检查宿主机和执行节点状态'; @@ -97,7 +100,6 @@ $lang->zanode->apiError['fail'] = '执行失败,请检查宿主机和执行 $lang->zanode->publicList[0] = '不共享'; $lang->zanode->publicList[1] = '共享'; -$lang->zanode->statusList['creating'] = '创建中'; $lang->zanode->statusList['created'] = '已创建'; $lang->zanode->statusList['launch'] = '运行中'; $lang->zanode->statusList['ready'] = '运行中'; diff --git a/module/zanode/model.php b/module/zanode/model.php index 1cac026889..41fc14106e 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -219,7 +219,7 @@ class zanodemodel extends model if(!empty($result) and $result->code == 'success') { - $this->loadModel('action')->create('zanode', $id, 'createdSnapshot', '', $data->name); + $this->loadModel('action')->create('zanode', $zanodeID, 'createdSnapshot', '', $data->name); return $newID; } @@ -228,6 +228,31 @@ class zanodemodel extends model return false; } + /** + * Edit Snapshot. + * + * @param int $snapshotID + * @access public + * @return bool + */ + public function editSnapshot($snapshotID) + { + $data = fixer::input('post')->get(); + + if(empty($data->name)) dao::$errors['name'] = $this->lang->zanode->imageNameEmpty; + if(dao::isError()) return false; + + $newSnapshot = new stdClass(); + $newSnapshot->localName = $data->name; + $newSnapshot->desc = $data->desc; + + $this->dao->update(TABLE_IMAGE) + ->data($newSnapshot) + ->where('id')->eq($snapshotID) + ->autoCheck() + ->exec(); + return true; + } /** * Action Node. diff --git a/module/zanode/view/browsesnapshot.html.php b/module/zanode/view/browsesnapshot.html.php index 9dd54111ed..93663ef974 100644 --- a/module/zanode/view/browsesnapshot.html.php +++ b/module/zanode/view/browsesnapshot.html.php @@ -35,12 +35,12 @@ status == 'completed' ? zget($snapshot, 'path', '') : '';?> - name;?> - '>zanode->statusList, $snapshot->status, '');?> + localName ? $snapshot->localName : $snapshot->name;?> + '>zanode->snapshot->statusList, $snapshot->status, '');?> createdBy, '')?> createdDate;?> - createLink('zanode', 'editsnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->editSnapshot}");?> + ', 'hiddenwin', "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")'");?> createLink('zahost', 'restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->restoreSnapshot}");?> createLink('zahost', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->deleteSnapshot}");?> diff --git a/module/zanode/view/createsnapshot.html.php b/module/zanode/view/createsnapshot.html.php index d591de2663..6379bd450f 100644 --- a/module/zanode/view/createsnapshot.html.php +++ b/module/zanode/view/createsnapshot.html.php @@ -12,13 +12,10 @@ ?> - -task);?> id);?> zanode); ?> -
@@ -26,20 +23,6 @@ zanode->createSnapshot;?>
- -
zanode->pending;?>
-
-
-
-
- parent}"); - $link = str_replace('onlybody=yes', '', $link); - $link = trim($link, '?'); - ?> -
zanode->createSnapshotSuccess . html::a($link, $lang->zanode->createSnapshotButton, "_parent", "style='color:#2e7fff;'");?>
-
zanode->createSnapshotFail;?>
-
@@ -58,7 +41,6 @@
-
diff --git a/module/zanode/view/editsnapshot.html.php b/module/zanode/view/editsnapshot.html.php new file mode 100644 index 0000000000..2d2b9dde0d --- /dev/null +++ b/module/zanode/view/editsnapshot.html.php @@ -0,0 +1,45 @@ + + * @package task + * @version + * @link http://www.zentao.net + */ +?> + + +zanode); ?> + +
+
+
+

+ zanode->editSnapshot;?> +

+
+
+ + + + + + + + + + + + + +
zanode->snapshotName;?>localName ? $snapshot->localName : $snapshot->name, "class='form-control'");?>
zanode->desc;?>desc, "rows='6' class='form-control'");?>
+ +
+
+
+
+ diff --git a/module/zanode/view/view.html.php b/module/zanode/view/view.html.php index 168fa86a9f..4a128e888e 100644 --- a/module/zanode/view/view.html.php +++ b/module/zanode/view/view.html.php @@ -202,6 +202,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou ?>
zanode->buildOperateMenu($zanode, 'view'); ?> +
From ffcc487808a1b745d32592d4e1f5bd671df3843d Mon Sep 17 00:00:00 2001 From: zhaoke Date: Thu, 2 Feb 2023 09:16:09 +0000 Subject: [PATCH 10/71] * Finish task #83362. --- api/v1/entries/hostsubmit.php | 13 +++++- db/update18.0.sql | 1 + module/action/lang/en.php | 2 + module/action/lang/zh-cn.php | 2 + module/zanode/control.php | 26 ++++++++++++ module/zanode/lang/en.php | 23 +++++++---- module/zanode/lang/zh-cn.php | 11 +++++- module/zanode/model.php | 46 ++++++++++++++++++++++ module/zanode/view/browsesnapshot.html.php | 12 ++++-- module/zanode/view/view.html.php | 14 ++++--- 10 files changed, 130 insertions(+), 20 deletions(-) diff --git a/api/v1/entries/hostsubmit.php b/api/v1/entries/hostsubmit.php index 83a2a628de..268df5fe90 100644 --- a/api/v1/entries/hostsubmit.php +++ b/api/v1/entries/hostsubmit.php @@ -23,7 +23,7 @@ class hostSubmitEntry extends baseEntry /* Check authorize. */ $header = getallheaders(); $token = isset($header['Authorization']) ? substr($header['Authorization'], 7) : ''; - // if(!$token) return $this->sendError(401, 'Unauthorized'); + if(!$token) return $this->sendError(401, 'Unauthorized'); $now = helper::now(); @@ -38,7 +38,16 @@ class hostSubmitEntry extends baseEntry ->andWhere('tokenTime')->gt($now)->fi() ->fetch('id'); - // if(!$id) return $this->sendError(400, 'Secret error.'); + if(!$id) return $this->sendError(400, 'Secret error.'); + + $imageInfo = $this->dao->select('`status`,`from`')->from(TABLE_IMAGE) + ->where('id')->eq($task) + ->fetch(); + if(empty($imageInfo)) return $this->sendSuccess(200, 'success'); + if($imageInfo->from == 'snapshot' && $imageInfo->status == 'restoring') + { + $image->status = $image->status == 'completed' ? 'restore_completed' : 'restore_failed'; + } $this->dao->update(TABLE_IMAGE)->data($image)->where("id")->eq($task)->exec(); diff --git a/db/update18.0.sql b/db/update18.0.sql index bfb3415f53..188d9253be 100644 --- a/db/update18.0.sql +++ b/db/update18.0.sql @@ -1 +1,2 @@ ALTER TABLE `zt_image` ADD `localName` VARCHAR(64) NOT NULL AFTER `name`; +ALTER TABLE `zt_image` ADD `restoreDate` datetime NOT NULL AFTER `createdDate`; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index dc490dccff..7ead472084 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -238,6 +238,7 @@ $lang->action->desc->switchtolight = '$date, Switch from ALM mode to ligh $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ @@ -422,6 +423,7 @@ $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; $lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->restoredsnapshot = 'create snapshot'; $lang->action->label->editsnapshot = 'edit snapshot'; /* Dynamic information is grouped by object. */ diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index f4ee36d719..868c060b34 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -238,6 +238,7 @@ $lang->action->desc->switchtolight = '$date, 由于 '. $lang->adm $lang->action->desc->getvnc = '$date, $actor对执行节点 $extra 进行了远程操控。' . "\n"; $lang->action->desc->unlinkproduct = '$date, 系统判断由于' . $lang->executionCommon . '所属项目与$extra取消关联,同步将' . $lang->executionCommon . '与$extra取消关联。' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor 创建了快照 $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor 还原了快照 $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor 编辑了快照 $extra。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ @@ -422,6 +423,7 @@ $lang->action->label->linkedrepo = '关联代码库到'; $lang->action->label->unlinkedrepo = '取消了项目与代码库的关联'; $lang->action->label->unlinkproduct = '取消了与产品的关联'; $lang->action->label->createdsnapshot = '创建了快照'; +$lang->action->label->restoredsnapshot = '还原了快照'; $lang->action->label->editsnapshot = '编辑了快照'; /* 动态信息按照对象分组 */ diff --git a/module/zanode/control.php b/module/zanode/control.php index 75a404d7d6..76cd0eb876 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -423,6 +423,32 @@ class zanode extends control $this->display(); } + /** + * Restore node. + * + * @param int $nodeID + * @return void + */ + public function restoreSnapshot($nodeID, $snapshotID, $confirm = 'no') + { + if($confirm == 'no') + { + return print(js::confirm($this->lang->zanode->confirmRestore, inlink('restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshotID}&confirm=yes"))); + } + + $this->zanode->restoreSnapshot($nodeID, $snapshotID); + + if(dao::isError()) + { + return print(js::alert(dao::getError()) . js::reload('parent')); + } + else + { + if(isonlybody()) return print(js::alert($this->lang->zanode->actionSuccess) . js::reload('parent')); + return print(js::alert($this->lang->zanode->actionSuccess) . js::locate($this->createLink('zanode', 'browse'), 'parent')); + } + } + /** * Ajax get template pairs by api. * diff --git a/module/zanode/lang/en.php b/module/zanode/lang/en.php index 483ec50fae..78417a405f 100644 --- a/module/zanode/lang/en.php +++ b/module/zanode/lang/en.php @@ -42,12 +42,13 @@ $lang->zanode->vnc = 'VNC Port'; $lang->zanode->destroyAt = 'Destroy Time'; $lang->zanode->creater = 'Creator'; $lang->zanode->createdDate = 'Create Date'; -$lang->zanode->confirmDelete = "Are you sure about destroying the ZenAgent Node?"; -$lang->zanode->confirmBoot = "Are you sure to start the ZenAgent Node?"; -$lang->zanode->confirmReboot = "Are you sure to restart the ZenAgent Node?"; -$lang->zanode->confirmShutdown = "Are you sure to shutdown the ZenAgent Node?"; -$lang->zanode->confirmSuspend = "Are you sure to suspend the ZenAgent Node?"; -$lang->zanode->confirmResume = "Are you sure to resume the ZenAgent Node?"; +$lang->zanode->confirmDelete = "Are you sure about destroying the ZenAgent Node?"; +$lang->zanode->confirmBoot = "Are you sure to start the ZenAgent Node?"; +$lang->zanode->confirmReboot = "Are you sure to restart the ZenAgent Node?"; +$lang->zanode->confirmShutdown = "Are you sure to shutdown the ZenAgent Node?"; +$lang->zanode->confirmSuspend = "Are you sure to suspend the ZenAgent Node?"; +$lang->zanode->confirmResume = "Are you sure to resume the ZenAgent Node?"; +$lang->zanode->confirmRestore = "Are you sure to restore the ZenAgent Node?"; $lang->zanode->actionSuccess = 'Success'; $lang->zanode->deleted = "Deleted"; $lang->zanode->scriptPath = "Script path"; @@ -87,7 +88,15 @@ $lang->zanode->restoreSnapshot = 'Revert Snapshot'; $lang->zanode->deleteSnapshot = 'Delete Snapshot'; $lang->zanode->snapshotEmpty = 'No snapshots'; -$lang->zanode->imageNameEmpty = 'Name can not be empty.'; +$lang->zanode->snapshot->statusList['creating'] = 'Creating'; +$lang->zanode->snapshot->statusList['completed'] = 'Create Completed'; +$lang->zanode->snapshot->statusList['restoring'] = 'Restoring'; +$lang->zanode->snapshot->statusList['restore_failed'] = 'Restore Failed'; +$lang->zanode->snapshot->statusList['restore_completed'] = 'Restore Completed'; + +$lang->zanode->imageNameEmpty = 'Name can not be empty.'; +$lang->zanode->snapStatusError = 'Snapshot is not ready.'; +$lang->zanode->snapRestoring = 'Snapshot is restoring.'; $lang->zanode->runTimeout = 'Network connection timeout, please check the host and execution node status.'; diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index 1df91949a4..f499d510d7 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -48,6 +48,7 @@ $lang->zanode->confirmReboot = "您确定重启执行节点吗?"; $lang->zanode->confirmShutdown = "您确定关闭执行节点吗?"; $lang->zanode->confirmSuspend = "您确定休眠执行节点吗?"; $lang->zanode->confirmResume = "您确定恢复执行节点吗?"; +$lang->zanode->confirmRestore = "您确定还原执行节点吗?"; $lang->zanode->actionSuccess = '操作成功'; $lang->zanode->deleted = "已删除"; $lang->zanode->scriptPath = "脚本目录"; @@ -87,10 +88,16 @@ $lang->zanode->restoreSnapshot = '还原快照'; $lang->zanode->deleteSnapshot = '删除快照'; $lang->zanode->snapshotEmpty = '无快照'; -$lang->zanode->snapshot->statusList['creating'] = '创建中'; -$lang->zanode->snapshot->statusList['completed'] = '已完成'; +$lang->zanode->snapshot->statusList['creating'] = '创建中'; +$lang->zanode->snapshot->statusList['completed'] = '创建完成'; +$lang->zanode->snapshot->statusList['restoring'] = '还原中'; +$lang->zanode->snapshot->statusList['restore_failed'] = '还原失败'; +$lang->zanode->snapshot->statusList['restore_completed'] = '还原成功'; $lang->zanode->imageNameEmpty = '名称不能为空'; +$lang->zanode->imageNameEmpty = '名称不能为空'; +$lang->zanode->snapStatusError = '快照不可用'; +$lang->zanode->snapRestoring = '快照正在还原中'; $lang->zanode->runTimeout = '自动执行失败,请检查宿主机和执行节点状态'; diff --git a/module/zanode/model.php b/module/zanode/model.php index 41fc14106e..ecc4bb0440 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -254,6 +254,52 @@ class zanodemodel extends model return true; } + /** + * Restore Snapshot to zanode. + * + * @param int $zanodeID + * @access public + * @return void + */ + public function restoreSnapshot($zanodeID = 0, $snapshotID = 0) + { + $node = $this->getNodeByID($zanodeID); + $snap = $this->getImageByID($snapshotID); + + $snap->status = ($snap->status == 'restoring' && time() - strtotime($snap->restoreDate) > 600) ? 'restore_failed' : $snap->status; + if(!in_array($snap->status, array('completed', 'restoring', 'restore_failed', 'restore_completed'))) dao::$errors = $this->lang->zanode->snapStatusError; + if($snap->status == 'restoring') dao::$errors = $this->lang->zanode->snapRestoring; + if(dao::isError()) return false; + + //update snapshot status + $this->dao->update(TABLE_IMAGE) + ->set('status')->eq('restoring') + ->set('restoreDate')->eq(helper::now()) + ->where('id')->eq($snapshotID)->exec(); + + /* Prepare create params. */ + $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; + $param = array(array( + 'name' => $snap->name, + 'task' => $snapshotID, + 'type' => 'revertSnap', + 'vm' => $node->name + )); + + $result = json_decode(commonModel::http($agnetUrl . static::SNAPSHOT_CREATE_PATH, json_encode($param,JSON_NUMERIC_CHECK), null, array("Authorization:$node->tokenSN"))); + + if(!empty($result) and $result->code == 'success') + { + $this->loadModel('action')->create('zanode', $zanodeID, 'restoredsnapshot', '', $snap->name); + return true; + } + + $this->dao->update(TABLE_IMAGE)->set('status')->eq('completed')->where('id')->eq($snapshotID)->exec(); + dao::$errors[] = (!empty($result) and !empty($result->msg)) ? $result->msg : $this->lang->zanode->apiError['fail']; + return false; + } + + /** * Action Node. * diff --git a/module/zanode/view/browsesnapshot.html.php b/module/zanode/view/browsesnapshot.html.php index 93663ef974..3686889565 100644 --- a/module/zanode/view/browsesnapshot.html.php +++ b/module/zanode/view/browsesnapshot.html.php @@ -34,15 +34,19 @@ - status == 'completed' ? zget($snapshot, 'path', '') : '';?> + status = ($snapshot->status == 'restoring' && time() - strtotime($snapshot->restoreDate) > 600) ? 'restore_failed' : $snapshot->status; + $restoreAttr = "title='{$lang->zanode->restoreSnapshot}' target='hiddenwin'"; + $restoreAttr .= $snapshot->status == 'restoring' ? ' class="btn disabled"' : 'class="btn"'; + ?> localName ? $snapshot->localName : $snapshot->name;?> '>zanode->snapshot->statusList, $snapshot->status, '');?> createdBy, '')?> createdDate;?> - ', 'hiddenwin', "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")'");?> - createLink('zahost', 'restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->restoreSnapshot}");?> - createLink('zahost', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->deleteSnapshot}");?> + ', 'hiddenwin', "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")' class='btn'");?> + createLink('zanode', 'restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshot->id}"), '', 'hiddenwin', $restoreAttr);?> + createLink('zanode', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->deleteSnapshot} class='btn'");?> diff --git a/module/zanode/view/view.html.php b/module/zanode/view/view.html.php index 4a128e888e..27e1210261 100644 --- a/module/zanode/view/view.html.php +++ b/module/zanode/view/view.html.php @@ -147,13 +147,17 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
zanode->desc; ?>
desc) ? htmlspecialchars_decode($zanode->desc) : $lang->noData; ?>
+
+ +
+
+
zanode->browseSnapshot;?>
-
-
zanode->browseSnapshot;?>
-
- createLink('zanode', 'browseSnapshot', "nodeID=$zanode->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?> -
+
+ createLink('zanode', 'browseSnapshot', "nodeID=$zanode->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?>
+ +
noData; ?>
From 97fcb6263ee93a09418165184f056289e7d91b36 Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 3 Feb 2023 05:19:53 +0000 Subject: [PATCH 11/71] * Delete snapshot --- module/action/lang/de.php | 4 ++ module/action/lang/en.php | 6 ++- module/action/lang/fr.php | 4 ++ module/action/lang/zh-cn.php | 6 ++- module/group/lang/resource.php | 34 ++++++++-------- module/zanode/control.php | 28 ++++++++++++++ module/zanode/lang/de.php | 22 +++++++---- module/zanode/lang/en.php | 16 ++++---- module/zanode/lang/fr.php | 22 +++++++---- module/zanode/lang/zh-cn.php | 16 ++++---- module/zanode/model.php | 45 ++++++++++++++++++++++ module/zanode/view/browsesnapshot.html.php | 16 +++++--- module/zanode/view/view.html.php | 2 +- 13 files changed, 168 insertions(+), 53 deletions(-) diff --git a/module/action/lang/de.php b/module/action/lang/de.php index f4a0a74ae1..e29603c2f1 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -238,7 +238,9 @@ $lang->action->desc->switchtolight = '$date, Switch from ALM mode to ligh $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -422,7 +424,9 @@ $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; $lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->restoredsnapshot = 'create snapshot'; $lang->action->label->editsnapshot = 'edit snapshot'; +$lang->action->label->deletesnapshot = 'deleted snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 7ead472084..64223a9966 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -238,8 +238,9 @@ $lang->action->desc->switchtolight = '$date, Switch from ALM mode to ligh $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; -$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -423,8 +424,9 @@ $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; $lang->action->label->createdsnapshot = 'create snapshot'; -$lang->action->label->restoredsnapshot = 'create snapshot'; +$lang->action->label->restoredsnapshot = 'create snapshot'; $lang->action->label->editsnapshot = 'edit snapshot'; +$lang->action->label->deletesnapshot = 'deleted snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php index a3a3fce60a..b35dfacfe1 100644 --- a/module/action/lang/fr.php +++ b/module/action/lang/fr.php @@ -238,7 +238,9 @@ $lang->action->desc->switchtolight = '$date, Switch from ALM mode to ligh $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor a créé un sous-tâche $extra。' . "\n"; @@ -422,7 +424,9 @@ $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; $lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->restoredsnapshot = 'create snapshot'; $lang->action->label->editsnapshot = 'edit snapshot'; +$lang->action->label->deletesnapshot = 'deleted snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 868c060b34..ede1fbb1ee 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -238,8 +238,9 @@ $lang->action->desc->switchtolight = '$date, 由于 '. $lang->adm $lang->action->desc->getvnc = '$date, $actor对执行节点 $extra 进行了远程操控。' . "\n"; $lang->action->desc->unlinkproduct = '$date, 系统判断由于' . $lang->executionCommon . '所属项目与$extra取消关联,同步将' . $lang->executionCommon . '与$extra取消关联。' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor 创建了快照 $extra。' . "\n"; -$lang->action->desc->restoredsnapshot = '$date, $actor 还原了快照 $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor 还原了快照 $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor 编辑了快照 $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor 删除了快照 $extra。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -423,8 +424,9 @@ $lang->action->label->linkedrepo = '关联代码库到'; $lang->action->label->unlinkedrepo = '取消了项目与代码库的关联'; $lang->action->label->unlinkproduct = '取消了与产品的关联'; $lang->action->label->createdsnapshot = '创建了快照'; -$lang->action->label->restoredsnapshot = '还原了快照'; +$lang->action->label->restoredsnapshot = '还原了快照'; $lang->action->label->editsnapshot = '编辑了快照'; +$lang->action->label->deletesnapshot = '编辑了快照'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index fc020d0d71..e58bbc2d7e 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1239,21 +1239,23 @@ $lang->zahost->methodOrder[30] = 'downloadImage'; $lang->zahost->methodOrder[35] = 'cancelDownload'; $lang->resource->zanode = new stdclass(); -$lang->resource->zanode->browse = 'browse'; -$lang->resource->zanode->create = 'create'; -$lang->resource->zanode->edit = 'edit'; -$lang->resource->zanode->destroy = 'destroy'; -$lang->resource->zanode->reboot = 'reboot'; -$lang->resource->zanode->suspend = 'suspend'; -$lang->resource->zanode->resume = 'resume'; -$lang->resource->zanode->getVNC = 'getVNC'; -$lang->resource->zanode->start = 'boot'; -$lang->resource->zanode->close = 'shutdown'; -$lang->resource->zanode->view = 'view'; -$lang->resource->zanode->createImage = 'createImage'; -$lang->resource->zanode->browseSnapshot = 'browseSnapshot'; -$lang->resource->zanode->createSnapshot = 'createSnapshot'; -$lang->resource->zanode->editSnapshot = 'editSnapshot'; +$lang->resource->zanode->browse = 'browse'; +$lang->resource->zanode->create = 'create'; +$lang->resource->zanode->edit = 'edit'; +$lang->resource->zanode->destroy = 'destroy'; +$lang->resource->zanode->reboot = 'reboot'; +$lang->resource->zanode->suspend = 'suspend'; +$lang->resource->zanode->resume = 'resume'; +$lang->resource->zanode->getVNC = 'getVNC'; +$lang->resource->zanode->start = 'boot'; +$lang->resource->zanode->close = 'shutdown'; +$lang->resource->zanode->view = 'view'; +$lang->resource->zanode->createImage = 'createImage'; +$lang->resource->zanode->browseSnapshot = 'browseSnapshot'; +$lang->resource->zanode->createSnapshot = 'createSnapshot'; +$lang->resource->zanode->editSnapshot = 'editSnapshot'; +$lang->resource->zanode->restoreSnapshot = 'restoreSnapshot'; +$lang->resource->zanode->deleteSnapshot = 'deleteSnapshot'; $lang->zanode->methodOrder[0] = 'browse'; $lang->zanode->methodOrder[5] = 'create'; @@ -1270,6 +1272,8 @@ $lang->zanode->methodOrder[55] = 'createImage'; $lang->zanode->methodOrder[60] = 'browseSnapshot'; $lang->zanode->methodOrder[65] = 'createSnapshot'; $lang->zanode->methodOrder[70] = 'editSnapshot'; +$lang->zanode->methodOrder[75] = 'restoreSnapshot'; +$lang->zanode->methodOrder[80] = 'deleteSnapshot'; $lang->resource->repo = new stdclass(); $lang->resource->repo->browse = 'browseAction'; diff --git a/module/zanode/control.php b/module/zanode/control.php index 76cd0eb876..2166320c1a 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -342,6 +342,34 @@ class zanode extends control $this->display(); } + /** + * Delete Snapshot. + * + * @param int $snapshotID + * @param string $confirm + * @access public + * @return void + */ + public function deleteSnapshot($snapshotID, $confirm = 'no') + { + if($confirm == 'no') + { + return print(js::confirm($this->lang->zanode->confirmDeleteSnapshot, inlink('deleteSnapshot', "snapshotID={$snapshotID}&confirm=yes"))); + } + + $result = $this->zanode->deleteSnapshot($snapshotID); + + if($result !== true) + { + return print(js::alert($result)); + } + else + { + if(isonlybody()) return print(js::alert($this->lang->zanode->actionSuccess) . js::reload('parent.parent')); + return print(js::alert($this->lang->zanode->actionSuccess) . js::locate($this->createLink('zanode', 'browse'), 'parent')); + } + } + /** * Desctroy node. * diff --git a/module/zanode/lang/de.php b/module/zanode/lang/de.php index 483ec50fae..9d05efbc81 100644 --- a/module/zanode/lang/de.php +++ b/module/zanode/lang/de.php @@ -79,13 +79,21 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; -$lang->zanode->snapshotName = 'Snapshot Name'; -$lang->zanode->browseSnapshot = 'Snapshot List'; -$lang->zanode->createSnapshot = 'Create Snapshot'; -$lang->zanode->editSnapshot = 'Edit Snapshot'; -$lang->zanode->restoreSnapshot = 'Revert Snapshot'; -$lang->zanode->deleteSnapshot = 'Delete Snapshot'; -$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->confirmDeleteSnapshot = "The snapshot cannot be restored from the recycle bin after being deleted. Are you sure to continue?"; + +$lang->zanode->snapshot->statusList['creating'] = 'Creating'; +$lang->zanode->snapshot->statusList['completed'] = 'Create Completed'; +$lang->zanode->snapshot->statusList['failed'] = 'Create Failed'; +$lang->zanode->snapshot->statusList['restoring'] = 'Restoring'; +$lang->zanode->snapshot->statusList['restore_failed'] = 'Restore Failed'; +$lang->zanode->snapshot->statusList['restore_completed'] = 'Restore Completed'; $lang->zanode->imageNameEmpty = 'Name can not be empty.'; diff --git a/module/zanode/lang/en.php b/module/zanode/lang/en.php index 78417a405f..f1c9a29cac 100644 --- a/module/zanode/lang/en.php +++ b/module/zanode/lang/en.php @@ -80,16 +80,18 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; -$lang->zanode->snapshotName = 'Snapshot Name'; -$lang->zanode->browseSnapshot = 'Snapshot List'; -$lang->zanode->createSnapshot = 'Create Snapshot'; -$lang->zanode->editSnapshot = 'Edit Snapshot'; -$lang->zanode->restoreSnapshot = 'Revert Snapshot'; -$lang->zanode->deleteSnapshot = 'Delete Snapshot'; -$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->confirmDeleteSnapshot = "The snapshot cannot be restored from the recycle bin after being deleted. Are you sure to continue?"; $lang->zanode->snapshot->statusList['creating'] = 'Creating'; $lang->zanode->snapshot->statusList['completed'] = 'Create Completed'; +$lang->zanode->snapshot->statusList['failed'] = 'Create Failed'; $lang->zanode->snapshot->statusList['restoring'] = 'Restoring'; $lang->zanode->snapshot->statusList['restore_failed'] = 'Restore Failed'; $lang->zanode->snapshot->statusList['restore_completed'] = 'Restore Completed'; diff --git a/module/zanode/lang/fr.php b/module/zanode/lang/fr.php index 483ec50fae..9d05efbc81 100644 --- a/module/zanode/lang/fr.php +++ b/module/zanode/lang/fr.php @@ -79,13 +79,21 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; -$lang->zanode->snapshotName = 'Snapshot Name'; -$lang->zanode->browseSnapshot = 'Snapshot List'; -$lang->zanode->createSnapshot = 'Create Snapshot'; -$lang->zanode->editSnapshot = 'Edit Snapshot'; -$lang->zanode->restoreSnapshot = 'Revert Snapshot'; -$lang->zanode->deleteSnapshot = 'Delete Snapshot'; -$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->confirmDeleteSnapshot = "The snapshot cannot be restored from the recycle bin after being deleted. Are you sure to continue?"; + +$lang->zanode->snapshot->statusList['creating'] = 'Creating'; +$lang->zanode->snapshot->statusList['completed'] = 'Create Completed'; +$lang->zanode->snapshot->statusList['failed'] = 'Create Failed'; +$lang->zanode->snapshot->statusList['restoring'] = 'Restoring'; +$lang->zanode->snapshot->statusList['restore_failed'] = 'Restore Failed'; +$lang->zanode->snapshot->statusList['restore_completed'] = 'Restore Completed'; $lang->zanode->imageNameEmpty = 'Name can not be empty.'; diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index f499d510d7..52c9f690e0 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -80,16 +80,18 @@ $lang->zanode->createImageSuccess = '镜像导出成功,您可以使用此镜 $lang->zanode->createImageFail = '镜像导出失败'; $lang->zanode->createImageButton = '去创建'; -$lang->zanode->snapshotName = '快照名称'; -$lang->zanode->browseSnapshot = '快照列表'; -$lang->zanode->createSnapshot = '创建快照'; -$lang->zanode->editSnapshot = '编辑快照'; -$lang->zanode->restoreSnapshot = '还原快照'; -$lang->zanode->deleteSnapshot = '删除快照'; -$lang->zanode->snapshotEmpty = '无快照'; +$lang->zanode->snapshotName = '快照名称'; +$lang->zanode->browseSnapshot = '快照列表'; +$lang->zanode->createSnapshot = '创建快照'; +$lang->zanode->editSnapshot = '编辑快照'; +$lang->zanode->restoreSnapshot = '还原快照'; +$lang->zanode->deleteSnapshot = '删除快照'; +$lang->zanode->snapshotEmpty = '无快照'; +$lang->zanode->confirmDeleteSnapshot = "快照被删除后无法从回收站中还原,您确定继续么?"; $lang->zanode->snapshot->statusList['creating'] = '创建中'; $lang->zanode->snapshot->statusList['completed'] = '创建完成'; +$lang->zanode->snapshot->statusList['failed'] = '创建失败'; $lang->zanode->snapshot->statusList['restoring'] = '还原中'; $lang->zanode->snapshot->statusList['restore_failed'] = '还原失败'; $lang->zanode->snapshot->statusList['restore_completed'] = '还原成功'; diff --git a/module/zanode/model.php b/module/zanode/model.php index ecc4bb0440..a594af4650 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -299,6 +299,42 @@ class zanodemodel extends model return false; } + /** + * Delete Snapshot. + * + * @param int $id + * @access public + * @return void + */ + public function deleteSnapshot($snapshotID) + { + $snapshot = $this->getImageByID($snapshotID); + $node = $this->getNodeByID($snapshot->host); + + if($node) + { + $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; + $param = (object)array( + 'name' => $snapshot->name, + 'task' => $snapshotID, + 'vm' => $node->name + ); + + $result = commonModel::http($agnetUrl . static::SNAPSHOT_REMOVE_PATH, json_encode($param,JSON_NUMERIC_CHECK), array(), array("Authorization:$node->tokenSN")); + $result = json_decode($result); + + if(!empty($result) and $result->code == 'success') + { + $this->dao->delete()->from(TABLE_IMAGE)->where('id')->eq($snapshotID)->exec(); + $this->loadModel('action')->create('zanode', $node->id, 'deletesnapshot', '', $snapshot->name); + return true; + } + + $error = (!empty($result) and !empty($result->msg)) ? $result->msg : $this->lang->zanode->apiError['fail']; + return $error; + } + } + /** * Action Node. @@ -662,6 +698,15 @@ class zanodemodel extends model ->page($pager) ->fetchAll('name'); + foreach($snapshotList as $name => $snapshot) + { + if($snapshot->status == 'creating' and (time() - strtotime($snapshot->createdDate)) > 1800) + { + $this->dao->update(TABLE_IMAGE)->set('status')->eq('failed')->where('id')->eq($snapshot->id)->exec(); + $snapshotList[$name]->status = 'failed'; + } + } + return $snapshotList; } diff --git a/module/zanode/view/browsesnapshot.html.php b/module/zanode/view/browsesnapshot.html.php index 3686889565..8abc25f631 100644 --- a/module/zanode/view/browsesnapshot.html.php +++ b/module/zanode/view/browsesnapshot.html.php @@ -34,19 +34,25 @@ - status = ($snapshot->status == 'restoring' && time() - strtotime($snapshot->restoreDate) > 600) ? 'restore_failed' : $snapshot->status; + + $editAttr = $snapshot->status == 'failed' ? 'class="btn disabled"' : "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")' class='btn'"; + $restoreAttr = "title='{$lang->zanode->restoreSnapshot}' target='hiddenwin'"; - $restoreAttr .= $snapshot->status == 'restoring' ? ' class="btn disabled"' : 'class="btn"'; + $restoreAttr .= ($snapshot->status == 'restoring' or $snapshot->status == 'failed') ? ' class="btn disabled"' : 'class="btn"'; + + $deleteAttr = "title='{$lang->zanode->deleteSnapshot}' target='hiddenwin'"; + $deleteAttr .= (($snapshot->status == 'restoring' and (time() - strtotime($snapshot->restoreDate)) <= 600) or $snapshot->status == 'failed') ? ' class="btn disabled"' : 'class="btn"'; ?> localName ? $snapshot->localName : $snapshot->name;?> - '>zanode->snapshot->statusList, $snapshot->status, '');?> + zanode->snapshot->statusList, $snapshot->status, '');?> createdBy, '')?> createdDate;?> - ', 'hiddenwin', "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")' class='btn'");?> + ', 'hiddenwin', $editAttr);?> createLink('zanode', 'restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshot->id}"), '', 'hiddenwin', $restoreAttr);?> - createLink('zanode', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->deleteSnapshot} class='btn'");?> + createLink('zanode', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', $deleteAttr);?> diff --git a/module/zanode/view/view.html.php b/module/zanode/view/view.html.php index 27e1210261..ff3d5ee010 100644 --- a/module/zanode/view/view.html.php +++ b/module/zanode/view/view.html.php @@ -152,7 +152,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
zanode->browseSnapshot;?>
- +
createLink('zanode', 'browseSnapshot', "nodeID=$zanode->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?>
From 4ff09220baf159aadcbabb5ffba08cfcf357f72a Mon Sep 17 00:00:00 2001 From: zhaoke Date: Fri, 3 Feb 2023 05:35:22 +0000 Subject: [PATCH 12/71] * Fix bug #31896. --- module/action/config.php | 1 + module/zahost/control.php | 3 ++- module/zahost/js/view.js | 1 - module/zahost/view/view.html.php | 2 ++ module/zanode/control.php | 4 ++-- module/zanode/lang/en.php | 1 + module/zanode/lang/zh-cn.php | 2 +- module/zanode/view/browsesnapshot.html.php | 4 +++- module/zanode/view/list.html.php | 1 + 9 files changed, 13 insertions(+), 6 deletions(-) diff --git a/module/action/config.php b/module/action/config.php index aae2118c64..77eaec4b92 100755 --- a/module/action/config.php +++ b/module/action/config.php @@ -49,6 +49,7 @@ $config->action->objectNameFields['stage'] = 'name'; $config->action->objectNameFields['apistruct'] = 'name'; $config->action->objectNameFields['repo'] = 'name'; $config->action->objectNameFields['dataview'] = 'name'; +$config->action->objectNameFields['zahost'] = 'name'; $config->action->objectNameFields['zanode'] = 'name'; $config->action->commonImgSize = 870; diff --git a/module/zahost/control.php b/module/zahost/control.php index a6f09f613c..a49ab2902a 100644 --- a/module/zahost/control.php +++ b/module/zahost/control.php @@ -168,8 +168,9 @@ class zahost extends control return print(js::confirm($this->lang->zahost->confirmDelete, inlink('delete', "hostID=$hostID&confirm=yes"))); } - $this->zahost->delete(TABLE_ZAHOST, $hostID); + $this->dao->update(TABLE_ZAHOST)->set('deleted')->eq(1)->where('id')->eq($hostID)->exec(); $this->loadModel('action')->create('zahost', $hostID, 'deleted'); + $this->loadModel('action')->create('zahost', $hostID, 'deleted', '', $extra = ACTIONMODEL::CAN_UNDELETED); /* if ajax request, send result. */ if($this->server->ajax) diff --git a/module/zahost/js/view.js b/module/zahost/js/view.js index 4df1246224..2b07966f7c 100644 --- a/module/zahost/js/view.js +++ b/module/zahost/js/view.js @@ -76,7 +76,6 @@ function setIframeHeight(iframe) { var height = iframeWin.document.documentElement.scrollHeight || iframeWin.document.body.scrollHeight iframe.height = height+10; - console.log(1111, iframe.height) } } } \ No newline at end of file diff --git a/module/zahost/view/view.html.php b/module/zahost/view/view.html.php index 61d09e08fe..012ba10e13 100644 --- a/module/zahost/view/view.html.php +++ b/module/zahost/view/view.html.php @@ -132,6 +132,7 @@
desc) ? htmlspecialchars_decode($zahost->desc) : $lang->noData;?>
+
zahost->browseNode;?>
@@ -148,6 +149,7 @@ if($canBeChanged) $actionFormLink = $this->createLink('action', 'comment', "objectType=zahost&objectID=$zahost->hostID"); ?>
+ printExtendFields($zahost, 'div', "position=left&inForm=0&inCell=1");?>
diff --git a/module/zanode/control.php b/module/zanode/control.php index 76cd0eb876..595e650db2 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -78,9 +78,9 @@ class zanode extends control */ public function list($hostID, $orderBy = 'id_desc') { - if(!commonModel::hasPriv('zahost', 'view')) + if(!commonModel::hasPriv('zanode', 'browse')) { - $this->loadModel('common')->deny('zahost', 'view'); + $this->loadModel('common')->deny('zanode', 'browse'); } $this->view->title = $this->lang->zanode->common; $this->view->nodeList = $this->loadModel("zanode")->getListByHost($hostID, $orderBy); diff --git a/module/zanode/lang/en.php b/module/zanode/lang/en.php index 78417a405f..dcada9c8bd 100644 --- a/module/zanode/lang/en.php +++ b/module/zanode/lang/en.php @@ -49,6 +49,7 @@ $lang->zanode->confirmShutdown = "Are you sure to shutdown the ZenAgent Node?"; $lang->zanode->confirmSuspend = "Are you sure to suspend the ZenAgent Node?"; $lang->zanode->confirmResume = "Are you sure to resume the ZenAgent Node?"; $lang->zanode->confirmRestore = "Are you sure to restore the ZenAgent Node?"; +$lang->zanode->confirmRestore = "The ZenAgent Node will be restored to this snapshot state, are you sure you want to continue?"; $lang->zanode->actionSuccess = 'Success'; $lang->zanode->deleted = "Deleted"; $lang->zanode->scriptPath = "Script path"; diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index f499d510d7..4ea8485bf4 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -48,7 +48,7 @@ $lang->zanode->confirmReboot = "您确定重启执行节点吗?"; $lang->zanode->confirmShutdown = "您确定关闭执行节点吗?"; $lang->zanode->confirmSuspend = "您确定休眠执行节点吗?"; $lang->zanode->confirmResume = "您确定恢复执行节点吗?"; -$lang->zanode->confirmRestore = "您确定还原执行节点吗?"; +$lang->zanode->confirmRestore = "执行节点将会还原至此快照状态,您确定要继续么?"; $lang->zanode->actionSuccess = '操作成功'; $lang->zanode->deleted = "已删除"; $lang->zanode->scriptPath = "脚本目录"; diff --git a/module/zanode/view/browsesnapshot.html.php b/module/zanode/view/browsesnapshot.html.php index 3686889565..1f5ebda9a4 100644 --- a/module/zanode/view/browsesnapshot.html.php +++ b/module/zanode/view/browsesnapshot.html.php @@ -38,6 +38,8 @@ $snapshot->status = ($snapshot->status == 'restoring' && time() - strtotime($snapshot->restoreDate) > 600) ? 'restore_failed' : $snapshot->status; $restoreAttr = "title='{$lang->zanode->restoreSnapshot}' target='hiddenwin'"; $restoreAttr .= $snapshot->status == 'restoring' ? ' class="btn disabled"' : 'class="btn"'; + $deleteAttr = "title='{$lang->zanode->deleteSnapshot}' target='hiddenwin'"; + $deleteAttr .= $snapshot->status == 'restoring' ? ' class="btn disabled"' : 'class="btn"'; ?> localName ? $snapshot->localName : $snapshot->name;?> '>zanode->snapshot->statusList, $snapshot->status, '');?> @@ -46,7 +48,7 @@ ', 'hiddenwin', "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")' class='btn'");?> createLink('zanode', 'restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshot->id}"), '', 'hiddenwin', $restoreAttr);?> - createLink('zanode', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', "title={$lang->zanode->deleteSnapshot} class='btn'");?> + createLink('zanode', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', $deleteAttr);?> diff --git a/module/zanode/view/list.html.php b/module/zanode/view/list.html.php index 084e62a41a..37e595a1e5 100644 --- a/module/zanode/view/list.html.php +++ b/module/zanode/view/list.html.php @@ -11,6 +11,7 @@ * @link http://www.zentao.net */ ?> + getModuleRoot() . 'common/view/header.html.php'; ?>
From 6374db88a628a9e63bb39792f4bf58d69a914c4e Mon Sep 17 00:00:00 2001 From: zhaoke Date: Fri, 3 Feb 2023 05:35:47 +0000 Subject: [PATCH 13/71] * Fix bug #31896. --- module/zahost/control.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/zahost/control.php b/module/zahost/control.php index a49ab2902a..e7787eb289 100644 --- a/module/zahost/control.php +++ b/module/zahost/control.php @@ -169,7 +169,6 @@ class zahost extends control } $this->dao->update(TABLE_ZAHOST)->set('deleted')->eq(1)->where('id')->eq($hostID)->exec(); - $this->loadModel('action')->create('zahost', $hostID, 'deleted'); $this->loadModel('action')->create('zahost', $hostID, 'deleted', '', $extra = ACTIONMODEL::CAN_UNDELETED); /* if ajax request, send result. */ From 1583320705fb5043e61e7df5f6950938fd3a5aa1 Mon Sep 17 00:00:00 2001 From: zhaoke Date: Fri, 3 Feb 2023 05:41:57 +0000 Subject: [PATCH 14/71] * Merge --- module/action/lang/de.php | 4 ++ module/action/lang/en.php | 6 ++- module/action/lang/fr.php | 4 ++ module/action/lang/zh-cn.php | 6 ++- module/group/lang/resource.php | 34 ++++++++-------- module/zanode/control.php | 28 ++++++++++++++ module/zanode/lang/de.php | 22 +++++++---- module/zanode/lang/en.php | 16 ++++---- module/zanode/lang/fr.php | 22 +++++++---- module/zanode/lang/zh-cn.php | 16 ++++---- module/zanode/model.php | 45 ++++++++++++++++++++++ module/zanode/view/browsesnapshot.html.php | 14 ++++--- module/zanode/view/view.html.php | 2 +- 13 files changed, 166 insertions(+), 53 deletions(-) diff --git a/module/action/lang/de.php b/module/action/lang/de.php index f4a0a74ae1..e29603c2f1 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -238,7 +238,9 @@ $lang->action->desc->switchtolight = '$date, Switch from ALM mode to ligh $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -422,7 +424,9 @@ $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; $lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->restoredsnapshot = 'create snapshot'; $lang->action->label->editsnapshot = 'edit snapshot'; +$lang->action->label->deletesnapshot = 'deleted snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 7ead472084..64223a9966 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -238,8 +238,9 @@ $lang->action->desc->switchtolight = '$date, Switch from ALM mode to ligh $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; -$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -423,8 +424,9 @@ $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; $lang->action->label->createdsnapshot = 'create snapshot'; -$lang->action->label->restoredsnapshot = 'create snapshot'; +$lang->action->label->restoredsnapshot = 'create snapshot'; $lang->action->label->editsnapshot = 'edit snapshot'; +$lang->action->label->deletesnapshot = 'deleted snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php index a3a3fce60a..b35dfacfe1 100644 --- a/module/action/lang/fr.php +++ b/module/action/lang/fr.php @@ -238,7 +238,9 @@ $lang->action->desc->switchtolight = '$date, Switch from ALM mode to ligh $lang->action->desc->getvnc = '$date, Remote control $extra by $actor .' . "\n"; $lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor creates a snapshot $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor restored a snapshot $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor edited the snapshot $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor deleted snapshot $extra。' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor a créé un sous-tâche $extra。' . "\n"; @@ -422,7 +424,9 @@ $lang->action->label->linkedrepo = 'Linked Code Repo'; $lang->action->label->unlinkedrepo = 'Unlinked Code Repo'; $lang->action->label->unlinkproduct = 'Unlinked Product'; $lang->action->label->createdsnapshot = 'create snapshot'; +$lang->action->label->restoredsnapshot = 'create snapshot'; $lang->action->label->editsnapshot = 'edit snapshot'; +$lang->action->label->deletesnapshot = 'deleted snapshot'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 868c060b34..ede1fbb1ee 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -238,8 +238,9 @@ $lang->action->desc->switchtolight = '$date, 由于 '. $lang->adm $lang->action->desc->getvnc = '$date, $actor对执行节点 $extra 进行了远程操控。' . "\n"; $lang->action->desc->unlinkproduct = '$date, 系统判断由于' . $lang->executionCommon . '所属项目与$extra取消关联,同步将' . $lang->executionCommon . '与$extra取消关联。' . "\n"; $lang->action->desc->createdsnapshot = '$date, $actor 创建了快照 $extra。' . "\n"; -$lang->action->desc->restoredsnapshot = '$date, $actor 还原了快照 $extra。' . "\n"; +$lang->action->desc->restoredsnapshot = '$date, $actor 还原了快照 $extra。' . "\n"; $lang->action->desc->editsnapshot = '$date, $actor 编辑了快照 $extra。' . "\n"; +$lang->action->desc->deletesnapshot = '$date, $actor 删除了快照 $extra。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -423,8 +424,9 @@ $lang->action->label->linkedrepo = '关联代码库到'; $lang->action->label->unlinkedrepo = '取消了项目与代码库的关联'; $lang->action->label->unlinkproduct = '取消了与产品的关联'; $lang->action->label->createdsnapshot = '创建了快照'; -$lang->action->label->restoredsnapshot = '还原了快照'; +$lang->action->label->restoredsnapshot = '还原了快照'; $lang->action->label->editsnapshot = '编辑了快照'; +$lang->action->label->deletesnapshot = '编辑了快照'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index fc020d0d71..e58bbc2d7e 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1239,21 +1239,23 @@ $lang->zahost->methodOrder[30] = 'downloadImage'; $lang->zahost->methodOrder[35] = 'cancelDownload'; $lang->resource->zanode = new stdclass(); -$lang->resource->zanode->browse = 'browse'; -$lang->resource->zanode->create = 'create'; -$lang->resource->zanode->edit = 'edit'; -$lang->resource->zanode->destroy = 'destroy'; -$lang->resource->zanode->reboot = 'reboot'; -$lang->resource->zanode->suspend = 'suspend'; -$lang->resource->zanode->resume = 'resume'; -$lang->resource->zanode->getVNC = 'getVNC'; -$lang->resource->zanode->start = 'boot'; -$lang->resource->zanode->close = 'shutdown'; -$lang->resource->zanode->view = 'view'; -$lang->resource->zanode->createImage = 'createImage'; -$lang->resource->zanode->browseSnapshot = 'browseSnapshot'; -$lang->resource->zanode->createSnapshot = 'createSnapshot'; -$lang->resource->zanode->editSnapshot = 'editSnapshot'; +$lang->resource->zanode->browse = 'browse'; +$lang->resource->zanode->create = 'create'; +$lang->resource->zanode->edit = 'edit'; +$lang->resource->zanode->destroy = 'destroy'; +$lang->resource->zanode->reboot = 'reboot'; +$lang->resource->zanode->suspend = 'suspend'; +$lang->resource->zanode->resume = 'resume'; +$lang->resource->zanode->getVNC = 'getVNC'; +$lang->resource->zanode->start = 'boot'; +$lang->resource->zanode->close = 'shutdown'; +$lang->resource->zanode->view = 'view'; +$lang->resource->zanode->createImage = 'createImage'; +$lang->resource->zanode->browseSnapshot = 'browseSnapshot'; +$lang->resource->zanode->createSnapshot = 'createSnapshot'; +$lang->resource->zanode->editSnapshot = 'editSnapshot'; +$lang->resource->zanode->restoreSnapshot = 'restoreSnapshot'; +$lang->resource->zanode->deleteSnapshot = 'deleteSnapshot'; $lang->zanode->methodOrder[0] = 'browse'; $lang->zanode->methodOrder[5] = 'create'; @@ -1270,6 +1272,8 @@ $lang->zanode->methodOrder[55] = 'createImage'; $lang->zanode->methodOrder[60] = 'browseSnapshot'; $lang->zanode->methodOrder[65] = 'createSnapshot'; $lang->zanode->methodOrder[70] = 'editSnapshot'; +$lang->zanode->methodOrder[75] = 'restoreSnapshot'; +$lang->zanode->methodOrder[80] = 'deleteSnapshot'; $lang->resource->repo = new stdclass(); $lang->resource->repo->browse = 'browseAction'; diff --git a/module/zanode/control.php b/module/zanode/control.php index 595e650db2..73559c7886 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -342,6 +342,34 @@ class zanode extends control $this->display(); } + /** + * Delete Snapshot. + * + * @param int $snapshotID + * @param string $confirm + * @access public + * @return void + */ + public function deleteSnapshot($snapshotID, $confirm = 'no') + { + if($confirm == 'no') + { + return print(js::confirm($this->lang->zanode->confirmDeleteSnapshot, inlink('deleteSnapshot', "snapshotID={$snapshotID}&confirm=yes"))); + } + + $result = $this->zanode->deleteSnapshot($snapshotID); + + if($result !== true) + { + return print(js::alert($result)); + } + else + { + if(isonlybody()) return print(js::alert($this->lang->zanode->actionSuccess) . js::reload('parent.parent')); + return print(js::alert($this->lang->zanode->actionSuccess) . js::locate($this->createLink('zanode', 'browse'), 'parent')); + } + } + /** * Desctroy node. * diff --git a/module/zanode/lang/de.php b/module/zanode/lang/de.php index 483ec50fae..9d05efbc81 100644 --- a/module/zanode/lang/de.php +++ b/module/zanode/lang/de.php @@ -79,13 +79,21 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; -$lang->zanode->snapshotName = 'Snapshot Name'; -$lang->zanode->browseSnapshot = 'Snapshot List'; -$lang->zanode->createSnapshot = 'Create Snapshot'; -$lang->zanode->editSnapshot = 'Edit Snapshot'; -$lang->zanode->restoreSnapshot = 'Revert Snapshot'; -$lang->zanode->deleteSnapshot = 'Delete Snapshot'; -$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->confirmDeleteSnapshot = "The snapshot cannot be restored from the recycle bin after being deleted. Are you sure to continue?"; + +$lang->zanode->snapshot->statusList['creating'] = 'Creating'; +$lang->zanode->snapshot->statusList['completed'] = 'Create Completed'; +$lang->zanode->snapshot->statusList['failed'] = 'Create Failed'; +$lang->zanode->snapshot->statusList['restoring'] = 'Restoring'; +$lang->zanode->snapshot->statusList['restore_failed'] = 'Restore Failed'; +$lang->zanode->snapshot->statusList['restore_completed'] = 'Restore Completed'; $lang->zanode->imageNameEmpty = 'Name can not be empty.'; diff --git a/module/zanode/lang/en.php b/module/zanode/lang/en.php index dcada9c8bd..2e088159cb 100644 --- a/module/zanode/lang/en.php +++ b/module/zanode/lang/en.php @@ -81,16 +81,18 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; -$lang->zanode->snapshotName = 'Snapshot Name'; -$lang->zanode->browseSnapshot = 'Snapshot List'; -$lang->zanode->createSnapshot = 'Create Snapshot'; -$lang->zanode->editSnapshot = 'Edit Snapshot'; -$lang->zanode->restoreSnapshot = 'Revert Snapshot'; -$lang->zanode->deleteSnapshot = 'Delete Snapshot'; -$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->confirmDeleteSnapshot = "The snapshot cannot be restored from the recycle bin after being deleted. Are you sure to continue?"; $lang->zanode->snapshot->statusList['creating'] = 'Creating'; $lang->zanode->snapshot->statusList['completed'] = 'Create Completed'; +$lang->zanode->snapshot->statusList['failed'] = 'Create Failed'; $lang->zanode->snapshot->statusList['restoring'] = 'Restoring'; $lang->zanode->snapshot->statusList['restore_failed'] = 'Restore Failed'; $lang->zanode->snapshot->statusList['restore_completed'] = 'Restore Completed'; diff --git a/module/zanode/lang/fr.php b/module/zanode/lang/fr.php index 483ec50fae..9d05efbc81 100644 --- a/module/zanode/lang/fr.php +++ b/module/zanode/lang/fr.php @@ -79,13 +79,21 @@ $lang->zanode->createImageSuccess = 'Successed, You can use this image to create $lang->zanode->createImageFail = 'Failed to create'; $lang->zanode->createImageButton = 'Create image'; -$lang->zanode->snapshotName = 'Snapshot Name'; -$lang->zanode->browseSnapshot = 'Snapshot List'; -$lang->zanode->createSnapshot = 'Create Snapshot'; -$lang->zanode->editSnapshot = 'Edit Snapshot'; -$lang->zanode->restoreSnapshot = 'Revert Snapshot'; -$lang->zanode->deleteSnapshot = 'Delete Snapshot'; -$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->snapshotName = 'Snapshot Name'; +$lang->zanode->browseSnapshot = 'Snapshot List'; +$lang->zanode->createSnapshot = 'Create Snapshot'; +$lang->zanode->editSnapshot = 'Edit Snapshot'; +$lang->zanode->restoreSnapshot = 'Revert Snapshot'; +$lang->zanode->deleteSnapshot = 'Delete Snapshot'; +$lang->zanode->snapshotEmpty = 'No snapshots'; +$lang->zanode->confirmDeleteSnapshot = "The snapshot cannot be restored from the recycle bin after being deleted. Are you sure to continue?"; + +$lang->zanode->snapshot->statusList['creating'] = 'Creating'; +$lang->zanode->snapshot->statusList['completed'] = 'Create Completed'; +$lang->zanode->snapshot->statusList['failed'] = 'Create Failed'; +$lang->zanode->snapshot->statusList['restoring'] = 'Restoring'; +$lang->zanode->snapshot->statusList['restore_failed'] = 'Restore Failed'; +$lang->zanode->snapshot->statusList['restore_completed'] = 'Restore Completed'; $lang->zanode->imageNameEmpty = 'Name can not be empty.'; diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index 4ea8485bf4..4372c17879 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -80,16 +80,18 @@ $lang->zanode->createImageSuccess = '镜像导出成功,您可以使用此镜 $lang->zanode->createImageFail = '镜像导出失败'; $lang->zanode->createImageButton = '去创建'; -$lang->zanode->snapshotName = '快照名称'; -$lang->zanode->browseSnapshot = '快照列表'; -$lang->zanode->createSnapshot = '创建快照'; -$lang->zanode->editSnapshot = '编辑快照'; -$lang->zanode->restoreSnapshot = '还原快照'; -$lang->zanode->deleteSnapshot = '删除快照'; -$lang->zanode->snapshotEmpty = '无快照'; +$lang->zanode->snapshotName = '快照名称'; +$lang->zanode->browseSnapshot = '快照列表'; +$lang->zanode->createSnapshot = '创建快照'; +$lang->zanode->editSnapshot = '编辑快照'; +$lang->zanode->restoreSnapshot = '还原快照'; +$lang->zanode->deleteSnapshot = '删除快照'; +$lang->zanode->snapshotEmpty = '无快照'; +$lang->zanode->confirmDeleteSnapshot = "快照被删除后无法从回收站中还原,您确定继续么?"; $lang->zanode->snapshot->statusList['creating'] = '创建中'; $lang->zanode->snapshot->statusList['completed'] = '创建完成'; +$lang->zanode->snapshot->statusList['failed'] = '创建失败'; $lang->zanode->snapshot->statusList['restoring'] = '还原中'; $lang->zanode->snapshot->statusList['restore_failed'] = '还原失败'; $lang->zanode->snapshot->statusList['restore_completed'] = '还原成功'; diff --git a/module/zanode/model.php b/module/zanode/model.php index ecc4bb0440..a594af4650 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -299,6 +299,42 @@ class zanodemodel extends model return false; } + /** + * Delete Snapshot. + * + * @param int $id + * @access public + * @return void + */ + public function deleteSnapshot($snapshotID) + { + $snapshot = $this->getImageByID($snapshotID); + $node = $this->getNodeByID($snapshot->host); + + if($node) + { + $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; + $param = (object)array( + 'name' => $snapshot->name, + 'task' => $snapshotID, + 'vm' => $node->name + ); + + $result = commonModel::http($agnetUrl . static::SNAPSHOT_REMOVE_PATH, json_encode($param,JSON_NUMERIC_CHECK), array(), array("Authorization:$node->tokenSN")); + $result = json_decode($result); + + if(!empty($result) and $result->code == 'success') + { + $this->dao->delete()->from(TABLE_IMAGE)->where('id')->eq($snapshotID)->exec(); + $this->loadModel('action')->create('zanode', $node->id, 'deletesnapshot', '', $snapshot->name); + return true; + } + + $error = (!empty($result) and !empty($result->msg)) ? $result->msg : $this->lang->zanode->apiError['fail']; + return $error; + } + } + /** * Action Node. @@ -662,6 +698,15 @@ class zanodemodel extends model ->page($pager) ->fetchAll('name'); + foreach($snapshotList as $name => $snapshot) + { + if($snapshot->status == 'creating' and (time() - strtotime($snapshot->createdDate)) > 1800) + { + $this->dao->update(TABLE_IMAGE)->set('status')->eq('failed')->where('id')->eq($snapshot->id)->exec(); + $snapshotList[$name]->status = 'failed'; + } + } + return $snapshotList; } diff --git a/module/zanode/view/browsesnapshot.html.php b/module/zanode/view/browsesnapshot.html.php index 1f5ebda9a4..8abc25f631 100644 --- a/module/zanode/view/browsesnapshot.html.php +++ b/module/zanode/view/browsesnapshot.html.php @@ -34,19 +34,23 @@ - status = ($snapshot->status == 'restoring' && time() - strtotime($snapshot->restoreDate) > 600) ? 'restore_failed' : $snapshot->status; + + $editAttr = $snapshot->status == 'failed' ? 'class="btn disabled"' : "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")' class='btn'"; + $restoreAttr = "title='{$lang->zanode->restoreSnapshot}' target='hiddenwin'"; - $restoreAttr .= $snapshot->status == 'restoring' ? ' class="btn disabled"' : 'class="btn"'; + $restoreAttr .= ($snapshot->status == 'restoring' or $snapshot->status == 'failed') ? ' class="btn disabled"' : 'class="btn"'; + $deleteAttr = "title='{$lang->zanode->deleteSnapshot}' target='hiddenwin'"; - $deleteAttr .= $snapshot->status == 'restoring' ? ' class="btn disabled"' : 'class="btn"'; + $deleteAttr .= (($snapshot->status == 'restoring' and (time() - strtotime($snapshot->restoreDate)) <= 600) or $snapshot->status == 'failed') ? ' class="btn disabled"' : 'class="btn"'; ?> localName ? $snapshot->localName : $snapshot->name;?> - '>zanode->snapshot->statusList, $snapshot->status, '');?> + zanode->snapshot->statusList, $snapshot->status, '');?> createdBy, '')?> createdDate;?> - ', 'hiddenwin', "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")' class='btn'");?> + ', 'hiddenwin', $editAttr);?> createLink('zanode', 'restoreSnapshot', "nodeID={$nodeID}&snapshotID={$snapshot->id}"), '', 'hiddenwin', $restoreAttr);?> createLink('zanode', 'deleteSnapshot', "snapshotID={$snapshot->id}"), '', 'hiddenwin', $deleteAttr);?> diff --git a/module/zanode/view/view.html.php b/module/zanode/view/view.html.php index 27e1210261..ff3d5ee010 100644 --- a/module/zanode/view/view.html.php +++ b/module/zanode/view/view.html.php @@ -152,7 +152,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
zanode->browseSnapshot;?>
- +
createLink('zanode', 'browseSnapshot', "nodeID=$zanode->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?>
From a6a820376941e9eab7197d1767bbf78488672b30 Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 3 Feb 2023 06:07:23 +0000 Subject: [PATCH 15/71] *Fix bugs --- module/zanode/css/browsesnapshot.css | 2 +- module/zanode/js/browsesnapshot.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 module/zanode/js/browsesnapshot.js diff --git a/module/zanode/css/browsesnapshot.css b/module/zanode/css/browsesnapshot.css index 5218ddb6ee..d5033bef8f 100644 --- a/module/zanode/css/browsesnapshot.css +++ b/module/zanode/css/browsesnapshot.css @@ -3,4 +3,4 @@ body{background-color: #fff!important;} .c-createdBy {width: 100px;} .c-datetime {width: 130px;} -.c-status {width: 80px;} +.c-status {width: 120px;} diff --git a/module/zanode/js/browsesnapshot.js b/module/zanode/js/browsesnapshot.js new file mode 100644 index 0000000000..a09811ad70 --- /dev/null +++ b/module/zanode/js/browsesnapshot.js @@ -0,0 +1,7 @@ +$(function() +{ + var myPager = $('.pager').data('zui.pager'); + + myPager.options.menuDirection = 'dropdown'; + myPager.set(); +}); From 27a5843cadfdaa31eecdc2e6c0ee9bff9e924257 Mon Sep 17 00:00:00 2001 From: liuhong Date: Fri, 3 Feb 2023 06:09:53 +0000 Subject: [PATCH 16/71] * Adjuct code for feedback #1836. --- module/story/model.php | 2 +- module/task/model.php | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index b6e3480739..4333f3f6d8 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -5509,7 +5509,7 @@ class storyModel extends model $stories[$id]->title = $story->title; $stories[$id]->cases = $this->loadModel('testcase')->getStoryCases($id); $stories[$id]->bugs = $this->loadModel('bug')->getStoryBugs($id); - $stories[$id]->tasks = $this->loadModel('task')->getStoryTasks($id); + $stories[$id]->tasks = $this->loadModel('task')->getStoryTasks($id, 0, $projectID); if($this->config->edition == 'max') { $stories[$id]->designs = $this->dao->select('id, name')->from(TABLE_DESIGN) diff --git a/module/task/model.php b/module/task/model.php index 93d401f575..6bc20d4347 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -2722,16 +2722,18 @@ class taskModel extends model * * @param int $storyID * @param int $executionID + * @param int $projectID * @access public * @return array */ - public function getStoryTasks($storyID, $executionID = 0) + public function getStoryTasks($storyID, $executionID = 0, $projectID = 0) { $tasks = $this->dao->select('id, parent, name, assignedTo, pri, status, estimate, consumed, closedReason, `left`') ->from(TABLE_TASK) ->where('story')->eq((int)$storyID) ->andWhere('deleted')->eq(0) ->beginIF($executionID)->andWhere('execution')->eq($executionID)->fi() + ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() ->fetchAll('id'); $parents = array(); From ecee798f488826bad8439551f728bb852865475e Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 3 Feb 2023 08:26:26 +0000 Subject: [PATCH 17/71] * Fix bugs --- module/zanode/control.php | 19 ++++++++++--------- module/zanode/lang/de.php | 1 + module/zanode/lang/en.php | 1 + module/zanode/lang/fr.php | 1 + module/zanode/lang/zh-cn.php | 1 + module/zanode/model.php | 2 ++ module/zanode/view/browsesnapshot.html.php | 2 +- 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/module/zanode/control.php b/module/zanode/control.php index 73559c7886..ef0141ded4 100644 --- a/module/zanode/control.php +++ b/module/zanode/control.php @@ -439,14 +439,15 @@ class zanode extends control $snapshotList = $this->zanode->getSnapshotList($nodeID, $browseType, $param, $orderBy, $pager); - $this->view->title = $this->lang->zanode->browseSnapshot; - $this->view->nodeID = $nodeID; - $this->view->snapshotList = $snapshotList; - $this->view->users = $this->loadModel('user')->getPairs('noletter'); - $this->view->pager = $pager; - $this->view->param = $param; - $this->view->orderBy = $orderBy; - $this->view->browseType = $browseType; + $this->view->title = $this->lang->zanode->browseSnapshot; + $this->view->nodeID = $nodeID; + $this->view->node = $this->zanode->getNodeByID($nodeID); + $this->view->snapshotList = $snapshotList; + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->pager = $pager; + $this->view->param = $param; + $this->view->orderBy = $orderBy; + $this->view->browseType = $browseType; $this->display(); } @@ -472,7 +473,7 @@ class zanode extends control } else { - if(isonlybody()) return print(js::alert($this->lang->zanode->actionSuccess) . js::reload('parent')); + if(isonlybody()) return print(js::alert($this->lang->zanode->actionSuccess) . js::reload('parent.parent')); return print(js::alert($this->lang->zanode->actionSuccess) . js::locate($this->createLink('zanode', 'browse'), 'parent')); } } diff --git a/module/zanode/lang/de.php b/module/zanode/lang/de.php index 9d05efbc81..35fb26c602 100644 --- a/module/zanode/lang/de.php +++ b/module/zanode/lang/de.php @@ -117,6 +117,7 @@ $lang->zanode->statusList['shutodown'] = 'shutdown'; $lang->zanode->statusList['destroy_fail'] = 'Destroy Fail'; $lang->zanode->statusList['wait'] = 'Initializing'; $lang->zanode->statusList['online'] = 'Online'; +$lang->zanode->statusList['restoring'] = 'Restoring'; $lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list."; $lang->zanode->initButton = "Initialize"; diff --git a/module/zanode/lang/en.php b/module/zanode/lang/en.php index 2e088159cb..5c671c31a1 100644 --- a/module/zanode/lang/en.php +++ b/module/zanode/lang/en.php @@ -121,6 +121,7 @@ $lang->zanode->statusList['shutodown'] = 'shutdown'; $lang->zanode->statusList['destroy_fail'] = 'Destroy Fail'; $lang->zanode->statusList['wait'] = 'Initializing'; $lang->zanode->statusList['online'] = 'Online'; +$lang->zanode->statusList['restoring'] = 'Restoring'; $lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list."; $lang->zanode->initButton = "Initialize"; diff --git a/module/zanode/lang/fr.php b/module/zanode/lang/fr.php index 9d05efbc81..35fb26c602 100644 --- a/module/zanode/lang/fr.php +++ b/module/zanode/lang/fr.php @@ -117,6 +117,7 @@ $lang->zanode->statusList['shutodown'] = 'shutdown'; $lang->zanode->statusList['destroy_fail'] = 'Destroy Fail'; $lang->zanode->statusList['wait'] = 'Initializing'; $lang->zanode->statusList['online'] = 'Online'; +$lang->zanode->statusList['restoring'] = 'Restoring'; $lang->zanode->initNotice = "Succeeded. Please initialize the execution node or return to the list."; $lang->zanode->initButton = "Initialize"; diff --git a/module/zanode/lang/zh-cn.php b/module/zanode/lang/zh-cn.php index 4372c17879..a000f90a49 100644 --- a/module/zanode/lang/zh-cn.php +++ b/module/zanode/lang/zh-cn.php @@ -121,6 +121,7 @@ $lang->zanode->statusList['shutodown'] = '已关机'; $lang->zanode->statusList['destroy_fail'] = '销毁失败'; $lang->zanode->statusList['wait'] = '初始化中'; $lang->zanode->statusList['online'] = '已上架'; +$lang->zanode->statusList['restoring'] = '还原中'; $lang->zanode->initNotice = "保存成功,请初始化执行节点或返回列表。"; $lang->zanode->initButton = "去初始化"; diff --git a/module/zanode/model.php b/module/zanode/model.php index a594af4650..5b7c426a5c 100644 --- a/module/zanode/model.php +++ b/module/zanode/model.php @@ -277,6 +277,7 @@ class zanodemodel extends model ->set('restoreDate')->eq(helper::now()) ->where('id')->eq($snapshotID)->exec(); + /* Prepare create params. */ $agnetUrl = 'http://' . $node->ip . ':' . $node->hzap; $param = array(array( @@ -290,6 +291,7 @@ class zanodemodel extends model if(!empty($result) and $result->code == 'success') { + $this->dao->update(TABLE_HOST)->set('status')->eq('restoring')->where('id')->eq($node->id)->exec(); $this->loadModel('action')->create('zanode', $zanodeID, 'restoredsnapshot', '', $snap->name); return true; } diff --git a/module/zanode/view/browsesnapshot.html.php b/module/zanode/view/browsesnapshot.html.php index 8abc25f631..067087af4a 100644 --- a/module/zanode/view/browsesnapshot.html.php +++ b/module/zanode/view/browsesnapshot.html.php @@ -40,7 +40,7 @@ $editAttr = $snapshot->status == 'failed' ? 'class="btn disabled"' : "title={$lang->zanode->editSnapshot} onclick='window.parent.editSnapshot(\"" . $this->createLink('zanode', 'editSnapshot', "snapshotID={$snapshot->id}") . "\")' class='btn'"; $restoreAttr = "title='{$lang->zanode->restoreSnapshot}' target='hiddenwin'"; - $restoreAttr .= ($snapshot->status == 'restoring' or $snapshot->status == 'failed') ? ' class="btn disabled"' : 'class="btn"'; + $restoreAttr .= ($node->status !='running' or $snapshot->status == 'restoring' or $snapshot->status == 'failed') ? ' class="btn disabled"' : 'class="btn"'; $deleteAttr = "title='{$lang->zanode->deleteSnapshot}' target='hiddenwin'"; $deleteAttr .= (($snapshot->status == 'restoring' and (time() - strtotime($snapshot->restoreDate)) <= 600) or $snapshot->status == 'failed') ? ' class="btn disabled"' : 'class="btn"'; From 41829d9fa6f22797c5a633f225a58de4361a45a2 Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 3 Feb 2023 08:57:34 +0000 Subject: [PATCH 18/71] *Fix bug#31894 --- module/zanode/view/view.html.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/module/zanode/view/view.html.php b/module/zanode/view/view.html.php index ff3d5ee010..ace6c719fc 100644 --- a/module/zanode/view/view.html.php +++ b/module/zanode/view/view.html.php @@ -149,10 +149,11 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
desc) ? htmlspecialchars_decode($zanode->desc) : $lang->noData; ?>
+
zanode->browseSnapshot;?>
- +
createLink('zanode', 'browseSnapshot', "nodeID=$zanode->id", '', true) . "' frameborder='no' allowfullscreen='true' mozallowfullscreen='true' webkitallowfullscreen='true' allowtransparency='true' scrolling='auto' onload='setIframeHeight(this)' style='min-height:300px;'>";?>
@@ -161,6 +162,7 @@ $account = strpos($zanode->osName, "windows") ? $config->zanode->defaultWinAccou
+ printExtendFields($zanode, 'div', "position=left&inForm=0&inCell=1"); ?>
From 2ba474e4a4ad75912f46884e07349cdb2ea7c603 Mon Sep 17 00:00:00 2001 From: liuhong Date: Mon, 6 Feb 2023 02:37:22 +0000 Subject: [PATCH 19/71] * Adjust Ticket 330. --- module/caselib/view/batchcreatecase.html.php | 8 ++++---- module/caselib/view/createcase.html.php | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/module/caselib/view/batchcreatecase.html.php b/module/caselib/view/batchcreatecase.html.php index d1d8a5cbb8..a644451b5b 100644 --- a/module/caselib/view/batchcreatecase.html.php +++ b/module/caselib/view/batchcreatecase.html.php @@ -28,10 +28,10 @@ '>testcase->module;?> testcase->title;?> testcase->type;?> - testcase->pri;?> - testcase->precondition;?> - testcase->keywords;?> - testcase->stage;?> + '>testcase->pri;?> + '>testcase->precondition;?> + '>testcase->keywords;?> + '>testcase->stage;?> diff --git a/module/caselib/view/createcase.html.php b/module/caselib/view/createcase.html.php index 1dcaed2fc1..9e8f5ada7b 100644 --- a/module/caselib/view/createcase.html.php +++ b/module/caselib/view/createcase.html.php @@ -55,7 +55,7 @@ testcase->type;?> testcase->typeList, $type, "class='form-control chosen'");?> - + testcase->create->requiredFields, 'stage') ? ' class="required"' : '';?>>
testcase->stage?> testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?> @@ -101,11 +101,12 @@ + testcase->create->requiredFields, 'pri') ? 'required' : '';?>
- @@ -116,7 +117,7 @@ testcase->precondition;?> - + testcase->create->requiredFields, 'precondition') ? ' class="required"' : '';?>> testcase->steps;?> @@ -189,7 +190,7 @@ testcase->keywords;?> - + testcase->create->requiredFields, 'keywords') ? ' class="required"' : '';?>> From 9d189f06eff6fc9a317cec4520e744fa3a9de7d9 Mon Sep 17 00:00:00 2001 From: liuhong Date: Mon, 6 Feb 2023 06:10:46 +0000 Subject: [PATCH 20/71] * Adjust code for feedback #2118. --- module/caselib/css/createcase.css | 2 ++ module/caselib/view/createcase.html.php | 8 ++++---- module/testcase/css/create.css | 2 ++ module/testcase/view/create.html.php | 5 +++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/module/caselib/css/createcase.css b/module/caselib/css/createcase.css index 7f2f67a335..c0361e55ba 100644 --- a/module/caselib/css/createcase.css +++ b/module/caselib/css/createcase.css @@ -46,6 +46,8 @@ .minw-80px {min-width: 80px;} .title-group.required:after {display: none;} .title-group.required > .required:after {display: block; right: 29px; top: 5px;} +div#titleBox.required:after{display: block; right: 29px; top: 5px;} +div#priBox.required:after{display: block; right: -12px; top: 5px;} .pri-selector > .btn {padding: 5px 8px !important; width: 100%;} .pri-selector > .dropdown-menu {padding: 10px;} diff --git a/module/caselib/view/createcase.html.php b/module/caselib/view/createcase.html.php index 9e8f5ada7b..bf4ab3aec3 100644 --- a/module/caselib/view/createcase.html.php +++ b/module/caselib/view/createcase.html.php @@ -67,7 +67,7 @@ testcase->title;?>
-
+
@@ -101,12 +101,12 @@ - testcase->create->requiredFields, 'pri') ? 'required' : '';?> -
+ testcase->create->requiredFields, 'pri') ? True : False;?> +
class="input-group-btn pri-selector " data-type="pri"> - diff --git a/module/testcase/css/create.css b/module/testcase/css/create.css index 40e076887a..5d44e21088 100644 --- a/module/testcase/css/create.css +++ b/module/testcase/css/create.css @@ -39,6 +39,8 @@ .title-group.required:after {display: none;} .title-group.required > .required:after {display: block; right: 29px; top: 5px;} +div#titleBox.required:after{display: block; right: 29px; top: 5px;} +div#priBox.required:after{display: block; right: -12px; top: 5px;} .pri-selector > .btn {padding: 5px 8px !important; width: 100%;} .pri-selector > .dropdown-menu {padding: 10px;} .stageBox {padding-left: 15px !important;} diff --git a/module/testcase/view/create.html.php b/module/testcase/view/create.html.php index 64177d11d2..c8673ea20d 100644 --- a/module/testcase/view/create.html.php +++ b/module/testcase/view/create.html.php @@ -111,7 +111,7 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field) testcase->title;?>
-
+
@@ -145,7 +145,8 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field) -
+ testcase->create->requiredFields, 'pri') ? True : False;?> +
class="input-group-btn pri-selector " data-type="pri"> From adc06163412e2eb5537f82fd9f331f653dbbe90f Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 6 Feb 2023 15:41:55 +0800 Subject: [PATCH 21/71] * Code for finish task #83721,83722. --- module/admin/lang/menu.php | 8 ++- module/admin/model.php | 101 ++++++++++++++++++++++++++-------- module/block/lang/de.php | 2 - module/block/lang/en.php | 2 - module/block/lang/fr.php | 2 - module/block/lang/vi.php | 2 - module/block/lang/zh-cn.php | 2 - module/common/lang/common.php | 1 + module/common/lang/de.php | 2 + module/common/lang/en.php | 2 + module/common/lang/fr.php | 2 + module/common/lang/zh-cn.php | 2 + module/todo/lang/de.php | 1 - module/todo/lang/en.php | 1 - module/todo/lang/fr.php | 1 - module/todo/lang/vi.php | 1 - module/todo/lang/zh-cn.php | 1 - 17 files changed, 94 insertions(+), 39 deletions(-) diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php index e6030721a4..3e6c2681d8 100644 --- a/module/admin/lang/menu.php +++ b/module/admin/lang/menu.php @@ -84,13 +84,19 @@ $lang->admin->menuList->model['menuOrder']['10'] = 'scrum'; $lang->admin->menuList->model['menuOrder']['15'] = 'waterfall'; $lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo"); -$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|product|"); +$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product|"); $lang->admin->menuList->feature['subMenu']['execution'] = array('link' => "{$lang->execution->common}|custom|execution|"); $lang->admin->menuList->feature['subMenu']['qa'] = array('link' => "{$lang->qa->common}|custom|required|module=bug"); $lang->admin->menuList->feature['subMenu']['kanban'] = array('link' => "{$lang->kanban->common}|custom|kanban|"); $lang->admin->menuList->feature['subMenu']['doc'] = array('link' => "{$lang->doc->common}|custom|required|module=doc"); $lang->admin->menuList->feature['subMenu']['user'] = array('link' => "{$lang->user->common}|custom|set|module=user"); +$lang->admin->menuList->feature['tabMenu']['my']['todo'] = array('link' => "{$lang->todo->common}|custom|set|module=todo&field=priList"); +$lang->admin->menuList->feature['tabMenu']['my']['block'] = array('link' => "{$lang->block->common}|custom|set|module=block&field=closed"); +if($this->config->vision == 'lite') $lang->admin->menuList->feature['tabMenu']['my']['task'] = array(); + +$lang->admin->menuList->feature['tabMenu']['product']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product", 'links' => array("custom|browsestoryconcept|", 'custom|product|')); + $lang->admin->menuList->feature['menuOrder']['5'] = 'my'; $lang->admin->menuList->feature['menuOrder']['10'] = 'product'; $lang->admin->menuList->feature['menuOrder']['15'] = 'execution'; diff --git a/module/admin/model.php b/module/admin/model.php index 2b65005df5..382e65a7d9 100755 --- a/module/admin/model.php +++ b/module/admin/model.php @@ -286,36 +286,54 @@ class adminModel extends model $orders = array(); foreach($this->lang->admin->menuList as $menuKey => $menu) { - $menu['disabled'] = false; + $menu['disabled'] = true; if(!isset($menu['link'])) $menu['link'] = ''; - if(!empty($menu['link']) and strpos($menu['link'], '|') !== false) + + /* Check sub menu priv. */ + if(isset($menu['subMenu'])) { - list($module, $method) = explode('|', $menu['link']); - $menu['link'] = helper::createLink($module, $method); - if(!common::hasPriv($module, $method)) $menu['disabled'] = true; - } - - $menuOrder = isset($menu['menuOrder']) ? $menu['menuOrder'] : array(); - if($menuOrder) - { - ksort($menuOrder); - - /* Check sub menu priv. */ - foreach($menuOrder as $subOrder => $subMenuKey) + foreach($menu['subMenu'] as $subMenuKey => $subMenu) { - list($label, $module, $method, $params) = explode('|', $menu['subMenu'][$subMenuKey]['link']); - if(!common::hasPriv($module, $method)) unset($menuOrder[$subOrder]); - } + /* Check tab menu priv. */ + $link = ''; + $linkLabel = ''; + if(isset($menu['tabMenu'][$subMenuKey])) + { + foreach($menu['tabMenu'][$subMenuKey] as $tabMenuKey => $tabMenu) + { + list($linkLabel, $link) = $this->getMenuLink($tabMenu); + if(!empty($link)) break; + } + } + else + { + list($linkLabel, $link) = $this->getMenuLink($subMenu); + } - /* Set link. */ - if(!empty($menuOrder)) + if(!empty($link)) + { + $menu['subMenu'][$subMenuKey]['link'] = $linkLabel; + if(empty($menu['link'])) + { + $menu['link'] = $link; + $menu['disabled'] = false; + } + } + else + { + unset($this->lang->admin->menuList->feature['subMenu'][$subMenuKey]); + } + } + } + else + { + if(!empty($menu['link']) and strpos($menu['link'], '|') !== false) { - $subMenuKey = reset($menuOrder); - list($label, $module, $method, $params) = explode('|', $menu['subMenu'][$subMenuKey]['link']); - $menu['link'] = helper::createLink($module, $method, $params); + list($module, $method) = explode('|', $menu['link']); + $menu['link'] = helper::createLink($module, $method); + if(common::hasPriv($module, $method)) $menu['disabled'] = false; } } - if(empty($menuOrder) and empty($menu['link'])) $menu['disabled'] = true; $order = $menu['order']; $orders[$order] = $menuKey; @@ -334,6 +352,43 @@ class adminModel extends model $this->lang->admin->menuList = $menuList; } + /** + * Get menu link. + * + * @param array $menu + * @access public + * @return array + */ + public function getMenuLink($menu) + { + $link = ''; + $linkLabel = ''; + if(!empty($menu['link'])) + { + list($label, $module, $method, $params) = explode('|', $menu['link']); + if(common::hasPriv($module, $method)) + { + $linkLabel = $menu['link']; + $link = helper::createLink($module, $method, $params); + } + elseif(!empty($menu['links'])) + { + foreach($menu['links'] as $menuLink) + { + list($module, $method, $params) = explode('|', $menuLink); + if(common::hasPriv($module, $method)) + { + $linkLabel = $label . '|' . $menuLink; + $link = helper::createLink($module, $method); + break; + } + } + } + } + + return array($linkLabel, $link); + } + /** * Get menu key * diff --git a/module/block/lang/de.php b/module/block/lang/de.php index f580bc7315..8d78ff19a1 100644 --- a/module/block/lang/de.php +++ b/module/block/lang/de.php @@ -10,8 +10,6 @@ * @link http://www.zentao.net */ global $config; -$lang->block = new stdclass(); -$lang->block->common = 'InfoBlock'; $lang->block->id = 'ID'; $lang->block->params = 'Params'; $lang->block->name = 'Name'; diff --git a/module/block/lang/en.php b/module/block/lang/en.php index b9eada8057..2186fa2f4b 100644 --- a/module/block/lang/en.php +++ b/module/block/lang/en.php @@ -10,8 +10,6 @@ * @link http://www.zentao.net */ global $config; -$lang->block = new stdclass(); -$lang->block->common = 'Block'; $lang->block->id = 'ID'; $lang->block->params = 'Params'; $lang->block->name = 'Name'; diff --git a/module/block/lang/fr.php b/module/block/lang/fr.php index 0575caf8a8..c66b631095 100644 --- a/module/block/lang/fr.php +++ b/module/block/lang/fr.php @@ -10,8 +10,6 @@ * @link http://www.zentao.net */ global $config; -$lang->block = new stdclass(); -$lang->block->common = 'Bloc'; $lang->block->id = 'ID'; $lang->block->params = 'Params'; $lang->block->name = 'Nom'; diff --git a/module/block/lang/vi.php b/module/block/lang/vi.php index aac102a0cb..fa892b4f23 100644 --- a/module/block/lang/vi.php +++ b/module/block/lang/vi.php @@ -10,8 +10,6 @@ * @link http://www.zentao.net */ global $config; -$lang->block = new stdclass(); -$lang->block->common = 'Block'; $lang->block->name = 'Tên'; $lang->block->style = 'Kiểu'; $lang->block->grid = 'Vị trí'; diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php index 5c6a85626f..f01edea1d9 100644 --- a/module/block/lang/zh-cn.php +++ b/module/block/lang/zh-cn.php @@ -10,8 +10,6 @@ * @link http://www.zentao.net */ global $config; -$lang->block = new stdclass(); -$lang->block->common = '区块'; $lang->block->id = '编号'; $lang->block->params = '参数'; $lang->block->name = '区块名称'; diff --git a/module/common/lang/common.php b/module/common/lang/common.php index 3959e83492..4fe8f34a27 100644 --- a/module/common/lang/common.php +++ b/module/common/lang/common.php @@ -3,6 +3,7 @@ $lang->common = new stdclass(); $lang->index = new stdclass(); $lang->my = new stdclass(); $lang->todo = new stdclass(); +$lang->block = new stdclass(); $lang->program = new stdclass(); $lang->programplan = new stdclass(); $lang->product = new stdclass(); diff --git a/module/common/lang/de.php b/module/common/lang/de.php index f3f247a320..306d80be31 100644 --- a/module/common/lang/de.php +++ b/module/common/lang/de.php @@ -158,6 +158,8 @@ $lang->delayed = 'Delayed'; $lang->common->common = 'Standard Module'; $lang->common->story = 'Story'; $lang->my->common = 'My'; +$lang->todo->common = 'Todo'; +$lang->block->common = 'InfoBlock'; $lang->program->common = 'Program'; $lang->product->common = 'Product'; $lang->project->common = 'Project'; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 30eeff46b7..5776664091 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -158,6 +158,8 @@ $lang->delayed = 'Delayed'; $lang->common->common = 'Common Module'; $lang->common->story = 'Story'; $lang->my->common = 'My'; +$lang->todo->common = 'Todo'; +$lang->block->common = 'Block'; $lang->program->common = 'Program'; $lang->product->common = 'Product'; $lang->project->common = 'Project'; diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php index 20c52b0b7d..9d84d2c124 100644 --- a/module/common/lang/fr.php +++ b/module/common/lang/fr.php @@ -158,6 +158,8 @@ $lang->delayed = 'Delayed'; $lang->common->common = 'Module Commun'; $lang->common->story = 'Story'; $lang->my->common = 'My'; +$lang->todo->common = 'Agenda'; +$lang->block->common = 'Bloc'; $lang->program->common = 'Program'; $lang->product->common = 'Product'; $lang->project->common = 'Project'; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 3cc4ed7fc8..ba38773871 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -158,6 +158,8 @@ $lang->delayed = '已延期'; $lang->common->common = '公有模块'; $lang->common->story = '需求'; $lang->my->common = '地盘'; +$lang->todo->common = '待办'; +$lang->block->common = '区块'; $lang->program->common = '项目集'; $lang->product->common = '产品'; $lang->project->common = '项目'; diff --git a/module/todo/lang/de.php b/module/todo/lang/de.php index a4b7f1d009..f836b192da 100644 --- a/module/todo/lang/de.php +++ b/module/todo/lang/de.php @@ -9,7 +9,6 @@ * @version $Id: en.php 4676 2013-04-26 06:08:23Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->todo->common = 'Todo'; $lang->todo->index = "Home"; $lang->todo->create = "Todo hinzufügen"; $lang->todo->createCycle = "Wiederkehrenden Todo hinzufügen"; diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index cb59f94861..6c611d06a7 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -9,7 +9,6 @@ * @version $Id: en.php 4676 2013-04-26 06:08:23Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->todo->common = 'Todo'; $lang->todo->index = "Home"; $lang->todo->create = "Add Todo"; $lang->todo->createCycle = "Add Recurred Todo"; diff --git a/module/todo/lang/fr.php b/module/todo/lang/fr.php index 375a62a895..9acfcedebc 100644 --- a/module/todo/lang/fr.php +++ b/module/todo/lang/fr.php @@ -9,7 +9,6 @@ * @version $Id: en.php 4676 2013-04-26 06:08:23Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->todo->common = 'Agenda'; $lang->todo->index = "Accueil"; $lang->todo->create = "Ajout Entrée"; $lang->todo->createCycle = "Ajout Tâche récurrente"; diff --git a/module/todo/lang/vi.php b/module/todo/lang/vi.php index afbb9a22f3..3b1c09f09e 100644 --- a/module/todo/lang/vi.php +++ b/module/todo/lang/vi.php @@ -9,7 +9,6 @@ * @version $Id: vi.php 4676 2020-04-06 06:08:23Z quocnho@gmail.com $ * @link http://www.zentao.net */ -$lang->todo->common = 'Việc làm'; $lang->todo->index = "Home"; $lang->todo->create = "Thêm việc"; $lang->todo->createCycle = "Thêm việc lặp lại"; diff --git a/module/todo/lang/zh-cn.php b/module/todo/lang/zh-cn.php index ec001e5182..790a23e7ba 100644 --- a/module/todo/lang/zh-cn.php +++ b/module/todo/lang/zh-cn.php @@ -9,7 +9,6 @@ * @version $Id: zh-cn.php 5022 2013-07-05 06:50:39Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->todo->common = '待办'; $lang->todo->index = "待办一览"; $lang->todo->create = "添加待办"; $lang->todo->createCycle = "创建周期待办"; From 73c669b24724d26dd3c9e25005f51179402b50a1 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 6 Feb 2023 16:11:57 +0800 Subject: [PATCH 22/71] * Code for finish task #83722. --- module/admin/model.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/module/admin/model.php b/module/admin/model.php index 382e65a7d9..976191046a 100755 --- a/module/admin/model.php +++ b/module/admin/model.php @@ -289,16 +289,17 @@ class adminModel extends model $menu['disabled'] = true; if(!isset($menu['link'])) $menu['link'] = ''; - /* Check sub menu priv. */ + /* Set links to authorized navigation. */ if(isset($menu['subMenu'])) { + /* Check sub menu priv. */ foreach($menu['subMenu'] as $subMenuKey => $subMenu) { - /* Check tab menu priv. */ $link = ''; $linkLabel = ''; if(isset($menu['tabMenu'][$subMenuKey])) { + /* Check tab menu priv. */ foreach($menu['tabMenu'][$subMenuKey] as $tabMenuKey => $tabMenu) { list($linkLabel, $link) = $this->getMenuLink($tabMenu); @@ -312,7 +313,11 @@ class adminModel extends model if(!empty($link)) { - $menu['subMenu'][$subMenuKey]['link'] = $linkLabel; + /* Updated secondary navigation link. */ + $subMenuLabel = $menu['subMenu'][$subMenuKey]['link']; + $menu['subMenu'][$subMenuKey]['link'] = substr($subMenuLabel, 0, strpos($subMenuLabel, '|') + 1) . $linkLabel; + + /* Update the level 1 navigation link. */ if(empty($menu['link'])) { $menu['link'] = $link; @@ -368,7 +373,7 @@ class adminModel extends model list($label, $module, $method, $params) = explode('|', $menu['link']); if(common::hasPriv($module, $method)) { - $linkLabel = $menu['link']; + $linkLabel = $module . '|' . $method . '|' . $params; $link = helper::createLink($module, $method, $params); } elseif(!empty($menu['links'])) @@ -378,7 +383,7 @@ class adminModel extends model list($module, $method, $params) = explode('|', $menuLink); if(common::hasPriv($module, $method)) { - $linkLabel = $label . '|' . $menuLink; + $linkLabel = $menuLink; $link = helper::createLink($module, $method); break; } From 55bc9f98b02de2edf10a91df5b21fe214bf1b3d3 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 6 Feb 2023 16:53:45 +0800 Subject: [PATCH 23/71] * Code for finish task #83722. --- module/admin/model.php | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/module/admin/model.php b/module/admin/model.php index 976191046a..57946661c6 100755 --- a/module/admin/model.php +++ b/module/admin/model.php @@ -295,49 +295,42 @@ class adminModel extends model /* Check sub menu priv. */ foreach($menu['subMenu'] as $subMenuKey => $subMenu) { - $link = ''; - $linkLabel = ''; + $link = array(); if(isset($menu['tabMenu'][$subMenuKey])) { /* Check tab menu priv. */ foreach($menu['tabMenu'][$subMenuKey] as $tabMenuKey => $tabMenu) { - list($linkLabel, $link) = $this->getMenuLink($tabMenu); + $link = $this->getHasPrivLink($tabMenu); if(!empty($link)) break; } } else { - list($linkLabel, $link) = $this->getMenuLink($subMenu); + $link = $this->getHasPrivLink($subMenu); } if(!empty($link)) { /* Updated secondary navigation link. */ + list($module, $method, $params) = $link; $subMenuLabel = $menu['subMenu'][$subMenuKey]['link']; - $menu['subMenu'][$subMenuKey]['link'] = substr($subMenuLabel, 0, strpos($subMenuLabel, '|') + 1) . $linkLabel; + $menu['subMenu'][$subMenuKey]['link'] = substr($subMenuLabel, 0, strpos($subMenuLabel, '|') + 1) . $module . '|' . $method . '|' . $params; /* Update the level 1 navigation link. */ if(empty($menu['link'])) { - $menu['link'] = $link; + $menu['link'] = helper::createLink($module, $method, $params); $menu['disabled'] = false; } } - else - { - unset($this->lang->admin->menuList->feature['subMenu'][$subMenuKey]); - } } } - else + elseif(!empty($menu['link']) and strpos($menu['link'], '|') !== false) { - if(!empty($menu['link']) and strpos($menu['link'], '|') !== false) - { - list($module, $method) = explode('|', $menu['link']); - $menu['link'] = helper::createLink($module, $method); - if(common::hasPriv($module, $method)) $menu['disabled'] = false; - } + list($module, $method) = explode('|', $menu['link']); + $menu['link'] = helper::createLink($module, $method); + if(common::hasPriv($module, $method)) $menu['disabled'] = false; } $order = $menu['order']; @@ -358,23 +351,21 @@ class adminModel extends model } /** - * Get menu link. + * Get the authorized link. * * @param array $menu * @access public * @return array */ - public function getMenuLink($menu) + public function getHasPrivLink($menu) { - $link = ''; - $linkLabel = ''; + $link = array(); if(!empty($menu['link'])) { list($label, $module, $method, $params) = explode('|', $menu['link']); if(common::hasPriv($module, $method)) { - $linkLabel = $module . '|' . $method . '|' . $params; - $link = helper::createLink($module, $method, $params); + $link = array($module, $method, $params); } elseif(!empty($menu['links'])) { @@ -383,15 +374,14 @@ class adminModel extends model list($module, $method, $params) = explode('|', $menuLink); if(common::hasPriv($module, $method)) { - $linkLabel = $menuLink; - $link = helper::createLink($module, $method); + $link = array($module, $method, $params); break; } } } } - return array($linkLabel, $link); + return $link; } /** From f6f4d0cc8adcc86045eb8e509817efd514a0ddb1 Mon Sep 17 00:00:00 2001 From: liuhong Date: Tue, 7 Feb 2023 00:25:24 +0000 Subject: [PATCH 24/71] * Adjust code for feedback #2118. --- module/testcase/css/create.css | 4 ++-- module/testcase/js/create.js | 6 ++++++ module/testcase/view/create.html.php | 6 +++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/module/testcase/css/create.css b/module/testcase/css/create.css index 5d44e21088..8dd356cd5c 100644 --- a/module/testcase/css/create.css +++ b/module/testcase/css/create.css @@ -39,8 +39,8 @@ .title-group.required:after {display: none;} .title-group.required > .required:after {display: block; right: 29px; top: 5px;} -div#titleBox.required:after{display: block; right: 29px; top: 5px;} -div#priBox.required:after{display: block; right: -12px; top: 5px;} +#titleBox.required:after{display: block; right: 29px; top: 5px;} +#priRequiredBox.required:after{display: block; right: -12px; top: 5px;} .pri-selector > .btn {padding: 5px 8px !important; width: 100%;} .pri-selector > .dropdown-menu {padding: 10px;} .stageBox {padding-left: 15px !important;} diff --git a/module/testcase/js/create.js b/module/testcase/js/create.js index d10755f5a4..4042988341 100644 --- a/module/testcase/js/create.js +++ b/module/testcase/js/create.js @@ -36,11 +36,17 @@ $(function() $searchInput.focus(); }); }; + $(document).on('change', '#story', function() { if($(this).val() === 'showmore') showSearchModal(); }); + $(document).on('click', '#priRequiredBox', function() + { + $('#priSelect').removeClass('required'); + }); + $(document).on('click', '#story_chosen .chosen-results > li.no-results', showSearchModal); $searchStories.on('hide.zui.modal', function() diff --git a/module/testcase/view/create.html.php b/module/testcase/view/create.html.php index c8673ea20d..8dd5a1166f 100644 --- a/module/testcase/view/create.html.php +++ b/module/testcase/view/create.html.php @@ -146,11 +146,11 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field) testcase->create->requiredFields, 'pri') ? True : False;?> -
class="input-group-btn pri-selector " data-type="pri"> - - From 7b6d5a1651d6540249dcb16e0cdbd005ae50f7a7 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 7 Feb 2023 08:26:37 +0800 Subject: [PATCH 25/71] * Code for finish task #83721. --- module/admin/view/tabmenu.html.php | 23 +++++++++++++++++++++++ module/custom/view/header.html.php | 24 +----------------------- 2 files changed, 24 insertions(+), 23 deletions(-) create mode 100644 module/admin/view/tabmenu.html.php diff --git a/module/admin/view/tabmenu.html.php b/module/admin/view/tabmenu.html.php new file mode 100644 index 0000000000..441f8d9819 --- /dev/null +++ b/module/admin/view/tabmenu.html.php @@ -0,0 +1,23 @@ + diff --git a/module/custom/view/header.html.php b/module/custom/view/header.html.php index f8c795c644..2e7a501bac 100644 --- a/module/custom/view/header.html.php +++ b/module/custom/view/header.html.php @@ -1,24 +1,2 @@ getModuleRoot() . 'common/view/header.html.php';?> - +getModuleRoot() . 'admin/view/tabmenu.html.php';?> From bb6a0ee14cd8f3e6eecc5b51f46f1c59355d986b Mon Sep 17 00:00:00 2001 From: liuhong Date: Tue, 7 Feb 2023 01:09:32 +0000 Subject: [PATCH 26/71] * Fix feedback #2118. --- module/caselib/css/createcase.css | 4 ++-- module/caselib/view/createcase.html.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/caselib/css/createcase.css b/module/caselib/css/createcase.css index c0361e55ba..8c0745564a 100644 --- a/module/caselib/css/createcase.css +++ b/module/caselib/css/createcase.css @@ -46,8 +46,8 @@ .minw-80px {min-width: 80px;} .title-group.required:after {display: none;} .title-group.required > .required:after {display: block; right: 29px; top: 5px;} -div#titleBox.required:after{display: block; right: 29px; top: 5px;} -div#priBox.required:after{display: block; right: -12px; top: 5px;} +#titleBox.required:after{display: block; right: 29px; top: 5px;} +#priRequiredBox.required:after{display: block; right: -12px; top: 5px;} .pri-selector > .btn {padding: 5px 8px !important; width: 100%;} .pri-selector > .dropdown-menu {padding: 10px;} diff --git a/module/caselib/view/createcase.html.php b/module/caselib/view/createcase.html.php index bf4ab3aec3..dc3e515681 100644 --- a/module/caselib/view/createcase.html.php +++ b/module/caselib/view/createcase.html.php @@ -102,7 +102,7 @@ testcase->create->requiredFields, 'pri') ? True : False;?> -
class="input-group-btn pri-selector " data-type="pri"> +
class="input-group-btn pri-selector " data-type="pri"> From d0d3b94b994cca5a47065ab6c36cb13fa5aafbc5 Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Tue, 7 Feb 2023 09:38:48 +0800 Subject: [PATCH 27/71] * Fix webhook content is markdown bug. --- module/webhook/model.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/webhook/model.php b/module/webhook/model.php index 19c32e8429..54aea4b902 100644 --- a/module/webhook/model.php +++ b/module/webhook/model.php @@ -122,6 +122,10 @@ class webhookModel extends model { $text = substr($data->markdown->content, 0, strpos($data->markdown->content, '(http')); } + elseif(isset($data->text->content)) + { + $text = substr($data->text->content, 0, strpos($data->text->content, '(http')); + } elseif(isset($data->content)) { $text = $data->content->text; From 5db38be8de7772eb3887960389fbe99360c366b9 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 7 Feb 2023 09:52:21 +0800 Subject: [PATCH 28/71] * Code for finish task #83721. --- module/admin/lang/menu.php | 8 ++++---- module/admin/model.php | 16 +++++++++++++++- module/admin/view/tabmenu.html.php | 27 ++++++++++++--------------- module/custom/view/set.html.php | 12 ++---------- 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php index 3e6c2681d8..14a3592588 100644 --- a/module/admin/lang/menu.php +++ b/module/admin/lang/menu.php @@ -83,13 +83,13 @@ $lang->admin->menuList->model['menuOrder']['5'] = 'common'; $lang->admin->menuList->model['menuOrder']['10'] = 'scrum'; $lang->admin->menuList->model['menuOrder']['15'] = 'waterfall'; -$lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo"); -$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product|"); +$lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo", 'exclude' => 'set,required'); +$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product|", 'exclude' => 'set,required'); $lang->admin->menuList->feature['subMenu']['execution'] = array('link' => "{$lang->execution->common}|custom|execution|"); -$lang->admin->menuList->feature['subMenu']['qa'] = array('link' => "{$lang->qa->common}|custom|required|module=bug"); +$lang->admin->menuList->feature['subMenu']['qa'] = array('link' => "{$lang->qa->common}|custom|required|module=bug", 'exclude' => 'set,required'); $lang->admin->menuList->feature['subMenu']['kanban'] = array('link' => "{$lang->kanban->common}|custom|kanban|"); $lang->admin->menuList->feature['subMenu']['doc'] = array('link' => "{$lang->doc->common}|custom|required|module=doc"); -$lang->admin->menuList->feature['subMenu']['user'] = array('link' => "{$lang->user->common}|custom|set|module=user"); +$lang->admin->menuList->feature['subMenu']['user'] = array('link' => "{$lang->user->common}|custom|set|module=user", 'exclude' => 'set,required'); $lang->admin->menuList->feature['tabMenu']['my']['todo'] = array('link' => "{$lang->todo->common}|custom|set|module=todo&field=priList"); $lang->admin->menuList->feature['tabMenu']['my']['block'] = array('link' => "{$lang->block->common}|custom|set|module=block&field=closed"); diff --git a/module/admin/model.php b/module/admin/model.php index 57946661c6..5cae3daad8 100755 --- a/module/admin/model.php +++ b/module/admin/model.php @@ -269,9 +269,23 @@ class adminModel extends model $this->setSwitcher($menuKey); if(isset($this->lang->admin->menuList->$menuKey)) { - if(isset($this->lang->admin->menuList->$menuKey['subMenu'])) $this->lang->admin->menu = $this->lang->admin->menuList->$menuKey['subMenu']; + if(isset($this->lang->admin->menuList->$menuKey['subMenu'])) + { + $moduleName = $this->app->rawModule; + $methodName = $this->app->rawMethod; + $paramName = $this->app->rawParams ? reset($this->app->rawParams) : ''; + if($moduleName == 'custom' and strpos(',required,set,', $methodName) !== false) + { + if(strpos(',todo,block,', $paramName) !== false) $subMenuKey = 'my'; + if(isset($subMenuKey)) $this->lang->admin->menuList->$menuKey['subMenu'][$subMenuKey]['subModule'] = $moduleName; + } + + $this->lang->admin->menu = $this->lang->admin->menuList->$menuKey['subMenu']; + } + if(isset($this->lang->admin->menuList->$menuKey['menuOrder'])) $this->lang->admin->menuOrder = $this->lang->admin->menuList->$menuKey['menuOrder']; if(isset($this->lang->admin->menuList->$menuKey['dividerMenu'])) $this->lang->admin->dividerMenu = $this->lang->admin->menuList->$menuKey['dividerMenu']; + if(isset($this->lang->admin->menuList->$menuKey['tabMenu'])) $this->lang->admin->tabMenu = $this->lang->admin->menuList->$menuKey['tabMenu']; } } diff --git a/module/admin/view/tabmenu.html.php b/module/admin/view/tabmenu.html.php index 441f8d9819..7f4cee4514 100644 --- a/module/admin/view/tabmenu.html.php +++ b/module/admin/view/tabmenu.html.php @@ -1,22 +1,19 @@