mirror of
https://github.com/perfect-panel/ppanel-web.git
synced 2026-02-16 13:21:10 -05:00
🐛 fix: Update minimum ratio value to 0 in protocol fields and adjust related schemas; enhance unit conversion in ServerConfig
This commit is contained in:
parent
3d778e5e36
commit
3b6ef177ba
@ -1,5 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import useGlobalStore from '@/config/use-global';
|
||||||
import { useNode } from '@/store/node';
|
import { useNode } from '@/store/node';
|
||||||
import { zodResolver } from '@hookform/resolvers/zod';
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
import {
|
import {
|
||||||
@ -78,6 +79,9 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
trigger,
|
trigger,
|
||||||
title,
|
title,
|
||||||
}: Readonly<SubscribeFormProps<T>>) {
|
}: Readonly<SubscribeFormProps<T>>) {
|
||||||
|
const { common } = useGlobalStore();
|
||||||
|
const { currency } = common;
|
||||||
|
|
||||||
const t = useTranslations('product');
|
const t = useTranslations('product');
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
||||||
@ -213,7 +217,11 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
form?.reset(
|
form?.reset(
|
||||||
assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>),
|
assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>),
|
||||||
);
|
);
|
||||||
}, [form, initialValues]);
|
const discount = form.getValues('discount') || [];
|
||||||
|
if (discount.length > 0) {
|
||||||
|
debouncedCalculateDiscount(discount, 'discount');
|
||||||
|
}
|
||||||
|
}, [form, initialValues, open]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
return () => {
|
return () => {
|
||||||
@ -228,7 +236,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
if (bool) setOpen(false);
|
if (bool) setOpen(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { nodes, getAllAvailableTags, getNodesByTag, getNodesWithoutTags } = useNode();
|
const { getAllAvailableTags, getNodesByTag, getNodesWithoutTags } = useNode();
|
||||||
|
|
||||||
const tagGroups = getAllAvailableTags();
|
const tagGroups = getAllAvailableTags();
|
||||||
|
|
||||||
@ -630,9 +638,9 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
{
|
{
|
||||||
name: 'discount',
|
name: 'discount',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
min: 0.01,
|
min: 1,
|
||||||
max: 100,
|
max: 100,
|
||||||
step: 0.01,
|
step: 1,
|
||||||
placeholder: t('form.discountPercent'),
|
placeholder: t('form.discountPercent'),
|
||||||
suffix: '%',
|
suffix: '%',
|
||||||
},
|
},
|
||||||
@ -642,6 +650,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
type: 'number',
|
type: 'number',
|
||||||
min: 0,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
|
prefix: currency.currency_symbol,
|
||||||
formatInput: (value) => unitConversion('centsToDollars', value),
|
formatInput: (value) => unitConversion('centsToDollars', value),
|
||||||
formatOutput: (value) =>
|
formatOutput: (value) =>
|
||||||
unitConversion('dollarsToCents', value).toString(),
|
unitConversion('dollarsToCents', value).toString(),
|
||||||
|
|||||||
@ -27,7 +27,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -134,7 +134,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -242,7 +242,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -500,7 +500,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -608,7 +608,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -716,7 +716,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -789,7 +789,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -809,7 +809,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -886,7 +886,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -963,7 +963,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
@ -999,7 +999,7 @@ export const PROTOCOL_FIELDS: Record<string, FieldConfig[]> = {
|
|||||||
name: 'ratio',
|
name: 'ratio',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
label: 'traffic_ratio',
|
label: 'traffic_ratio',
|
||||||
min: 1,
|
min: 0,
|
||||||
step: 0.01,
|
step: 0.01,
|
||||||
defaultValue: 1,
|
defaultValue: 1,
|
||||||
group: 'basic',
|
group: 'basic',
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import {
|
|||||||
const nullableString = z.string().nullish();
|
const nullableString = z.string().nullish();
|
||||||
const nullableBool = z.boolean().nullish();
|
const nullableBool = z.boolean().nullish();
|
||||||
const nullablePort = z.number().int().min(0).max(65535).nullish();
|
const nullablePort = z.number().int().min(0).max(65535).nullish();
|
||||||
const nullableRatio = z.number().min(1).nullish();
|
const nullableRatio = z.number().min(0).nullish();
|
||||||
|
|
||||||
const ss = z.object({
|
const ss = z.object({
|
||||||
ratio: nullableRatio,
|
ratio: nullableRatio,
|
||||||
|
|||||||
@ -35,6 +35,7 @@ import { Textarea } from '@workspace/ui/components/textarea';
|
|||||||
import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs';
|
import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs';
|
||||||
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
|
import { unitConversion } from '@workspace/ui/utils';
|
||||||
import { DicesIcon } from 'lucide-react';
|
import { DicesIcon } from 'lucide-react';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { uid } from 'radash';
|
import { uid } from 'radash';
|
||||||
@ -275,8 +276,10 @@ export default function ServerConfig() {
|
|||||||
type='number'
|
type='number'
|
||||||
min={0}
|
min={0}
|
||||||
suffix='MB'
|
suffix='MB'
|
||||||
value={field.value as any}
|
value={unitConversion('bitsToMb', field.value as number | undefined)}
|
||||||
onValueChange={field.onChange}
|
onValueChange={(value) => {
|
||||||
|
field.onChange(unitConversion('mbToBits', value));
|
||||||
|
}}
|
||||||
placeholder='1'
|
placeholder='1'
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user