实现V4 Trace事项卡前端展示
This commit is contained in:
1 parent
38661257d1
commit
f3b6adda17
10 files changed
+931
-7
No files matched your search
@@ -18,8 +18,14 @@ const reviewWriteTargets = new Set([
|
||||
'FIELD_OVERRIDES',
|
||||
])
|
||||
const readonlyControlTypes = new Set(['READONLY', 'FILE', 'WORKFLOW_STATE', 'STRUCTURED_TABLE'])
|
||||
const reviewWritablePointerPrefixes = ['/basic_information/', '/room_information/final_values/', '/business_fields/']
|
||||
const reviewWritablePointerPrefixes = [
|
||||
'/basic_information/',
|
||||
'/room_information/final_values/',
|
||||
'/business_fields/',
|
||||
'/trace_items/',
|
||||
]
|
||||
const roomInformationFieldPrefix = '/room_information/final_values/'
|
||||
const traceFieldPattern = /^\/trace_items\/\d+\/(?:text|department_code|target_room_type_code|extra_bed_room_count)$/
|
||||
const hiddenDisplayValue = Symbol('reservation-v4-hidden-display-value')
|
||||
|
||||
export type ReservationV4FieldErrorMap = Record<string, string>
|
||||
@@ -43,6 +49,11 @@ export function isReservationV4RoomInformationSafeField(field: ReservationV4Task
|
||||
return pointer.startsWith(roomInformationFieldPrefix) && !isForbiddenRoomInformationPointer(pointer)
|
||||
}
|
||||
|
||||
export function isReservationV4TraceSafeField(field: ReservationV4TaskCardFieldResult): boolean {
|
||||
const pointer = field.field_pointer || fieldPathToPointer(field.field_path)
|
||||
return traceFieldPattern.test(pointer)
|
||||
}
|
||||
|
||||
export function buildReservationV4ConfirmedPayload(
|
||||
fields: ReservationV4TaskCardFieldResult[],
|
||||
values: ReservationRecord,
|
||||
@@ -73,8 +84,13 @@ export function validateReservationV4Fields(
|
||||
): ReservationV4FieldErrorMap {
|
||||
return fields.filter(isReservationV4EditableField).reduce<ReservationV4FieldErrorMap>((errors, field) => {
|
||||
const key = reservationV4FieldKey(field)
|
||||
if (field.required && isEmptyV4Value(readV4FieldValue(field, values))) {
|
||||
const value = readV4FieldValue(field, values)
|
||||
if (field.required && isEmptyV4Value(value)) {
|
||||
errors[key] = `${field.display_name} is required`
|
||||
return errors
|
||||
}
|
||||
if (isTracePositiveIntegerField(field) && !isEmptyV4Value(value) && !isPositiveIntegerValue(value)) {
|
||||
errors[key] = `${field.display_name} must be a positive integer`
|
||||
}
|
||||
return errors
|
||||
}, {})
|
||||
@@ -383,6 +399,21 @@ function isForbiddenRoomInformationPointer(pointer: string): boolean {
|
||||
normalizedPointer.includes('/locator_value')
|
||||
}
|
||||
|
||||
function isTracePositiveIntegerField(field: ReservationV4TaskCardFieldResult): boolean {
|
||||
const pointer = field.field_pointer || fieldPathToPointer(field.field_path)
|
||||
return /^\/trace_items\/\d+\/extra_bed_room_count$/.test(pointer)
|
||||
}
|
||||
|
||||
function isPositiveIntegerValue(value: unknown): boolean {
|
||||
if (typeof value === 'number') {
|
||||
return Number.isInteger(value) && value > 0
|
||||
}
|
||||
if (typeof value !== 'string') {
|
||||
return false
|
||||
}
|
||||
return /^[1-9]\d*$/.test(value.trim())
|
||||
}
|
||||
|
||||
function isUnsafeUrlLikeValue(value: string): boolean {
|
||||
const trimmedValue = value.trim()
|
||||
return /^(https?:\/\/|oss:\/\/|s3:\/\/)/i.test(trimmedValue)
|
||||
|
||||
Reference in new issue
Block a user