Add handling of negative space values

This commit is contained in:
Bill Thornton
2025-06-05 15:05:13 -04:00
parent b705cfc4c3
commit f2a1f9e1b8
3 changed files with 64 additions and 20 deletions
@@ -11,6 +11,7 @@ import globalize from 'lib/globalize';
import { getReadableSize } from 'utils/file';
import { StorageType } from '../constants/StorageType';
import { calculateTotal, calculateUsedPercentage } from '../utils/space';
import StorageTypeIcon from './StorageTypeIcon';
@@ -19,19 +20,6 @@ interface StorageListItemProps {
folder?: FolderStorageDto
}
const calculateUsed = (folder?: FolderStorageDto) => {
if (typeof folder?.UsedSpace === 'undefined') return 0;
if (typeof folder.FreeSpace === 'undefined') return 100;
const totalSpace = folder.FreeSpace + folder.UsedSpace;
if (totalSpace === 0) return 0;
// Ensure we don't have negative values
const usedSpace = Math.max(0, folder.UsedSpace);
return Math.min(100, (usedSpace / totalSpace) * 100);
};
const getStatusColor = (percent: number) => {
if (percent >= 90) return 'error';
if (percent >= 80) return 'warning';
@@ -52,11 +40,12 @@ const StorageListItem: FC<StorageListItemProps> = ({
label,
folder
}) => {
const usedSpace = (typeof folder?.UsedSpace === 'undefined') ? '?' : getReadableSize(folder.UsedSpace);
const totalSpace = (typeof folder?.FreeSpace === 'undefined' || typeof folder.UsedSpace === 'undefined') ?
'?' : getReadableSize(folder.FreeSpace + folder.UsedSpace);
const usedPercent = calculateUsed(folder);
const statusColor = folder ? getStatusColor(usedPercent) : 'primary';
const readableUsedSpace = (typeof folder?.UsedSpace === 'undefined' || folder.UsedSpace < 0) ?
'?' : getReadableSize(folder.UsedSpace);
const totalSpace = calculateTotal(folder);
const readableTotalSpace = (totalSpace < 0) ? '?' : getReadableSize(totalSpace);
const usedPercentage = calculateUsedPercentage(folder);
const statusColor = folder ? getStatusColor(usedPercentage) : 'primary';
return (
<ListItem>
@@ -87,7 +76,7 @@ const StorageListItem: FC<StorageListItemProps> = ({
<LinearProgress
variant={folder ? 'determinate' : 'indeterminate'}
color={statusColor}
value={usedPercent}
value={usedPercentage}
/>
<Typography
variant='body2'
@@ -96,7 +85,7 @@ const StorageListItem: FC<StorageListItemProps> = ({
textAlign: 'end'
}}
>
{`${usedSpace} / ${totalSpace}`}
{`${readableUsedSpace} / ${readableTotalSpace}`}
</Typography>
</>
}
@@ -0,0 +1,35 @@
import { describe, expect, it } from 'vitest';
import { calculateUsedPercentage, calculateTotal } from './space';
describe('calculateTotal()', () => {
it('should return the total', () => {
expect(calculateTotal({ FreeSpace: 1, UsedSpace: 2 })).toBe(3);
});
it('should return -1 for invalid used space values', () => {
expect(calculateTotal({ FreeSpace: 1 })).toBe(-1);
expect(calculateTotal({ FreeSpace: 1, UsedSpace: -1 })).toBe(-1);
});
it('should treat invalid free space values as 0', () => {
expect(calculateTotal({ UsedSpace: 1 })).toBe(1);
expect(calculateTotal({ FreeSpace: -1, UsedSpace: 1 })).toBe(1);
});
});
describe('calculateUsedPercentage', () => {
it('should return the percentage used', () => {
expect(calculateUsedPercentage({ FreeSpace: 1, UsedSpace: 3 })).toBe(75);
});
it('should return 0 for invalid used space values', () => {
expect(calculateUsedPercentage({ FreeSpace: 1 })).toBe(0);
expect(calculateUsedPercentage({ FreeSpace: 1, UsedSpace: -1 })).toBe(0);
});
it('should return 100 for invalid free space values', () => {
expect(calculateUsedPercentage({ UsedSpace: 1 })).toBe(100);
expect(calculateUsedPercentage({ FreeSpace: -1, UsedSpace: 1 })).toBe(100);
});
});
@@ -0,0 +1,20 @@
import type { FolderStorageDto } from '@jellyfin/sdk/lib/generated-client/models/folder-storage-dto';
export const calculateTotal = (folder?: FolderStorageDto) => {
if (typeof folder?.UsedSpace === 'undefined' || folder.UsedSpace < 0) {
return -1;
}
const freeSpace = Math.max(0, folder.FreeSpace || 0);
const usedSpace = Math.max(0, folder.UsedSpace);
return freeSpace + usedSpace;
};
export const calculateUsedPercentage = (folder?: FolderStorageDto) => {
const totalSpace = calculateTotal(folder);
if (totalSpace <= 0) return 0;
const usedSpace = folder?.UsedSpace || 0;
return Math.min(100, (usedSpace / totalSpace) * 100);
};