diff --git a/module/common/model.php b/module/common/model.php
index d5e671b78d..04f54d930d 100644
--- a/module/common/model.php
+++ b/module/common/model.php
@@ -1321,9 +1321,9 @@ eof;
* The following pages can be allowed to open in non-iframe, so ignore these pages.
*/
$module = $this->app->getModuleName();
- $whitelist = is_string($whitelist) ? $whitelist : '|index|tutorial|install|upgrade|sso|cron|misc|user-login|user-deny|user-logout|user-reset|user-forgetpassword|user-resetpassword|my-changepassword|my-preference|file-read|file-download|file-preview|file-uploadimages|file-ajaxwopifiles|report-annualdata|misc-captcha|execution-printkanban|traincourse-ajaxuploadlargefile|traincourse-playvideo|screen-view|zanode-create|screen-ajaxgetchart|ai-chat|integration-wopi|instance-terminal|conference-getconferencepermissions|';
+ $whitelist = is_string($whitelist) ? $whitelist : '|index|tutorial|install|upgrade|sso|cron|misc|user-login|user-deny|user-logout|user-reset|user-forgetpassword|user-resetpassword|my-changepassword|my-preference|file-read|file-download|file-preview|file-uploadimages|file-ajaxwopifiles|report-annualdata|misc-captcha|execution-printkanban|traincourse-ajaxuploadlargefile|traincourse-playvideo|screen-view|zanode-create|screen-ajaxgetchart|ai-chat|integration-wopi|instance-terminal|conference-getconferencepermissions|instance-logs|';
$iframeList = '|cron-index|zanode-create|';
-
+//var_dump($whitelist);die;
if(strpos($iframeList, "|{$module}-{$method}|") === false && (strpos($whitelist, "|{$module}|") !== false || strpos($whitelist, "|{$module}-{$method}|") !== false)) return true;
/**
diff --git a/module/instance/config.php b/module/instance/config.php
index adfa9b3764..a323c7c4af 100644
--- a/module/instance/config.php
+++ b/module/instance/config.php
@@ -24,16 +24,14 @@ $app->loadLang('space');
$config->instance->actionList['showLogs']['icon'] = 'time';
$config->instance->actionList['showLogs']['hint'] = $lang->instance->log->viewButton;
$config->instance->actionList['showLogs']['text'] = $lang->instance->log->viewButton;
-$config->instance->actionList['showLogs']['url'] = array('module' => 'instance', 'method' => 'logs', 'params' => 'id={id}&zin=1');
-$config->instance->actionList['showLogs']['data-toggle'] = 'modal';
-$config->instance->actionList['showLogs']['class'] = 'task-record-btn';
+$config->instance->actionList['showLogs']['url'] = array('module' => 'instance', 'method' => 'logs', 'params' => 'id={id}');
+$config->instance->actionList['showLogs']['target'] = '_blank';
-$config->instance->actionList['showEvents']['icon'] = 'magic';
+$config->instance->actionList['showEvents']['icon'] = 'summary';
$config->instance->actionList['showEvents']['hint'] = $lang->instance->event->viewButton;
$config->instance->actionList['showEvents']['text'] = $lang->instance->event->viewButton;
$config->instance->actionList['showEvents']['url'] = array('module' => 'instance', 'method' => 'events', 'params' => 'id={id}');
$config->instance->actionList['showEvents']['data-toggle'] = 'modal';
-$config->instance->actionList['showEvents']['class'] = 'task-record-btn';
$config->instance->actionList['ajaxStart']['icon'] = 'play';
$config->instance->actionList['ajaxStart']['className'] = 'ajax-submit';
diff --git a/module/instance/js/logs.ui.js b/module/instance/js/logs.ui.js
index fa512e8a4e..898368900e 100644
--- a/module/instance/js/logs.ui.js
+++ b/module/instance/js/logs.ui.js
@@ -29,20 +29,51 @@ window.changeComponent = function (instanceID)
$picker.$.setValue(items.pod);
}
toggleLoading('#logs-panel', false);
- showLogs(instanceID);
+ startAutoRefreshLogs(instanceID);
});
};
window.showLogs = function (instanceID)
{
+ const headerHeight = document.getElementById('logs-header').offsetHeight;
+ document.getElementById('logs-content').style.height = `calc(100vh - ${headerHeight}px - 16px)`;
const instanceComponent = $('[name=component]').val();
const instancePod = $('[name=pod]').val();
- const previous = $('[name=previous]').val();
+ const previous = $('[name=previous]:checked').val();
const target = $.createLink('instance', 'showlogs', 'id=' + instanceID + "&component=" + instanceComponent + "&pod=" + instancePod + "&previous=" + previous);
- toggleLoading('#logs-panel', true);
- $.getJSON(target, function (data)
+ $.getJSON(target, function (resp)
{
- toggleLoading('#logs-panel', false);
- $('#logs-content').html(data.data.map(item => item.timestamp + ' ' + item.content).join('\n'));
+ $('#logs-content').html(resp.data.map(item => item.timestamp + ' ' + item.content).join('\n'));
+ $('#logs-content')[0].scrollTop = $('#logs-content')[0].scrollHeight;
});
};
+
+let logsTimer = null;
+
+window.startAutoRefreshLogs = function(instanceID) {
+ if(logsTimer) clearInterval(logsTimer);
+ logsTimer = setInterval(function() {
+ showLogs(instanceID);
+ }, 5000);
+}
+
+$(window).on('unload', function() {
+ if(logsTimer) clearInterval(logsTimer);
+});
+
+$(document).ready(function() {
+ const instanceID = $('#logs-panel').data('id');
+ if(instanceID) startAutoRefreshLogs(instanceID);
+});
+
+window.toggleAutoRefresh = function(instanceID) {
+ const $toggleBtn = $('#autoRefreshBtn');
+ if(logsTimer) {
+ clearInterval(logsTimer);
+ logsTimer = null;
+ $toggleBtn.html('');
+ } else {
+ startAutoRefreshLogs(instanceID);
+ $toggleBtn.html('');
+ }
+}
\ No newline at end of file
diff --git a/module/instance/lang/zh-cn.php b/module/instance/lang/zh-cn.php
index 053e30a47d..3e83f1c592 100644
--- a/module/instance/lang/zh-cn.php
+++ b/module/instance/lang/zh-cn.php
@@ -187,24 +187,28 @@ $lang->instance->management = '管理';
$lang->instance->dbReady = '正常';
$lang->instance->dbWaiting = '等待就绪';
-$lang->instance->log = new stdclass;
+$lang->instance->log = new stdClass;
$lang->instance->log->date = '日期';
$lang->instance->log->message = '内容';
-$lang->instance->log->viewButton = '日志';
-$lang->instance->log->title = '查看日志';
-$lang->instance->log->button = '立即查看';
+$lang->instance->log->viewButton = '日志';
+$lang->instance->log->title = '查看日志';
+$lang->instance->log->button = '立即查看';
+$lang->instance->log->autoRefresh = '切换刷新状态';
+$lang->instance->log->tips = '日志默认自动刷新,可点切换按钮切换';
+$lang->instance->log->noLog = '暂无日志';
+
$lang->instance->component = '组件';
$lang->instance->pod = 'Pod';
-$lang->instance->isPrevious = '是否上个退出容器';
-$lang->instance->isPreviousList[0] = '否';
-$lang->instance->isPreviousList[1] = '是';
+$lang->instance->isPreviousList[0] = '当前容器';
+$lang->instance->isPreviousList[1] = '上个容器';
$lang->instance->event = new stdClass;
$lang->instance->event->viewButton = '事件';
$lang->instance->event->title = '查看事件';
$lang->instance->event->button = '立即查看';
+$lang->instance->event->noEvents = '暂无事件';
$lang->instance->actionList = array();
$lang->instance->actionList['install'] = '安装了%s';
diff --git a/module/instance/ui/logs.html.php b/module/instance/ui/logs.html.php
index c0de73c13d..f457029501 100644
--- a/module/instance/ui/logs.html.php
+++ b/module/instance/ui/logs.html.php
@@ -11,83 +11,85 @@ declare(strict_types=1);
*/
namespace zin;
+set::zui(true);
-formPanel
+div
(
- set::title($lang->instance->log->title),
- set::actions(array(
- array(
- 'text' => $lang->instance->log->button,
- 'type' => 'primary',
- 'onclick' => 'window.showLogs('.$instance->id.')',
- )
- )),
setID('logs-panel'),
- setClass('w-full'),
- formRow
- (
- formGroup
- (
- set::name('name'),
- set::labelWidth('160px'),
- set::required(true),
- set::label($lang->instance->name),
- set::value($instance->name),
- set::disabled(true)
- )
- ),
- formRow
- (
- formGroup
- (
- setID('component-logs'),
- set::name('component'),
- set::labelWidth('160px'),
- set::control('picker'),
- set::required(true),
- set::label($lang->instance->component),
- on::change()->call('changeComponent', $instance->id)
- )
- ),
- formRow
- (
- formGroup
- (
- setID('pod-logs'),
- set::name('pod'),
- set::labelWidth('160px'),
- set::control('picker'),
- set::required(true),
- set::label($lang->instance->pod),
- set::items(array())
- )
- ),
+ setClass('px-1 mt-2 w-full'),
formRow
(
+ setID('logs-header'),
+ setClass('flex px-1 top-0 bg-white'),
+ formGroup(
+ inputGroup
+ (
+ h::button
+ (
+ setClass('btn primary'),
+ $lang->instance->log->autoRefresh,
+ span(
+ setID('autoRefreshBtn'),
+ icon(setClass('icon icon-pause'))
+ ),
+ on::click()->call('toggleAutoRefresh', $instance->id)
+ ),
+ $lang->instance->name,
+ input
+ (
+ set::class('input-group-addon'),
+ set::name('name'),
+ set::required(true),
+ set::value($instance->name),
+ set::disabled(true)
+ ),
+ $lang->instance->component,
+ picker
+ (
+ setClass('input-group-addon w-48'),
+ setID('component-logs'),
+ set::name('component'),
+ set::control('picker'),
+ set::required(true),
+ on::change()->call('changeComponent', $instance->id)
+ ),
+ $lang->instance->pod,
+ picker
+ (
+ setClass('input-group-addon w-72'),
+ setID('pod-logs'),
+ set::name('pod'),
+ set::required(true),
+ set::items(array()),
+ set::inline(true),
+ on::inited()->call('initComponent', $instance->id)
+ )
+ )
+ ),
formGroup
(
+ setClass('flex mx-2'),
setID('is-previous'),
set::name('previous'),
- set::labelWidth('160px'),
- set::control('picker'),
- set::label($lang->instance->isPrevious),
+ set::control('radioListInline'),
set::items($lang->instance->isPreviousList),
set::value(0),
- on::change()->call('showLogs', $instance->id),
- on::inited()->call('initComponent', $instance->id)
+ set::inline(true),
+ on::change()->call('showLogs', $instance->id)
+ ),
+ formGroup(
+ setClass('flex mx-2 text-sm text-gray-500'),
+ set::label( setClass('text-danger'), $lang->instance->log->tips)
)
),
div
(
- setClass('px-1 mt-2 w-full'),
- panel
- (
- setClass('py-2'),
- form
- (
- h::pre(setID('logs-content'), setClass('bg-gray-800 text-white progress block h-96')),
- set::actions(false)
- )
- )
+ setClass('px-1 mt-2 w-full h-full'),
+ h::pre(
+ setID('logs-content'),
+ setClass('bg-gray-800 text-white block h-screen scrollbar-thin')
+ ),
+ set::actions(false)
)
-);
\ No newline at end of file
+);
+render('pagebase');
\ No newline at end of file
diff --git a/www/js/zui3/zin.js b/www/js/zui3/zin.js
index a5e5bc0066..38bd134ef3 100644
--- a/www/js/zui3/zin.js
+++ b/www/js/zui3/zin.js
@@ -8,7 +8,7 @@
const isIndexPage = currentModule === 'index' && currentMethod === 'index';
const moduleMethod = `${currentModule}-${currentMethod}`;
- const selfOpenList = new Set('index|tutorial|install|upgrade|sso|cron|misc|user-login|user-deny|user-logout|user-reset|user-forgetpassword|user-resetpassword|my-changepassword|my-preference|file-read|file-download|file-preview|file-uploadimages|file-ajaxwopifiles|report-annualdata|misc-captcha|execution-printkanban|traincourse-ajaxuploadlargefile|traincourse-playvideo|screen-view|zanode-create|screen-ajaxgetchart|instance-terminal|ai-chat'.split('|'));
+ const selfOpenList = new Set('index|tutorial|install|upgrade|sso|cron|misc|user-login|user-deny|user-logout|user-reset|user-forgetpassword|user-resetpassword|my-changepassword|my-preference|file-read|file-download|file-preview|file-uploadimages|file-ajaxwopifiles|report-annualdata|misc-captcha|execution-printkanban|traincourse-ajaxuploadlargefile|traincourse-playvideo|screen-view|zanode-create|screen-ajaxgetchart|instance-terminal|ai-chat|instance-logs'.split('|'));
const iframeList = new Set(['cron-index', 'zanode-create']);
const isAllowSelfOpen = !iframeList.has(moduleMethod) &&
(isIndexPage