Files
platforms/frontend/platform_admin/src/api/resource-form.ts

67 lines
2.1 KiB
TypeScript
Raw Normal View History

import type { ResourceField } from './resources';
2026-07-27 12:48:35 +08:00
export type ResourceFormValue = string | number | boolean | string[] | undefined;
export type ResourceFormMode = 'create' | 'edit';
export function isMissingField(value: ResourceFormValue | null): boolean {
2026-07-27 12:48:35 +08:00
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;
}