提交代码

This commit is contained in:
andy committed 2026-07-22 15:30:26 +07:00
1 parent 1236df86cf
commit 7e2cd8969f
7 files changed
+137 -9

No files matched your search

+32 -2
View File
@@ -30,6 +30,15 @@ const hiddenDisplayValue = Symbol('reservation-v4-hidden-display-value')
export type ReservationV4FieldErrorMap = Record<string, string>
export type ReservationV4LookupKind = 'ACCOUNT' | 'ROOM_TYPE' | 'RATE_CODE'
export type ReservationV4FieldValidationErrorType = 'required' | 'positiveInteger'
export type ReservationV4FieldValidationMessageContext = {
type: ReservationV4FieldValidationErrorType
field: ReservationV4TaskCardFieldResult
fieldKey: string
}
export type ReservationV4FieldValidationOptions = {
formatMessage?: (context: ReservationV4FieldValidationMessageContext) => string
}
export function reservationV4FieldKey(field: ReservationV4TaskCardFieldResult): string {
return field.field_pointer || field.field_path
@@ -81,21 +90,42 @@ export function buildReservationV4ReviewOverrides(
export function validateReservationV4Fields(
fields: ReservationV4TaskCardFieldResult[],
values: ReservationRecord,
options: ReservationV4FieldValidationOptions = {},
): ReservationV4FieldErrorMap {
return fields.filter(isReservationV4EditableField).reduce<ReservationV4FieldErrorMap>((errors, field) => {
const key = reservationV4FieldKey(field)
const value = readV4FieldValue(field, values)
if (field.required && isEmptyV4Value(value)) {
errors[key] = `${field.display_name} is required`
errors[key] = formatValidationMessage('required', field, key, options)
return errors
}
if (isTracePositiveIntegerField(field) && !isEmptyV4Value(value) && !isPositiveIntegerValue(value)) {
errors[key] = `${field.display_name} must be a positive integer`
errors[key] = formatValidationMessage('positiveInteger', field, key, options)
}
return errors
}, {})
}
function formatValidationMessage(
type: ReservationV4FieldValidationErrorType,
field: ReservationV4TaskCardFieldResult,
fieldKey: string,
options: ReservationV4FieldValidationOptions,
): string {
const formattedMessage = options.formatMessage?.({
type,
field,
fieldKey,
})
if (formattedMessage?.trim()) {
return formattedMessage
}
if (type === 'positiveInteger') {
return `${field.display_name} must be a positive integer`
}
return `${field.display_name} is required`
}
export function isReservationV4ConfirmWritableField(field: ReservationV4TaskCardFieldResult): boolean {
if (!isReservationV4EditableField(field)) {
return false