96 lines
3.2 KiB
JavaScript
96 lines
3.2 KiB
JavaScript
import { computed } from 'vue'
|
|
import { storeToRefs } from 'pinia'
|
|
import { useAuthStore } from '@/stores/auth'
|
|
|
|
const CLINICAL_ROLES = ['NURSE', 'PHYSICIAN', 'ADMIN']
|
|
|
|
export const OPS_NAV_LINK = {
|
|
to: '/operations/gateways',
|
|
label: 'Operations',
|
|
icon: 'ops',
|
|
}
|
|
|
|
export const MAIN_NAV_LINKS = [
|
|
{ to: '/ward', label: 'Virtual Ward', icon: 'ward', roles: CLINICAL_ROLES },
|
|
{ to: '/departments', label: 'Departments', icon: 'departments', roles: CLINICAL_ROLES },
|
|
{ to: '/sepsis', label: 'Sepsis Board', icon: 'sepsis', roles: CLINICAL_ROLES },
|
|
{ to: '/alerts', label: 'Alert Center', icon: 'alerts', roles: CLINICAL_ROLES },
|
|
{ to: '/feedback', label: 'Feedback Summary', icon: 'feedback', roles: ['PHYSICIAN', 'ADMIN'] },
|
|
{ to: '/admin/reconciliation', label: 'Data Quality', icon: 'reconciliation', roles: CLINICAL_ROLES },
|
|
]
|
|
|
|
export function canAccessOps(role) {
|
|
if (import.meta.env.VITE_SHOW_OPS === 'true') return isDashboardRole(role)
|
|
return role === 'ADMIN'
|
|
}
|
|
|
|
export const ADMIN_NAV_LINKS = [
|
|
{ to: '/admin/thresholds', label: 'Alert Thresholds', icon: 'admin', roles: ['ADMIN'] },
|
|
{ to: '/admin/users', label: 'User Management', icon: 'users', roles: ['ADMIN'] },
|
|
{ to: '/admin/audit', label: 'Audit Logs', icon: 'audit', roles: ['ADMIN'] },
|
|
]
|
|
|
|
export const MOBILE_NAV_LINKS = [
|
|
{ to: '/ward', label: 'Ward', icon: 'ward', roles: CLINICAL_ROLES },
|
|
{ to: '/alerts', label: 'Alerts', icon: 'alerts', roles: CLINICAL_ROLES },
|
|
{ to: '/sepsis', label: 'Sepsis', icon: 'sepsis', roles: CLINICAL_ROLES },
|
|
{ to: '/admin/reconciliation', label: 'Quality', icon: 'reconciliation', roles: CLINICAL_ROLES },
|
|
]
|
|
|
|
export function isDashboardRole(role) {
|
|
return CLINICAL_ROLES.includes(role)
|
|
}
|
|
|
|
export function defaultRouteForRole(role) {
|
|
if (isDashboardRole(role)) return '/ward'
|
|
return '/login'
|
|
}
|
|
|
|
export function roleCanAccessRoute(role, meta = {}) {
|
|
if (meta.public) return true
|
|
if (!role || !isDashboardRole(role)) return false
|
|
if (meta.allowedRoles && !meta.allowedRoles.includes(role)) return false
|
|
return true
|
|
}
|
|
|
|
export function filterNavLinks(links, role) {
|
|
if (!role) return []
|
|
return links.filter((link) => link.roles.includes(role))
|
|
}
|
|
|
|
export function useRoleAccess() {
|
|
const auth = useAuthStore()
|
|
const { role } = storeToRefs(auth)
|
|
|
|
const isNurse = computed(() => role.value === 'NURSE')
|
|
const isPhysician = computed(() => role.value === 'PHYSICIAN')
|
|
const isAdmin = computed(() => role.value === 'ADMIN')
|
|
const isClinical = computed(() => isDashboardRole(role.value))
|
|
|
|
const mainNavLinks = computed(() => {
|
|
const links = filterNavLinks(MAIN_NAV_LINKS, role.value)
|
|
if (canAccessOps(role.value)) links.push(OPS_NAV_LINK)
|
|
return links
|
|
})
|
|
const adminNavLinks = computed(() => filterNavLinks(ADMIN_NAV_LINKS, role.value))
|
|
const mobileNavLinks = computed(() => filterNavLinks(MOBILE_NAV_LINKS, role.value))
|
|
const showAdminSection = computed(() => adminNavLinks.value.length > 0)
|
|
|
|
const nursePatientLayout = computed(() => isNurse.value)
|
|
const physicianPatientLayout = computed(() => isPhysician.value)
|
|
|
|
return {
|
|
role,
|
|
isNurse,
|
|
isPhysician,
|
|
isAdmin,
|
|
isClinical,
|
|
mainNavLinks,
|
|
adminNavLinks,
|
|
mobileNavLinks,
|
|
showAdminSection,
|
|
nursePatientLayout,
|
|
physicianPatientLayout,
|
|
}
|
|
}
|