Skip to content

Commit 526b3cb

Browse files
committed
feat(indexd): add fundTargetBytes to quota management
1 parent 6e67e45 commit 526b3cb

6 files changed

Lines changed: 80 additions & 17 deletions

File tree

.changeset/wise-dingos-say.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@siafoundation/indexd-types': minor
3+
'indexd': minor
4+
---
5+
6+
Added fundTargetBytes to quota management.

apps/indexd/components/Data/Quotas/SidePanelQuota.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export function SidePanelQuota() {
115115
<div className="flex flex-col gap-2">
116116
<FieldText name="description" form={form} fields={fields} />
117117
<FieldNumber
118-
name="maxPinnedDataGB"
118+
name="maxPinnedDataGiB"
119119
form={form}
120120
fields={fields}
121121
/>
@@ -124,6 +124,11 @@ export function SidePanelQuota() {
124124
form={form}
125125
fields={fields}
126126
/>
127+
<FieldNumber
128+
name="fundTargetBytesGiB"
129+
form={form}
130+
fields={fields}
131+
/>
127132
</div>
128133
</SidePanelSection>
129134
)

apps/indexd/components/Data/Quotas/quotasColumns.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,16 @@ export const quotasColumns: ColumnDef<QuotaData>[] = [
5454
cell: ({ row }) => <Text>{row.original.totalUses}</Text>,
5555
meta: { className: 'justify-end', ...smallColumnWidth },
5656
},
57+
{
58+
id: 'fundTargetBytes',
59+
header: ({ table, column }) => (
60+
<TableHeader table={table} column={column} className="justify-end">
61+
Fund target
62+
</TableHeader>
63+
),
64+
cell: ({ row }) => (
65+
<Text>{row.original.displayFields.fundTargetBytes}</Text>
66+
),
67+
meta: { className: 'justify-end', ...smallColumnWidth },
68+
},
5769
]

apps/indexd/dialogs/QuotaCreateDialog.tsx

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ import { useDialog } from '../contexts/dialog'
1616
import { useQuotasParams } from '../components/Data/Quotas/useQuotasParams'
1717
import { useMutate } from '@siafoundation/react-core'
1818
import { adminQuotasRoute } from '@siafoundation/indexd-types'
19+
import { GiBToBytes } from '@siafoundation/units'
1920
import BigNumber from 'bignumber.js'
2021

2122
const defaultValues = {
2223
key: '',
2324
description: '',
24-
maxPinnedDataGB: undefined as undefined | BigNumber,
25+
maxPinnedDataGiB: undefined as undefined | BigNumber,
2526
totalUses: undefined as undefined | BigNumber,
27+
fundTargetBytesGiB: new BigNumber(16) as undefined | BigNumber,
2628
}
2729

2830
type CreateValues = typeof defaultValues
@@ -45,10 +47,10 @@ function getCreateFields(): ConfigFields<CreateValues, never> {
4547
required: 'required',
4648
},
4749
},
48-
maxPinnedDataGB: {
50+
maxPinnedDataGiB: {
4951
type: 'number',
5052
title: 'Max pinned data',
51-
units: 'GB',
53+
units: 'GiB',
5254
decimalsLimit: 2,
5355
placeholder: '100',
5456
validation: {
@@ -64,6 +66,16 @@ function getCreateFields(): ConfigFields<CreateValues, never> {
6466
required: 'required',
6567
},
6668
},
69+
fundTargetBytesGiB: {
70+
type: 'number',
71+
title: 'Fund target',
72+
units: 'GiB',
73+
decimalsLimit: 2,
74+
placeholder: '16',
75+
validation: {
76+
required: 'required',
77+
},
78+
},
6779
}
6880
}
6981

@@ -93,10 +105,13 @@ export function QuotaCreateDialog({ trigger, open, onOpenChange }: Props) {
93105
},
94106
payload: {
95107
description: values.description,
96-
maxPinnedData: values.maxPinnedDataGB
97-
? values.maxPinnedDataGB.times(1e9).toNumber()
108+
maxPinnedData: values.maxPinnedDataGiB
109+
? GiBToBytes(values.maxPinnedDataGiB).toNumber()
98110
: 0,
99111
totalUses: values.totalUses ? values.totalUses.toNumber() : 0,
112+
fundTargetBytes: values.fundTargetBytesGiB
113+
? GiBToBytes(values.fundTargetBytesGiB).toNumber()
114+
: 0,
100115
},
101116
})
102117
if (response.error) {
@@ -137,8 +152,9 @@ export function QuotaCreateDialog({ trigger, open, onOpenChange }: Props) {
137152
<Paragraph size="14">Create a new quota.</Paragraph>
138153
<FieldText name="key" form={form} fields={fields} />
139154
<FieldText name="description" form={form} fields={fields} />
140-
<FieldNumber name="maxPinnedDataGB" form={form} fields={fields} />
155+
<FieldNumber name="maxPinnedDataGiB" form={form} fields={fields} />
141156
<FieldNumber name="totalUses" form={form} fields={fields} />
157+
<FieldNumber name="fundTargetBytesGiB" form={form} fields={fields} />
142158
<FormSubmitButton form={form}>Create quota</FormSubmitButton>
143159
</div>
144160
</Dialog>

apps/indexd/lib/quota.ts

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ConfigFields } from '@siafoundation/design-system'
22
import { Quota } from '@siafoundation/indexd-types'
3-
import { humanBytes } from '@siafoundation/units'
3+
import { bytesToGiB, GiBToBytes } from '@siafoundation/units'
44
import BigNumber from 'bignumber.js'
55

66
export type QuotaData = {
@@ -9,8 +9,10 @@ export type QuotaData = {
99
description: string
1010
maxPinnedData: number
1111
totalUses: number
12+
fundTargetBytes: number
1213
displayFields: {
1314
maxPinnedData: string
15+
fundTargetBytes: string
1416
}
1517
}
1618

@@ -21,31 +23,40 @@ export function transformDownData(quota: Quota): QuotaData {
2123
description: quota.description,
2224
maxPinnedData: quota.maxPinnedData,
2325
totalUses: quota.totalUses,
26+
fundTargetBytes: quota.fundTargetBytes,
2427
displayFields: {
25-
maxPinnedData: humanBytes(quota.maxPinnedData),
28+
maxPinnedData: `${bytesToGiB(quota.maxPinnedData).toFixed(2)} GiB`,
29+
fundTargetBytes: `${bytesToGiB(quota.fundTargetBytes).toFixed(2)} GiB`,
2630
},
2731
}
2832
}
2933

3034
function transformDownForm(
31-
quota: Pick<QuotaData, 'description' | 'maxPinnedData' | 'totalUses'>,
35+
quota: Pick<
36+
QuotaData,
37+
'description' | 'maxPinnedData' | 'totalUses' | 'fundTargetBytes'
38+
>,
3239
): Values {
3340
return {
3441
description: quota.description,
35-
maxPinnedDataGB: new BigNumber(quota.maxPinnedData).div(1e9),
42+
maxPinnedDataGiB: bytesToGiB(quota.maxPinnedData),
3643
totalUses: new BigNumber(quota.totalUses),
44+
fundTargetBytesGiB: bytesToGiB(quota.fundTargetBytes),
3745
}
3846
}
3947

4048
export function transformUpForm(
4149
values: Values,
42-
): Pick<Quota, 'description' | 'maxPinnedData' | 'totalUses'> {
50+
): Pick<Quota, 'description' | 'maxPinnedData' | 'totalUses' | 'fundTargetBytes'> {
4351
return {
4452
description: values.description,
45-
maxPinnedData: values.maxPinnedDataGB
46-
? values.maxPinnedDataGB.times(1e9).toNumber()
53+
maxPinnedData: values.maxPinnedDataGiB
54+
? GiBToBytes(values.maxPinnedDataGiB).toNumber()
4755
: 0,
4856
totalUses: values.totalUses ? values.totalUses.toNumber() : 0,
57+
fundTargetBytes: values.fundTargetBytesGiB
58+
? GiBToBytes(values.fundTargetBytesGiB).toNumber()
59+
: 0,
4960
}
5061
}
5162

@@ -63,8 +74,9 @@ export function transformDown(response: Quota): {
6374

6475
export const defaultValues = {
6576
description: '',
66-
maxPinnedDataGB: undefined as undefined | BigNumber,
77+
maxPinnedDataGiB: undefined as undefined | BigNumber,
6778
totalUses: undefined as undefined | BigNumber,
79+
fundTargetBytesGiB: new BigNumber(16) as undefined | BigNumber,
6880
}
6981

7082
export type Values = typeof defaultValues
@@ -79,10 +91,10 @@ export function getFields(): ConfigFields<typeof defaultValues, never> {
7991
required: 'required',
8092
},
8193
},
82-
maxPinnedDataGB: {
94+
maxPinnedDataGiB: {
8395
type: 'number',
8496
title: 'Max pinned data',
85-
units: 'GB',
97+
units: 'GiB',
8698
decimalsLimit: 2,
8799
placeholder: '100',
88100
validation: {
@@ -98,5 +110,15 @@ export function getFields(): ConfigFields<typeof defaultValues, never> {
98110
required: 'required',
99111
},
100112
},
113+
fundTargetBytesGiB: {
114+
type: 'number',
115+
title: 'Fund target',
116+
units: 'GiB',
117+
decimalsLimit: 2,
118+
placeholder: '16',
119+
validation: {
120+
required: 'required',
121+
},
122+
},
101123
}
102124
}

libs/indexd-types/src/admin/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,14 @@ export type Quota = {
100100
description: string
101101
maxPinnedData: number
102102
totalUses: number
103+
fundTargetBytes: number
103104
}
104105

105106
export type PutQuotaRequest = {
106107
description: string
107108
maxPinnedData: number
108109
totalUses: number
110+
fundTargetBytes: number
109111
}
110112

111113
export type AlertSeverity = 'info' | 'warning' | 'error' | 'critical'

0 commit comments

Comments
 (0)