feat: update VmSkuOption and related components to use non-nullable numeric types

This commit is contained in:
2026-04-20 22:33:53 +02:00
parent cc4ff948c5
commit 778a74c49a
4 changed files with 23 additions and 88 deletions

View File

@@ -169,13 +169,12 @@ export class AzureImageService {
.filter((value): value is string => Boolean(value)); .filter((value): value is string => Boolean(value));
} }
private toNumber(value: string | undefined): number | null { private toNumber(value: string | undefined): number {
if (!value) { if (!value) {
return null; return 0;
} }
const parsed = Number.parseFloat(value); const parsed = Number.parseFloat(value);
return Number.isFinite(parsed) ? parsed : null; return Number.isFinite(parsed) ? parsed : 0;
} }
} }

View File

@@ -22,7 +22,7 @@ export type VmSkuOption = {
size: string; size: string;
family: string; family: string;
tier: string; tier: string;
vcpus: number | null; vcpus: number;
memoryGb: number | null; memoryGb: number;
maxDataDiskCount: number | null; maxDataDiskCount: number;
}; };

View File

@@ -25,9 +25,9 @@ type VmSkuRow = {
id: string; id: string;
name: string; name: string;
family: string; family: string;
vcpus: string; vcpus: number;
memoryGb: string; memoryGb: number;
maxDataDiskCount: string; maxDataDiskCount: number;
}; };
const formatValue = (value: number | null): string => { const formatValue = (value: number | null): string => {
@@ -38,19 +38,6 @@ const formatValue = (value: number | null): string => {
return Number.isInteger(value) ? String(value) : value.toFixed(1); return Number.isInteger(value) ? String(value) : value.toFixed(1);
}; };
const parseNumericFilter = (value: string): number | null => {
if (!value.trim()) {
return null;
}
const parsed = Number.parseFloat(value);
if (!Number.isFinite(parsed)) {
return null;
}
return parsed;
};
const extractFamilyCode = (sku: VmSkuOption): string => { const extractFamilyCode = (sku: VmSkuOption): string => {
const skuName = sku.name ?? ""; const skuName = sku.name ?? "";
const skuFamily = sku.family ?? ""; const skuFamily = sku.family ?? "";
@@ -72,10 +59,6 @@ const VmSkuChooserTool = () => {
const [location, setLocation] = useState(() => readSharedLocation()); const [location, setLocation] = useState(() => readSharedLocation());
const [nameFilter, setNameFilter] = useState(""); const [nameFilter, setNameFilter] = useState("");
const [familyFilter, setFamilyFilter] = useState(""); const [familyFilter, setFamilyFilter] = useState("");
const [minVcpusFilter, setMinVcpusFilter] = useState("");
const [maxVcpusFilter, setMaxVcpusFilter] = useState("");
const [minMemoryFilter, setMinMemoryFilter] = useState("");
const [maxMemoryFilter, setMaxMemoryFilter] = useState("");
const healthQuery = useQuery({ queryKey: ["health"], queryFn: api.health }); const healthQuery = useQuery({ queryKey: ["health"], queryFn: api.health });
const locationsQuery = useQuery({ queryKey: ["locations"], queryFn: api.locations }); const locationsQuery = useQuery({ queryKey: ["locations"], queryFn: api.locations });
@@ -105,10 +88,6 @@ const VmSkuChooserTool = () => {
const filteredSkus = useMemo(() => { const filteredSkus = useMemo(() => {
const source = vmSkusQuery.data ?? []; const source = vmSkusQuery.data ?? [];
const nameQuery = nameFilter.trim().toLowerCase(); const nameQuery = nameFilter.trim().toLowerCase();
const minVcpus = parseNumericFilter(minVcpusFilter);
const maxVcpus = parseNumericFilter(maxVcpusFilter);
const minMemory = parseNumericFilter(minMemoryFilter);
const maxMemory = parseNumericFilter(maxMemoryFilter);
return source.filter((item) => { return source.filter((item) => {
const itemName = item.name ?? ""; const itemName = item.name ?? "";
@@ -121,25 +100,9 @@ const VmSkuChooserTool = () => {
return false; return false;
} }
if (minVcpus !== null && (item.vcpus === null || item.vcpus < minVcpus)) {
return false;
}
if (maxVcpus !== null && (item.vcpus === null || item.vcpus > maxVcpus)) {
return false;
}
if (minMemory !== null && (item.memoryGb === null || item.memoryGb < minMemory)) {
return false;
}
if (maxMemory !== null && (item.memoryGb === null || item.memoryGb > maxMemory)) {
return false;
}
return true; return true;
}); });
}, [vmSkusQuery.data, nameFilter, familyFilter, minVcpusFilter, maxVcpusFilter, minMemoryFilter, maxMemoryFilter]); }, [vmSkusQuery.data, nameFilter, familyFilter]);
const rows = useMemo<VmSkuRow[]>( const rows = useMemo<VmSkuRow[]>(
() => () =>
@@ -147,9 +110,9 @@ const VmSkuChooserTool = () => {
id: sku.name || `${sku.size || "sku"}-${sku.family || "unknown"}`, id: sku.name || `${sku.size || "sku"}-${sku.family || "unknown"}`,
name: sku.name || "-", name: sku.name || "-",
family: sku.family || sku.size || sku.tier || "-", family: sku.family || sku.size || sku.tier || "-",
vcpus: formatValue(sku.vcpus), vcpus: sku.vcpus,
memoryGb: formatValue(sku.memoryGb), memoryGb: sku.memoryGb,
maxDataDiskCount: formatValue(sku.maxDataDiskCount) maxDataDiskCount: sku.maxDataDiskCount
})), })),
[filteredSkus] [filteredSkus]
); );
@@ -173,25 +136,31 @@ const VmSkuChooserTool = () => {
{ {
field: "vcpus", field: "vcpus",
headerName: "vCPUs", headerName: "vCPUs",
type: "number",
minWidth: 110, minWidth: 110,
align: "right", align: "right",
headerAlign: "right", headerAlign: "right",
valueFormatter: (value) => formatValue(typeof value === "number" ? value : null),
headerClassName: HEADER_CLASS_NAME headerClassName: HEADER_CLASS_NAME
}, },
{ {
field: "memoryGb", field: "memoryGb",
headerName: "Memory (GB)", headerName: "Memory (GB)",
type: "number",
minWidth: 130, minWidth: 130,
align: "right", align: "right",
headerAlign: "right", headerAlign: "right",
valueFormatter: (value) => formatValue(typeof value === "number" ? value : null),
headerClassName: HEADER_CLASS_NAME headerClassName: HEADER_CLASS_NAME
}, },
{ {
field: "maxDataDiskCount", field: "maxDataDiskCount",
headerName: "Max Data Disks", headerName: "Max Data Disks",
type: "number",
minWidth: 150, minWidth: 150,
align: "right", align: "right",
headerAlign: "right", headerAlign: "right",
valueFormatter: (value) => formatValue(typeof value === "number" ? value : null),
headerClassName: HEADER_CLASS_NAME headerClassName: HEADER_CLASS_NAME
} }
], ],
@@ -260,8 +229,7 @@ const VmSkuChooserTool = () => {
display: "grid", display: "grid",
gridTemplateColumns: { gridTemplateColumns: {
xs: "1fr", xs: "1fr",
sm: "repeat(2, minmax(0, 1fr))", sm: "repeat(2, minmax(0, 1fr))"
lg: "repeat(5, minmax(0, 1fr))"
}, },
gap: 2 gap: 2
}} }}
@@ -282,38 +250,6 @@ const VmSkuChooserTool = () => {
))} ))}
</Select> </Select>
</FormControl> </FormControl>
<TextField
type="number"
label="Min vCPUs"
value={minVcpusFilter}
onChange={(event) => setMinVcpusFilter(event.target.value)}
disabled={!location}
/>
<TextField
type="number"
label="Max vCPUs"
value={maxVcpusFilter}
onChange={(event) => setMaxVcpusFilter(event.target.value)}
disabled={!location}
/>
<TextField
type="number"
label="Min Memory (GB)"
value={minMemoryFilter}
onChange={(event) => setMinMemoryFilter(event.target.value)}
disabled={!location}
/>
<TextField
type="number"
label="Max Memory (GB)"
value={maxMemoryFilter}
onChange={(event) => setMaxMemoryFilter(event.target.value)}
disabled={!location}
/>
</Box> </Box>
</Stack> </Stack>
</CardContent> </CardContent>

View File

@@ -22,7 +22,7 @@ export type VmSkuOption = {
size: string; size: string;
family: string; family: string;
tier: string; tier: string;
vcpus: number | null; vcpus: number;
memoryGb: number | null; memoryGb: number;
maxDataDiskCount: number | null; maxDataDiskCount: number;
}; };