910b641750
feat(patient): add edit functionality to patient form - Modify genPatientEntity to accept existing patient data for updates - Add handleActionEdit handler for edit mode - Update form to handle both create and edit modes - Rename patient ref to patientDetail for clarity refactor(patient): update marital status codes and job options mapping - Change marital status enum values to standardized codes (S, M, D, W) - Simplify job options and marital status options mapping using mapToComboboxOptList - Add error handling in patient data loading ajust styling text based on combobox wip: edit patient redirect refactor(models): update type definitions and form field handling - Add field-name prop to SelectDob component for better form handling - Update Person and Patient interfaces to use null for optional fields - Add maritalStatus_code field to Person interface - Improve type safety by replacing undefined with null for optional fields fix casting radio str to boolean and parsing date error
119 lines
3.3 KiB
TypeScript
119 lines
3.3 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
const ACCEPTED_UPLOAD_TYPES = ['image/jpeg', 'image/png', 'application/pdf']
|
|
|
|
const PatientSchema = z
|
|
.object({
|
|
// Data Diri Pasien
|
|
identityNumber: z.string().optional(),
|
|
// .string({
|
|
// required_error: 'Mohon lengkapi NIK',
|
|
// })
|
|
// .min(16, 'NIK harus berupa angka 16 digit')
|
|
// .regex(/^\d+$/, 'NIK harus berupa angka 16 digit'),
|
|
residentIdentityFile: z
|
|
.any()
|
|
.optional()
|
|
.refine((f) => !f || f instanceof File, { message: 'Harus berupa file yang valid' })
|
|
.refine((f) => !f || ACCEPTED_UPLOAD_TYPES.includes(f.type), {
|
|
message: 'Format file harus JPG, PNG, atau PDF',
|
|
})
|
|
.refine((f) => !f || f.size <= 1 * 1024 * 1024, { message: 'Maksimal 1MB' }),
|
|
|
|
familyIdentityFile: z
|
|
.any()
|
|
.optional()
|
|
.refine((f) => !f || f instanceof File, { message: 'Harus berupa file yang valid' })
|
|
.refine((f) => !f || ACCEPTED_UPLOAD_TYPES.includes(f.type), {
|
|
message: 'Format file harus JPG, PNG, atau PDF',
|
|
})
|
|
.refine((f) => !f || f.size <= 1 * 1024 * 1024, { message: 'Maksimal 1MB' }),
|
|
|
|
fullName: z.string({
|
|
required_error: 'Mohon lengkapi Nama',
|
|
}),
|
|
birthPlace: z
|
|
.string({
|
|
required_error: 'Mohon lengkapi Tempat Lahir',
|
|
})
|
|
.min(1, 'Mohon lengkapi Tempat Lahir'),
|
|
birthDate: z.string({
|
|
required_error: 'Mohon lengkapi Tanggal Lahir',
|
|
}),
|
|
|
|
// Jenis Kelamin & Status
|
|
gender: z.string({
|
|
required_error: 'Pilih Jenis Kelamin',
|
|
}),
|
|
maritalStatus: z.enum(['S', 'M', 'D', 'W'], {
|
|
required_error: 'Pilih Status Perkawinan',
|
|
}),
|
|
|
|
// Informasi Lokasi & Sosial
|
|
job: z
|
|
.string({
|
|
required_error: 'Mohon lengkapi Pekerjaan',
|
|
})
|
|
.min(1),
|
|
nationality: z.string({
|
|
required_error: 'Pilih Kebangsaan',
|
|
}),
|
|
isNewBorn: z.string({
|
|
required_error: 'Mohon lengkapi status pasien',
|
|
}),
|
|
language: z.string({
|
|
required_error: 'Mohon pilih Preferensi Bahasa',
|
|
}),
|
|
education: z
|
|
.string({
|
|
required_error: 'Mohon lengkapi Pendidikan',
|
|
})
|
|
.min(1),
|
|
religion: z
|
|
.string({
|
|
required_error: 'Pilih Kepercayaan',
|
|
})
|
|
.min(1),
|
|
ethnicity: z.string().optional(),
|
|
|
|
// Disabilitas
|
|
disability: z.string({
|
|
required_error: 'Mohon lengkapi Status Disabilitas',
|
|
}),
|
|
disabilityType: z.string().optional(),
|
|
|
|
// Informasi Kontak
|
|
passportNumber: z.string().optional(),
|
|
communicationBarrier: z.string({
|
|
required_error: 'Mohon lengkapi Status Hambatan Berkomunikasi',
|
|
}),
|
|
|
|
note: z.string().optional(),
|
|
drivingLicenseNumber: z.string().optional(),
|
|
})
|
|
.refine(
|
|
(data) => {
|
|
if (data.disability === 'yes') {
|
|
return !!data.disabilityType?.trim()
|
|
}
|
|
return true
|
|
},
|
|
{
|
|
message: 'Mohon pilih jenis Disabilitas',
|
|
path: ['disabilityType'],
|
|
},
|
|
)
|
|
// .transform((data) => {
|
|
// return {
|
|
// ...data,
|
|
// // newBornStatus: data.isNewBorn === 'yes',
|
|
// // communicationBarrier: data.communicationBarrier === 'yes',
|
|
// // disability: data.disability ? data.disabilityType : null,
|
|
// }
|
|
// })
|
|
|
|
type PatientFormData = z.infer<typeof PatientSchema>
|
|
|
|
export { PatientSchema }
|
|
export type { PatientFormData }
|