+
Draft
diff --git a/app/composables/useRBAC.ts b/app/composables/useRBAC.ts
index ced57e3e..fcc28144 100644
--- a/app/composables/useRBAC.ts
+++ b/app/composables/useRBAC.ts
@@ -1,5 +1,13 @@
import type { Permission, RoleAccess } from '~/models/role'
+export interface PageOperationPermission {
+ canRead: boolean
+ canCreate: boolean
+ canUpdate: boolean
+ canDelete: boolean
+}
+
+
/**
* Check if user has access to a page
*/
@@ -36,6 +44,14 @@ export function useRBAC() {
const hasUpdateAccess = (roleAccess: RoleAccess) => checkPermission(roleAccess, 'U')
const hasDeleteAccess = (roleAccess: RoleAccess) => checkPermission(roleAccess, 'D')
+ const getPagePermissions = (roleAccess: RoleAccess): PageOperationPermission => ({
+ canRead : hasReadAccess(roleAccess),
+ canCreate: hasCreateAccess(roleAccess),
+ canUpdate: hasUpdateAccess(roleAccess),
+ canDelete: hasDeleteAccess(roleAccess),
+ })
+
+
return {
checkRole,
checkPermission,
@@ -44,5 +60,7 @@ export function useRBAC() {
hasReadAccess,
hasUpdateAccess,
hasDeleteAccess,
+ getPagePermissions,
+
}
}
diff --git a/app/lib/utils.ts b/app/lib/utils.ts
index 357d8700..64248caf 100644
--- a/app/lib/utils.ts
+++ b/app/lib/utils.ts
@@ -1,6 +1,7 @@
import type { ClassValue } from 'clsx'
import { clsx } from 'clsx'
import { twMerge } from 'tailwind-merge'
+import { toast } from '~/components/pub/ui/toast'
export interface SelectOptionType<_T = string> {
value: string
@@ -104,3 +105,11 @@ export function calculateAge(birthDate: Date | string | null | undefined): strin
return `${years} tahun ${months} bulan`
}
}
+
+export function unauthorizedToast() {
+ toast({
+ title: 'Unauthorized',
+ description: 'You are not authorized to perform this action.',
+ variant: 'destructive',
+ })
+}
\ No newline at end of file
diff --git a/app/pages/(features)/resume/add.vue b/app/pages/(features)/resume/add.vue
new file mode 100644
index 00000000..7cc707f9
--- /dev/null
+++ b/app/pages/(features)/resume/add.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
diff --git a/app/schemas/resume.schema.ts b/app/schemas/resume.schema.ts
new file mode 100644
index 00000000..3e466a33
--- /dev/null
+++ b/app/schemas/resume.schema.ts
@@ -0,0 +1,76 @@
+import { z } from 'zod'
+import type { CreateDto } from '~/models/consultation'
+
+export type ResumeArrangementType = "krs" | "mrs" | "rujukInternal" | "rujukExternal" | "meninggal" | "other"
+
+const SecondaryDiagnosisSchema = z.object({
+ diagnosis: z.string({ required_error: 'Diagnosis harus diisi' }),
+ icd10: z.string({ required_error: 'ICD 10 harus diisi' }),
+ diagnosisBasis: z.string({ required_error: 'Dasar Diagnosis harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+})
+
+const SecondaryActionSchema = z.object({
+ action: z.string({ required_error: 'Action harus diisi' }),
+ icd9: z.string({ required_error: 'ICD 10 harus diisi' }),
+ actionBasis: z.string({ required_error: 'Dasar Action harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+})
+
+const ConsultationSchema = z.object({
+ consultation: z.string({ required_error: 'Consultation harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+ consultationReply: z.string({ required_error: 'Jawaban Consultation harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+})
+
+const ResumeSchema = z.object({
+ inDate: z.string({ required_error: 'Tanggal harus diisi' }),
+ outDate: z.string({ required_error: 'Tanggal harus diisi' }),
+ anamnesis: z.number({ required_error: 'Anamnesis harus diisi' })
+ .min(1, 'Anamnesis minimum 1 karakter')
+ .max(2048, 'Anamnesis maksimum 2048 karakter'),
+ physicalCheckup: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+ supplementCheckup: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+
+ primaryDiagnosis: z.string({ required_error: 'Diagnosis harus diisi' }),
+ secondaryDiagnosis: z.array(SecondaryDiagnosisSchema).optional(),
+
+ primaryOperativeNonOperativeAct: z.string({ required_error: 'Diagnosis harus diisi' }),
+ secondaryOperativeNonOperativeAct: z.array(SecondaryActionSchema).optional(),
+ medikamentosa: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+
+ consultation: z.array(ConsultationSchema).optional(),
+
+ arrangement: z.custom
().default("krs"),
+ inpatientIndication: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+ faskes: z.string({ required_error: 'Faskes harus diisi' }).optional(),
+ clinic: z.string({ required_error: 'Klinik harus diisi' }).optional(),
+ deathDate: z.string({ required_error: 'Tanggal harus diisi' }).optional(),
+ deathCause: z.array(z.string()).optional().default([]),
+ deathCauseDescription: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter')
+ .optional(),
+ keterangan: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter')
+ .optional(),
+})
+
+type ResumeFormData = z.infer & (CreateDto)
+
+export { ResumeSchema }
+export type { ResumeFormData }
diff --git a/app/schemas/verification.schema.ts b/app/schemas/verification.schema.ts
new file mode 100644
index 00000000..db0319cf
--- /dev/null
+++ b/app/schemas/verification.schema.ts
@@ -0,0 +1,19 @@
+import { z } from 'zod'
+
+const VerificationSchema = z.object({
+ name: z.string({
+ required_error: 'Mohon lengkapi Nama Anda',
+ }),
+ email: z.string({
+ required_error: 'Mohon lengkapi email',
+ }),
+ password: z.string({
+ required_error: 'Mohon lengkapi password',
+ }),
+})
+
+
+type VerificationFormData = z.infer
+
+export { VerificationSchema, }
+export type { VerificationFormData, }
\ No newline at end of file