| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- <?php
- /**
- * The appview view file of instance module of ZenTaoPMS.
- *
- * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
- * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
- * @author Ke Zhao<zhaoke@easycorp.ltd>
- * @package instance
- * @link https://www.zentao.net
- */
- namespace zin;
- jsVar('copied', $lang->instance->copied);
- jsVar('instanceID', $instance->id);
- jsVar('instanceStatus', $instance->status);
- jsVar('instanceType', $type);
- jsVar('inQuickon', $config->inQuickon);
- jsVar('confirmBackupTip', $lang->instance->backup->confirmTip);
- if(empty($instance->externalID)) $instance->externalID = 0;
- $instance->appName = strtolower($instance->appName);
- $cpuInfo = $this->instance->printCpuUsage($instance, (object)$instanceMetric->cpu);
- $memoryInfo = $this->instance->printStorageUsage($instance, (object)$instanceMetric->memory);
- $volumeInfo = $this->instance->printStorageUsage($instance, (object)$instanceMetric->disk);
- $actions = $this->loadModel('common')->buildOperateMenu($instance);
- if($type !== 'store')
- {
- $defaultAccount = new stdclass();
- $defaultAccount->username = $instance->account;
- $defaultAccount->password = $instance->password;
- $defaultAccount->token = $instance->token;
- $lang->instance->defaultAccount = $lang->instance->account;
- $lang->instance->defaultPassword = $lang->instance->password;
- }
- if(!empty($actions['suffixActions']))
- {
- foreach($actions['suffixActions'] as $suffix => &$action)
- {
- if($type == 'store' && $action['icon'] == 'trash' && !empty($action['data-confirm']['message'])) $action['data-confirm']['message'] = $lang->instance->notices['confirmUninstallStoreApp'];
- }
- }
- $dbListWg = array();
- foreach($dbList as $db)
- {
- $disabledClass = $db->ready && commonModel::hasPriv('instance', 'manage') ? '' : 'disabled';
- $dbListWg[] = h::tr
- (
- h::td($db->db_name),
- h::td($db->db_type),
- h::td
- (
- setID('dbStatusTD'),
- $db->ready ? $lang->instance->dbReady : $lang->instance->dbWaiting,
- setClass('text-' . ($db->ready ? 'success' : 'danger'))
- ),
- h::td
- (
- btn
- (
- $lang->instance->management,
- setClass('btn text-primary ghost db-management ' . $disabledClass),
- setData('dbname', $db->name),
- setData('dbtype', $db->db_type),
- setData('id', $instance->id),
- on::click()->call('loadDBAuthUrl', jsRaw('this'))
- )
- )
- );
- }
- $hideOperate = !in_array($instance->appName, array('gitlab', 'sonarqube'));
- if($instance->appName == 'gitlab' && !$app->user->admin)
- {
- $openID = $this->loadModel('pipeline')->getOpenIdByAccount($instance->externalID, 'gitlab', $app->user->account);
- if(!$openID) $hideOperate = true;
- }
- detailHeader(to::prefix(''), to::title(''));
- div
- (
- setClass('flex flex-normal gap-x-5 justify-center'),
- on::click('.copy-btn')->call('copyText', jsRaw('this')),
- div
- (
- setClass('flex-none w-2/3'),
- setID('instanceInfoContainer'),
- detailBody
- (
- sectionList(
- /* 应用名称信息图标区块 */
- section
- (
- set::title(''),
- div
- (
- setClass('flex justify-between'),
- div
- (
- setClass('flex basis-full'),
- $type === 'store' && !empty($instance->logo) ? img(set::src($instance->logo), setStyle(array('width' => '50px', 'height' => '50px'))) : null,
- div
- (
- setClass(($type === 'store' ? 'ml-3' : '') . ' flex col gap-y-1 basis-full'),
- div
- (
- $instance->name, setClass('text-xl'),
- $type === 'store' ? span(setID("appVersion"), $instance->appVersion, setClass('ml-3 label gray-pale rounded-full')) : null
- ),
- $type === 'store' ? div
- (
- setID('systemLoad'),
- setClass('flex progress-container'),
- icon('cpu text-' . $cpuInfo['color']),
- $lang->instance->cpuUsage,
- div
- (
- setClass('progress rounded-lg'),
- set::title($cpuInfo['tip']),
- setStyle('background', "var(--color-{$cpuInfo['color']}-50)"),
- div
- (
- setClass('progress-bar ' . $cpuInfo['color']),
- set::role('progressbar'),
- setStyle('width', $cpuInfo['rate'])
- )
- ),
- icon('memory text-' . $memoryInfo['color']),
- $lang->instance->memUsage,
- span
- (
- setClass('text-gray'),
- sprintf($lang->instance->memTotal, helper::formatKB($instanceMetric->memory->limit))
- ),
- div
- (
- setClass('progress rounded-lg'),
- set::title($memoryInfo['tip']),
- setStyle('background', "var(--color-{$memoryInfo['color']}-50)"),
- div
- (
- setID('memoryRate'),
- set::role('progressbar'),
- setData('load', $instance->status == 'running' && $memoryInfo['rate'] == '0%'),
- setClass('progress-bar ' . $memoryInfo['color']),
- setStyle('width', $memoryInfo['rate'])
- )
- ),
- !empty($diskSettings->resizable) ? icon('db text-' . $volumeInfo['color']) : null,
- !empty($diskSettings->resizable) ? $lang->instance->volUsage: null,
- !empty($diskSettings->resizable) ? span
- (
- setClass('text-gray'),
- sprintf($lang->instance->volTotal, helper::formatKB($instanceMetric->disk->limit))
- ) : null,
- !empty($diskSettings->resizable) ? div
- (
- setClass('progress rounded-lg'),
- set::title($volumeInfo['tip']),
- setStyle('background', "var(--color-{$volumeInfo['color']}-50)"),
- div
- (
- setID('volumeRate'),
- set::role('progressbar'),
- setData('load', $instance->status == 'running' && $volumeInfo['rate'] == '0%'),
- setClass('progress-bar ' . $volumeInfo['color']),
- setStyle('width', $volumeInfo['rate'])
- )
- ) : null
- ) : null
- )
- ),
- $type !== 'store' ? null : btn
- (
- $lang->instance->setting,
- setClass('btn ghost'),
- set::disabled(in_array($instance->status, array('installing', 'initializing', 'uninstalling', 'destroying'))),
- set::id('setting'),
- set::icon('backend'),
- setData('toggle', 'modal'),
- setData('size', 'sm'),
- set::url(createLink('instance', 'setting', "id={$instance->id}")))
- )
- ),
- /* 基本信息区块 */
- section
- (
- set::title($lang->instance->baseInfo),
- h::table
- (
- setStyle('min-width', '700px'),
- setClass('table w-full max-w-full bordered mt-4 text-center store-info'),
- h::tr
- (
- $type !== 'store' ? null : h::th($lang->instance->status),
- h::th($lang->instance->source),
- // h::th($lang->instance->appTemplate),
- h::th($lang->instance->installBy),
- h::th($lang->instance->installAt),
- $type !== 'store' ? null : h::th($lang->instance->runDuration),
- !empty($defaultAccount->username) ? h::th($lang->instance->defaultAccount) : null,
- !empty($defaultAccount->password) ? h::th($lang->instance->defaultPassword) : null,
- !empty($defaultAccount->token) ? h::th($lang->instance->token) : null,
- $hideOperate ? null : h::th($lang->instance->browseProject)
- ),
- h::tr
- (
- $type !== 'store' ? null : h::td
- (
- setID('statusTD'),
- setData('status', $instance->status),
- setData('reload', in_array($instance->status, array('creating', 'initializing', 'pulling', 'startup', 'starting', 'suspending', 'installing', 'uninstalling', 'stopping', 'destroying', 'upgrading'))),
- span
- (
- setClass('label label-dot mx-1 ' . zget($this->lang->instance->htmlStatusesClass, $instance->status, ''))
- ),
- zget($this->lang->instance->statusList, $instance->status, ''), setClass('text-' . zget($this->lang->instance->htmlStatusesClass, $instance->status, ''))
- ),
- h::td(zget($lang->instance->sourceList, $instance->source, '')),
- // h::td(a(set::href($this->createLink('store', 'appView', "id=$instance->appID")), $instance->appName)),
- h::td(zget($users, $instance->createdBy, '')),
- h::td(substr($instance->createdAt, 0, 16)),
- $type !== 'store' ? null : h::td(common::printDuration($instance->runDuration)),
- !empty($defaultAccount->username) ? h::td($defaultAccount->username) : null,
- !empty($defaultAccount->password) ? h::td
- (
- input(set::type('text'), set::value($defaultAccount->password), set::name('password'), setStyle('display', 'none')),
- btn(set::className('copy-btn ghost'),set::icon('copy'))
- ): null,
- !empty($defaultAccount->token) ? h::td
- (
- input(set::type('text'), set::value($defaultAccount->token), set::name('token'), setStyle('display', 'none')),
- btn(set::className('copy-btn ghost'),set::icon('copy'))
- ): null,
- $hideOperate ? null : h::td
- (
- btn
- (
- $lang->instance->management,
- setClass('btn text-primary ghost'),
- set::disabled($instance->type === 'store' && $instance->status != 'running'),
- set::url(createLink($instance->appName, 'browseProject', "{$instance->appName}ID={$instance->externalID}"))
- )
- )
- )
- )
- ),
- /* 数据库区块 */
- empty($dbList) ? null : section
- (
- set::title($lang->instance->dbList),
- h::table
- (
- setStyle('min-width', '700px'),
- setClass('table w-full max-w-full bordered mt-4 text-center store-info'),
- h::tr
- (
- h::th($lang->instance->dbName),
- h::th($lang->instance->dbType, setStyle('width', '100px')),
- h::th($lang->instance->status, setStyle('width', '100px')),
- h::th($lang->instance->action, setStyle('width', '100px'))
- ),
- $dbListWg
- )
- ),
- /* 应用实例备份块。 */
- /* Instance Backup block. */
- ($config->inQuickon && $type == 'store' && $instance->name != 'ZenTao') ? section(
- set::title($lang->instance->backup->common),
- set::id('backupSection'),
- div(setClass('flex justify-end'), btn(
- set(array
- (
- 'icon' => 'refresh',
- 'class' => 'ghost btn',
- 'text' => $lang->instance->backup->operators['manual'] ,
- 'data-size' => 'sm',
- 'onclick' => "onManualBackup({$instance->id})"
- ))
- ), btn(
- set(array
- (
- 'icon' => 'backend',
- 'class' => 'ghost btn',
- 'text' => $lang->instance->backup->operators['settings'] ,
- 'url' => createLink('instance', 'backupSettings', "id={$instance->id}"),
- 'data-size' => 'sm',
- 'data-toggle' => 'modal'
- ))
- )),
- div(setID('backupList'), h::js("if(!$('#backupList').find('.dtable-header-cell').length) loadTarget($.createLink('instance', 'backupList', 'id={$instance->id}'), '#backupList');"))
- ) : null
- ),
- floatToolbar
- (
- set::object($instance),
- isAjaxRequest('modal') ? null : to::prefix(backBtn(
- set::icon('back'),
- set::className('ghost text-white'),
- set::url(createLink('space', 'browse')),
- $lang->goback
- )),
- set::main($actions['mainActions']),
- set::suffix($actions['suffixActions'])
- )
- )
- ),
- div
- (
- setClass('w-1/3'),
- history
- (
- set::objectID($instance->id),
- set::objectType($type === 'store' ? 'instance' : $instance->type),
- set::commentUrl(createLink('action', 'comment', array('objectType' => $type === 'store' ? 'instance' : $instance->type, 'objectID' => $instance->id)))
- )
- )
- );
|