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