42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
|
|
import type { ResourceField } from './resources';
|
||
|
|
|
||
|
|
export type ResourceFormValue = string | number | boolean | undefined;
|
||
|
|
|
||
|
|
export function isMissingField(value: ResourceFormValue | null): boolean {
|
||
|
|
return value === '' || value === null || value === undefined;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function buildResourcePayload(
|
||
|
|
fields: ResourceField[],
|
||
|
|
form: Record<string, ResourceFormValue>,
|
||
|
|
): Record<string, unknown> {
|
||
|
|
const payload: Record<string, unknown> = {};
|
||
|
|
for (const field of fields) {
|
||
|
|
const value = form[field.key];
|
||
|
|
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 'boolean':
|
||
|
|
payload[field.key] = value === true || value === 'true';
|
||
|
|
break;
|
||
|
|
case 'json':
|
||
|
|
payload[field.key] =
|
||
|
|
typeof value === 'string' ? JSON.parse(value) : value;
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
payload[field.key] = value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return payload;
|
||
|
|
}
|