mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-22 19:23:31 +00:00
refactor: improve type safety in guest ID comparisons
Replace loose equality/inequality operators with strict comparisons and proper type conversion for guest vmid matching: - Use parseInt() with strict equality for all guest ID comparisons - Prevents type coercion bugs between string and number vmids - Ensures consistent behavior across different data sources - Improves reliability in multi-cluster environments 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -21,7 +21,7 @@ PulseApp.ui.backupSummaryCards = (() => {
|
||||
? backupData[type].filter(item => {
|
||||
// Match vmid
|
||||
const itemVmid = item.vmid || item['backup-id'] || item.backupVMID;
|
||||
if (itemVmid != guestId) return false;
|
||||
if (parseInt(itemVmid, 10) !== parseInt(guestId, 10)) return false;
|
||||
|
||||
// For PBS backups (centralized), don't filter by node
|
||||
if (type === 'pbsSnapshots') return true;
|
||||
|
||||
@@ -1167,7 +1167,7 @@ PulseApp.ui.backups = (() => {
|
||||
const vmsData = PulseApp.state.get('vmsData') || [];
|
||||
const containersData = PulseApp.state.get('containersData') || [];
|
||||
const allGuests = [...vmsData, ...containersData];
|
||||
const guest = allGuests.find(g => g.vmid == guestId);
|
||||
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
|
||||
|
||||
if (!guest) return null;
|
||||
|
||||
@@ -1232,7 +1232,7 @@ PulseApp.ui.backups = (() => {
|
||||
|
||||
// Match vmid
|
||||
const taskVmid = task.vmid || task.guestId;
|
||||
if (taskVmid != guestId) return false;
|
||||
if (parseInt(taskVmid, 10) !== parseInt(guestId, 10)) return false;
|
||||
|
||||
const date = new Date(task.starttime * 1000);
|
||||
const utcDate = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
|
||||
@@ -1300,7 +1300,7 @@ PulseApp.ui.backups = (() => {
|
||||
(ds.snapshots || []).filter(snap => {
|
||||
const vmid = snap['backup-id'];
|
||||
const timestamp = snap['backup-time'];
|
||||
return vmid == guestId && timestamp >= startTimestamp && timestamp < endTimestamp;
|
||||
return parseInt(vmid, 10) === parseInt(guestId, 10) && timestamp >= startTimestamp && timestamp < endTimestamp;
|
||||
})
|
||||
)
|
||||
);
|
||||
@@ -1310,7 +1310,7 @@ PulseApp.ui.backups = (() => {
|
||||
// Check PVE storage backups
|
||||
if (pveBackups.storageBackups && Array.isArray(pveBackups.storageBackups)) {
|
||||
const matchingBackups = pveBackups.storageBackups.filter(backup => {
|
||||
return backup.vmid == guestId &&
|
||||
return parseInt(backup.vmid, 10) === parseInt(guestId, 10) &&
|
||||
backup.ctime >= startTimestamp &&
|
||||
backup.ctime < endTimestamp;
|
||||
});
|
||||
@@ -1982,7 +1982,7 @@ PulseApp.ui.backups = (() => {
|
||||
const pbsDates = {};
|
||||
backupData.pbsSnapshots.forEach(snap => {
|
||||
const snapId = snap['backup-id'] || snap.backupVMID;
|
||||
if (snapId == guestId) {
|
||||
if (parseInt(snapId, 10) === parseInt(guestId, 10)) {
|
||||
const timestamp = snap['backup-time'];
|
||||
if (timestamp) {
|
||||
const date = new Date(timestamp * 1000);
|
||||
@@ -2005,7 +2005,7 @@ PulseApp.ui.backups = (() => {
|
||||
if ((backupTypeFilter === 'all' || backupTypeFilter === 'pve') && backupData.pveBackups) {
|
||||
const pveDates = {};
|
||||
backupData.pveBackups.forEach(backup => {
|
||||
if (backup.vmid == guestId) {
|
||||
if (parseInt(backup.vmid, 10) === parseInt(guestId, 10)) {
|
||||
const timestamp = backup['backup-time'] || backup.ctime;
|
||||
if (timestamp) {
|
||||
const date = new Date(timestamp * 1000);
|
||||
@@ -2034,7 +2034,7 @@ PulseApp.ui.backups = (() => {
|
||||
if ((backupTypeFilter === 'all' || backupTypeFilter === 'snapshots') && backupData.vmSnapshots) {
|
||||
const snapDates = {};
|
||||
backupData.vmSnapshots.forEach(snap => {
|
||||
if (snap.vmid == guestId) {
|
||||
if (parseInt(snap.vmid, 10) === parseInt(guestId, 10)) {
|
||||
const timestamp = snap.snaptime;
|
||||
if (timestamp) {
|
||||
const date = new Date(timestamp * 1000);
|
||||
|
||||
@@ -22,13 +22,13 @@ PulseApp.ui.calendarHeatmap = (() => {
|
||||
return tasks.filter(task => {
|
||||
// Match vmid
|
||||
const taskVmid = task.vmid || task.guestId;
|
||||
if (taskVmid != guestId) return false;
|
||||
if (parseInt(taskVmid, 10) !== parseInt(guestId, 10)) return false;
|
||||
|
||||
// For single guest filtering, we need to get the guest node info
|
||||
const vmsData = PulseApp.state.get('vmsData') || [];
|
||||
const containersData = PulseApp.state.get('containersData') || [];
|
||||
const allGuests = [...vmsData, ...containersData];
|
||||
const guest = allGuests.find(g => g.vmid == guestId);
|
||||
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
|
||||
|
||||
if (!guest) return true; // Fallback if guest not found
|
||||
|
||||
@@ -527,7 +527,7 @@ PulseApp.ui.calendarHeatmap = (() => {
|
||||
if (!vmid) return;
|
||||
|
||||
// Apply filtering logic
|
||||
if (guestId && vmid != guestId) return;
|
||||
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
|
||||
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
|
||||
|
||||
// Use unique guest key that includes node information
|
||||
@@ -669,7 +669,7 @@ PulseApp.ui.calendarHeatmap = (() => {
|
||||
const vmsData = PulseApp.state.get('vmsData') || [];
|
||||
const containersData = PulseApp.state.get('containersData') || [];
|
||||
const allGuests = [...vmsData, ...containersData];
|
||||
const guest = allGuests.find(g => g.vmid == guestId);
|
||||
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
|
||||
const guestName = guest ? guest.name : `Guest ${guestId}`;
|
||||
guestDisplayText = `${stats.activeGuests} (${guestName})`;
|
||||
}
|
||||
@@ -732,7 +732,7 @@ PulseApp.ui.calendarHeatmap = (() => {
|
||||
if (!vmid) return;
|
||||
|
||||
// Apply filtering logic
|
||||
if (guestId && vmid != guestId) return;
|
||||
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
|
||||
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
|
||||
|
||||
// Track unique guests using node-aware keys
|
||||
@@ -814,7 +814,7 @@ PulseApp.ui.calendarHeatmap = (() => {
|
||||
const vmsData = PulseApp.state.get('vmsData') || [];
|
||||
const containersData = PulseApp.state.get('containersData') || [];
|
||||
const allGuests = [...vmsData, ...containersData];
|
||||
const guest = allGuests.find(g => g.vmid == guestId);
|
||||
const guest = allGuests.find(g => parseInt(g.vmid, 10) === parseInt(guestId, 10));
|
||||
const guestName = guest ? guest.name : `Guest ${guestId}`;
|
||||
guestDisplayText = `${stats.activeGuests} (${guestName})`;
|
||||
}
|
||||
@@ -975,7 +975,7 @@ PulseApp.ui.calendarHeatmap = (() => {
|
||||
if (!vmid) return;
|
||||
|
||||
// Skip if filtering by specific guest
|
||||
if (guestId && vmid != guestId) return;
|
||||
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
|
||||
|
||||
// Skip if filtered guest list is provided and this guest is not in it
|
||||
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
|
||||
@@ -1162,7 +1162,7 @@ PulseApp.ui.calendarHeatmap = (() => {
|
||||
}
|
||||
|
||||
// Skip if filtering by specific guest
|
||||
if (guestId && vmid != guestId) return;
|
||||
if (guestId && parseInt(vmid, 10) !== parseInt(guestId, 10)) return;
|
||||
|
||||
// Skip if filtered guest list is provided and this guest is not in it
|
||||
if (filteredGuestIds && !isGuestInFilteredList(vmid, item, filteredGuestIds)) return;
|
||||
|
||||
Reference in New Issue
Block a user