feat: improve styling

This commit is contained in:
2025-08-30 15:57:25 +02:00
parent 7bac42c58e
commit dc46fc6ca2
3 changed files with 204 additions and 57 deletions

View File

@@ -2905,8 +2905,10 @@ class MemberCardOverlayComponent extends Component {
setupEventListeners() {
// Close overlay when clicking outside or pressing escape
this.addEventListener(document, 'click', (e) => {
if (this.isVisible && !this.container.contains(e.target)) {
this.addEventListener(this.container, 'click', (e) => {
if (!this.isVisible) return;
// Only close when clicking on the backdrop, not inside the dialog content
if (e.target === this.container) {
this.hide();
}
});
@@ -2934,8 +2936,10 @@ class MemberCardOverlayComponent extends Component {
this.setupMemberCardInteractions();
}
hide() {
this.isVisible = false;
this.container.classList.remove('visible');
@@ -2977,11 +2981,9 @@ class MemberCardOverlayComponent extends Component {
<span class="latency-label">Latency:</span>
<span class="latency-value">${member.latency ? member.latency + 'ms' : 'N/A'}</span>
</div>
${member.labels && Object.keys(member.labels).length ? `
<div class="member-labels">
${Object.entries(member.labels).map(([key, value]) => `<span class="label-chip">${key}: ${value}</span>`).join('')}
<div class="member-labels" style="display: none;">
<!-- Labels will be populated dynamically from node status API -->
</div>
` : ''}
</div>
</div>
<div class="member-details">
@@ -3008,7 +3010,7 @@ class MemberCardOverlayComponent extends Component {
if (memberCard) {
const memberDetails = memberCard.querySelector('.member-details');
const memberIp = memberCard.dataset.memberIp;
// Automatically expand the card to show details
await this.expandCard(memberCard, memberIp, memberDetails);
}
@@ -3024,39 +3026,49 @@ class MemberCardOverlayComponent extends Component {
// Load node details
await nodeDetailsVM.loadNodeDetails(memberIp);
// Update the labels in the member header with the actual node status data
const nodeStatus = nodeDetailsVM.get('nodeStatus');
if (nodeStatus && nodeStatus.labels) {
const labelsContainer = card.querySelector('.member-labels');
if (labelsContainer) {
// Update existing labels container and show it
labelsContainer.innerHTML = Object.entries(nodeStatus.labels)
.map(([key, value]) => `<span class="label-chip">${key}: ${value}</span>`)
.join('');
labelsContainer.style.display = 'block';
} else {
// Create new labels container if it doesn't exist
const memberInfo = card.querySelector('.member-info');
if (memberInfo) {
const labelsDiv = document.createElement('div');
labelsDiv.className = 'member-labels';
labelsDiv.innerHTML = Object.entries(nodeStatus.labels)
.map(([key, value]) => `<span class="label-chip">${key}: ${value}</span>`)
.join('');
// Insert after latency
const latencyDiv = memberInfo.querySelector('.member-latency');
if (latencyDiv) {
latencyDiv.parentNode.insertBefore(labelsDiv, latencyDiv.nextSibling);
}
}
}
}
// Mount the component
nodeDetailsComponent.mount();
// Update UI
card.classList.add('expanded');
const expandIcon = card.querySelector('.expand-icon');
if (expandIcon) {
expandIcon.classList.add('expanded');
}
} catch (error) {
console.error('Failed to expand card:', error);
memberDetails.innerHTML = `
<div class="error">
<strong>Error loading node details:</strong><br>
${error.message}
</div>
`;
console.error('Failed to expand member card:', error);
// Still show the UI even if details fail to load
card.classList.add('expanded');
const details = card.querySelector('.member-details');
if (details) {
details.innerHTML = '<div class="error">Failed to load node details</div>';
}
}
}
collapseCard(card, expandIcon) {
card.classList.remove('expanded');
if (expandIcon) {
expandIcon.classList.remove('expanded');
}
// Reset member details to loading state
const memberDetails = card.querySelector('.member-details');
if (memberDetails) {
memberDetails.innerHTML = '<div class="loading-details">Loading detailed information...</div>';
}
}
}