-
-
- Nama dan Gelar
-
-
-
-
-
-
-
-
-
-
-
- NIK
+ No. IHS
-
+
- NO SIP
-
-
-
-
-
-
-
- Telepon / HP
-
-
+ No. SIP
+
+
- Kode BPJS
+ Unit
-
-
-
-
-
-
- Fee Rajal
-
-
-
-
-
- Fee Ranap
-
-
-
-
-
-
-
- Status
-
-
- Aktif
- Tidak Aktif
-
+
diff --git a/app/components/app/employee/entry-form.vue b/app/components/app/employee/entry-form.vue
new file mode 100644
index 00000000..7bb9dfd7
--- /dev/null
+++ b/app/components/app/employee/entry-form.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
diff --git a/app/components/app/employee/list-cfg.ts b/app/components/app/employee/list-cfg.ts
new file mode 100644
index 00000000..f697dc88
--- /dev/null
+++ b/app/components/app/employee/list-cfg.ts
@@ -0,0 +1,109 @@
+import type {
+ Col,
+ KeyLabel,
+ RecComponent,
+ RecStrFuncComponent,
+ RecStrFuncUnknown,
+ Th,
+} from '~/components/pub/custom-ui/data/types'
+import { defineAsyncComponent } from 'vue'
+
+type SmallDetailDto = any
+
+const action = defineAsyncComponent(() => import('~/components/pub/custom-ui/data/dropdown-action-dud.vue'))
+
+const doctorStatus = {
+ 0: 'Tidak Aktif',
+ 1: 'Aktif',
+}
+
+export const cols: Col[] = [
+ { width: 100 },
+ { width: 250 },
+ {},
+ { width: 100 },
+ { width: 100 },
+ {},
+ {},
+ {},
+ { width: 100 },
+ { width: 100 },
+ { width: 100 },
+ { width: 50 },
+]
+
+export const header: Th[][] = [
+ [
+ { label: 'Kode JKN' },
+ { label: 'Nama' },
+ { label: 'No KTP' },
+ { label: 'No SIP' },
+ { label: 'No IHS' },
+ { label: 'Telpon' },
+ { label: 'Fee Ranap' },
+ { label: 'Fee Rajal' },
+ { label: 'Status' },
+ ],
+]
+
+export const keys = [
+ 'bpjs_code',
+ 'name',
+ 'identity_number',
+ 'sip_no',
+ 'ihs_number',
+ 'phone',
+ 'inPatient_itemPrice',
+ 'outPatient_itemPrice',
+ 'status',
+ 'action',
+]
+
+export const delKeyNames: KeyLabel[] = [
+ { key: 'code', label: 'Kode' },
+ { key: 'name', label: 'Nama' },
+]
+
+export const funcParsed: RecStrFuncUnknown = {
+ name: (rec: unknown): unknown => {
+ console.log(rec)
+ const recX = rec as SmallDetailDto
+ return `${recX.frontTitle} ${recX.name} ${recX.endTitle}`.trim()
+ },
+ identity_number: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ if (recX.identity_number?.substring(0, 5) === 'BLANK') {
+ return '(TANPA NIK)'
+ }
+ return recX.identity_number
+ },
+ inPatient_itemPrice: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return Number(recX.inPatient_itemPrice.price).toLocaleString('id-ID')
+ },
+ outPatient_itemPrice: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return Number(recX.outPatient_itemPrice.price).toLocaleString('id-ID')
+ },
+ status: (rec: unknown): unknown => {
+ const recX = rec as SmallDetailDto
+ return doctorStatus[recX.status_code as keyof typeof doctorStatus]
+ },
+}
+
+export const funcComponent: RecStrFuncComponent = {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+}
+
+export const funcHtml: RecStrFuncUnknown = {
+ patient_address(_rec) {
+ return '-'
+ },
+}
diff --git a/app/components/app/device/list.vue b/app/components/app/employee/list.vue
similarity index 100%
rename from app/components/app/device/list.vue
rename to app/components/app/employee/list.vue
diff --git a/app/components/app/employee/picker.vue b/app/components/app/employee/picker.vue
new file mode 100644
index 00000000..e69de29b
diff --git a/app/components/app/employee/search.vue b/app/components/app/employee/search.vue
new file mode 100644
index 00000000..e69de29b
diff --git a/app/components/app/material/entry-form.vue b/app/components/app/equipment/entry-form.vue
similarity index 75%
rename from app/components/app/material/entry-form.vue
rename to app/components/app/equipment/entry-form.vue
index 81951d91..759f011d 100644
--- a/app/components/app/material/entry-form.vue
+++ b/app/components/app/equipment/entry-form.vue
@@ -6,19 +6,18 @@ import type { MaterialFormData } from '~/schemas/material'
import { toTypedSchema } from '@vee-validate/zod'
import { useForm } from 'vee-validate'
// components
-import Label from '~/components/pub/custom-ui/form/label.vue'
interface Props {
- isLoading: boolean
schema: z.ZodSchema
uoms: any[]
items: any[]
}
+const isLoading = ref(false)
const props = defineProps()
const emit = defineEmits<{
- back: []
- submit: [data: any]
+ submit: [values: MaterialFormData, resetForm: () => void]
+ cancel: [resetForm: () => void]
}>()
const { handleSubmit, defineField, errors } = useForm({
@@ -38,19 +37,36 @@ const [uom, uomAttrs] = defineField('uom_code')
const [item, itemAttrs] = defineField('item_id')
const [stock, stockAttrs] = defineField('stock')
-const onSubmit = handleSubmit(async (values) => {
- try {
- emit('submit', values)
- } catch (error) {
- console.error('Submission failed:', error)
+const resetForm = () => {
+ code.value = ''
+ name.value = ''
+ uom.value = ''
+ item.value = ''
+ stock.value = 0
+}
+
+// Form submission handler
+function onSubmitForm(values: any) {
+ const formData: MaterialFormData = {
+ name: values.name || '',
+ code: values.code || '',
+ uom_code: values.uom_code || '',
+ item_id: values.item_id || '',
+ stock: values.stock || 0,
}
-})
+ emit('submit', formData, resetForm)
+}
+
+// Form cancel handler
+function onCancelForm() {
+ emit('cancel', resetForm)
+}
-
diff --git a/app/components/content/employee/entry.vue b/app/components/content/employee/entry.vue
new file mode 100644
index 00000000..509baad0
--- /dev/null
+++ b/app/components/content/employee/entry.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+ Tambah Karyawan
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/employee/list.vue b/app/components/content/employee/list.vue
new file mode 100644
index 00000000..e03c976b
--- /dev/null
+++ b/app/components/content/employee/list.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
diff --git a/app/components/content/equipment/list.vue b/app/components/content/equipment/list.vue
new file mode 100644
index 00000000..61d2a0b0
--- /dev/null
+++ b/app/components/content/equipment/list.vue
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ID: {{ record?.id }}
+
Nama: {{ record.name }}
+
Kode: {{ record.code }}
+
+
+
+
+
diff --git a/app/components/content/tools/list.vue b/app/components/content/tools/list.vue
new file mode 100644
index 00000000..580dda40
--- /dev/null
+++ b/app/components/content/tools/list.vue
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ID: {{ record?.id }}
+
Nama: {{ record.name }}
+
Kode: {{ record.code }}
+
+
+
+
+
diff --git a/app/components/content/user/list.vue b/app/components/content/user/list.vue
index 4b77cf12..e03c976b 100644
--- a/app/components/content/user/list.vue
+++ b/app/components/content/user/list.vue
@@ -30,7 +30,7 @@ const headerPrep: HeaderPrep = {
icon: 'i-lucide-users',
addNav: {
label: 'Tambah',
- onClick: () => navigateTo('/human-src/user/add'),
+ onClick: () => navigateTo('/human-src/employee/add'),
},
}
@@ -56,10 +56,8 @@ provide('table_data_loader', isLoading)
-
-
-
+
+
diff --git a/app/components/pub/base/data-table/data-table.vue b/app/components/pub/base/data-table/data-table.vue
index eb59b9b9..ccb41100 100644
--- a/app/components/pub/base/data-table/data-table.vue
+++ b/app/components/pub/base/data-table/data-table.vue
@@ -31,7 +31,7 @@ function handleActionCellClick(event: Event, _cellRef: string) {
const cell = event.currentTarget as HTMLElement
const triggerButton = cell.querySelector('button[data-state]') || cell.querySelector('button')
if (triggerButton) {
- (triggerButton as HTMLButtonElement).click()
+ ;(triggerButton as HTMLButtonElement).click()
}
}
@@ -41,9 +41,11 @@ function handleActionCellClick(event: Event, _cellRef: string) {
+ >
{{ h.label }}
@@ -53,13 +55,13 @@ v-for="(h, idx) in header[0]" :key="`head-${idx}`" class="border"
-
+
-
+
Tidak ada data tersedia
@@ -74,7 +76,11 @@ v-for="(h, idx) in header[0]" :key="`head-${idx}`" class="border"
:key="`cell-${rowIndex}-${cellIndex}`"
class="border"
:class="{ 'cursor-pointer': key === 'action' && funcComponent[key] }"
- @click="key === 'action' && funcComponent[key] ? handleActionCellClick($event, `cell-${rowIndex}-${cellIndex}`) : null"
+ @click="
+ key === 'action' && funcComponent[key]
+ ? handleActionCellClick($event, `cell-${rowIndex}-${cellIndex}`)
+ : null
+ "
>
(),
{
@@ -12,25 +13,25 @@ const props = withDefaults(
density: 'default',
side: 'default',
position: 'default',
+ layout: 'default',
class: '',
},
)
-const wrapperClass = computed(() => [
- 'w-full flex-shrink-0',
+const widthClass = computed(() => {
+ if (props.column === 1) return 'md:w-full pe-4'
+ if (props.column === 2) return 'md:w-1/2 pe-4'
+ if (props.column === 3) return 'md:w-1/3 pe-4'
+ return 'w-full'
+})
- props.column === 1 && props.side !== 'break' ? 'pe-4 md:w-1/1 ' : '',
- props.column === 2 && props.side !== 'break' ? 'pe-4 md:w-1/2 my-3' : '',
- props.column === 3 && props.side !== 'break' ? 'pe-4 md:w-1/3' : '',
- props.column === 2 && props.side === 'break' ? 'md:w-1/2' : '',
- props.column === 3 && props.side === 'break' ? 'md:w-1/3' : '',
+const wrapperClass = computed(() => [
+ 'w-full flex-shrink-0 mb-3',
+ widthClass.value,
+
+ props.layout === 'stacked' ? 'flex flex-col p-2' : 'md:flex',
props.density !== 'dense' ? 'mb-2 md:mb-2.5 xl:mb-3' : '',
-
- props.side !== 'break' ? 'md:flex' : '',
-
- props.position === 'dynamic' ? 'ps-4' : props.column > 1 ? 'pe-4' : '',
-
props.class,
])
@@ -40,5 +41,3 @@ const wrapperClass = computed(() => [
-
-
diff --git a/app/components/pub/custom-ui/form/label.vue b/app/components/pub/custom-ui/form/label.vue
index f8272352..42274ee6 100644
--- a/app/components/pub/custom-ui/form/label.vue
+++ b/app/components/pub/custom-ui/form/label.vue
@@ -5,11 +5,13 @@ const props = withDefaults(
size?: 'default' | 'narrow' | 'wide'
height?: 'default' | 'compact'
position?: 'default' | 'dynamic'
+ stacked?: boolean
}>(),
{
size: 'default',
height: 'default',
position: 'default',
+ stacked: false,
},
)
@@ -36,17 +38,17 @@ const positionChildMap = {
const wrapperClass = computed(() => [
'block shrink-0',
- sizeMap[props.size],
- heightMap[props.height],
- positionWrapMap[props.position],
+ props.stacked ? 'w-full mb-1 text-start' : sizeMap[props.size],
+ props.stacked ? '' : heightMap[props.height],
+ props.stacked ? '' : positionWrapMap[props.position],
])
-const labelClass = computed(() => positionChildMap[props.position])
+const labelClass = computed(() => [props.stacked ? 'block mb-1 text-sm font-medium' : positionChildMap[props.position]])
-
+
diff --git a/app/lib/constants.ts b/app/lib/constants.ts
index fb6b9171..866fc520 100644
--- a/app/lib/constants.ts
+++ b/app/lib/constants.ts
@@ -72,7 +72,7 @@ export const dischargeMethodCodes: Record = {
}
export const genderCodes: Record = {
- male: 'Laki - Laki',
+ male: 'Laki',
female: 'Perempuan',
'not-stated': 'Tidak Disebutkan',
unknown: 'Tidak Diketahui',
@@ -218,3 +218,17 @@ export const instructionCodes: Record = {
medication: 'Obat',
material: 'BMHP',
}
+
+export const relationshipCodes: Record = {
+ mother: 'Ibu',
+ father: 'Ayah',
+ uncle: 'Paman',
+ aunt: 'Bibi',
+ sibling: 'Saudara',
+ 'gd-mother': 'Nenek',
+ 'gd-father': 'Kakek',
+ child: 'Anak',
+ nephew: 'Keponakan',
+ 'gd-child': 'Cucu',
+ other: 'Lainnya',
+}
diff --git a/app/lib/utils.ts b/app/lib/utils.ts
index abba253f..c6098e1b 100644
--- a/app/lib/utils.ts
+++ b/app/lib/utils.ts
@@ -2,6 +2,27 @@ import type { ClassValue } from 'clsx'
import { clsx } from 'clsx'
import { twMerge } from 'tailwind-merge'
+export interface SelectOptionType {
+ value: string
+ label: string
+ code?: string
+}
+
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
+
+export function mapToComboboxOptList(items: Record): SelectOptionType[] {
+ if (!items) {
+ return []
+ }
+ const result: SelectOptionType[] = []
+ Object.keys(items).forEach((item) => {
+ result.push({
+ label: items[item] as string,
+ value: item,
+ code: item,
+ })
+ })
+ return result
+}
diff --git a/app/middleware/auth.global.ts b/app/middleware/auth.global.ts
index 9d4fb60b..e985520e 100644
--- a/app/middleware/auth.global.ts
+++ b/app/middleware/auth.global.ts
@@ -4,11 +4,8 @@ export default defineNuxtRouteMiddleware((to) => {
const { $pinia } = useNuxtApp()
if (import.meta.client) {
const userStore = useUserStore($pinia)
-
- console.log('currRole', userStore.userRole)
- console.log('isAuth', userStore.isAuthenticated)
if (!userStore.isAuthenticated) {
- return navigateTo('/401')
+ return navigateTo('/auth/login')
}
}
})
diff --git a/app/models/doctor.ts b/app/models/doctor.ts
new file mode 100644
index 00000000..8359d54a
--- /dev/null
+++ b/app/models/doctor.ts
@@ -0,0 +1,61 @@
+export interface Doctor {
+ id: number
+ createdAt: string
+ updatedAt: string
+ name: string
+ frontTitle?: string
+ endTitle?: string
+ specialist_code?: string
+ sip_no: string
+ ihs_number: string
+ identity_number: string
+ phone?: string
+ bpjs_code?: string
+ status_code?: number
+}
+// use one dto for both create and update
+export interface CreateDto {
+ name?: string
+ frontTitle?: string
+ endTitle?: string
+ identity_number?: string
+ sip_no?: string
+ ihs_number?: string
+ phone?: string
+ email?: string
+ bpjs_code?: string
+ status_code?: number
+ outPatient_rate?: number
+ inPatient_rate?: number
+}
+
+export interface GetListDto {
+ name?: string
+ identity_number?: string
+ sip_no?: string
+ ihs_number?: string
+}
+
+export interface GetDetailDto {
+ id?: string
+}
+
+export interface UpdateDto extends CreateDto {
+ id?: number
+}
+
+export interface DeleteDto {
+ id?: string
+}
+
+export function genDoctor(): Doctor {
+ return {
+ id: 0,
+ createdAt: '',
+ updatedAt: '',
+ name: '',
+ ihs_number: '',
+ identity_number: '',
+ sip_no: '',
+ }
+}
diff --git a/app/models/employee.ts b/app/models/employee.ts
new file mode 100644
index 00000000..ea2d1f18
--- /dev/null
+++ b/app/models/employee.ts
@@ -0,0 +1,37 @@
+export interface Employee {
+ name: string
+ number: string
+ status_code: string
+ user_id: number
+ person_id: number
+ position_code: string
+ division_code: string
+}
+
+export interface CreateDto extends Employee {}
+
+export interface UpdateDto extends Employee {
+ id: number
+}
+
+export interface DeleteDto {
+ id: number
+}
+
+export interface GetListDto extends Employee {
+ id: number
+ createdAt: string
+ updatedAt: string
+}
+
+export function genEmployee(): Employee {
+ return {
+ name: '',
+ number: '',
+ status_code: '',
+ user_id: 0,
+ person_id: 0,
+ position_code: '',
+ division_code: '',
+ }
+}
diff --git a/app/models/user.ts b/app/models/user.ts
new file mode 100644
index 00000000..03dd4076
--- /dev/null
+++ b/app/models/user.ts
@@ -0,0 +1,19 @@
+export interface User {
+ id: number
+ name: string
+ password: string
+ status_code: string
+ createdAt: string
+ updatedAt: string
+}
+
+export function genUser(): User {
+ return {
+ id: 0,
+ name: '',
+ password: '',
+ status_code: '',
+ createdAt: '',
+ updatedAt: '',
+ }
+}
diff --git a/app/pages/(features)/doctor/[id]/detail.vue b/app/pages/(features)/doctor/[id]/detail.vue
deleted file mode 100644
index 33a36f0f..00000000
--- a/app/pages/(features)/doctor/[id]/detail.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- detail pasien
-
diff --git a/app/pages/(features)/doctor/[id]/edit.vue b/app/pages/(features)/doctor/[id]/edit.vue
deleted file mode 100644
index 3a8f1295..00000000
--- a/app/pages/(features)/doctor/[id]/edit.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- edit detail pasien
-
diff --git a/app/pages/(features)/human-src/user/add.vue b/app/pages/(features)/human-src/employee/add.vue
similarity index 97%
rename from app/pages/(features)/human-src/user/add.vue
rename to app/pages/(features)/human-src/employee/add.vue
index 8478c9b2..b615504e 100644
--- a/app/pages/(features)/human-src/user/add.vue
+++ b/app/pages/(features)/human-src/employee/add.vue
@@ -35,7 +35,7 @@ const canCreate = hasCreateAccess(roleAccess)
-
+
diff --git a/app/pages/(features)/human-src/user/index.vue b/app/pages/(features)/human-src/employee/index.vue
similarity index 100%
rename from app/pages/(features)/human-src/user/index.vue
rename to app/pages/(features)/human-src/employee/index.vue
diff --git a/app/pages/(features)/tools-equipment-src/equipment/index.vue b/app/pages/(features)/tools-equipment-src/equipment/index.vue
index e1968876..92061d83 100644
--- a/app/pages/(features)/tools-equipment-src/equipment/index.vue
+++ b/app/pages/(features)/tools-equipment-src/equipment/index.vue
@@ -27,13 +27,13 @@ if (!hasAccess) {
}
// Define permission-based computed properties
-const canRead = hasReadAccess(roleAccess)
+const canRead = true // hasReadAccess(roleAccess)
diff --git a/app/pages/(features)/tools-equipment-src/device/index.vue b/app/pages/(features)/tools-equipment-src/tools/index.vue
similarity index 91%
rename from app/pages/(features)/tools-equipment-src/device/index.vue
rename to app/pages/(features)/tools-equipment-src/tools/index.vue
index 98fe16df..5301e65a 100644
--- a/app/pages/(features)/tools-equipment-src/device/index.vue
+++ b/app/pages/(features)/tools-equipment-src/tools/index.vue
@@ -27,13 +27,13 @@ if (!hasAccess) {
}
// Define permission-based computed properties
-const canRead = hasReadAccess(roleAccess)
+const canRead = true // hasReadAccess(roleAccess)
diff --git a/app/schemas/device.ts b/app/schemas/device.ts
new file mode 100644
index 00000000..036f3bc7
--- /dev/null
+++ b/app/schemas/device.ts
@@ -0,0 +1,13 @@
+import { z } from 'zod'
+
+const schema = z.object({
+ code: z.string({ required_error: 'Kode harus diisi' }).min(1, 'Kode minimum 1 karakter'),
+ name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimum 1 karakter'),
+ uom_code: z.string({ required_error: 'Kode unit harus diisi' }).min(1, 'Kode unit harus diisi'),
+ item_id: z.string({ required_error: 'Tipe harus diisi' }).min(1, 'Tipe harus diisi'),
+})
+
+type formData = z.infer
+
+export { schema as DeviceSchema }
+export type { formData as DeviceFormData }
diff --git a/public/side-menu-items/sys.json b/public/side-menu-items/sys.json
index e10aab27..488d9fa2 100644
--- a/public/side-menu-items/sys.json
+++ b/public/side-menu-items/sys.json
@@ -35,7 +35,7 @@
},
{
"title": "IGD",
- "icon": "i-lucide-stethoscope",
+ "icon": "i-lucide-zap",
"children": [
{
"title": "Triase",
@@ -77,7 +77,7 @@
},
{
"title": "Rehabilitasi Medik",
- "icon": "i-lucide-heart",
+ "icon": "i-lucide-bike",
"link": "/rehabilitasi",
"children": [
{
@@ -103,34 +103,44 @@
]
},
{
- "title": "Farmasi",
- "icon": "i-lucide-users",
+ "title": "Obat - Order",
+ "icon": "i-lucide-briefcase-medical",
"children": [
{
"title": "Permintaan",
"icon": "i-lucide-user",
- "link": "/pharmacy/request"
+ "link": "/medication/order"
},
{
"title": "Standing Order",
"icon": "i-lucide-user",
- "link": "/pharmacy/standing-order"
+ "link": "/medication/standing-order"
}
]
},
{
- "title": "Lab",
- "icon": "i-lucide-briefcase",
+ "title": "Lab - Order",
+ "icon": "i-lucide-microscope",
"link": "/lab-order"
},
{
- "title": "Radiologi",
+ "title": "Lab Mikro - Order",
+ "icon": "i-lucide-microscope",
+ "link": "/micro-lab-order"
+ },
+ {
+ "title": "Lab PA - Order",
+ "icon": "i-lucide-microscope",
+ "link": "/pa-lab-order"
+ },
+ {
+ "title": "Radiologi - Order",
"icon": "i-lucide-radio",
"link": "/radiology-order"
},
{
"title": "Gizi",
- "icon": "i-lucide-briefcase",
+ "icon": "i-lucide-egg-fried",
"link": "/nutrition-order"
},
{
@@ -160,7 +170,7 @@
"items": [
{
"title": "BPJS",
- "icon": "i-lucide-refresh-cw",
+ "icon": "i-lucide-circuit-board",
"link": "/integration/bpjs",
"badge": "Live"
},
@@ -177,7 +187,7 @@
"items": [
{
"title": "Peralatan dan Perlengkapan",
- "icon": "i-lucide-radius",
+ "icon": "i-lucide-layout-dashboard",
"children": [
{
"title": "Obat",
@@ -187,12 +197,12 @@
{
"title": "Peralatan",
"icon": "i-lucide-tools",
- "link": "/tools-equipment-src/device"
+ "link": "/tools-equipment-src/tools"
},
{
"title": "Perlengkapan (BMHP)",
"icon": "i-lucide-stethoscope",
- "link": "/tools-equipment-src/material"
+ "link": "/tools-equipment-src/equipment"
},
{
"title": "Metode Obat",
@@ -209,36 +219,88 @@
{
"title": "Pengguna",
"icon": "i-lucide-user",
- "link": "/human-src/employee"
+ "children": [
+ {
+ "title": "Pegawai",
+ "icon": "i-lucide-stethoscope",
+ "link": "/human-src/employee"
+ },
+ {
+ "title": "PPDS",
+ "icon": "i-lucide-user",
+ "link": "/human-src/specialist-intern"
+ }
+ ]
},
{
"title": "Layanan",
- "icon": "i-lucide-card-sim",
+ "icon": "i-lucide-layout-list",
"children": [
{
"title": "Counter",
"icon": "i-lucide-stethoscope",
- "link": "/tools-equipment-src/medicine"
+ "link": "/service-src/counter"
},
{
- "title": "Bed",
+ "title": "Public Screen (Big Screen)",
"icon": "i-lucide-tools",
- "link": "/tools-equipment-src/device"
+ "link": "/service-src/public-screen"
+ },
+ {
+ "title": "Kasur",
+ "icon": "i-lucide-tools",
+ "link": "/service-src/bed"
},
{
"title": "Kamar",
"icon": "i-lucide-stethoscope",
- "link": "/tools-equipment-src/medical-device"
+ "link": "/service-src/chamber"
},
{
"title": "Lantai",
"icon": "i-lucide-user",
- "link": "/tools-equipment-src/medicine-method"
+ "link": "/service-src/floor"
},
{
"title": "Gedung",
"icon": "i-lucide-user",
- "link": "/tools-equipment-src/medicine-type"
+ "link": "/service-src/building"
+ }
+ ]
+ },
+ {
+ "title": "Item & Item Price",
+ "icon": "i-lucide-shopping-basket",
+ "link": "/item-src/item"
+ },
+ {
+ "title": "Organisasi",
+ "icon": "i-lucide-network",
+ "children": [
+ {
+ "title": "Divisi",
+ "icon": "i-lucide-stethoscope",
+ "link": "/org-src/division"
+ },
+ {
+ "title": "Instalasi",
+ "icon": "i-lucide-tools",
+ "link": "/org-src/installation"
+ },
+ {
+ "title": "Unit",
+ "icon": "i-lucide-tools",
+ "link": "/org-src/unit"
+ },
+ {
+ "title": "Specialist",
+ "icon": "i-lucide-stethoscope",
+ "link": "/org-src/specialist"
+ },
+ {
+ "title": "Sub Specialist",
+ "icon": "i-lucide-user",
+ "link": "/org-src/subspecialist"
}
]
}