Skip to content

Commit 4d2d734

Browse files
authored
Merge pull request #5959 from bcgov/feat/5856
feat(5856): replace cost tables with table cc
2 parents f8e7bb7 + 5595eba commit 4d2d734

File tree

5 files changed

+84
-10
lines changed

5 files changed

+84
-10
lines changed

app/app/private-cloud/products/(product)/[licencePlate]/costs/Monthly.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import { MonthPickerInput } from '@mantine/dates';
55
import { useQuery } from '@tanstack/react-query';
66
import { format } from 'date-fns';
77
import { Session } from 'next-auth';
8-
import { useEffect, useState } from 'react';
8+
import { useState } from 'react';
9+
import DataTable from '@/components/generic/data-table/DataTable';
910
import LoadingBox from '@/components/generic/LoadingBox';
1011
import MonthlyCostSummary from '@/components/private-cloud/monthly-cost/MonthlyCostSummary';
11-
import MonthlyCostTable from '@/components/private-cloud/monthly-cost/MonthlyCostTable';
1212
import MonthlyCostChart from '@/components/private-cloud/monthly-cost/MonthyCostChart';
13+
import { dailyCostColumns, periodicCostColumns } from '@/constants/private-cloud';
1314
import { downloadPrivateCloudMonthlyCosts, getMonthlyCosts } from '@/services/backend/private-cloud/products';
15+
import { DailyCostMetric, PeriodicCostMetric } from '@/types/private-cloud';
1416
import { getDateFromYyyyMmDd } from '@/utils/js';
1517

1618
export default function Monthly({ licencePlate, session }: { licencePlate: string; session: Session }) {
@@ -31,6 +33,22 @@ export default function Monthly({ licencePlate, session }: { licencePlate: strin
3133
setSelectedDate(date ? getDateFromYyyyMmDd(date) : new Date());
3234
};
3335

36+
const dailyCostData = data.days.map((day, idx) => {
37+
const { cpuToDate, storageToDate, cpuToProjected, storageToProjected } = data.dayDetails;
38+
const totalCost = cpuToDate[idx] + storageToDate[idx] + cpuToProjected[idx] + storageToProjected[idx];
39+
40+
return {
41+
day,
42+
dayDetails: {
43+
cpuToDate: cpuToDate[idx],
44+
storageToDate: storageToDate[idx],
45+
cpuToProjected: cpuToProjected[idx],
46+
storageToProjected: storageToProjected[idx],
47+
totalCost,
48+
},
49+
};
50+
});
51+
3452
return (
3553
<div>
3654
<div className="flex items-center gap-4 mb-6">
@@ -70,7 +88,8 @@ export default function Monthly({ licencePlate, session }: { licencePlate: strin
7088
)}
7189

7290
<LoadingBox isLoading={isLoading}>
73-
<MonthlyCostTable data={{ items: data.items, days: data.days, dayDetails: data.dayDetails }} />
91+
<DataTable<PeriodicCostMetric> data={data.items} columns={periodicCostColumns} defaultPageSize={5} />
92+
<DataTable<DailyCostMetric> data={dailyCostData} columns={dailyCostColumns} defaultPageSize={5} />
7493
</LoadingBox>
7594
</div>
7695
);

app/app/private-cloud/products/(product)/[licencePlate]/costs/Quarterly.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import { Button, Tooltip } from '@mantine/core';
44
import { MonthPickerInput } from '@mantine/dates';
55
import { useQuery } from '@tanstack/react-query';
66
import { Session } from 'next-auth';
7-
import { useEffect, useState } from 'react';
7+
import { useState } from 'react';
8+
import DataTable from '@/components/generic/data-table/DataTable';
89
import LoadingBox from '@/components/generic/LoadingBox';
910
import QuarterlyCostChart from '@/components/private-cloud/quarterly-cost/QuarterlyCostChart';
1011
import QuarterlyCostSummary from '@/components/private-cloud/quarterly-cost/QuarterlyCostSummary';
11-
import QuarterlyCostTable from '@/components/private-cloud/quarterly-cost/QuarterlyCostTable';
12+
import { monthlyCostColumns, periodicCostColumns } from '@/constants/private-cloud';
1213
import { downloadPrivateCloudQuarterlyCosts, getQuarterlyCosts } from '@/services/backend/private-cloud/products';
14+
import { MonthlyCostMetric, PeriodicCostMetric } from '@/types/private-cloud';
1315
import { formatAsYearQuarter, getDateFromYyyyMmDd } from '@/utils/js';
1416

1517
export default function Quarterly({ licencePlate, session }: { licencePlate: string; session: Session }) {
@@ -30,6 +32,22 @@ export default function Quarterly({ licencePlate, session }: { licencePlate: str
3032
setSelectedDate(date ? getDateFromYyyyMmDd(date) : new Date());
3133
};
3234

35+
const monthlyCostData = data.months.map((month, idx) => {
36+
const { cpuToDate, storageToDate, cpuToProjected, storageToProjected } = data.monthDetails;
37+
const totalCost = cpuToDate[idx] + storageToDate[idx] + cpuToProjected[idx] + storageToProjected[idx];
38+
39+
return {
40+
month,
41+
monthDetails: {
42+
cpuToDate: cpuToDate[idx],
43+
storageToDate: storageToDate[idx],
44+
cpuToProjected: cpuToProjected[idx],
45+
storageToProjected: storageToProjected[idx],
46+
totalCost,
47+
},
48+
};
49+
});
50+
3351
return (
3452
<div>
3553
<div className="flex items-center gap-4 mb-6">
@@ -68,7 +86,8 @@ export default function Quarterly({ licencePlate, session }: { licencePlate: str
6886
)}
6987

7088
<LoadingBox isLoading={isLoading}>
71-
<QuarterlyCostTable data={{ items: data.items, months: data.months, monthDetails: data.monthDetails }} />
89+
<DataTable<PeriodicCostMetric> data={data.items} columns={periodicCostColumns} defaultPageSize={5} />
90+
<DataTable<MonthlyCostMetric> data={monthlyCostData} columns={monthlyCostColumns} defaultPageSize={5} />
7291
</LoadingBox>
7392
</div>
7493
);

app/app/private-cloud/products/(product)/[licencePlate]/costs/Yearly.tsx

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import { YearPickerInput } from '@mantine/dates';
55
import { useQuery } from '@tanstack/react-query';
66
import { Session } from 'next-auth';
77
import { useState } from 'react';
8+
import DataTable from '@/components/generic/data-table/DataTable';
89
import LoadingBox from '@/components/generic/LoadingBox';
910
import YearlyCostChart from '@/components/private-cloud/yearly-cost/YearlyCostChart';
1011
import YearlyCostSummary from '@/components/private-cloud/yearly-cost/YearlyCostSummary';
11-
import YearlyCostTable from '@/components/private-cloud/yearly-cost/YearlyCostTable';
12+
import { monthlyCostColumns, periodicCostColumns } from '@/constants/private-cloud';
1213
import { downloadPrivateCloudYearlyCosts, getYearlyCosts } from '@/services/backend/private-cloud/products';
14+
import { MonthlyCostMetric, PeriodicCostMetric } from '@/types/private-cloud';
1315

1416
export default function Yearly({ licencePlate, session }: { licencePlate: string; session: Session }) {
1517
const [selectedYear, setSelectedYear] = useState<Date>(new Date());
@@ -30,6 +32,22 @@ export default function Yearly({ licencePlate, session }: { licencePlate: string
3032
setSelectedYear(year ? new Date(Number(year)) : new Date());
3133
};
3234

35+
const monthlyCostData = data.months.map((month, idx) => {
36+
const { cpuToDate, storageToDate, cpuToProjected, storageToProjected } = data.monthDetails;
37+
const totalCost = cpuToDate[idx] + storageToDate[idx] + cpuToProjected[idx] + storageToProjected[idx];
38+
39+
return {
40+
month,
41+
monthDetails: {
42+
cpuToDate: cpuToDate[idx],
43+
storageToDate: storageToDate[idx],
44+
cpuToProjected: cpuToProjected[idx],
45+
storageToProjected: storageToProjected[idx],
46+
totalCost,
47+
},
48+
};
49+
});
50+
3351
return (
3452
<div>
3553
<div className="flex items-center justify-between w-full mb-6">
@@ -68,7 +86,8 @@ export default function Yearly({ licencePlate, session }: { licencePlate: string
6886
)}
6987

7088
<LoadingBox isLoading={isLoading}>
71-
<YearlyCostTable data={{ items: data.items, months: data.months, monthDetails: data.monthDetails }} />
89+
<DataTable<PeriodicCostMetric> data={data.items} columns={periodicCostColumns} defaultPageSize={5} />
90+
<DataTable<MonthlyCostMetric> data={monthlyCostData} columns={monthlyCostColumns} defaultPageSize={5} />
7291
</LoadingBox>
7392
</div>
7493
);

app/components/generic/data-table/DataTable.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export default function DataTable<TData extends object>({
8989

9090
return (
9191
<>
92-
<table className="w-full text-sm border-collapse border">
92+
<table className="w-full text-sm border-collapse border mt-5">
9393
<thead>
9494
{table.getHeaderGroups().map((headerGroup) => (
9595
<tr key={headerGroup.id}>

app/constants/private-cloud.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1+
import CostStatusBadge from '@/components/badges/CostStatusBadge';
12
import { Cluster, Prisma, ResourceRequestsEnv, ResourceRequests, PrivateCloudProductMemberRole } from '@/prisma/client';
23
import {
34
CostTableColumnDef,
45
CostMetric,
56
DailyCostMetric,
67
MonthlyCostMetric,
78
PeriodicCostMetric,
9+
MonthlyCost,
810
} from '@/types/private-cloud';
9-
import { formatCurrency } from '@/utils/js';
11+
import { formatCurrency, getMonthNameFromNumber } from '@/utils/js';
1012
import { productSorts } from './common';
1113

1214
export const privateCloudProductMemberRoles = Object.values(PrivateCloudProductMemberRole);
@@ -148,3 +150,18 @@ export const monthlyCostCommonColumns = <T extends MonthlyCostMetric>(): CostTab
148150

149151
export const dailyCostCommonColumns = <T extends DailyCostMetric>(): CostTableColumnDef<T>[] =>
150152
createCostColumns<T, 'dayDetails'>('dayDetails');
153+
154+
export const periodicCostColumns: CostTableColumnDef<PeriodicCostMetric>[] = [
155+
{ label: 'Data Range', value: 'startDate', cellProcessor: (item, attr) => CostStatusBadge(item) },
156+
...periodicCostCommonColumns<PeriodicCostMetric>(),
157+
];
158+
159+
export const dailyCostColumns: CostTableColumnDef<DailyCostMetric>[] = [
160+
{ label: 'Day', value: 'day', cellProcessor: (item) => item.day },
161+
...dailyCostCommonColumns<DailyCostMetric>(),
162+
];
163+
164+
export const monthlyCostColumns: CostTableColumnDef<MonthlyCostMetric>[] = [
165+
{ label: 'Month', value: 'month', cellProcessor: (item) => getMonthNameFromNumber(item.month) },
166+
...monthlyCostCommonColumns<MonthlyCostMetric>(),
167+
];

0 commit comments

Comments
 (0)