diff --git a/src/app/[orgId]/settings/sites/SitesTable.tsx b/src/app/[orgId]/settings/sites/SitesTable.tsx
index c032800f..b266b162 100644
--- a/src/app/[orgId]/settings/sites/SitesTable.tsx
+++ b/src/app/[orgId]/settings/sites/SitesTable.tsx
@@ -27,6 +27,7 @@ import { formatAxiosError } from "@app/lib/api";
import { createApiClient } from "@app/lib/api";
import { useEnvContext } from "@app/hooks/useEnvContext";
import CreateSiteFormModal from "./CreateSiteModal";
+import { parseDataSize } from '@app/lib/dataSize';
export type SiteRow = {
id: number;
@@ -197,7 +198,9 @@ export default function SitesTable({ sites, orgId }: SitesTableProps) {
);
- }
+ },
+ sortingFn: (rowA, rowB) =>
+ parseDataSize(rowA.original.mbIn) - parseDataSize(rowB.original.mbIn)
},
{
accessorKey: "mbOut",
@@ -213,7 +216,9 @@ export default function SitesTable({ sites, orgId }: SitesTableProps) {
);
- }
+ },
+ sortingFn: (rowA, rowB) =>
+ parseDataSize(rowA.original.mbOut) - parseDataSize(rowB.original.mbOut),
},
{
accessorKey: "type",
diff --git a/src/lib/dataSize.ts b/src/lib/dataSize.ts
new file mode 100644
index 00000000..67439d31
--- /dev/null
+++ b/src/lib/dataSize.ts
@@ -0,0 +1,21 @@
+export function parseDataSize(sizeStr: string): number {
+ if (typeof sizeStr !== 'string') return 0;
+
+ const match = /^\s*([\d.]+)\s*([KMGT]?B)\s*$/i.exec(sizeStr);
+ if (!match) return 0;
+
+ const [ , numStr, unitRaw ] = match;
+ const num = parseFloat(numStr);
+ if (isNaN(num)) return 0;
+
+ const unit = unitRaw.toUpperCase();
+ const multipliers = {
+ B: 1,
+ KB: 1024,
+ MB: 1024 ** 2,
+ GB: 1024 ** 3,
+ TB: 1024 ** 4,
+ } as const;
+
+ return num * (multipliers[unit as keyof typeof multipliers] ?? 1);
+}
\ No newline at end of file