Consolidate back to VMOverview.vue and disable

This commit is contained in:
Joshua Boniface 2025-03-02 10:41:34 -05:00
parent 8158f84eb7
commit 8f5dac1ca4
2 changed files with 141 additions and 4 deletions

View File

@ -111,7 +111,80 @@
<!-- VM Details -->
<div v-if="selectedVMData && !showVMList" class="vm-details">
<VMDetail :vm="selectedVMData" />
<!-- Basic Info Section -->
<CollapsibleSection title="VM Information" :initially-expanded="sections.info">
<div class="info-grid">
<ValueCard
title="State"
:value="selectedVMData.state || 'Unknown'"
:status="getStateColor(selectedVMData.state)"
/>
<ValueCard
title="Node"
:value="selectedVMData.node || 'N/A'"
/>
<ValueCard
title="CPUs"
:value="selectedVMData.vcpus || 0"
/>
<ValueCard
title="Memory"
:value="formatMemory(selectedVMData.memory)"
/>
</div>
</CollapsibleSection>
<!-- Resources Section -->
<CollapsibleSection title="Resources" :initially-expanded="sections.resources">
<div class="info-grid-2">
<ValueCard
title="Disk Size"
:value="formatStorage(selectedVMData.disk_size)"
/>
<ValueCard
title="Network IPs"
:value="selectedVMData.ips?.join(', ') || 'None'"
/>
</div>
</CollapsibleSection>
<!-- Networks Section -->
<CollapsibleSection
v-if="selectedVMData.networks?.length"
title="Network Interfaces"
:initially-expanded="sections.networks"
>
<div class="cards-stack">
<div v-for="network in selectedVMData.networks"
:key="network.vni"
class="detail-card"
>
<ValueCard title="Interface" :value="network.vni" />
<ValueCard title="Type" :value="network.type" />
<ValueCard title="MAC" :value="network.mac" />
<ValueCard title="Source" :value="network.source" />
</div>
</div>
</CollapsibleSection>
<!-- Storage Section -->
<CollapsibleSection
v-if="selectedVMData.disks?.length"
title="Storage"
:initially-expanded="sections.storage"
>
<div class="cards-stack">
<div v-for="disk in selectedVMData.disks"
:key="disk.dev"
class="detail-card"
>
<ValueCard title="Device" :value="disk.dev" />
<ValueCard title="Type" :value="disk.type" />
<ValueCard title="Bus" :value="disk.bus" />
<ValueCard title="Source" :value="disk.name" />
</div>
</div>
</CollapsibleSection>
</div>
<!-- No VM Selected Message -->
@ -127,8 +200,8 @@
<script setup>
import { ref, computed, onMounted, onUnmounted, watch, nextTick } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import VMDetail from './VMDetail.vue';
import CollapsibleSection from '../../general/CollapsibleSection.vue';
import ValueCard from '../../general/ValueCard.vue';
const router = useRouter();
const route = useRoute();
@ -168,7 +241,8 @@ const sections = ref({
info: true,
graphs: true,
resources: true,
network: true
network: true,
storage: true
});
// Toggle VM list visibility
@ -486,6 +560,28 @@ watch(() => showVMList.value, (isVisible) => {
watch(() => props.vmData, (newData) => {
console.log('VMOverview received vmData:', newData);
}, { immediate: true });
// Helper functions
const getStateColor = (state) => {
if (!state) return '';
switch(state.toLowerCase()) {
case 'start': return 'success';
case 'stop': return 'danger';
case 'disable': return 'warning';
default: return '';
}
};
const formatMemory = (memoryMB) => {
if (!memoryMB) return '0 GB';
return Math.round(memoryMB / 1024) + ' GB';
};
const formatStorage = (sizeGB) => {
if (!sizeGB) return '0 GB';
if (sizeGB < 1024) return sizeGB + ' GB';
return (sizeGB / 1024).toFixed(1) + ' TB';
};
</script>
<style scoped>
@ -670,10 +766,51 @@ watch(() => props.vmData, (newData) => {
/* VM Details */
.vm-details {
display: flex;
flex-direction: column;
gap: 1rem;
padding: 1rem;
background-color: white;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem;
padding: 0.5rem;
}
.info-grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
.info-grid-2 {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}
.cards-stack {
display: flex;
flex-direction: column;
gap: 1rem;
}
.detail-card {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
padding: 1rem;
background-color: rgba(0, 0, 0, 0.02);
border-radius: 0.25rem;
}
@media (max-width: 768px) {
.info-grid,
.info-grid-2 {
grid-template-columns: 1fr;
}
.detail-card {
grid-template-columns: 1fr;
}
}
/* Filter menu styles */