feat: implement gas and delivery admin systems
This commit is contained in:
66
frontend/delivery_admin/src/api/resource-form.ts
Normal file
66
frontend/delivery_admin/src/api/resource-form.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import type { ResourceField } from './resources';
|
||||
|
||||
export type ResourceFormValue = string | number | boolean | string[] | undefined;
|
||||
export type ResourceFormMode = 'create' | 'edit';
|
||||
|
||||
export function isMissingField(value: ResourceFormValue | null): boolean {
|
||||
return value === '' || value === null || value === undefined || (Array.isArray(value) && value.length === 0);
|
||||
}
|
||||
|
||||
export function isResourceFieldRequired(
|
||||
field: ResourceField,
|
||||
mode: ResourceFormMode,
|
||||
): boolean {
|
||||
return Boolean(field.required && !(mode === 'edit' && field.type === 'password'));
|
||||
}
|
||||
|
||||
export function buildResourcePayload(
|
||||
fields: ResourceField[],
|
||||
form: Record<string, ResourceFormValue>,
|
||||
mode: ResourceFormMode = 'create',
|
||||
): Record<string, unknown> {
|
||||
const payload: Record<string, unknown> = {};
|
||||
for (const field of fields) {
|
||||
if (mode === 'edit' && field.type === 'password') continue;
|
||||
const value = form[field.key];
|
||||
if (field.type === 'identity-list' && Array.isArray(value)) {
|
||||
payload[field.key] = value;
|
||||
continue;
|
||||
}
|
||||
if (isMissingField(value)) {
|
||||
if (!field.required) continue;
|
||||
payload[field.key] = value;
|
||||
continue;
|
||||
}
|
||||
switch (field.type) {
|
||||
case 'number': {
|
||||
const number = Number(value);
|
||||
if (!Number.isFinite(number))
|
||||
throw new Error(`${field.label}必须是数字`);
|
||||
payload[field.key] = number;
|
||||
break;
|
||||
}
|
||||
case 'money': {
|
||||
const amount = Number(value);
|
||||
if (!Number.isFinite(amount))
|
||||
throw new Error(`${field.label}必须是有效金额`);
|
||||
payload[field.key] = Math.round(amount * 100);
|
||||
break;
|
||||
}
|
||||
case 'boolean':
|
||||
payload[field.key] = value === true || value === 'true';
|
||||
break;
|
||||
case 'date':
|
||||
case 'datetime': {
|
||||
const date = new Date(String(value));
|
||||
if (Number.isNaN(date.getTime()))
|
||||
throw new Error(`${field.label}必须是有效日期`);
|
||||
payload[field.key] = date.toISOString();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
payload[field.key] = value;
|
||||
}
|
||||
}
|
||||
return payload;
|
||||
}
|
||||
Reference in New Issue
Block a user