This is an automated email from the ASF dual-hosted git repository.
pearl11594 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 40b0e7cd63c ui: fix build after forward merge (#11010)
40b0e7cd63c is described below
commit 40b0e7cd63c6395dfec173229aa38ea779c4ea87
Author: Abhishek Kumar <[email protected]>
AuthorDate: Thu Jun 12 11:33:59 2025 +0530
ui: fix build after forward merge (#11010)
Signed-off-by: Abhishek Kumar <[email protected]>
---
ui/src/components/view/InfoCard.vue | 887 +++++++-----------------------------
1 file changed, 169 insertions(+), 718 deletions(-)
diff --git a/ui/src/components/view/InfoCard.vue
b/ui/src/components/view/InfoCard.vue
index e2f9fb304e7..7ef8d074890 100644
--- a/ui/src/components/view/InfoCard.vue
+++ b/ui/src/components/view/InfoCard.vue
@@ -31,8 +31,8 @@
<edit-outlined class="upload-icon"/>
</div>
<slot name="avatar">
- <span v-if="(resource.icon && resource.icon.base64image ||
images.template || images.iso || resourceIcon) && !['router', 'systemvm',
'volume'].includes($route.path.split('/')[1])">
- <resource-icon :image="getImage(resource.icon &&
resource.icon.base64image || images.template || images.iso || resourceIcon)"
size="4x" style="margin-right: 5px"/>
+ <span v-if="resourceIcon && !['router', 'systemvm',
'volume'].includes($route.path.split('/')[1])">
+ <resource-icon :image="resourceIcon" size="4x"
style="margin-right: 5px"/>
</span>
<span v-else>
<os-logo v-if="resource.ostypeid || resource.ostypename
|| ['guestoscategory'].includes($route.path.split('/')[1])"
:osId="resource.ostypeid" :osName="resource.ostypename || resource.name"
size="3x" @update-osname="setResourceOsType"/>
@@ -56,21 +56,59 @@
</div>
</slot>
</div>
- <slot name="avatar">
- <span v-if="resourceIcon && !['router', 'systemvm',
'volume'].includes($route.path.split('/')[1])">
- <resource-icon :image="resourceIcon" size="4x"
style="margin-right: 5px"/>
- </span>
- <span v-else>
- <os-logo v-if="resource.ostypeid || resource.ostypename ||
['guestoscategory'].includes($route.path.split('/')[1])"
:osId="resource.ostypeid" :osName="resource.ostypename || resource.name"
size="3x" @update-osname="setResourceOsType"/>
- <render-icon v-else-if="typeof $route.meta.icon ==='string'"
style="font-size: 36px" :icon="$route.meta.icon" />
- <font-awesome-icon
- v-else-if="$route.meta.icon &&
Array.isArray($route.meta.icon)"
- :icon="$route.meta.icon"
- size="3x"
- class="anticon"
- :style="[$store.getters.darkMode ? { color: 'rgba(255,
255, 255, 0.65)' } : { color: '#888' }]" />
- <render-icon v-else style="font-size: 36px"
:svgIcon="$route.meta.icon" />
- </span>
+ <slot name="actions">
+ <div class="tags">
+ <a-tag v-if="resource.instancename">
+ {{ resource.instancename }}
+ </a-tag>
+ <a-tag v-if="resource.type">
+ <span v-if="['USER.LOGIN', 'USER.LOGOUT',
'ROUTER.HEALTH.CHECKS', 'FIREWALL.CLOSE',
'ALERT.SERVICE.DOMAINROUTER'].includes(resource.type)">{{
$t(resource.type.toLowerCase()) }}</span>
+ <span v-else>
+ {{ resource.type }}
+ </span>
+ </a-tag>
+ <a-tag v-if="resource.issourcenat">
+ {{ $t('label.issourcenat') }}
+ </a-tag>
+ <a-tag v-if="resource.broadcasturi">
+ {{ resource.broadcasturi }}
+ </a-tag>
+ <a-tag v-if="resource.arch">
+ {{ resource.arch }}
+ </a-tag>
+ <a-tag v-if="resource.hypervisor">
+ {{ resource.hypervisor }}
+ </a-tag>
+ <a-tag v-if="resource.haenable">
+ {{ $t('label.haenable') }}
+ </a-tag>
+ <a-tag v-if="resource.isdynamicallyscalable">
+ {{ $t('label.isdynamicallyscalable') }}
+ </a-tag>
+ <a-tag v-if="resource.scope">
+ {{ resource.scope }}
+ </a-tag>
+ <a-tag v-if="resource.version">
+ {{ resource.version }}
+ </a-tag>
+ <a-tag v-if="resource.internetprotocol && ['IPv6',
'DualStack'].includes(resource.internetprotocol)">
+ {{ resource.internetprotocol ? $t('label.ip.v4.v6') :
resource.internetprotocol }}
+ </a-tag>
+ <a-tag v-if="resource.archived"
:color="this.$config.theme['@warning-color']">
+ {{ $t('label.archived') }}
+ </a-tag>
+ <a-tooltip placement="right" >
+ <template #title>
+ <span>{{ $t('label.view.console') }}</span>
+ </template>
+ <console
+ style="margin-top: -5px;"
+ :resource="resource"
+ size="default"
+ v-if="resource.id"
+ />
+ </a-tooltip>
+ </div>
</slot>
</div>
@@ -99,268 +137,79 @@
<div class="resource-detail-item__details">
<status class="status" :text="resource.success ? 'success' :
'error'"/>
</div>
- </slot>
- </div>
- <slot name="actions">
- <div class="tags">
- <a-tag v-if="resource.instancename">
- {{ resource.instancename }}
- </a-tag>
- <a-tag v-if="resource.type">
- <span v-if="['USER.LOGIN', 'USER.LOGOUT',
'ROUTER.HEALTH.CHECKS', 'FIREWALL.CLOSE',
'ALERT.SERVICE.DOMAINROUTER'].includes(resource.type)">{{
$t(resource.type.toLowerCase()) }}</span>
+ </div>
+
+ <div class="resource-detail-item" v-if="resource.id">
+ <div class="resource-detail-item__label">{{ $t('label.id')
}}</div>
+ <div class="resource-detail-item__details">
+ <tooltip-button
+ tooltipPlacement="top"
+ :tooltip="$t('label.copyid')"
+ icon="barcode-outlined"
+ type="dashed"
+ size="small"
+ :copyResource="String(resource.id)"
+ @onClick="$message.success($t('label.copied.clipboard'))" />
+ <span style="margin-left: 10px;"><copy-label
:label="resource.id" /></span>
+ </div>
+ </div>
+ <div class="resource-detail-item" v-if="resource.ostypename &&
resource.ostypeid">
+ <div class="resource-detail-item__label">{{
$t('label.ostypename') }}</div>
+ <div class="resource-detail-item__details">
+ <span v-if="images.guestoscategory">
+ <resource-icon :image="images.guestoscategory" size="1x"
style="margin-right: 5px"/>
+ </span>
+ <os-logo v-else :osId="resource.ostypeid"
:osName="resource.ostypename" size="lg" style="margin-left: -1px" />
+ <span style="margin-left: 8px">
+ <router-link v-if="$router.resolve('/guestos/' +
resource.ostypeid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/guestos/' + resource.ostypeid }">
+ {{ resource.ostypename }}
+ </router-link>
+ <span v-else>{{ resource.ostypename }}</span>
+ </span>
+ </div>
+ </div>
+ <div class="resource-detail-item" v-if="resource.ipaddress">
+ <div class="resource-detail-item__label">{{ $t('label.ip')
}}</div>
+ <div class="resource-detail-item__details">
+ <environment-outlined
+ @click="$message.success(`${$t('label.copied.clipboard')} :
${ ipaddress }`)"
+ v-clipboard:copy="ipaddress" />
+ <router-link v-if="!isStatic && resource.ipaddressid" :to="{
path: '/publicip/' + resource.ipaddressid }">
+ <copy-label :label="ipaddress" />
+ </router-link>
<span v-else>
- {{ resource.type }}
+ <span v-if="ipaddress.includes(',')">
+ <span
+ v-for="(value, index) in ipaddress.split(',')"
+ :key="index">
+ <copy-label :label="value" /><br/>
+ </span>
+ </span>
+ <span v-else>
+ <copy-label :label="ipaddress" />
+ </span>
</span>
- </a-tag>
- <a-tag v-if="resource.issourcenat">
- {{ $t('label.issourcenat') }}
- </a-tag>
- <a-tag v-if="resource.broadcasturi">
- {{ resource.broadcasturi }}
- </a-tag>
- <a-tag v-if="resource.arch">
- {{ resource.arch }}
- </a-tag>
- <a-tag v-if="resource.hypervisor">
- {{ resource.hypervisor }}
- </a-tag>
- <a-tag v-if="resource.haenable">
- {{ $t('label.haenable') }}
- </a-tag>
- <a-tag v-if="resource.isdynamicallyscalable">
- {{ $t('label.isdynamicallyscalable') }}
- </a-tag>
- <a-tag v-if="resource.scope">
- {{ resource.scope }}
- </a-tag>
- <a-tag v-if="resource.version">
- {{ resource.version }}
- </a-tag>
- <a-tag v-if="resource.internetprotocol && ['IPv6',
'DualStack'].includes(resource.internetprotocol)">
- {{ resource.internetprotocol ? $t('label.ip.v4.v6') :
resource.internetprotocol }}
- </a-tag>
- <a-tag v-if="resource.archived"
:color="this.$config.theme['@warning-color']">
- {{ $t('label.archived') }}
- </a-tag>
- <a-tag v-if="resource.leaseduration != undefined">
- {{ $t('label.remainingdays') + ': ' + (resource.leaseduration
> -1 ? resource.leaseduration + 'd' : 'Over') }}
- </a-tag>
- <a-tooltip placement="right" >
- <template #title>
- <span>{{ $t('label.view.console') }}</span>
- </template>
- <console
- style="margin-top: -5px;"
- :resource="resource"
- size="default"
- v-if="resource.id"
- />
- </a-tooltip>
+ </div>
</div>
-
- <a-divider/>
-
- <div class="resource-detail-item" v-if="(resource.state ||
resource.status) && $route.meta.name !== 'zone'">
- <div class="resource-detail-item__label">{{ $t('label.status')
}}</div>
- <div class="resource-detail-item__details">
- <status class="status" :text="resource.state || resource.status"
displayText/>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.allocationstate">
- <div class="resource-detail-item__label">{{
$t('label.allocationstate') }}</div>
- <div class="resource-detail-item__details">
- <status class="status" :text="resource.allocationstate"
displayText/>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.resourcestate">
- <div class="resource-detail-item__label">{{
$t('label.resourcestate') }}</div>
- <div class="resource-detail-item__details">
- <status class="status" :text="resource.resourcestate" displayText/>
- </div>
- </div>
- <div class="resource-detail-item" v-if="('success' in resource) &&
$route.meta.name === 'webhookdeliveries'">
- <div class="resource-detail-item__label">{{ $t('label.success')
}}</div>
- <div class="resource-detail-item__details">
- <status class="status" :text="resource.success ? 'success' :
'error'"/>
- </div>
- </div>
-
- <div class="resource-detail-item" v-if="resource.id">
- <div class="resource-detail-item__label">{{ $t('label.id') }}</div>
- <div class="resource-detail-item__details">
- <tooltip-button
- tooltipPlacement="top"
- :tooltip="$t('label.copyid')"
- icon="barcode-outlined"
- type="dashed"
- size="small"
- :copyResource="String(resource.id)"
- @onClick="$message.success($t('label.copied.clipboard'))" />
- <span style="margin-left: 10px;"><copy-label :label="resource.id"
/></span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.ostypename &&
resource.ostypeid">
- <div class="resource-detail-item__label">{{ $t('label.ostypename')
}}</div>
- <div class="resource-detail-item__details">
- <span v-if="images.guestoscategory">
- <resource-icon :image="images.guestoscategory" size="1x"
style="margin-right: 5px"/>
- </span>
- <os-logo v-else :osId="resource.ostypeid"
:osName="resource.ostypename" size="lg" style="margin-left: -1px" />
- <span style="margin-left: 8px">
- <router-link v-if="$router.resolve('/guestos/' +
resource.ostypeid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/guestos/' + resource.ostypeid }">
- {{ resource.ostypename }}
- </router-link>
- <span v-else>{{ resource.ostypename }}</span>
- </span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.ipaddress">
- <div class="resource-detail-item__label">{{ $t('label.ip') }}</div>
- <div class="resource-detail-item__details">
- <environment-outlined
- @click="$message.success(`${$t('label.copied.clipboard')} : ${
ipaddress }`)"
- v-clipboard:copy="ipaddress" />
- <router-link v-if="!isStatic && resource.ipaddressid" :to="{ path:
'/publicip/' + resource.ipaddressid }">
- <copy-label :label="ipaddress" />
- </router-link>
- <span v-else>
- <span v-if="ipaddress.includes(',')">
- <span
- v-for="(value, index) in ipaddress.split(',')"
- :key="index">
- <copy-label :label="value" /><br/>
+ <div class="resource-detail-item" v-if="('cpunumber' in resource
&& 'cpuspeed' in resource) || resource.cputotal">
+ <div class="resource-detail-item__label">{{ $t('label.cpu')
}}</div>
+ <div class="resource-detail-item__details">
+ <font-awesome-icon
+ :icon="['fa-solid', 'fa-microchip']"
+ class="anticon"
+ :style="[$store.getters.darkMode ? { color: 'rgba(255, 255,
255, 0.65)' } : { color: '#888' }]" />
+ <span v-if="'cpunumber' in resource && 'cpuspeed' in
resource">{{ resource.cpunumber }} CPU x {{ (resource.cpuspeed /
1000.0).toFixed(2) }} GHz
+ <a-tooltip placement="top">
+ <template #title>
+ {{ resource.cpuspeed }} MHz
+ </template>
+ <QuestionCircleOutlined />
+ </a-tooltip>
</span>
- </span>
- <span v-else>
- <copy-label :label="ipaddress" />
- </span>
- </span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="('cpunumber' in resource &&
'cpuspeed' in resource) || resource.cputotal">
- <div class="resource-detail-item__label">{{ $t('label.cpu') }}</div>
- <div class="resource-detail-item__details">
- <font-awesome-icon
- :icon="['fa-solid', 'fa-microchip']"
- class="anticon"
- :style="[$store.getters.darkMode ? { color: 'rgba(255, 255, 255,
0.65)' } : { color: '#888' }]" />
- <span v-if="'cpunumber' in resource && 'cpuspeed' in resource">{{
resource.cpunumber }} CPU x {{ (resource.cpuspeed / 1000.0).toFixed(2) }} GHz
- <a-tooltip placement="top">
- <template #title>
- {{ resource.cpuspeed }} MHz
- </template>
- <QuestionCircleOutlined />
- </a-tooltip>
- </span>
- <span v-else>{{ resource.cputotal }}</span>
- <a-tag v-if="resource.arch" style="margin-left: 10px">
- {{ resource.arch }}
- </a-tag>
- </div>
- <div>
- <span v-if="resource.cpuused">
- <a-progress
- v-if="resource.cpuused"
- class="progress-bar"
- size="small"
- status="active"
- :percent="parseFloat(resource.cpuused)"
- :format="(percent, successPercent) =>
parseFloat(percent).toFixed(2) + '% ' + $t('label.used')"
- />
- </span>
- <span v-if="resource.cpuallocated">
- <a-progress
- class="progress-bar"
- size="small"
- :percent="parseFloat(resource.cpuallocated)"
- :format="(percent, successPercent) =>
parseFloat(percent).toFixed(2) + '% ' + $t('label.allocated')"
- />
- </span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="'leaseduration' in resource &&
resource.leaseduration !== undefined">
- <div class="resource-detail-item__label">{{
$t('label.leaseduration') }}</div>
- <div class="resource-detail-item__details">
- <field-time-outlined
- :style="{
- color: $store.getters.darkMode ? { color: 'rgba(255, 255,
255, 0.65)' } : { color: '#888' },
- fontSize: '20px'
- }"/>
- {{ resource.leaseduration + ' ' + $t('label.days') }}
- </div>
- </div>
- <div class="resource-detail-item" v-if="'leaseexpiryaction' in
resource && resource.leaseexpiryaction !== undefined">
- <div class="resource-detail-item__label">{{
$t('label.leaseexpiryaction') }}</div>
- <div class="resource-detail-item__details">
- <font-awesome-icon
- :icon="['fa-solid', 'fa-circle-xmark']"
- class="anticon"
- :style="[$store.getters.darkMode ? { color: 'rgba(255, 255, 255,
0.65)' } : { color: '#888' }]" />
- {{ resource.leaseexpiryaction }}
- </div>
- </div>
- <div class="resource-detail-item" v-if="'memory' in resource">
- <div class="resource-detail-item__label">{{ $t('label.memory')
}}</div>
- <div class="resource-detail-item__details">
- <font-awesome-icon
- :icon="['fa-solid', 'fa-memory']"
- class="anticon"
- :style="[$store.getters.darkMode ? { color: 'rgba(255, 255, 255,
0.65)' } : { color: '#888' }]" />
- {{ resource.memory + ' ' + $t('label.mb.memory') }}
- </div>
- <div>
- <span v-if="resource.memorykbs && resource.memoryintfreekbs">
- <a-progress
- class="progress-bar"
- size="small"
- status="active"
- :percent="Number(parseFloat(100.0 * (resource.memorykbs -
resource.memoryintfreekbs) / resource.memorykbs).toFixed(2))"
- :format="(percent, successPercent) =>
parseFloat(percent).toFixed(2) + '% ' + $t('label.used')"
- />
- </span>
- </div>
- </div>
- <div class="resource-detail-item" v-else-if="resource.memorytotalgb">
- <div class="resource-detail-item__label">{{ $t('label.memory')
}}</div>
- <div class="resource-detail-item__details">
- <bulb-outlined />
- <span>
- {{ resource.memorytotalgb + ' ' + $t('label.memory') }}
- <a-tooltip placement="top">
- <template #title>
- {{ (resource.memorytotal/(1024**2)).toFixed(3) }} MB
- </template>
- <QuestionCircleOutlined />
- </a-tooltip>
- </span>
- </div>
- <div>
- <span v-if="resource.memoryusedgb">
- <a-progress
- class="progress-bar"
- size="small"
- status="active"
- :percent="Number(parseFloat(100.0 *
parseFloat(resource.memoryusedgb) /
parseFloat(resource.memorytotalgb)).toFixed(2))"
- :format="(percent, successPercent) =>
parseFloat(percent).toFixed(2) + '% ' + $t('label.used')"
- />
- </span>
- <span v-if="resource.memoryallocatedgb">
- <a-progress
- class="progress-bar"
- size="small"
- :percent="Number(parseFloat(100.0 *
parseFloat(resource.memoryallocatedgb) /
parseFloat(resource.memorytotalgb)).toFixed(2))"
- :format="(percent, successPercent) =>
parseFloat(percent).toFixed(2) + '% ' + $t('label.allocated')"
- />
- </span>
- </div>
- </div>
- <div class="resource-detail-item" v-else-if="resource.memorytotal">
- <div class="resource-detail-item__label">{{ $t('label.memory')
}}</div>
- <div class="resource-detail-item__details">
-
- <div style="display: flex; flex-direction: column; width: 100%;">
- <div>
- <bulb-outlined />{{ resource.memorytotal + ' ' +
$t('label.memory') }}
+ <span v-else>{{ resource.cputotal }}</span>
+ <a-tag v-if="resource.arch" style="margin-left: 10px">
+ {{ resource.arch }}
+ </a-tag>
</div>
<div>
<span v-if="resource.cpuused">
@@ -551,272 +400,38 @@
</div>
</div>
</div>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.loadbalancer">
- <div class="resource-detail-item__label">{{
$t('label.loadbalancerrule') }}</div>
- <div class="resource-detail-item__details">
- <api-outlined />
- <span>{{ resource.loadbalancer.name }} ( {{
resource.loadbalancer.publicip }}:{{ resource.loadbalancer.publicport }})</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.projectid ||
resource.projectname">
- <div class="resource-detail-item__label">{{ $t('label.project')
}}</div>
- <div class="resource-detail-item__details">
- <span v-if="images.project">
- <resource-icon :image="images.project" size="1x"
style="margin-right: 5px"/>
- </span>
- <project-outlined v-else />
- <router-link v-if="!isStatic && resource.projectid" :to="{ path:
'/project/' + resource.projectid }">{{ resource.project || resource.projectname
|| resource.projectid }}</router-link>
- <router-link v-else :to="{ path: '/project', query: { name:
resource.projectname }}">{{ resource.projectname }}</router-link>
- </div>
- </div>
-
- <div class="resource-detail-item">
- <slot name="details">
- </slot>
- </div>
-
- <div class="resource-detail-item" v-if="resource.groupid">
- <div class="resource-detail-item__label">{{ $t('label.group')
}}</div>
- <div class="resource-detail-item__details">
- <gold-outlined />
- <router-link :to="{ path: '/vmgroup/' + resource.groupid }">{{
resource.group || resource.groupid }}</router-link>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.autoscalevmgroupid">
- <div class="resource-detail-item__label">{{
$t('label.autoscalevmgroupname') }}</div>
- <div class="resource-detail-item__details">
- <gold-outlined />
- <router-link :to="{ path: '/autoscalevmgroup/' +
resource.autoscalevmgroupid }">{{ resource.autoscalevmgroupname ||
resource.autoscalevmgroupid }}</router-link>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.keypairs &&
resource.keypairs.length > 0">
- <div class="resource-detail-item__label">{{ $t('label.keypairs')
}}</div>
- <div class="resource-detail-item__details">
- <div>
- <div
- v-for="keypair in keypairs"
- :key="keypair"
- style="margin-top: 5px;">
- <key-outlined />
- <router-link :to="{ path: '/ssh/' + keypair }"
style="margin-right: 5px">{{ keypair }}</router-link>
+ <div class="resource-detail-item" v-if="resource.networks &&
resource.networks.length > 0">
+ <div class="resource-detail-item__label">{{ $t('label.networks')
}}</div>
+ <div class="resource-detail-item__details
resource-detail-item__details--start">
+ <div>
+ <div
+ v-for="network in resource.networks"
+ :key="network.id"
+ style="margin-top: 5px;">
+ <font-awesome-icon
+ :icon="['fa-solid', 'fa-ethernet']"
+ class="anticon"
+ :style="[$store.getters.darkMode ? { color: 'rgba(255,
255, 255, 0.65)' } : { color: '#888' }]" />
+ {{ network.name }}
+ <span v-if="resource.defaultnetworkid === network.id">
+ ({{ $t('label.default') }})
+ </span>
+ </div>
+ </div>
</div>
</div>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.resourcetype &&
resource.resourceid && routeFromResourceType">
- <div class="resource-detail-item__label">{{ $t('label.resource')
}}</div>
- <div class="resource-detail-item__details">
- <resource-label :resourceType="resource.resourcetype"
:resourceId="resource.resourceid" :resourceName="resource.resourcename" />
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.virtualmachineid">
- <div class="resource-detail-item__label">{{ $t('label.vmname')
}}</div>
- <div class="resource-detail-item__details">
- <desktop-outlined />
- <router-link :to="{ path: createPathBasedOnVmType(resource.vmtype,
resource.virtualmachineid) }">{{ resource.vmname || resource.vm ||
resource.virtualmachinename || resource.virtualmachineid }} </router-link>
- <status class="status status--end" :text="resource.vmstate"
v-if="resource.vmstate"/>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.volumeid">
- <div class="resource-detail-item__label">{{ $t('label.volume')
}}</div>
- <div class="resource-detail-item__details">
- <hdd-outlined />
- <router-link v-if="validLinks.volume" :to="{ path: '/volume/' +
resource.volumeid }">{{ resource.volumename || resource.volume ||
resource.volumeid }} </router-link>
- <span v-else>{{ resource.volumename || resource.volume ||
resource.volumeid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.associatednetworkid">
- <div class="resource-detail-item__label">{{
$t('label.associatednetwork') }}</div>
- <div class="resource-detail-item__details">
- <wifi-outlined />
- <router-link :to="{ path: '/guestnetwork/' +
resource.associatednetworkid }">{{ resource.associatednetworkname ||
resource.associatednetwork || resource.associatednetworkid }} </router-link>
- </div>
- </div>
- <div class="resource-detail-item"
v-if="resource.sourceipaddressnetworkid">
- <div class="resource-detail-item__label">{{ $t('label.network')
}}</div>
- <div class="resource-detail-item__details">
- <wifi-outlined />
- <router-link :to="{ path: '/guestnetwork/' +
resource.sourceipaddressnetworkid }">{{ resource.sourceipaddressnetworkname ||
resource.sourceipaddressnetworkid }} </router-link>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.guestnetworkid">
- <div class="resource-detail-item__label">{{ $t('label.guestnetwork')
}}</div>
- <div class="resource-detail-item__details">
- <gateway-outlined />
- <router-link :to="{ path: '/guestnetwork/' +
resource.guestnetworkid }">{{ resource.guestnetworkname ||
resource.guestnetworkid }} </router-link>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.publicip">
- <div class="resource-detail-item__label">{{ $t('label.public.ip')
}}</div>
- <div class="resource-detail-item__details">
- <gateway-outlined />
- <router-link v-if="resource.publicipid" :to="{ path: '/publicip/'
+ resource.publicipid }">{{ resource.publicip }} </router-link>
- <copy-label v-if="resource.publicipid"
:copyValue="resource.publicip" :showIcon=true />
- <copy-label v-else :label="resource.publicip" />
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.vpcid">
- <div class="resource-detail-item__label">{{ $t('label.vpcname')
}}</div>
- <div class="resource-detail-item__details">
- <span v-if="images.vpc">
- <resource-icon :image="images.vpc" size="1x"
style="margin-right: 5px"/>
- </span>
- <deployment-unit-outlined v-else />
- <router-link :to="{ path: '/vpc/' + resource.vpcid }">{{
resource.vpcname || resource.vpcid }}</router-link>
- </div>
- </div>
-
- <div class="resource-detail-item" v-if="resource.aclid">
- <div class="resource-detail-item__label">{{ $t('label.aclid')
}}</div>
- <div class="resource-detail-item__details">
- <span v-if="images.acl">
- <resource-icon :image="images.acl" size="1x"
style="margin-right: 5px"/>
- </span>
- <deployment-unit-outlined v-else />
- <router-link :to="{ path: '/acllist/' + resource.aclid }">{{
resource.aclname || resource.aclid }}</router-link>
- </div>
- </div>
-
- <div class="resource-detail-item" v-if="resource.affinitygroup &&
resource.affinitygroup.length > 0">
- <div class="resource-detail-item__label">{{
$t('label.affinitygroup') }}</div>
- <SwapOutlined />
- <span
- v-for="(group, index) in resource.affinitygroup"
- :key="group.id"
- >
- <router-link :to="{ path: '/affinitygroup/' + group.id }">{{
group.name }}</router-link>
- <span v-if="index + 1 < resource.affinitygroup.length">, </span>
- </span>
- </div>
- <div class="resource-detail-item" v-if="resource.templateid">
- <div class="resource-detail-item__label">{{ resource.templateformat
=== 'ISO'? $t('label.iso') : $t('label.templatename') }}</div>
- <div class="resource-detail-item__details">
- <resource-icon v-if="images.template || images.guestoscategory"
:image="images.template || images.guestoscategory" size="1x"
style="margin-right: 5px"/>
- <SaveOutlined v-else />
- <router-link :to="{ path: (resource.templateformat === 'ISO' ?
'/iso/' : '/template/') + resource.templateid }">{{
resource.templatedisplaytext || resource.templatename || resource.templateid }}
</router-link>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.isoid">
- <div class="resource-detail-item__label">{{ $t('label.isoname')
}}</div>
- <div class="resource-detail-item__details">
- <resource-icon v-if="images.iso || (resource.isoid ===
resource.templateid && images.guestoscategory)" :image="images.iso ||
images.guestoscategory" size="1x" style="margin-right: 5px"/>
- <UsbOutlined v-else />
- <router-link :to="{ path: '/iso/' + resource.isoid }">{{
resource.isodisplaytext || resource.isoname || resource.isoid }} </router-link>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.serviceofferingname
&& resource.serviceofferingid">
- <div class="resource-detail-item__label" v-if="$route.meta.name ===
'router' || $route.meta.name === 'systemvm'">{{ $t('label.system.offering')
}}</div>
- <div class="resource-detail-item__label" v-else >{{
$t('label.serviceofferingname') }}</div>
- <div class="resource-detail-item__details">
- <cloud-outlined />
- <router-link v-if="!isStatic && ($route.meta.name === 'router' ||
$route.meta.name === 'systemvm')" :to="{ path: '/systemoffering/' +
resource.serviceofferingid}">{{ resource.serviceofferingname ||
resource.serviceofferingid }} </router-link>
- <router-link v-else-if="$router.resolve('/computeoffering/' +
resource.serviceofferingid).matched[0].redirect !== '/exception/404'" :to="{
path: '/computeoffering/' + resource.serviceofferingid }">{{
resource.serviceofferingname || resource.serviceofferingid }} </router-link>
- <span v-else>{{ resource.serviceofferingname ||
resource.serviceofferingid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.rootdiskofferingid &&
resource.rootdiskofferingdisplaytext || resource.datadiskofferingid &&
resource.datadiskofferingdisplaytext">
- <div class="resource-detail-item__label">{{ $t('label.diskoffering')
}}</div>
- <div class="resource-detail-item__details">
- <hdd-outlined />
- <div v-if="resource.rootdiskofferingid">
- <router-link v-if="!isStatic && $router.resolve('/diskoffering/'
+ resource.rootdiskofferingid).matched[0].redirect !== '/exception/404'" :to="{
path: '/diskoffering/' + resource.rootdiskofferingid }">{{
resource.rootdiskofferingdisplaytext }}</router-link>
- <span v-else>{{ resource.rootdiskofferingdisplaytext }}</span>
- </div>
- <span v-if="resource.rootdiskofferingid &&
resource.datadiskofferingid"> | </span>
- <div v-if="resource.datadiskofferingid">
- <router-link v-if="!isStatic && $router.resolve('/diskoffering/'
+ resource.datadiskofferingid).matched[0].redirect !== '/exception/404'" :to="{
path: '/diskoffering/' + resource.datadiskofferingid }">{{
resource.datadiskofferingdisplaytext }}</router-link>
- <span v-else>{{ resource.datadiskofferingdisplaytext }}</span>
+ <div class="resource-detail-item" v-if="resource.loadbalancer">
+ <div class="resource-detail-item__label">{{
$t('label.loadbalancerrule') }}</div>
+ <div class="resource-detail-item__details">
+ <api-outlined />
+ <span>{{ resource.loadbalancer.name }} ( {{
resource.loadbalancer.publicip }}:{{ resource.loadbalancer.publicport }})</span>
+ </div>
</div>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.backupofferingid">
- <div class="resource-detail-item__label">{{
$t('label.backupofferingid') }}</div>
- <cloud-upload-outlined />
- <router-link v-if="!isStatic && $router.resolve('/backupoffering/' +
resource.backupofferingid).matched[0].redirect !== '/exception/404'" :to="{
path: '/backupoffering/' + resource.backupofferingid }">{{
resource.backupofferingname || resource.backupofferingid }} </router-link>
- <span v-else>{{ resource.backupofferingname ||
resource.backupofferingid }}</span>
- </div>
- <div class="resource-detail-item" v-if="resource.networkofferingid">
- <div class="resource-detail-item__label">{{
$t('label.networkofferingid') }}</div>
- <div class="resource-detail-item__details">
- <wifi-outlined />
- <router-link v-if="!isStatic &&
$router.resolve('/networkoffering/' +
resource.networkofferingid).matched[0].redirect !== '/exception/404'" :to="{
path: '/networkoffering/' + resource.networkofferingid }">{{
resource.networkofferingname || resource.networkofferingid }} </router-link>
- <span v-else>{{ resource.networkofferingname ||
resource.networkofferingid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.vpcofferingid">
- <div class="resource-detail-item__label">{{ $t('label.vpcoffering')
}}</div>
- <div class="resource-detail-item__details">
- <DeploymentUnitOutlined />
- <router-link v-if="!isStatic && $router.resolve('/vpcoffering/' +
resource.vpcofferingid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/vpcoffering/' + resource.vpcofferingid }">{{ resource.vpcofferingname ||
resource.vpcofferingid }} </router-link>
- <span v-else>{{ resource.vpcofferingname || resource.vpcofferingid
}}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.storageid">
- <div class="resource-detail-item__label">{{ $t('label.storagepool')
}}</div>
- <div class="resource-detail-item__details">
- <database-outlined />
- <router-link v-if="!isStatic && $router.resolve('/storagepool/' +
resource.storageid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/storagepool/' + resource.storageid }">{{ resource.storage ||
resource.storageid }} </router-link>
- <span v-else>{{ resource.storage || resource.storageid }}</span>
- <a-tag style="margin-left: 5px;" v-if="resource.storagetype">
- {{ resource.storagetype }}
- </a-tag>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.hostid">
- <div class="resource-detail-item__label">{{ $t('label.hostname')
}}</div>
- <div class="resource-detail-item__details">
- <desktop-outlined />
- <router-link v-if="!isStatic && $router.resolve('/host/' +
resource.hostid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/host/' + resource.hostid }">{{ resource.hostname || resource.hostid }}
</router-link>
- <span v-else>{{ resource.hostname || resource.hostid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.clusterid">
- <div class="resource-detail-item__label">{{ $t('label.clusterid')
}}</div>
- <div class="resource-detail-item__details">
- <cluster-outlined />
- <router-link v-if="!isStatic && $router.resolve('/cluster/' +
resource.clusterid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/cluster/' + resource.clusterid }">{{ resource.clustername || resource.cluster
|| resource.clusterid }}</router-link>
- <span v-else>{{ resource.clustername || resource.cluster ||
resource.clusterid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.podid">
- <div class="resource-detail-item__label">{{ $t('label.podid')
}}</div>
- <div class="resource-detail-item__details">
- <appstore-outlined />
- <router-link v-if="!isStatic && $router.resolve('/pod/' +
resource.podid).matched[0].redirect !== '/exception/404'" :to="{ path: '/pod/'
+ resource.podid }">{{ resource.podname || resource.pod || resource.podid
}}</router-link>
- <span v-else>{{ resource.podname || resource.pod || resource.podid
}}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.zoneid &&
!['template', 'iso'].includes($route.path.split('/')[1])">
- <div class="resource-detail-item__label">{{ $t('label.zone') }}</div>
- <div class="resource-detail-item__details">
- <span v-if="images.zone">
- <resource-icon :image="images.zone" size="1x"
style="margin-right: 5px"/>
- </span>
- <global-outlined v-else />
- <router-link v-if="!isStatic && $router.resolve('/zone/' +
resource.zoneid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/zone/' + resource.zoneid }">{{ resource.zone || resource.zonename ||
resource.zoneid }}</router-link>
- <router-link v-else-if="$router.resolve('/zones/' +
resource.zoneid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/zones/' + resource.zoneid }">{{ resource.zone || resource.zonename ||
resource.zoneid }}</router-link>
- <span v-else>{{ resource.zone || resource.zonename ||
resource.zoneid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.userdataname">
- <div class="resource-detail-item__label">{{ $t('label.userdata')
}}</div>
- <div class="resource-detail-item__details">
- <solution-outlined />
- <router-link v-if="!isStatic && $router.resolve('/userdata/' +
resource.userdataid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/userdata/' + resource.userdataid }">{{ resource.userdataname ||
resource.userdataid }}</router-link>
- <span v-else>{{ resource.userdataname || resource.userdataid
}}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.owner">
- <div class="resource-detail-item__label">{{ $t('label.owners')
}}</div>
- <div class="resource-detail-item__details">
- <user-outlined />
- <template v-for="(item, idx) in resource.owner" :key="idx">
- <span style="margin-right:5px">
- <span v-if="$store.getters.userInfo.roletype !== 'User'">
- <router-link v-if="!isStatic && 'user' in item" :to="{ path:
'/accountuser', query: { username: item.user, domainid: resource.domainid
}}">{{ item.account + '(' + item.user + ')' }}</router-link>
- <router-link v-else :to="{ path: '/account', query: { name:
item.account, domainid: resource.domainid } }">{{ item.account }}</router-link>
+ <div class="resource-detail-item" v-if="resource.projectid ||
resource.projectname">
+ <div class="resource-detail-item__label">{{ $t('label.project')
}}</div>
+ <div class="resource-detail-item__details">
+ <span v-if="images.project">
+ <resource-icon :image="images.project" size="1x"
style="margin-right: 5px"/>
</span>
<project-outlined v-else />
<router-link v-if="!isStatic && resource.projectid" :to="{
path: '/project/' + resource.projectid }">{{ resource.project ||
resource.projectname || resource.projectid }}</router-link>
@@ -913,7 +528,7 @@
<div class="resource-detail-item__label">{{ $t('label.vpcname')
}}</div>
<div class="resource-detail-item__details">
<span v-if="images.vpc">
- <resource-icon :image="getImage(images.vpc)" size="1x"
style="margin-right: 5px"/>
+ <resource-icon :image="images.vpc" size="1x"
style="margin-right: 5px"/>
</span>
<deployment-unit-outlined v-else />
<router-link :to="{ path: '/vpc/' + resource.vpcid }">{{
resource.vpcname || resource.vpcid }}</router-link>
@@ -924,7 +539,7 @@
<div class="resource-detail-item__label">{{ $t('label.aclid')
}}</div>
<div class="resource-detail-item__details">
<span v-if="images.acl">
- <resource-icon :image="getImage(images.acl)" size="1x"
style="margin-right: 5px"/>
+ <resource-icon :image="images.acl" size="1x"
style="margin-right: 5px"/>
</span>
<deployment-unit-outlined v-else />
<router-link :to="{ path: '/acllist/' + resource.aclid }">{{
resource.aclname || resource.aclid }}</router-link>
@@ -941,176 +556,11 @@
<router-link :to="{ path: '/affinitygroup/' + group.id }">{{
group.name }}</router-link>
<span v-if="index + 1 < resource.affinitygroup.length">,
</span>
</span>
- </template>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.account &&
!resource.account.startsWith('PrjAcct-')">
- <div class="resource-detail-item__label">{{ $t('label.account')
}}</div>
- <div class="resource-detail-item__details">
- <span v-if="images.account">
- <resource-icon :image="images.account" size="1x"
style="margin-right: 5px"/>
- </span>
- <user-outlined v-else />
- <router-link v-if="!isStatic && $store.getters.userInfo.roletype
!== 'User'" :to="{ path: '/account', query: { name: resource.account, domainid:
resource.domainid } }">{{ resource.account }}</router-link>
- <span v-else>{{ resource.account }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.roleid">
- <div class="resource-detail-item__label">{{ $t('label.role') }}</div>
- <div class="resource-detail-item__details">
- <idcard-outlined />
- <router-link v-if="!isStatic && $router.resolve('/role/' +
resource.roleid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/role/' + resource.roleid }">{{ resource.rolename || resource.role ||
resource.roleid }}</router-link>
- <span v-else>{{ resource.rolename || resource.role ||
resource.roleid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.domainid">
- <div class="resource-detail-item__label">{{ $t('label.domain')
}}</div>
- <div class="resource-detail-item__details">
- <resource-icon v-if="images.domain" :image="images.domain"
size="1x" style="margin-right: 5px"/>
- <block-outlined v-else />
- <router-link v-if="!isStatic && $store.getters.userInfo.roletype
!== 'User'" :to="{ path: '/domain/' + resource.domainid, query: { tab:
'details'} }">{{ resource.domain || resource.domainid }}</router-link>
- <span v-else>{{ resource.domain || resource.domainid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.payloadurl">
- <div class="resource-detail-item__label">{{ $t('label.payloadurl')
}}</div>
- <div class="resource-detail-item__details">
- <link-outlined/>
- <a v-if="!isStatic" :href="resource.payloadurl">{{
resource.payloadurl }}</a>
- <span v-else>{{ resource.payloadurl }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.webhookid">
- <div class="resource-detail-item__label">{{ $t('label.webhook')
}}</div>
- <div class="resource-detail-item__details">
- <node-index-outlined />
- <router-link v-if="!isStatic && $router.resolve('/webhook/' +
resource.webhookid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/webhook/' + resource.webhookid }">{{ resource.webhookname ||
resource.webhookid }}</router-link>
- <span v-else>{{ resource.webhookname || resource.webhookid
}}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.managementserverid">
- <div class="resource-detail-item__label">{{
$t('label.management.servers') }}</div>
- <div class="resource-detail-item__details">
- <rocket-outlined />
- <router-link v-if="!isStatic &&
$router.resolve('/managementserver/' +
resource.managementserverid).matched[0].redirect !== '/exception/404'" :to="{
path: '/managementserver/' + resource.managementserverid }">{{
resource.managementserver || resource.managementserverid }}</router-link>
- <span v-else>{{ resource.managementserver ||
resource.managementserverid }}</span>
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.created &&
!['template', 'iso'].includes($route.path.split('/')[1])">
- <div class="resource-detail-item__label">{{ $t('label.created')
}}</div>
- <div class="resource-detail-item__details">
- <calendar-outlined />{{ $toLocaleDate(resource.created) }}
- </div>
- </div>
- <div class="resource-detail-item" v-if="resource.lastupdated">
- <div class="resource-detail-item__label">{{ $t('label.last.updated')
}}</div>
- <div class="resource-detail-item__details">
- <calendar-outlined />{{ $toLocaleDate(resource.lastupdated) }}
- </div>
- </div>
- </div>
-
- <div class="account-center-tags" v-if="$route.meta.related">
- <a-divider/>
- <div v-for="item in $route.meta.related" :key="item.path">
- <router-link
- v-if="(item.show === undefined || item.show(resource)) &&
$router.resolve('/' + item.name).matched[0].redirect !== '/exception/404'"
- :to="{ name: item.name, query: getRouterQuery(item) }">
- <a-button style="margin-right: 10px">
- <template #icon>
- <render-icon :icon="$router.resolve('/' +
item.name).meta.icon" />
- </template>
- {{ $t('label.view') + ' ' + $t(item.title) }}
- </a-button>
- </router-link>
- </div>
- <image-deploy-instance-button
- v-if="'deployVirtualMachine' in $store.getters.apis && ['template',
'iso'].includes($route.meta.name)"
- :resource="resource"
- :osCategoryId="osCategoryId" />
- </div>
-
- <div class="account-center-tags" v-if="showKeys ||
resource.apikeyaccess">
- <a-divider/>
- </div>
- <div class="account-center-tags" v-if="resource.apikeyaccess &&
resource.account">
- <div class="resource-detail-item">
- <div class="resource-detail-item__label">{{ $t('label.apikeyaccess')
}}</div>
- <div class="resource-detail-item__details">
- <status class="status" :text="resource.apikeyaccess" displayText/>
- </div>
- </div>
- </div>
- <div class="account-center-tags" v-if="showKeys">
- <div class="user-keys">
- <key-outlined />
- <strong>
- {{ $t('label.apikey') }}
- <tooltip-button
- tooltipPlacement="right"
- :tooltip="$t('label.copy') + ' ' + $t('label.apikey')"
- icon="CopyOutlined"
- type="dashed"
- size="small"
- @onClick="$message.success($t('label.copied.clipboard'))"
- :copyResource="resource.apikey" />
- </strong>
- <div>
- {{ resource.apikey.substring(0, 20) }}...
- </div>
- </div> <br/>
- <div class="user-keys">
- <lock-outlined />
- <strong>
- {{ $t('label.secretkey') }}
- <tooltip-button
- tooltipPlacement="right"
- :tooltip="$t('label.copy') + ' ' + $t('label.secretkey')"
- icon="CopyOutlined"
- type="dashed"
- size="small"
- @onClick="$message.success($t('label.copied.clipboard'))"
- :copyResource="resource.secretkey" />
- </strong>
- <div>
- {{ resource.secretkey.substring(0, 20) }}...
- </div>
- </div>
- </div>
-
- <div class="account-center-tags" v-if="!isStatic && resourceType &&
tagsSupportingResourceTypes.includes(this.resourceType) && 'listTags' in
$store.getters.apis">
- <a-divider/>
- <a-spin :spinning="loadingTags">
- <div class="title">{{ $t('label.tags') }}</div>
- <div>
- <template v-for="(tag, index) in tags" :key="index">
- <a-tag :closable="isAdminOrOwner() && 'deleteTags' in
$store.getters.apis" @close="() => handleDeleteTag(tag)">
- {{ tag.key }} = {{ tag.value }}
- </a-tag>
- </template>
-
- <div v-if="inputVisible">
- <a-input-group
- type="text"
- size="small"
- @blur="handleInputConfirm"
- @keyup.enter="handleInputConfirm"
- compact>
- <a-input ref="input" :value="inputKey"
@change="handleKeyChange" style="width: 30%; text-align: center"
:placeholder="$t('label.key')" />
- <a-input
- class="tag-disabled-input"
- style="width: 30px; border-left: 0; pointer-events: none;
text-align: center"
- placeholder="="
- disabled />
- <a-input :value="inputValue" @change="handleValueChange"
style="width: 30%; text-align: center; border-left: 0"
:placeholder="$t('label.value')" />
- <tooltip-button :tooltip="$t('label.ok')" icon="CheckOutlined"
size="small" @onClick="handleInputConfirm" />
- <tooltip-button :tooltip="$t('label.cancel')"
icon="CloseOutlined" size="small" @onClick="inputVisible=false" />
- </a-input-group>
</div>
<div class="resource-detail-item" v-if="resource.templateid">
<div class="resource-detail-item__label">{{
resource.templateformat === 'ISO'? $t('label.iso') : $t('label.templatename')
}}</div>
<div class="resource-detail-item__details">
- <resource-icon v-if="resource.icon"
:image="getImage(resource.icon.base64image)" size="1x" style="margin-right:
5px"/>
+ <resource-icon v-if="images.template ||
images.guestoscategory" :image="images.template || images.guestoscategory"
size="1x" style="margin-right: 5px"/>
<SaveOutlined v-else />
<router-link :to="{ path: (resource.templateformat === 'ISO' ?
'/iso/' : '/template/') + resource.templateid }">{{
resource.templatedisplaytext || resource.templatename || resource.templateid }}
</router-link>
</div>
@@ -1118,7 +568,7 @@
<div class="resource-detail-item" v-if="resource.isoid">
<div class="resource-detail-item__label">{{ $t('label.isoname')
}}</div>
<div class="resource-detail-item__details">
- <resource-icon v-if="resource.icon"
:image="getImage(resource.icon.base64image)" size="1x" style="margin-right:
5px"/>
+ <resource-icon v-if="images.iso || (resource.isoid ===
resource.templateid && images.guestoscategory)" :image="images.iso ||
images.guestoscategory" size="1x" style="margin-right: 5px"/>
<UsbOutlined v-else />
<router-link :to="{ path: '/iso/' + resource.isoid }">{{
resource.isodisplaytext || resource.isoname || resource.isoid }} </router-link>
</div>
@@ -1209,7 +659,7 @@
<div class="resource-detail-item__label">{{ $t('label.zone')
}}</div>
<div class="resource-detail-item__details">
<span v-if="images.zone">
- <resource-icon :image="getImage(images.zone)" size="1x"
style="margin-right: 5px"/>
+ <resource-icon :image="images.zone" size="1x"
style="margin-right: 5px"/>
</span>
<global-outlined v-else />
<router-link v-if="!isStatic && $router.resolve('/zone/' +
resource.zoneid).matched[0].redirect !== '/exception/404'" :to="{ path:
'/zone/' + resource.zoneid }">{{ resource.zone || resource.zonename ||
resource.zoneid }}</router-link>
@@ -1244,7 +694,7 @@
<div class="resource-detail-item__label">{{ $t('label.account')
}}</div>
<div class="resource-detail-item__details">
<span v-if="images.account">
- <resource-icon :image="getImage(images.account)" size="1x"
style="margin-right: 5px"/>
+ <resource-icon :image="images.account" size="1x"
style="margin-right: 5px"/>
</span>
<user-outlined v-else />
<router-link v-if="!isStatic &&
$store.getters.userInfo.roletype !== 'User'" :to="{ path: '/account', query: {
name: resource.account, domainid: resource.domainid } }">{{ resource.account
}}</router-link>
@@ -1262,7 +712,7 @@
<div class="resource-detail-item" v-if="resource.domainid">
<div class="resource-detail-item__label">{{ $t('label.domain')
}}</div>
<div class="resource-detail-item__details">
- <resource-icon v-if="images.domain"
:image="getImage(images.domain)" size="1x" style="margin-right: 5px"/>
+ <resource-icon v-if="images.domain" :image="images.domain"
size="1x" style="margin-right: 5px"/>
<block-outlined v-else />
<router-link v-if="!isStatic &&
$store.getters.userInfo.roletype !== 'User'" :to="{ path: '/domain/' +
resource.domainid, query: { tab: 'details'} }">{{ resource.domain ||
resource.domainid }}</router-link>
<span v-else>{{ resource.domain || resource.domainid }}</span>
@@ -1320,6 +770,10 @@
</a-button>
</router-link>
</div>
+ <image-deploy-instance-button
+ v-if="'deployVirtualMachine' in $store.getters.apis &&
['template', 'iso'].includes($route.meta.name)"
+ :resource="resource"
+ :osCategoryId="osCategoryId" />
</div>
<div class="account-center-tags" v-if="showKeys ||
resource.apikeyaccess">
@@ -1431,7 +885,7 @@ import UploadResourceIcon from
'@/components/view/UploadResourceIcon'
import eventBus from '@/config/eventBus'
import ResourceIcon from '@/components/view/ResourceIcon'
import ResourceLabel from '@/components/widgets/ResourceLabel'
-import ImageDeployInstanceButton from
'@/components/view/ImageDeployInstanceButton.vue'
+import ImageDeployInstanceButton from
'@/components/view/ImageDeployInstanceButton'
export default {
name: 'InfoCard',
@@ -1570,9 +1024,6 @@ export default {
},
routeFromResourceType () {
return this.$getRouteFromResourceType(this.resource.resourcetype)
- },
- isModernImageSelection () {
- return this.$config.imageSelectionInterface === undefined ||
this.$config.imageSelectionInterface === 'modern'
}
},
methods: {
@@ -1587,6 +1038,10 @@ export default {
this.getTags()
}
}
+ this.fetchOsCategoryAndIcon()
+ this.getIcons()
+ },
+ fetchOsCategoryAndIcon () {
const osId = this.resource.guestosid || this.resource.ostypeid
if (osId && 'listOsTypes' in this.$store.getters.apis) {
api('listOsTypes', { id: osId }).then(json => {
@@ -1596,7 +1051,6 @@ export default {
}
})
}
- this.getIcons()
},
showUploadModal (show) {
if (show) {
@@ -1783,9 +1237,6 @@ export default {
if (item.name === 'template') {
query.templatefilter = 'self'
query.filter = 'self'
- } else if (item.name === 'iso') {
- query.isofilter = 'self'
- query.filter = 'self'
}
if (item.param === 'account') {