-
-
+
+
+ {chosenUnit === 'percent' ? '%' : 'connections'}
+
+
+ {
}
disabled={!canUpdateConfig || promptUpgrade}
/>
-
+
{isLoadingMaxConns ? (
diff --git a/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx
index 011c79f6c6637..7a0560d752e59 100644
--- a/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx
+++ b/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx
@@ -1,12 +1,5 @@
import { yupResolver } from '@hookform/resolvers/yup'
import { PermissionAction } from '@supabase/shared-types/out/constants'
-import { Eye, EyeOff } from 'lucide-react'
-import Link from 'next/link'
-import { useEffect, useState } from 'react'
-import { useForm } from 'react-hook-form'
-import { toast } from 'sonner'
-import { boolean, number, object, string } from 'yup'
-
import { useParams } from 'common'
import AlertError from 'components/ui/AlertError'
import { InlineLink } from 'components/ui/InlineLink'
@@ -15,25 +8,28 @@ import { useAuthConfigQuery } from 'data/auth/auth-config-query'
import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation'
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { DOCS_URL } from 'lib/constants'
+import Link from 'next/link'
+import { useEffect } from 'react'
+import { useForm } from 'react-hook-form'
+import { toast } from 'sonner'
import {
Badge,
Button,
Card,
CardContent,
CardFooter,
+ Form_Shadcn_,
FormControl_Shadcn_,
FormField_Shadcn_,
- Form_Shadcn_,
- Input_Shadcn_,
- PrePostTab,
+ Select_Shadcn_,
SelectContent_Shadcn_,
SelectItem_Shadcn_,
SelectTrigger_Shadcn_,
SelectValue_Shadcn_,
- Select_Shadcn_,
Switch,
} from 'ui'
import { GenericSkeletonLoader } from 'ui-patterns'
+import { Input } from 'ui-patterns/DataInputs/Input'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import {
PageSection,
@@ -42,6 +38,8 @@ import {
PageSectionSummary,
PageSectionTitle,
} from 'ui-patterns/PageSection'
+import { boolean, number, object, string } from 'yup'
+
import { NO_REQUIRED_CHARACTERS } from '../Auth.constants'
const CAPTCHA_PROVIDERS = [
@@ -90,7 +88,6 @@ export const ProtectionAuthSettingsForm = () => {
toast.success('Successfully updated settings')
},
})
- const [hidden, setHidden] = useState(true)
const { can: canReadConfig } = useAsyncCheckPermissions(
PermissionAction.READ,
@@ -274,24 +271,7 @@ export const ProtectionAuthSettingsForm = () => {
description="Obtain this secret from the provider."
>
-
-
setHidden(!hidden)}
- icon={hidden ? : }
- />
- }
- >
-
-
-
+
)}
diff --git a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx
index 0e5899e7224e7..462b62293440f 100644
--- a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx
+++ b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx
@@ -1,27 +1,27 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { PermissionAction } from '@supabase/shared-types/out/constants'
-import Link from 'next/link'
-import { useEffect } from 'react'
-import { useForm } from 'react-hook-form'
-import { toast } from 'sonner'
-import * as z from 'zod'
-
import { useParams } from 'common'
import AlertError from 'components/ui/AlertError'
import NoPermission from 'components/ui/NoPermission'
import { useAuthConfigQuery } from 'data/auth/auth-config-query'
import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation'
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
+import Link from 'next/link'
+import { useEffect } from 'react'
+import { useForm } from 'react-hook-form'
+import { toast } from 'sonner'
import {
Button,
Card,
CardContent,
CardFooter,
+ Form_Shadcn_,
FormControl_Shadcn_,
FormField_Shadcn_,
- Form_Shadcn_,
- Input_Shadcn_,
- PrePostTab,
+ InputGroup,
+ InputGroupAddon,
+ InputGroupInput,
+ InputGroupText,
Tooltip,
TooltipContent,
TooltipTrigger,
@@ -29,6 +29,8 @@ import {
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import { PageSection, PageSectionContent } from 'ui-patterns/PageSection'
import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
+import * as z from 'zod'
+
import { isSmtpEnabled } from '../SmtpForm/SmtpForm.utils'
export const RateLimits = () => {
@@ -191,14 +193,17 @@ export const RateLimits = () => {
-
-
+
+ emails/h
+
+
-
+
{!canUpdateConfig || !canUpdateEmailLimit ? (
@@ -259,14 +264,17 @@ export const RateLimits = () => {
-
-
+
+ sms/h
+
+
-
+
{!canUpdateConfig || !canUpdateSMSRateLimit ? (
@@ -305,14 +313,17 @@ export const RateLimits = () => {
-
-
+
+ requests/5 min
+
+
-
+
{!canUpdateConfig && (
@@ -349,14 +360,17 @@ export const RateLimits = () => {
-
-
+
+ requests/5 min
+
+
-
+
{!canUpdateConfig && (
@@ -393,14 +407,17 @@ export const RateLimits = () => {
-
-
+
+ requests/h
+
+
-
+
{!canUpdateConfig || !canUpdateAnonymousUsersRateLimit ? (
@@ -437,14 +454,17 @@ export const RateLimits = () => {
-
-
+
+ requests/5 min
+
+
-
+
{!canUpdateConfig && (
@@ -481,14 +501,17 @@ export const RateLimits = () => {
-
-
+
+ requests/5 min
+
+
-
+
{!canUpdateConfig || !canUpdateWeb3RateLimit ? (
diff --git a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx
index 13b450a398848..0c3d733c6f335 100644
--- a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx
+++ b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx
@@ -1,10 +1,5 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { PermissionAction } from '@supabase/shared-types/out/constants'
-import { useEffect, useState } from 'react'
-import { useForm } from 'react-hook-form'
-import { toast } from 'sonner'
-import * as z from 'zod'
-
import { useParams } from 'common'
import AlertError from 'components/ui/AlertError'
import NoPermission from 'components/ui/NoPermission'
@@ -14,16 +9,21 @@ import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutati
import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements'
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { IS_PLATFORM } from 'lib/constants'
+import { useEffect, useState } from 'react'
+import { useForm } from 'react-hook-form'
+import { toast } from 'sonner'
import {
Button,
Card,
CardContent,
CardFooter,
+ Form_Shadcn_,
FormControl_Shadcn_,
FormField_Shadcn_,
- Form_Shadcn_,
- Input_Shadcn_,
- PrePostTab,
+ InputGroup,
+ InputGroupAddon,
+ InputGroupInput,
+ InputGroupText,
Switch,
} from 'ui'
import { GenericSkeletonLoader } from 'ui-patterns'
@@ -35,6 +35,7 @@ import {
PageSectionSummary,
PageSectionTitle,
} from 'ui-patterns/PageSection'
+import * as z from 'zod'
function HoursOrNeverText({ value }: { value: number }) {
if (value === 0) {
@@ -239,14 +240,17 @@ export const SessionsAuthSettingsForm = () => {
description="Time interval where the same refresh token can be used multiple times to request for an access token. Recommendation: 10 seconds."
>
-
-
+
+ seconds
+
+
-
+
)}
@@ -323,14 +327,19 @@ export const SessionsAuthSettingsForm = () => {
description="The amount of time before a user is forced to sign in again. Use 0 for never."
>
- }>
-
+
+
+
+
+
+
-
+
)}
@@ -348,14 +357,19 @@ export const SessionsAuthSettingsForm = () => {
description="The amount of time a user needs to be inactive to be forced to sign in again. Use 0 for never."
>
- }>
-
+
+
+
+
+
+
-
+
)}
diff --git a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx
index d2e7dd4699fcd..57800057c5b7b 100644
--- a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx
+++ b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx
@@ -7,7 +7,6 @@ import NoPermission from 'components/ui/NoPermission'
import { useAuthConfigQuery } from 'data/auth/auth-config-query'
import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation'
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
-import { Eye, EyeOff } from 'lucide-react'
import { useEffect, useState } from 'react'
import { useForm } from 'react-hook-form'
import { toast } from 'sonner'
@@ -21,10 +20,14 @@ import {
FormControl_Shadcn_,
FormField_Shadcn_,
Input_Shadcn_,
- PrePostTab,
+ InputGroup,
+ InputGroupAddon,
+ InputGroupInput,
+ InputGroupText,
Switch,
} from 'ui'
import { Admonition, PageSection, PageSectionContent } from 'ui-patterns'
+import { Input } from 'ui-patterns/DataInputs/Input'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import * as yup from 'yup'
@@ -49,7 +52,6 @@ export const SmtpForm = () => {
const { mutate: updateAuthConfig, isPending: isUpdatingConfig } = useAuthConfigUpdateMutation()
const [enableSmtp, setEnableSmtp] = useState(false)
- const [hidden, setHidden] = useState(true)
const { can: canReadConfig } = useAsyncCheckPermissions(
PermissionAction.READ,
@@ -189,7 +191,6 @@ export const SmtpForm = () => {
toast.error(`Failed to update settings: ${error.message}`)
},
onSuccess: () => {
- setHidden(true)
toast.success('Successfully updated settings')
},
}
@@ -394,14 +395,17 @@ export const SmtpForm = () => {
description="The minimum time in seconds between emails before another email can be sent to the same user."
>
-
-
+
+ seconds
+
+ field.onChange(Number(e.target.value))}
disabled={!canUpdateConfig}
/>
-
+
)}
@@ -435,25 +439,7 @@ export const SmtpForm = () => {
description="Password for your SMTP server. For security reasons, this password cannot be viewed once saved."
>
- setHidden(!hidden)}
- icon={hidden ? : }
- />
- }
- >
-
-
+
)}
diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx
index 475b47d824622..63096351d16bd 100644
--- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx
+++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx
@@ -8,8 +8,10 @@ import {
Badge,
FormControl_Shadcn_,
FormField_Shadcn_,
- Input_Shadcn_,
- PrePostTab,
+ InputGroup,
+ InputGroupAddon,
+ InputGroupInput,
+ InputGroupText,
Select_Shadcn_,
SelectContent_Shadcn_,
SelectItem_Shadcn_,
@@ -68,15 +70,18 @@ export const AdvancedSettings = ({
}
>
-
-
+
+ milliseconds
+
+
-
+
)}
@@ -99,15 +104,18 @@ export const AdvancedSettings = ({
}
>
-
-
+
+ workers
+
+
-
+
)}
@@ -133,15 +141,18 @@ export const AdvancedSettings = ({
}
>
-
-
+
+ connections
+
+
-
+
)}
@@ -205,15 +216,18 @@ export const AdvancedSettings = ({
}
>
-
-
+
+ connections
+
+
-
+
)}
@@ -245,15 +259,18 @@ export const AdvancedSettings = ({
}
>
-
-
+
+ minutes
+
+
-
+
)}
diff --git a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx
index d1fc6651aee34..88e8c416eda86 100644
--- a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx
@@ -1,15 +1,21 @@
-import { UseFormReturn } from 'react-hook-form'
-
import { InputVariants } from '@ui/components/shadcn/ui/input'
import { useParams } from 'common'
import { useDiskAutoscaleCustomConfigQuery } from 'data/config/disk-autoscale-config-query'
-import { cn, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_, Skeleton } from 'ui'
+import { UseFormReturn } from 'react-hook-form'
+import {
+ cn,
+ FormControl_Shadcn_,
+ FormField_Shadcn_,
+ InputGroup,
+ InputGroupAddon,
+ InputGroupInput,
+ InputGroupText,
+} from 'ui'
import { Admonition } from 'ui-patterns'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
+
import { DiskStorageSchemaType } from '../DiskManagement.schema'
import { DISK_AUTOSCALE_CONFIG_DEFAULTS } from '../ui/DiskManagement.constants'
-import FormMessage from '../ui/FormMessage'
-import { InputPostTab } from '../ui/InputPostTab'
type AutoScaleFieldProps = {
form: UseFormReturn
@@ -62,40 +68,30 @@ export const AutoScaleFields = ({ form }: AutoScaleFieldProps) => {
}
className="[&>div>span]:text-foreground-lighter"
>
-
- {isLoading ? (
-
-
-
- ) : (
-
- {
- setValue(
- 'growthPercent',
- e.target.value === '' ? null : e.target.valueAsNumber,
- {
- shouldDirty: true,
- shouldValidate: true,
- }
- )
- }}
- placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.growthPercent)}
- />
-
- )}
-
- {error && }
+
+
+
+ %
+
+ {
+ setValue(
+ 'growthPercent',
+ e.target.value === '' ? null : e.target.valueAsNumber,
+ {
+ shouldDirty: true,
+ shouldValidate: true,
+ }
+ )
+ }}
+ placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.growthPercent)}
+ />
+
+
)
}}
@@ -118,40 +114,30 @@ export const AutoScaleFields = ({ form }: AutoScaleFieldProps) => {
}
className="[&>div>span]:text-foreground-lighter"
>
-
- {isLoading ? (
-
-
-
- ) : (
-
- {
- setValue(
- 'minIncrementGb',
- e.target.value === '' ? null : e.target.valueAsNumber,
- {
- shouldDirty: true,
- shouldValidate: true,
- }
- )
- }}
- placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.minIncrementSize)}
- />
-
- )}
-
- {error && }
+
+
+
+ GB
+
+ {
+ setValue(
+ 'minIncrementGb',
+ e.target.value === '' ? null : e.target.valueAsNumber,
+ {
+ shouldDirty: true,
+ shouldValidate: true,
+ }
+ )
+ }}
+ placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.minIncrementSize)}
+ />
+
+
)
}}
@@ -169,40 +155,26 @@ export const AutoScaleFields = ({ form }: AutoScaleFieldProps) => {
labelOptional="Maximum size that the disk can grow to"
className="[&>div>span]:text-foreground-lighter"
>
-
- {isLoading ? (
-
-
-
- ) : (
-
- {
- setValue(
- 'maxSizeGb',
- e.target.value === '' ? null : e.target.valueAsNumber,
- {
- shouldDirty: true,
- shouldValidate: true,
- }
- )
- }}
- placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb)}
- />
-
- )}
-
- {error && }
+
+
+
+ GB
+
+ {
+ setValue('maxSizeGb', e.target.value === '' ? null : e.target.valueAsNumber, {
+ shouldDirty: true,
+ shouldValidate: true,
+ })
+ }}
+ placeholder={String(DISK_AUTOSCALE_CONFIG_DEFAULTS.maxSizeGb)}
+ />
+
+
)
}}
diff --git a/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx
index f47263a7909b0..676fb52f855e3 100644
--- a/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx
@@ -1,6 +1,3 @@
-import { UseFormReturn } from 'react-hook-form'
-
-import { InputVariants } from '@ui/components/shadcn/ui/input'
import { useParams } from 'common'
import { DocsButton } from 'components/ui/DocsButton'
import { useDiskAttributesQuery } from 'data/config/disk-attributes-query'
@@ -9,8 +6,20 @@ import dayjs from 'dayjs'
import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject'
import { DOCS_URL, GB } from 'lib/constants'
-import { Button, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_, Skeleton, cn } from 'ui'
+import { RotateCcw } from 'lucide-react'
+import { UseFormReturn } from 'react-hook-form'
+import {
+ Button,
+ FormControl_Shadcn_,
+ FormField_Shadcn_,
+ InputGroup,
+ InputGroupAddon,
+ InputGroupButton,
+ InputGroupInput,
+ InputGroupText,
+} from 'ui'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
+
import { DiskStorageSchemaType } from '../DiskManagement.schema'
import { calculateDiskSizePrice } from '../DiskManagement.utils'
import { BillingChangeBadge } from '../ui/BillingChangeBadge'
@@ -19,8 +28,6 @@ import { DiskManagementDiskSizeReadReplicas } from '../ui/DiskManagementReadRepl
import { DiskSpaceBar } from '../ui/DiskSpaceBar'
import { DiskTypeRecommendationSection } from '../ui/DiskTypeRecommendationSection'
import FormMessage from '../ui/FormMessage'
-import { InputPostTab } from '../ui/InputPostTab'
-import { InputResetButton } from '../ui/InputResetButton'
type DiskSizeFieldProps = {
form: UseFormReturn
@@ -38,11 +45,7 @@ export function DiskSizeField({
const { data: org } = useSelectedOrganizationQuery()
const { data: project } = useSelectedProjectQuery()
- const {
- isPending: isLoadingDiskAttributes,
- error: diskAttributesError,
- isError: isDiskAttributesError,
- } = useDiskAttributesQuery(
+ const { error: diskAttributesError, isError: isDiskAttributesError } = useDiskAttributesQuery(
{ projectRef },
{ enabled: project && project.cloud_provider !== 'FLY' }
)
@@ -76,15 +79,15 @@ export function DiskSizeField({
PLAN_DETAILS?.[planId as keyof typeof PLAN_DETAILS] ?? {}
const includedDiskGB = includedDiskGBMeta[watchedStorageType]
+ const { defaultValues, dirtyFields, isDirty, errors } = formState
const diskSizePrice = calculateDiskSizePrice({
planId,
- oldSize: formState.defaultValues?.totalSize || 0,
- oldStorageType: formState.defaultValues?.storageType as DiskType,
+ oldSize: defaultValues?.totalSize || 0,
+ oldStorageType: defaultValues?.storageType as DiskType,
newSize: getValues('totalSize'),
newStorageType: getValues('storageType') as DiskType,
})
- const isAllocatedStorageDirty = !!formState.dirtyFields.totalSize
const mainDiskUsed = Math.round(((diskUtil?.metrics.fs_used_bytes ?? 0) / GB) * 100) / 100
return (
@@ -93,49 +96,46 @@ export function DiskSizeField({
(
+ render={({ field, fieldState: { isDirty } }) => (
-
-
- {isLoadingDiskAttributes ? (
-
-
-
- ) : (
-
- e.currentTarget.blur()}
- onChange={(e) => {
- setValue('totalSize', e.target.valueAsNumber, {
- shouldDirty: true,
- shouldValidate: true,
- })
+
+
+
+ GB
+ {isDirty ? (
+ {
+ resetField('totalSize')
trigger('provisionedIOPS')
- trigger('throughput')
}}
- min={includedDiskGB}
- />
-
- )}
-
-
{
- resetField('totalSize')
- trigger('provisionedIOPS')
- }}
- />
-
+ title="Reset"
+ >
+
+
+ ) : null}
+
+ e.currentTarget.blur()}
+ onChange={(e) => {
+ setValue('totalSize', e.target.valueAsNumber, {
+ shouldDirty: true,
+ shouldValidate: true,
+ })
+ trigger('provisionedIOPS')
+ trigger('throughput')
+ }}
+ min={includedDiskGB}
+ />
+
+
)}
/>
@@ -144,11 +144,7 @@ export function DiskSizeField({
className="mt-1"
beforePrice={Number(diskSizePrice.oldPrice)}
afterPrice={Number(diskSizePrice.newPrice)}
- show={
- formState.isDirty &&
- !formState.errors.totalSize &&
- diskSizePrice.oldPrice !== diskSizePrice.newPrice
- }
+ show={isDirty && !errors.totalSize && diskSizePrice.oldPrice !== diskSizePrice.newPrice}
/>
{includedDiskGB > 0 &&
@@ -194,11 +190,11 @@ export function DiskSizeField({
)}
diff --git a/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx
index 122eb02565992..2c7e8f2ce683d 100644
--- a/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx
@@ -1,10 +1,17 @@
-import { UseFormReturn } from 'react-hook-form'
-
import { InputVariants } from '@ui/components/shadcn/ui/input'
import { useParams } from 'common'
import { useDiskAttributesQuery } from 'data/config/disk-attributes-query'
-import { Button, cn, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_, Skeleton } from 'ui'
+import { UseFormReturn } from 'react-hook-form'
+import {
+ Button,
+ FormControl_Shadcn_,
+ FormField_Shadcn_,
+ InputGroup,
+ InputGroupAddon,
+ InputGroupInput,
+} from 'ui'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
+
import { DiskStorageSchemaType } from '../DiskManagement.schema'
import {
calculateComputeSizeRequiredForIops,
@@ -15,8 +22,6 @@ import { BillingChangeBadge } from '../ui/BillingChangeBadge'
import { ComputeSizeRecommendationSection } from '../ui/ComputeSizeRecommendationSection'
import { DiskType, RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3 } from '../ui/DiskManagement.constants'
import { DiskManagementIOPSReadReplicas } from '../ui/DiskManagementReadReplicas'
-import FormMessage from '../ui/FormMessage'
-import { InputPostTab } from '../ui/InputPostTab'
type IOPSFieldProps = {
form: UseFormReturn