enhance (appsidebar): improve sidebar navigation spacing and appearance

This commit is contained in:
Abizrh
2025-09-03 22:11:58 +07:00
parent 28634d8a64
commit bdc3e837f9
3 changed files with 248 additions and 102 deletions

No files matched your search

+16 -14
View File
@@ -1,11 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
const navMenu: { const navMenu = ref([])
heading: string
items: Array<any>
} = ref({
heading: 'Menu Utama',
items: [],
})
const teams: { const teams: {
name: string name: string
@@ -45,7 +39,7 @@ async function setMenu() {
const position_code = 'sys' const position_code = 'sys'
const res = await fetch(`/side-menu-items/${position_code}.json`) const res = await fetch(`/side-menu-items/${position_code}.json`)
const rawMenu = await res.text() const rawMenu = await res.text()
navMenu.value.items = JSON.parse(rawMenu) navMenu.value = JSON.parse(rawMenu)
} }
</script> </script>
@@ -55,15 +49,20 @@ async function setMenu() {
<LayoutSidebarNavHeader :teams="teams" /> <LayoutSidebarNavHeader :teams="teams" />
</SidebarHeader> </SidebarHeader>
<SidebarContent> <SidebarContent>
<SidebarGroup v-if="navMenu.items.length > 0"> <template v-if="navMenu.length > 0">
<SidebarGroupLabel> <SidebarGroup v-for="(nav, indexGroup) in navMenu" :key="indexGroup">
{{ navMenu.heading }} <SidebarGroupLabel v-if="nav.heading">
{{ nav.heading }}
</SidebarGroupLabel> </SidebarGroupLabel>
<component <component
:is="resolveNavItemComponent(item)" v-for="(item, index) in navMenu.items" :key="index" :item="item" :is="resolveNavItemComponent(item)"
class="my-2 mb-2" v-for="(item, index) in nav.items"
:key="index"
:item="item"
class="my-1 mb-1"
/> />
</SidebarGroup> </SidebarGroup>
</template>
<template v-else> <template v-else>
<div class="p-5"> <div class="p-5">
<div v-for="n in 10" :key="n" class="my-4 h-8 animate-pulse rounded bg-gray-200 py-2"></div> <div v-for="n in 10" :key="n" class="my-4 h-8 animate-pulse rounded bg-gray-200 py-2"></div>
@@ -71,7 +70,10 @@ async function setMenu() {
</template> </template>
<SidebarGroup class="mt-auto"> <SidebarGroup class="mt-auto">
<component <component
:is="resolveNavItemComponent(item)" v-for="(item, index) in navMenuBottom" :key="index" :item="item" :is="resolveNavItemComponent(item)"
v-for="(item, index) in navMenuBottom"
:key="index"
:item="item"
size="sm" size="sm"
/> />
</SidebarGroup> </SidebarGroup>
+2 -2
View File
@@ -21,12 +21,12 @@ const { setOpenMobile } = useSidebar()
<SidebarMenuButton as-child :tooltip="item.title" :size="size" class=""> <SidebarMenuButton as-child :tooltip="item.title" :size="size" class="">
<NuxtLink <NuxtLink
:to="item.link" :to="item.link"
class="group flex items-center gap-3 rounded-lg px-3 py-4 text-sm font-medium transition-all duration-200" class="group flex items-center gap-3 rounded-lg px-2 py-4 text-sm font-medium transition-all duration-200"
active-class="bg-primary text-white" active-class="bg-primary text-white"
@click="setOpenMobile(false)" @click="setOpenMobile(false)"
> >
<Icon :name="item.icon || ''" mode="svg" /> <Icon :name="item.icon || ''" mode="svg" />
<span>{{ item.title }}</span> <span class="mx-1">{{ item.title }}</span>
<span <span
v-if="item.new" v-if="item.new"
class="bg-#adfa1d rounded-md px-1.5 py-0.5 text-xs leading-none text-black no-underline group-hover:no-underline" class="bg-#adfa1d rounded-md px-1.5 py-0.5 text-xs leading-none text-black no-underline group-hover:no-underline"
+173 -29
View File
@@ -1,4 +1,7 @@
[ [
{
"heading": "Menu Utama",
"items": [
{ {
"title": "Dashboard", "title": "Dashboard",
"icon": "i-lucide-home", "icon": "i-lucide-home",
@@ -31,25 +34,46 @@
] ]
}, },
{ {
"title": "Karyawan", "title": "IGD",
"icon": "i-lucide-users", "icon": "i-lucide-stethoscope",
"children": [ "children": [
{ {
"title": "User", "title": "Triase",
"icon": "i-lucide-user", "icon": "i-lucide-stethoscope",
"link": "/human-src/user" "link": "/emergency/triage"
},
{
"title": "Pendaftaran",
"icon": "i-lucide-building-2",
"link": "/emergency/registration"
},
{
"title": "Pemeriksaan",
"icon": "i-lucide-building-2",
"link": "/emergency/examination"
} }
] ]
}, },
{ {
"title": "Dokter", "title": "Rawat Inap",
"icon": "i-lucide-cross", "icon": "i-lucide-building-2",
"link": "/doctor" "children": [
{
"title": "Permintaan",
"icon": "i-lucide-stethoscope",
"link": "/outpatient/request"
}, },
{ {
"title": "Pasien", "title": "Pendaftaran",
"icon": "i-lucide-users", "icon": "i-lucide-building-2",
"link": "/patient" "link": "/outpatient/registration"
},
{
"title": "Pemeriksaan",
"icon": "i-lucide-building-2",
"link": "/outpatient/examination"
}
]
}, },
{ {
"title": "Rehabilitasi Medik", "title": "Rehabilitasi Medik",
@@ -57,47 +81,167 @@
"link": "/rehabilitasi", "link": "/rehabilitasi",
"children": [ "children": [
{ {
"title": "Daftar Kunjungan Rawat Jalan", "title": "Antrian Pendaftaran",
"icon": "i-lucide-stethoscope", "icon": "i-lucide-stethoscope",
"link": "/rehab/registration-queue" "link": "/rehab/examination-queue"
}, },
{ {
"title": "Daftar Kunjungan Rawat Inap", "title": "Pendaftaran",
"icon": "i-lucide-building-2",
"link": "/rehab/registration"
},
{
"title": "Antrian Pemeriksaan",
"icon": "i-lucide-stethoscope",
"link": "/rehab/examination-queue"
},
{
"title": "Pemeriksaan",
"icon": "i-lucide-building-2", "icon": "i-lucide-building-2",
"link": "/rehab/examination" "link": "/rehab/examination"
} }
] ]
}, },
{ {
"title": "Rawat Inap", "title": "Farmasi",
"icon": "i-lucide-building-2", "icon": "i-lucide-users",
"link": "/rawat-inap" "children": [
{
"title": "Permintaan",
"icon": "i-lucide-user",
"link": "/pharmacy/request"
}, },
{ {
"title": "VClaim BPJS", "title": "Standing Order",
"icon": "i-lucide-user",
"link": "/pharmacy/standing-order"
}
]
},
{
"title": "Lab",
"icon": "i-lucide-briefcase",
"link": "/lab-order"
},
{
"title": "Radiologi",
"icon": "i-lucide-radio",
"link": "/radiology-order"
},
{
"title": "Gizi",
"icon": "i-lucide-briefcase",
"link": "/nutrition-order"
},
{
"title": "Pembayaran",
"icon": "i-lucide-banknote-arrow-up",
"link": "/payment"
}
]
},
{
"heading": "Client",
"items": [
{
"title": "Pasien",
"icon": "i-lucide-users",
"link": "/client/patient"
},
{
"title": "Rekam Medis",
"icon": "i-lucide-file-text",
"link": "/client/medical-record"
}
]
},
{
"heading": "Integrasi",
"items": [
{
"title": "BPJS",
"icon": "i-lucide-refresh-cw", "icon": "i-lucide-refresh-cw",
"link": "/vclaim", "link": "/integration/bpjs",
"badge": "Live" "badge": "Live"
}, },
{ {
"title": "SATUSEHAT", "title": "SATUSEHAT",
"icon": "i-lucide-database", "icon": "i-lucide-database",
"link": "/satusehat", "link": "/integration/satusehat",
"badge": "FHIR" "badge": "FHIR"
}
]
}, },
{ {
"title": "Medical Records", "heading": "Source",
"icon": "i-lucide-file-text", "items": [
"link": "/medical-records" {
"title": "Peralatan dan Perlengkapan",
"icon": "i-lucide-radius",
"children": [
{
"title": "Obat",
"icon": "i-lucide-stethoscope",
"link": "/tools-equipment-src/medicine"
},
{
"title": "Peralatan",
"icon": "i-lucide-tools",
"link": "/tools-equipment-src/device"
},
{
"title": "Perlengkapan (BMHP)",
"icon": "i-lucide-stethoscope",
"link": "/tools-equipment-src/material"
},
{
"title": "Metode Obat",
"icon": "i-lucide-user",
"link": "/tools-equipment-src/medicine-method"
},
{
"title": "Jenis Obat",
"icon": "i-lucide-user",
"link": "/tools-equipment-src/medicine-type"
}
]
},
{
"title": "Pengguna",
"icon": "i-lucide-user",
"link": "/human-src/employee"
},
{
"title": "Layanan",
"icon": "i-lucide-card-sim",
"children": [
{
"title": "Counter",
"icon": "i-lucide-stethoscope",
"link": "/tools-equipment-src/medicine"
},
{
"title": "Bed",
"icon": "i-lucide-tools",
"link": "/tools-equipment-src/device"
},
{
"title": "Kamar",
"icon": "i-lucide-stethoscope",
"link": "/tools-equipment-src/medical-device"
}, },
{ {
"title": "Laporan", "title": "Lantai",
"icon": "i-lucide-clipboard-list", "icon": "i-lucide-user",
"link": "/laporan" "link": "/tools-equipment-src/medicine-method"
}, },
{ {
"title": "Monitoring", "title": "Gedung",
"icon": "i-lucide-bar-chart-3", "icon": "i-lucide-user",
"link": "/monitoring" "link": "/tools-equipment-src/medicine-type"
}
]
}
]
} }
] ]