更新操作按钮为菜单栏 & 调整页面表格顺序

This commit is contained in:
Eamon
2026-04-11 17:07:03 +08:00
parent ed95f0520d
commit 4307efae98
22 changed files with 675 additions and 395 deletions

View File

@@ -43,16 +43,17 @@ const schema = z.object({
.refine(
v => !Number.isNaN(Number(v)) && Number(v) > 0,
"请输入有效的正数单价",
),
)
.refine(val => /^\d+(\.\d{1,2})?$/.test(val), "价格最多只能保留两位小数"),
discount_id: z.string().optional(),
price_min: z
.string()
.optional()
.or(z.literal(""))
.min(1, "请输入最低价格")
.refine(
v => !v || (!Number.isNaN(Number(v)) && Number(v) > 0),
v => !Number.isNaN(Number(v)) && Number(v) > 0,
"请输入有效的正数价格",
),
)
.refine(val => /^\d+(\.\d{1,2})?$/.test(val), "价格最多只能保留两位小数"),
})
export function CreateProductSku(props: {
@@ -159,12 +160,25 @@ export function CreateProductSku(props: {
name="price"
render={({ field, fieldState }) => (
<Field>
<FieldLabel htmlFor="sku-create-price"></FieldLabel>
<FieldLabel htmlFor="sku-update-price"></FieldLabel>
<Input
id="sku-create-price"
id="sku-update-price"
placeholder="请输入单价"
{...field}
aria-invalid={fieldState.invalid}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
let value = e.target.value
value = value.replace(/[^\d.]/g, "")
const dotCount = (value.match(/\./g) || []).length
if (dotCount > 1) {
value = value.slice(0, value.lastIndexOf("."))
}
if (value.includes(".")) {
const [int, dec] = value.split(".")
value = `${int}.${dec.slice(0, 2)}`
}
field.onChange(value)
}}
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />
@@ -172,7 +186,6 @@ export function CreateProductSku(props: {
</Field>
)}
/>
<Controller
control={form.control}
name="price_min"
@@ -181,9 +194,22 @@ export function CreateProductSku(props: {
<FieldLabel htmlFor="sku-create-price"></FieldLabel>
<Input
id="sku-create-price"
placeholder="请输入单价"
placeholder="请输入最低价格"
{...field}
aria-invalid={fieldState.invalid}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
let value = e.target.value
value = value.replace(/[^\d.]/g, "")
const dotCount = (value.match(/\./g) || []).length
if (dotCount > 1) {
value = value.slice(0, value.lastIndexOf("."))
}
if (value.includes(".")) {
const [int, dec] = value.split(".")
value = `${int}.${dec.slice(0, 2)}`
}
field.onChange(value)
}}
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />

View File

@@ -57,7 +57,7 @@ function Products(props: {
}, [refresh])
return (
<section className="flex-none basis-64 bg-background rounded-lg">
<section className="flex-none basis-50 bg-background rounded-lg">
<header className="pl-3 pr-1 h-10 border-b flex items-center justify-between">
<h3 className="text-sm"></h3>
</header>

View File

@@ -43,7 +43,8 @@ const schema = z.object({
.refine(
v => !Number.isNaN(Number(v)) && Number(v) > 0,
"请输入有效的正数单价",
),
)
.refine(val => /^\d+(\.\d{1,2})?$/.test(val), "价格最多只能保留两位小数"),
discount_id: z.string().optional(),
price_min: z
.string()
@@ -51,7 +52,8 @@ const schema = z.object({
.refine(
v => !Number.isNaN(Number(v)) && Number(v) > 0,
"请输入有效的正数价格",
),
)
.refine(val => /^\d+(\.\d{1,2})?$/.test(val), "价格最多只能保留两位小数"),
})
export function UpdateProductSku(props: {
@@ -97,19 +99,6 @@ export function UpdateProductSku(props: {
: null,
price_min: data.price_min,
})
console.log({
id: props.sku.id,
code: data.code,
name: data.name,
price: data.price,
discount_id:
data.discount_id && data.discount_id !== ""
? Number(data.discount_id)
: null,
price_min: data.price_min,
})
console.log(resp, "resp")
if (resp.success) {
toast.success("套餐修改成功")
@@ -182,6 +171,19 @@ export function UpdateProductSku(props: {
placeholder="请输入单价"
{...field}
aria-invalid={fieldState.invalid}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
let value = e.target.value
value = value.replace(/[^\d.]/g, "")
const dotCount = (value.match(/\./g) || []).length
if (dotCount > 1) {
value = value.slice(0, value.lastIndexOf("."))
}
if (value.includes(".")) {
const [int, dec] = value.split(".")
value = `${int}.${dec.slice(0, 2)}`
}
field.onChange(value)
}}
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />
@@ -200,6 +202,19 @@ export function UpdateProductSku(props: {
placeholder="请输入最低价格"
{...field}
aria-invalid={fieldState.invalid}
onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
let value = e.target.value
value = value.replace(/[^\d.]/g, "")
const dotCount = (value.match(/\./g) || []).length
if (dotCount > 1) {
value = value.slice(0, value.lastIndexOf("."))
}
if (value.includes(".")) {
const [int, dec] = value.split(".")
value = `${int}.${dec.slice(0, 2)}`
}
field.onChange(value)
}}
/>
{fieldState.invalid && (
<FieldError errors={[fieldState.error]} />