fix: firmware page styling
This commit is contained in:
@@ -315,7 +315,9 @@ class FirmwareViewModel extends ViewModel {
|
||||
availableNodes: [],
|
||||
uploadProgress: null,
|
||||
uploadResults: [],
|
||||
isUploading: false
|
||||
isUploading: false,
|
||||
selectedLabels: [],
|
||||
availableLabels: []
|
||||
});
|
||||
}
|
||||
|
||||
@@ -327,6 +329,11 @@ class FirmwareViewModel extends ViewModel {
|
||||
// Set target type
|
||||
setTargetType(type) {
|
||||
this.set('targetType', type);
|
||||
// Clear any previously selected labels when switching options
|
||||
const currentLabels = this.get('selectedLabels') || [];
|
||||
if (currentLabels.length > 0) {
|
||||
this.set('selectedLabels', []);
|
||||
}
|
||||
}
|
||||
|
||||
// Set specific node
|
||||
@@ -337,6 +344,27 @@ class FirmwareViewModel extends ViewModel {
|
||||
// Update available nodes
|
||||
updateAvailableNodes(nodes) {
|
||||
this.set('availableNodes', nodes);
|
||||
// Compute availableLabels as unique key=value pairs from nodes' labels
|
||||
try {
|
||||
const labelSet = new Set();
|
||||
(nodes || []).forEach(n => {
|
||||
const labels = n && n.labels ? n.labels : {};
|
||||
Object.entries(labels).forEach(([k, v]) => {
|
||||
labelSet.add(`${k}=${v}`);
|
||||
});
|
||||
});
|
||||
const availableLabels = Array.from(labelSet).sort((a, b) => a.localeCompare(b));
|
||||
this.set('availableLabels', availableLabels);
|
||||
// Prune selected labels that are no longer available
|
||||
const selected = this.get('selectedLabels') || [];
|
||||
const pruned = selected.filter(x => availableLabels.includes(x));
|
||||
if (pruned.length !== selected.length) {
|
||||
this.set('selectedLabels', pruned);
|
||||
}
|
||||
} catch (_) {
|
||||
this.set('availableLabels', []);
|
||||
this.set('selectedLabels', []);
|
||||
}
|
||||
}
|
||||
|
||||
// Start upload
|
||||
@@ -379,6 +407,26 @@ class FirmwareViewModel extends ViewModel {
|
||||
this.set('isUploading', false);
|
||||
}
|
||||
|
||||
// Set selected labels
|
||||
setSelectedLabels(labels) {
|
||||
this.set('selectedLabels', Array.isArray(labels) ? labels : []);
|
||||
}
|
||||
|
||||
// Return nodes matching ALL selected label pairs
|
||||
getAffectedNodesByLabels() {
|
||||
const selected = this.get('selectedLabels') || [];
|
||||
if (!selected.length) return [];
|
||||
const selectedPairs = selected.map(s => {
|
||||
const idx = String(s).indexOf('=');
|
||||
return idx > -1 ? { key: s.slice(0, idx), value: s.slice(idx + 1) } : null;
|
||||
}).filter(Boolean);
|
||||
const nodes = this.get('availableNodes') || [];
|
||||
return nodes.filter(n => {
|
||||
const labels = n && n.labels ? n.labels : {};
|
||||
return selectedPairs.every(p => String(labels[p.key]) === String(p.value));
|
||||
});
|
||||
}
|
||||
|
||||
// Check if deploy button should be enabled
|
||||
isDeployEnabled() {
|
||||
const hasFile = this.get('selectedFile') !== null;
|
||||
@@ -390,6 +438,9 @@ class FirmwareViewModel extends ViewModel {
|
||||
isValidTarget = hasAvailableNodes;
|
||||
} else if (this.get('targetType') === 'specific') {
|
||||
isValidTarget = hasAvailableNodes && this.get('specificNode');
|
||||
} else if (this.get('targetType') === 'labels') {
|
||||
const affected = this.getAffectedNodesByLabels();
|
||||
isValidTarget = hasAvailableNodes && (this.get('selectedLabels') || []).length > 0 && affected.length > 0;
|
||||
}
|
||||
|
||||
return hasFile && isValidTarget && !this.get('isUploading');
|
||||
|
||||
Reference in New Issue
Block a user