Move selector into dedicated component
This commit is contained in:
parent
c467b92384
commit
e450c5dca3
70
pvc-vue/src/components/general/NodeSelectBar.vue
Normal file
70
pvc-vue/src/components/general/NodeSelectBar.vue
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<template>
|
||||||
|
<div class="node-select-bar">
|
||||||
|
<button
|
||||||
|
v-for="node in nodes"
|
||||||
|
:key="node"
|
||||||
|
class="node-tab"
|
||||||
|
:class="{ 'active': modelValue === node }"
|
||||||
|
@click="selectNode(node)"
|
||||||
|
>
|
||||||
|
{{ node }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { defineProps, defineEmits } from 'vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
modelValue: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
nodes: {
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
default: () => []
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(['update:modelValue', 'select']);
|
||||||
|
|
||||||
|
const selectNode = (node) => {
|
||||||
|
emit('update:modelValue', node);
|
||||||
|
emit('select', node);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.node-select-bar {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.25rem;
|
||||||
|
padding: 0.5rem;
|
||||||
|
background-color: white;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
overflow-x: auto;
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-tab {
|
||||||
|
padding: 0.375rem 0.75rem;
|
||||||
|
border: none;
|
||||||
|
background: none;
|
||||||
|
color: #495057;
|
||||||
|
font-weight: 500;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
white-space: nowrap;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-tab:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-tab.active {
|
||||||
|
color: #0d6efd;
|
||||||
|
background-color: rgba(13, 110, 253, 0.1);
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,26 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="overview-container">
|
<div class="overview-container">
|
||||||
<!-- Node Tabs -->
|
<NodeSelectBar
|
||||||
<div class="node-tabs-wrapper">
|
v-model="selectedNode"
|
||||||
<div class="node-tabs" ref="tabsContainer">
|
:nodes="availableNodes"
|
||||||
<button
|
@select="handleNodeSelect"
|
||||||
v-for="node in nodeData"
|
/>
|
||||||
:key="node.name"
|
|
||||||
class="node-tab"
|
|
||||||
:class="{ 'active': selectedNode === node.name }"
|
|
||||||
@click="selectNode(node.name)"
|
|
||||||
>
|
|
||||||
{{ node.name }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<!-- Tab scroll buttons -->
|
|
||||||
<button class="tab-scroll-button left" @click="scrollTabs('left')" v-show="showLeftScroll">
|
|
||||||
<i class="fas fa-chevron-left"></i>
|
|
||||||
</button>
|
|
||||||
<button class="tab-scroll-button right" @click="scrollTabs('right')" v-show="showRightScroll">
|
|
||||||
<i class="fas fa-chevron-right"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Node Details -->
|
<!-- Node Details -->
|
||||||
<div v-if="selectedNodeData" class="node-details">
|
<div v-if="selectedNodeData" class="node-details">
|
||||||
@ -208,6 +192,7 @@ import StorageChart from '../../charts/StorageChart.vue';
|
|||||||
import HealthChart from '../../charts/HealthChart.vue';
|
import HealthChart from '../../charts/HealthChart.vue';
|
||||||
import ValueCard from '../../general/ValueCard.vue';
|
import ValueCard from '../../general/ValueCard.vue';
|
||||||
import CollapsibleSection from '../../general/CollapsibleSection.vue';
|
import CollapsibleSection from '../../general/CollapsibleSection.vue';
|
||||||
|
import NodeSelectBar from '../../general/NodeSelectBar.vue';
|
||||||
|
|
||||||
// Move all the props, refs, computed properties, and functions from Nodes.vue
|
// Move all the props, refs, computed properties, and functions from Nodes.vue
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@ -494,6 +479,15 @@ watch(() => props.nodeData, () => {
|
|||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
window.removeEventListener('resize', checkScrollButtons);
|
window.removeEventListener('resize', checkScrollButtons);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const availableNodes = computed(() => {
|
||||||
|
return props.nodeData.map(node => node.name).sort();
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleNodeSelect = (node) => {
|
||||||
|
selectedNode.value = node;
|
||||||
|
// Any other node selection handling logic
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user