Merge branch 'dev' of github.com:dikstub-rssa/simrs-fe into feat/patient-63-adjustment
This commit is contained in:
+33
@@ -0,0 +1,33 @@
|
||||
# Build Stage
|
||||
FROM node:20-alpine AS build-stage
|
||||
|
||||
# Set the working directory inside the container
|
||||
WORKDIR /app
|
||||
|
||||
# Enable pnpm using corepack
|
||||
RUN corepack enable
|
||||
|
||||
# Copy pnpm related files and package.json to leverage Docker layer caching
|
||||
COPY package.json pnpm-lock.yaml ./
|
||||
|
||||
# Install dependencies using pnpm
|
||||
# Using --frozen-lockfile ensures consistent installations based on pnpm-lock.yaml
|
||||
RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store pnpm install --frozen-lockfile
|
||||
|
||||
# Copy the rest of the application files
|
||||
COPY . .
|
||||
|
||||
# Build the Vue.js application for production
|
||||
RUN pnpm build
|
||||
|
||||
# Production Stage
|
||||
FROM nginx:stable-alpine AS production-stage
|
||||
|
||||
# Copy the built Vue.js application from the build stage to Nginx's web root
|
||||
COPY --from=build-stage /app/dist /usr/share/nginx/html
|
||||
|
||||
# Expose port 80 for Nginx
|
||||
EXPOSE 80
|
||||
|
||||
# Command to run Nginx in the foreground
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
@@ -89,10 +89,10 @@ function proceedItem(action: string) {
|
||||
|
||||
function getLinks() {
|
||||
switch (activeServicePosition.value) {
|
||||
case 'medical':
|
||||
case 'med':
|
||||
linkItemsFiltered.value = baseLinkItems.filter((item) => item.groups?.includes('medical'))
|
||||
break
|
||||
case 'registration':
|
||||
case 'reg':
|
||||
linkItemsFiltered.value = baseLinkItems.filter((item) => item.groups?.includes('registration'))
|
||||
break
|
||||
default:
|
||||
|
||||
@@ -28,6 +28,7 @@ import ConfirmationInfo from '~/components/app/device-order/confirmation-info.vu
|
||||
// Props
|
||||
const props = defineProps<{
|
||||
encounter_id: number
|
||||
canUpdate?: boolean
|
||||
}>()
|
||||
|
||||
const encounter_id = props.encounter_id
|
||||
@@ -153,7 +154,7 @@ function pickItem(): DeviceOrder | null {
|
||||
:pagination-meta="paginationMeta"
|
||||
@page-change="handlePageChange"
|
||||
/>
|
||||
<!--
|
||||
<!--
|
||||
@cancel="cancel"
|
||||
@edit="edit"
|
||||
@submit="submit"
|
||||
|
||||
@@ -16,7 +16,7 @@ import { useIntegrationSepEntry } from '~/handlers/integration-sep-entry.handler
|
||||
const props = defineProps<{
|
||||
id: number
|
||||
classCode?: 'ambulatory' | 'emergency' | 'inpatient' | 'outpatient'
|
||||
subClassCode?: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk'
|
||||
subclassCode?: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk'
|
||||
formType: string
|
||||
}>()
|
||||
|
||||
@@ -77,9 +77,7 @@ function handleSaveClick() {
|
||||
}
|
||||
|
||||
function handleFetch(value?: any) {
|
||||
if (value?.subSpecialistId) {
|
||||
handleFetchDoctors(value.subSpecialistId)
|
||||
}
|
||||
// handleFetchDoctors(props.subclassCode)
|
||||
}
|
||||
|
||||
async function handleEvent(menu: string, value?: any) {
|
||||
@@ -97,7 +95,7 @@ async function handleEvent(menu: string, value?: any) {
|
||||
isService: 'false',
|
||||
encounterId: props.id || null,
|
||||
sourcePath: route.path,
|
||||
resource: `${props.classCode}-${props.subClassCode}`,
|
||||
resource: `${props.classCode}-${props.subclassCode}`,
|
||||
...value,
|
||||
})
|
||||
} else if (menu === 'sep-number-changed') {
|
||||
@@ -213,7 +211,7 @@ onMounted(async () => {
|
||||
:is-action="true"
|
||||
:histories="histories"
|
||||
/>
|
||||
|
||||
|
||||
<!-- Footer Actions -->
|
||||
<div class="mt-6 flex justify-end gap-2 border-t border-t-slate-300 pt-4">
|
||||
<Button
|
||||
|
||||
@@ -35,7 +35,7 @@ import FilterForm from '~/components/app/encounter/filter-form.vue'
|
||||
// Props
|
||||
const props = defineProps<{
|
||||
classCode?: 'ambulatory' | 'emergency' | 'inpatient'
|
||||
subClassCode?: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk'
|
||||
subclassCode?: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk'
|
||||
canCreate?: boolean
|
||||
canUpdate?: boolean
|
||||
canDelete?: boolean
|
||||
@@ -172,8 +172,8 @@ async function getPatientList() {
|
||||
if (props.classCode) {
|
||||
params['class-code'] = props.classCode
|
||||
}
|
||||
if (props.subClassCode) {
|
||||
params['sub-class-code'] = props.subClassCode
|
||||
if (props.subclassCode) {
|
||||
params['subclass-code'] = props.subclassCode
|
||||
}
|
||||
const result = await getEncounterList(params)
|
||||
if (result.success) {
|
||||
|
||||
@@ -15,6 +15,8 @@ import CheckOutView from '~/components/app/encounter/check-out-view.vue'
|
||||
import CheckOutEntry from '~/components/app/encounter/check-out-entry.vue'
|
||||
import type { Encounter } from '~/models/encounter'
|
||||
import { checkIn } from '~/services/encounter.service'
|
||||
import { getServicePosition } from '~/lib/roles'
|
||||
import type { Item } from '~/components/pub/my-ui/combobox'
|
||||
|
||||
//
|
||||
const props = defineProps<{
|
||||
@@ -22,11 +24,24 @@ const props = defineProps<{
|
||||
canUpdate?: boolean
|
||||
}>()
|
||||
|
||||
//
|
||||
const { user } = useUserStore()
|
||||
const servicePosition = user.user_contractPosition_code == 'emp' ? getServicePosition('emp|'+user.employee_position_code) : null
|
||||
// const subClassCode = servicePosition == 'chemo' ? 'chemo' : null
|
||||
|
||||
// doctors
|
||||
const localEncounter = ref<Encounter>(props.encounter)
|
||||
const doctors = await getDoctorValueLabelList({'includes': 'employee,employee-person'}, true)
|
||||
const doctors = ref<Item[]>([])
|
||||
const employees = await getEmployeeValueLabelList({'includes': 'person', 'position-code': 'reg'})
|
||||
const units = await getUnitValueLabelList()
|
||||
const canUpdate = ref(true)
|
||||
|
||||
if (props.encounter.status_code == 'done') {
|
||||
canUpdate.value = false
|
||||
}
|
||||
if (canUpdate.value) {
|
||||
doctors.value = await getDoctorValueLabelList({'includes': 'employee,employee-person', 'unit-code': user.unit_code}, true)
|
||||
}
|
||||
|
||||
// check in
|
||||
const checkInValues = ref<any>({
|
||||
@@ -94,6 +109,7 @@ function submitCheckOut(values: CheckOutFormData) {
|
||||
</div>
|
||||
|
||||
<Dialog
|
||||
v-if="canUpdate"
|
||||
v-model:open="checkInDialogOpen"
|
||||
title="Ubah Informasi Masuk"
|
||||
size="md"
|
||||
@@ -103,7 +119,7 @@ function submitCheckOut(values: CheckOutFormData) {
|
||||
:schema="CheckInSchema"
|
||||
:values="checkInValues"
|
||||
:encounter="encounter"
|
||||
:doctors="doctors"
|
||||
:doctors="doctors || []"
|
||||
:employees="employees"
|
||||
:is-loading="checkInIsLoading"
|
||||
:is-readonly="checkInIsReadonly"
|
||||
@@ -113,6 +129,7 @@ function submitCheckOut(values: CheckOutFormData) {
|
||||
</Dialog>
|
||||
|
||||
<Dialog
|
||||
v-if="canUpdate"
|
||||
v-model:open="checkOutDialogOpen"
|
||||
title="Ubah Informasi Keluar"
|
||||
size="lg"
|
||||
|
||||
@@ -7,6 +7,14 @@ import SoapiList from './list.vue'
|
||||
import EarlyForm from './form.vue'
|
||||
import RehabForm from './form-rehab.vue'
|
||||
import FunctionForm from './form-function.vue'
|
||||
import type { Encounter } from '~/models/encounter'
|
||||
|
||||
interface Props {
|
||||
encounter: Encounter
|
||||
label: string
|
||||
canUpdate?: boolean
|
||||
}
|
||||
const props = defineProps<Props>()
|
||||
|
||||
const route = useRoute()
|
||||
const type = computed(() => (route.query.menu as string) || 'early-medical-assessment')
|
||||
@@ -23,8 +31,9 @@ const ActiveForm = computed(() => formMap[type.value] || EarlyForm)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- {{ type }} -->
|
||||
<div>
|
||||
<SoapiList v-if="mode === 'list'" />
|
||||
<SoapiList v-if="mode === 'list'" :label="label" :canUpdate="canUpdate" />
|
||||
<component
|
||||
v-else
|
||||
:is="ActiveForm"
|
||||
|
||||
@@ -21,6 +21,7 @@ import type { Encounter } from '~/models/encounter'
|
||||
interface Props {
|
||||
encounter: Encounter
|
||||
label: string
|
||||
canUpdate?: boolean
|
||||
}
|
||||
const props = defineProps<Props>()
|
||||
const emits = defineEmits(['add', 'edit'])
|
||||
@@ -58,10 +59,12 @@ const typeCode = ref('')
|
||||
const hreaderPrep: HeaderPrep = {
|
||||
title: props.label,
|
||||
icon: 'i-lucide-users',
|
||||
addNav: {
|
||||
}
|
||||
if(props.canUpdate) {
|
||||
hreaderPrep['addNav'] = {
|
||||
label: 'Tambah',
|
||||
onClick: () => goToEntry(),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const type = computed(() => (route.query.menu as string) || 'early-medical-assessment')
|
||||
@@ -169,6 +172,8 @@ provide('table_data_loader', isLoading)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- {{ canUpdate }}
|
||||
{{ hreaderPrep }} -->
|
||||
<Header
|
||||
:prep="{ ...hreaderPrep }"
|
||||
:ref-search-nav="refSearchNav"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export interface Item {
|
||||
value: string | number
|
||||
value: string
|
||||
label: string
|
||||
code?: string
|
||||
priority?: number
|
||||
|
||||
@@ -1,40 +1,33 @@
|
||||
<script setup lang="ts">
|
||||
const props = defineProps<{
|
||||
height?: number
|
||||
class?: string
|
||||
activeTab?: 1 | 2
|
||||
}>()
|
||||
|
||||
const classVal = computed(() => {
|
||||
return props.class ? props.class : ''
|
||||
})
|
||||
const activeTab = ref(props.activeTab || 1)
|
||||
|
||||
function handleClick(value: 1 | 2) {
|
||||
activeTab.value = value
|
||||
function switchActiveTab() {
|
||||
activeTab.value = activeTab.value === 1 ? 2 : 1
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="content-switcher" :style="`height: ${height || 200}px`">
|
||||
<div :class="`${activeTab === 1 ? 'active' : 'inactive'}`">
|
||||
<div class="content-wrapper">
|
||||
<div>
|
||||
<slot name="content1" />
|
||||
</div>
|
||||
<div :class="`content-switcher ${classVal}`" :style="height ? `height:${200}px` : ''">
|
||||
<div class="wrapper">
|
||||
<div :class="`item item-1 ${activeTab === 1 ? 'active' : 'inactive'}`">
|
||||
<slot name="content1" />
|
||||
</div>
|
||||
<div class="content-nav">
|
||||
<button @click="handleClick(1)">
|
||||
<Icon name="i-lucide-chevron-right" />
|
||||
<div :class="`nav border-slate-300 ${ activeTab == 1 ? 'border-l' : 'border-r'}`">
|
||||
<button @click="switchActiveTab()" class="!p-0 w-full h-full">
|
||||
<Icon :name="activeTab == 1 ? 'i-lucide-chevron-left' : 'i-lucide-chevron-right'" class="text-3xl" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div :class="`${activeTab === 2 ? 'active' : 'inactive'}`">
|
||||
<div class="content-nav">
|
||||
<button @click="handleClick(2)">
|
||||
<Icon name="i-lucide-chevron-left" />
|
||||
</button>
|
||||
</div>
|
||||
<div class="content-wrapper">
|
||||
<div>
|
||||
<slot name="content2" />
|
||||
</div>
|
||||
<div :class="`item item-2 ${activeTab === 2 ? 'active' : 'inactive'}`">
|
||||
<slot name="content2" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -42,45 +35,24 @@ function handleClick(value: 1 | 2) {
|
||||
|
||||
<style>
|
||||
.content-switcher {
|
||||
@apply flex overflow-hidden gap-3
|
||||
@apply overflow-hidden
|
||||
}
|
||||
.content-switcher > * {
|
||||
@apply border border-slate-300 rounded-md flex overflow-hidden
|
||||
.wrapper {
|
||||
@apply flex w-[200%] h-full
|
||||
}
|
||||
.item {
|
||||
@apply w-[calc(50%-60px)]
|
||||
}
|
||||
|
||||
.content-wrapper {
|
||||
@apply p-4 2xl:p-5 overflow-hidden grow
|
||||
.item-1.active {
|
||||
@apply ms-0 transition-all duration-500 ease-in-out
|
||||
}
|
||||
.inactive .content-wrapper {
|
||||
@apply p-0 w-0
|
||||
.item-1.inactive {
|
||||
@apply -ms-[calc(50%-60px)] transition-all duration-500 ease-in-out
|
||||
}
|
||||
|
||||
.content-nav {
|
||||
@apply h-full flex flex-row items-center justify-center content-center !text-2xl overflow-hidden
|
||||
.nav {
|
||||
@apply h-full w-[60px] flex flex-row items-center justify-center content-center !text-2xl overflow-hidden
|
||||
}
|
||||
|
||||
.content-nav button {
|
||||
@apply pt-2 px-2 h-full w-full
|
||||
}
|
||||
|
||||
/* .content-switcher .inactive > .content-wrapper {
|
||||
@apply w-0 p-0 opacity-0 transition-all duration-500 ease-in-out
|
||||
} */
|
||||
.content-switcher .inactive {
|
||||
@apply w-16 transition-all duration-500 ease-in-out
|
||||
}
|
||||
.content-switcher .inactive > .content-nav {
|
||||
@apply w-full transition-all duration-100 ease-in-out
|
||||
}
|
||||
|
||||
.content-switcher .active {
|
||||
@apply grow transition-all duration-500 ease-in-out
|
||||
}
|
||||
.content-switcher .active > .content-nav {
|
||||
@apply w-0 transition-all duration-100 ease-in-out
|
||||
}
|
||||
/* .content-switcher .active > .content-wrapper {
|
||||
@apply w-full delay-1000 transition-all duration-1000 ease-in-out
|
||||
} */
|
||||
|
||||
</style>
|
||||
|
||||
@@ -4,6 +4,9 @@ import { type EncounterItem } from "~/handlers/encounter-init.handler";
|
||||
const props = defineProps<{
|
||||
initialActiveMenu: string
|
||||
data: EncounterItem[]
|
||||
canCreate?: boolean
|
||||
canUpdate?: boolean
|
||||
canDelete?: boolean
|
||||
}>()
|
||||
|
||||
const activeMenu = ref(props.initialActiveMenu)
|
||||
@@ -38,7 +41,11 @@ function changeMenu(value: string) {
|
||||
class="flex-1 rounded-md border bg-white p-4 shadow-sm dark:bg-neutral-950">
|
||||
<component
|
||||
:is="data.find((m) => m.id === activeMenu)?.component"
|
||||
v-bind="data.find((m) => m.id === activeMenu)?.props" />
|
||||
v-bind="data.find((m) => m.id === activeMenu)?.props"
|
||||
:can-create="canCreate"
|
||||
:can-update="canUpdate"
|
||||
:can-delete="canDelete"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+36
-24
@@ -2,35 +2,47 @@ export const systemCode = 'system'
|
||||
|
||||
export const rehabInstCode = 'rehab'
|
||||
export const rehabUnitCode = 'rehab'
|
||||
export const chemoUnitCode = 'chemo'
|
||||
|
||||
export const headPosCode = 'head' // head position
|
||||
export const respPosCode = 'resp' // responsible position, verificator
|
||||
// Object keys are faster than array
|
||||
export const infraPositions: Record<string, boolean> = {
|
||||
'head': true,
|
||||
'resp': true,
|
||||
'doc': true,
|
||||
'nur':true
|
||||
}
|
||||
export type InfraPositionCode = keyof typeof infraPositions
|
||||
|
||||
export type UnitLevel =
|
||||
'inst' | // installation
|
||||
'unit' | // unit / poly
|
||||
'spec' | // specialist
|
||||
'subspec' // subspecialist
|
||||
export const servicePositioons: Record<string, boolean> = {
|
||||
'none': true,
|
||||
'reg': true,
|
||||
'scr': true,
|
||||
'med': true,
|
||||
}
|
||||
export type ServicePositionCode = keyof typeof servicePositioons
|
||||
|
||||
export const medicalRoles = [
|
||||
'emp|doc', // doctor
|
||||
'emp|nur', // nurse
|
||||
'emp|miw', // midwife
|
||||
'emp|thr', // therapist
|
||||
'emp|nut', // nutritionist
|
||||
'emp|pha', // pharmacy
|
||||
'emp|lab' // laborant
|
||||
]
|
||||
export const medicalRoles: Record<string, boolean> = {
|
||||
'emp|doc': true, // doctor
|
||||
'emp|nur': true, // nurse
|
||||
'emp|miw': true, // midwife
|
||||
'emp|thr': true, // therapist
|
||||
'emp|nut': true, // nutritionist
|
||||
'emp|pha': true, // pharmacy
|
||||
'emp|lab': true // laborant
|
||||
}
|
||||
export type MedicalRoleCode = keyof typeof medicalRoles
|
||||
|
||||
export const serviceRoles = [
|
||||
'emp|reg',
|
||||
export const serviceRoles: Record<string, boolean> = {
|
||||
'emp|reg': true,
|
||||
'emp|scr': true,
|
||||
...medicalRoles,
|
||||
]
|
||||
|
||||
export function genSpecHeadCode(unit_level: UnitLevel, unit_code: string): string {
|
||||
return `${unit_level}|${unit_code}|${headPosCode}`
|
||||
}
|
||||
export type ServiceRoleCode = keyof typeof serviceRoles
|
||||
|
||||
export function genUnitRespCode(unit_level: UnitLevel, unit_code: string): string {
|
||||
return `${unit_level}|${unit_code}|${respPosCode}`
|
||||
export const unitLevels: Record<string, boolean> = {
|
||||
'inst': true, // installation
|
||||
'unit': true, // unit / poly
|
||||
'spec': true, // specialist
|
||||
'subspec': true, // subspecialist
|
||||
}
|
||||
export type UnitLevel = keyof typeof unitLevels
|
||||
|
||||
@@ -20,6 +20,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/add': {
|
||||
'emp|reg': ['C', 'R', 'U', 'D'],
|
||||
@@ -34,6 +35,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/edit': {
|
||||
'emp|reg': ['C', 'R', 'U', 'D'],
|
||||
@@ -47,6 +49,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=status': {
|
||||
'emp|doc': ['R'],
|
||||
@@ -57,6 +60,18 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=rehab-medical-assessment': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=early-medical-assessment': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -67,8 +82,20 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=fkr': {
|
||||
'/ambulatory/encounter/[id]/process?menu=early-nurse-assessment': {
|
||||
'emp|doc': ['R'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=kfr': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R'],
|
||||
'emp|thr': ['R'],
|
||||
@@ -77,6 +104,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=education-assessment': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -87,6 +115,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=general-consent': {
|
||||
'emp|doc': ['R'],
|
||||
@@ -97,6 +126,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=patient-amb-note': {
|
||||
'emp|doc': ['R'],
|
||||
@@ -107,6 +137,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=prescription': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -117,6 +148,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=device-order': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -127,6 +159,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=radiology-order': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -137,6 +170,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=cp-lab-order': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -147,6 +181,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=micro-lab-order': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -157,6 +192,7 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=ap-lab-order': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
@@ -167,6 +203,161 @@ export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=inpatient-letter': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=reference-back': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=procedure-room-order': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=mcu-result': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=action-report': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=surgery-report': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=vaccine-data': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=consultation': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=control-letter': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R', 'U'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=screening': {
|
||||
'emp|doc': ['R'],
|
||||
'emp|nur': ['R'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R', 'U'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=supporting-document': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=resume': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=amb-resume': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/encounter/[id]/process?menu=price-list': {
|
||||
'emp|doc': ['R', 'U'],
|
||||
'emp|nur': ['R'],
|
||||
'emp|thr': ['R'],
|
||||
'emp|miw': ['R'],
|
||||
'emp|nut': ['R'],
|
||||
'emp|pha': ['R'],
|
||||
'emp|lab': ['R'],
|
||||
'emp|rad': ['R'],
|
||||
'emp|scr': ['R'],
|
||||
},
|
||||
'/ambulatory/consulation': {
|
||||
'emp|doc': ['R'],
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import type { Permission } from "~/models/role";
|
||||
|
||||
// Should we define the keys first?
|
||||
// export type Keys = 'key1' | 'key2' | 'key3' | etc
|
||||
|
||||
export const permissions: Record<string, Record<string, Permission[]>> = {
|
||||
'/client/patient': {
|
||||
'emp|reg': ['C','R','U','D'],
|
||||
},
|
||||
'/client/patient/add': {
|
||||
'emp|reg': ['C','R','U','D'],
|
||||
},
|
||||
'/client/patient/{id}': {
|
||||
'emp|reg': ['C','R','U','D'],
|
||||
},
|
||||
}
|
||||
@@ -44,7 +44,7 @@ import {
|
||||
export function useEncounterEntry(props: {
|
||||
id: number
|
||||
classCode?: 'ambulatory' | 'emergency' | 'inpatient' | 'outpatient'
|
||||
subClassCode?: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk'
|
||||
subclassCode?: 'reg' | 'rehab' | 'chemo' | 'emg' | 'eon' | 'op' | 'icu' | 'hcu' | 'vk'
|
||||
}) {
|
||||
const route = useRoute()
|
||||
const userStore = useUserStore()
|
||||
@@ -294,24 +294,42 @@ export function useEncounterEntry(props: {
|
||||
}
|
||||
}
|
||||
|
||||
async function handleFetchDoctors(subSpecialistId: string | null = null) {
|
||||
async function handleFetchDoctors(unit?: string, specialist_code?: string, subSpecialist_code?: string) {
|
||||
try {
|
||||
const filterParams: any = { 'page-size': 100, includes: 'employee-Person,unit,specialist,subspecialist' }
|
||||
|
||||
if (!subSpecialistId) {
|
||||
doctorsList.value = await getDoctorValueLabelList(filterParams, true)
|
||||
return
|
||||
const filterParams: Record<string, any> = {
|
||||
'page-size': 100,
|
||||
includes: 'employee-Person,unit,specialist,subspecialist'
|
||||
}
|
||||
|
||||
const isSub = getIsSubspecialist(subSpecialistId, specialistsTree.value)
|
||||
|
||||
if (isSub) {
|
||||
filterParams['subspecialist-id'] = subSpecialistId
|
||||
} else {
|
||||
filterParams['specialist-id'] = subSpecialistId
|
||||
// rehab is special
|
||||
if (unit) {
|
||||
if (unit == 'rehab') {
|
||||
filterParams['unit-code'] = 'rehab'
|
||||
} else {
|
||||
filterParams['unit-code'] = 'rehab'
|
||||
filterParams['unit-code-opt'] = 'ne'
|
||||
}
|
||||
}
|
||||
|
||||
if (specialist_code) {
|
||||
if (specialist_code == 'rehab') {
|
||||
filterParams['specialist-code'] = 'rehab'
|
||||
} else {
|
||||
filterParams['specialist-code'] = 'rehab'
|
||||
filterParams['specialist-code-opt'] = 'ne'
|
||||
}
|
||||
}
|
||||
if (subSpecialist_code) filterParams['subspecialist-code'] = subSpecialist_code
|
||||
doctorsList.value = await getDoctorValueLabelList(filterParams, true)
|
||||
|
||||
// const isSub = getIsSubspecialist(subSpecialistId, specialistsTree.value)
|
||||
|
||||
// if (isSub) {
|
||||
// filterParams['subspecialist-id'] = subSpecialistId
|
||||
// } else {
|
||||
// filterParams['specialist-id'] = subSpecialistId
|
||||
// }
|
||||
|
||||
// doctorsList.value = await getDoctorValueLabelList(filterParams, true)
|
||||
} catch (error) {
|
||||
console.error('Error fetching doctors:', error)
|
||||
doctorsList.value = []
|
||||
@@ -332,7 +350,7 @@ export function useEncounterEntry(props: {
|
||||
value: item.toString(),
|
||||
label: participantGroups[item],
|
||||
})) as any
|
||||
await handleFetchDoctors()
|
||||
await handleFetchDoctors(props.subclassCode)
|
||||
await handleFetchSpecialists()
|
||||
if (route.query) {
|
||||
formObjects.value = { ...formObjects.value }
|
||||
@@ -537,7 +555,7 @@ export function useEncounterEntry(props: {
|
||||
patient_id: patientId,
|
||||
appointment_doctor_code: formValues.doctor_code || null,
|
||||
class_code: props.classCode || '',
|
||||
subClass_code: props.subClassCode || '',
|
||||
subClass_code: props.subclassCode || '',
|
||||
infra_id: formValues.infra_id ?? null,
|
||||
unit_code: formValues.unitCode ?? userStore?.user?.unit_code ?? null,
|
||||
refSource_name: formValues.refSource_name ?? 'RSSA',
|
||||
|
||||
@@ -30,13 +30,12 @@ export interface EncounterListData {
|
||||
}
|
||||
|
||||
const StatusAsync = defineAsyncComponent(() => import('~/components/content/encounter/status.vue'))
|
||||
const AssesmentFunctionListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
|
||||
const EarlyMedicalRehabAssessmentListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
|
||||
const EarlyMedicalAssesmentListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
|
||||
const EarlyMedicalRehabListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
|
||||
const initialNursesAssessmentAsync = defineAsyncComponent(() => import('~/components/content/initial-nursing/entry.vue'))
|
||||
const AssesmentFunctionListAsync = defineAsyncComponent(() => import('~/components/content/soapi/entry.vue'))
|
||||
const ChemoProtocolListAsync = defineAsyncComponent(() => import('~/components/app/chemotherapy/list.protocol.vue'))
|
||||
const ChemoMedicineProtocolListAsync = defineAsyncComponent(
|
||||
() => import('~/components/app/chemotherapy/list.medicine.vue'),
|
||||
)
|
||||
const ChemoMedicineProtocolListAsync = defineAsyncComponent(() => import('~/components/app/chemotherapy/list.medicine.vue'))
|
||||
const DeviceOrderAsync = defineAsyncComponent(() => import('~/components/content/device-order/main.vue'))
|
||||
const PrescriptionAsync = defineAsyncComponent(() => import('~/components/content/prescription/main.vue'))
|
||||
const CpLabOrderAsync = defineAsyncComponent(() => import('~/components/content/cp-lab-order/main.vue'))
|
||||
@@ -54,7 +53,6 @@ const KfrListAsync = defineAsyncComponent(() => import('~/components/content/kfr
|
||||
const PrbListAsync = defineAsyncComponent(() => import('~/components/content/prb/list.vue'))
|
||||
const SurgeryReportListAsync = defineAsyncComponent(() => import('~/components/content/surgery-report/list.vue'))
|
||||
const VaccineDataListAsync = defineAsyncComponent(() => import('~/components/content/vaccine-data/list.vue'))
|
||||
const InitialNursingStudyAsync = defineAsyncComponent(() => import('~/components/content/initial-nursing/entry.vue'))
|
||||
const AssessmentEducationEntryAsync = defineAsyncComponent(
|
||||
() => import('~/components/content/assessment-education/entry.vue'),
|
||||
)
|
||||
@@ -68,12 +66,6 @@ const defaultKeys: Record<string, any> = {
|
||||
classCode: ['ambulatory', 'emergency', 'inpatient'],
|
||||
unit: 'all',
|
||||
},
|
||||
// earlyNurseryAssessment: {
|
||||
// id: 'early-nursery-assessment',
|
||||
// title: 'Pengkajian Awal Keperawatan',
|
||||
// classCode: ['ambulatory', 'emergency', 'inpatient'],
|
||||
// unit: 'all',
|
||||
// },
|
||||
earlyMedicalAssessment: {
|
||||
id: 'early-medical-assessment',
|
||||
title: 'Pengkajian Awal Medis',
|
||||
@@ -87,28 +79,15 @@ const defaultKeys: Record<string, any> = {
|
||||
unit: 'rehab',
|
||||
afterId: 'early-medical-assessment',
|
||||
},
|
||||
functionAssessment: {
|
||||
id: 'function-assessment',
|
||||
title: 'Asesmen Fungsi',
|
||||
classCode: ['ambulatory'],
|
||||
unit: 'rehab',
|
||||
afterId: 'rehab-medical-assessment',
|
||||
},
|
||||
// therapyProtocol: {
|
||||
// id: 'therapy-protocol',
|
||||
// classCode: ['ambulatory'],
|
||||
// title: 'Protokol Terapi',
|
||||
// unit: 'rehab',
|
||||
// afterId: 'function-assessment',
|
||||
initialNursingStudy: {
|
||||
id: 'initial-nursing-study',
|
||||
initialNursesAssessment: {
|
||||
id: 'early-nurse-assessment',
|
||||
title: 'Kajian Awal Keperawatan',
|
||||
classCode: ['ambulatory', 'emergency', 'inpatient'],
|
||||
unit: 'all',
|
||||
},
|
||||
fkr: {
|
||||
id: 'fkr',
|
||||
title: 'FKR',
|
||||
kfr: {
|
||||
id: 'kfr',
|
||||
title: 'KFR',
|
||||
classCode: ['ambulatory', 'emergency', 'inpatient'],
|
||||
unit: 'all',
|
||||
},
|
||||
@@ -234,12 +213,6 @@ const defaultKeys: Record<string, any> = {
|
||||
classCode: ['ambulatory', 'emergency'],
|
||||
unit: 'all',
|
||||
},
|
||||
kfr: {
|
||||
id: 'kfr',
|
||||
title: 'KFR',
|
||||
classCode: ['ambulatory', 'emergency', 'inpatient'],
|
||||
unit: 'all',
|
||||
},
|
||||
refBack: {
|
||||
id: 'reference-back',
|
||||
title: 'PRB',
|
||||
@@ -276,7 +249,7 @@ const defaultKeys: Record<string, any> = {
|
||||
classCode: ['ambulatory', 'emergency', 'inpatient'],
|
||||
unit: 'all',
|
||||
},
|
||||
// initialNursingStudy: {
|
||||
// initialNursesAssessment: {
|
||||
// id: 'initial-nursing-study',
|
||||
// title: 'Kajian Awal Keperawatan',
|
||||
// classCode: ['ambulatory', 'emergency', 'inpatient'],
|
||||
@@ -335,7 +308,7 @@ export function injectComponents(id: string | number, data: EncounterListData, m
|
||||
}
|
||||
}
|
||||
if (currentKeys?.earlyMedicalRehabAssessment) {
|
||||
currentKeys.earlyMedicalRehabAssessment['component'] = EarlyMedicalRehabListAsync
|
||||
currentKeys.earlyMedicalRehabAssessment['component'] = EarlyMedicalRehabAssessmentListAsync
|
||||
currentKeys.earlyMedicalRehabAssessment['props'] = {
|
||||
encounter: data?.encounter,
|
||||
type: 'early-rehab',
|
||||
@@ -464,12 +437,10 @@ export function injectComponents(id: string | number, data: EncounterListData, m
|
||||
currentKeys.priceList['component'] = null
|
||||
currentKeys.priceList['props'] = { encounter_id: id }
|
||||
}
|
||||
|
||||
if (currentKeys?.initialNursingStudy) {
|
||||
currentKeys.initialNursingStudy['component'] = InitialNursingStudyAsync
|
||||
currentKeys.initialNursingStudy['props'] = { encounter: data?.encounter }
|
||||
if (currentKeys?.initialNursesAssessment) {
|
||||
currentKeys.initialNursesAssessment['component'] = initialNursesAssessmentAsync
|
||||
currentKeys.initialNursesAssessment['props'] = { encounter: data?.encounter }
|
||||
}
|
||||
|
||||
if (currentKeys?.actionReport) {
|
||||
currentKeys.actionReport['component'] = ActionReportEntryAsync
|
||||
currentKeys.actionReport['props'] = {
|
||||
@@ -533,6 +504,9 @@ export function mapResponseToEncounter(result: any): any {
|
||||
? result.visitDate
|
||||
: result.registeredAt || result.patient?.registeredAt || null,
|
||||
adm_employee_id: result.adm_employee_id || 0,
|
||||
adm_employee: result.adm_employee || null,
|
||||
responsible_nurse_id: result.responsible_nurse_id || null,
|
||||
responsible_nurse: result.responsible_nurse || null,
|
||||
appointment_doctor_id: result.appointment_doctor_id || null,
|
||||
responsible_doctor_id: result.responsible_doctor_id || null,
|
||||
appointment_doctor: result.appointment_doctor || null,
|
||||
@@ -595,7 +569,7 @@ export function getMenuItems(id: string | number, props: any, user: any, data: E
|
||||
const currentUnitItems: any = currentListItems[`${unitCode}`]
|
||||
if (!currentUnitItems) return []
|
||||
let menus = []
|
||||
if (currentUnitItems.roles && currentUnitItems.roles?.includes(user.activeRole)) {
|
||||
if (currentUnitItems.roles && currentUnitItems.roles && user.activeRole in currentUnitItems.roles) {
|
||||
menus = [...currentUnitItems.items]
|
||||
} else {
|
||||
menus = unitCode !== 'all' && currentUnitItems?.items ? [...currentUnitItems.items] : [...currentUnitItems]
|
||||
|
||||
+15
-5
@@ -1,16 +1,26 @@
|
||||
import { medicalRoles, respPosCode } from '~/const/common/role'
|
||||
import type { UnitLevel, ServicePositionCode } from '~/const/common/role'
|
||||
import { medicalRoles, infraPositions } from '~/const/common/role'
|
||||
|
||||
export function getServicePosition(role?: string): string {
|
||||
export function getServicePosition(role?: string): ServicePositionCode {
|
||||
if(!role) {
|
||||
return 'none'
|
||||
}
|
||||
if (medicalRoles.includes(role)) {
|
||||
return 'medical'
|
||||
if (role in medicalRoles) {
|
||||
return 'med'
|
||||
} else if (role === 'emp|reg') {
|
||||
return 'registration'
|
||||
return 'reg'
|
||||
} else if (role.includes('|resp')) {
|
||||
return 'verificator'
|
||||
} else {
|
||||
return 'none'
|
||||
}
|
||||
}
|
||||
|
||||
export function genSpecHeadCode(unit_level: UnitLevel, unit_code: string): string {
|
||||
return `${unit_level}|${unit_code}|${infraPositions.head}`
|
||||
}
|
||||
|
||||
export function genUnitRespCode(unit_level: UnitLevel, unit_code: string): string {
|
||||
return `${unit_level}|${unit_code}|${infraPositions.resp}`
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ export function genEncounter(): Encounter {
|
||||
patient: genPatient(),
|
||||
registeredAt: '',
|
||||
class_code: '',
|
||||
unit_code: 0,
|
||||
unit_code: '',
|
||||
unit: genUnit(),
|
||||
visitDate: '',
|
||||
adm_employee_id: 0,
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { type Base, genBase } from "./_base"
|
||||
import type { Employee } from "./employee"
|
||||
|
||||
export interface Nurse extends Base {
|
||||
employee_id: number
|
||||
employee?: Employee
|
||||
ihs_number?: string
|
||||
unit_id: number
|
||||
infra_id: number
|
||||
|
||||
@@ -31,12 +31,12 @@ useHead({
|
||||
const route = useRoute()
|
||||
const menu = computed(() => route.query.menu as string | undefined)
|
||||
const accessKey = computed(() => `/ambulatory/encounter/[id]/process` + (menu.value ? `?menu=${menu.value}` : ''))
|
||||
const roleAccess: Record<string, Permission[]> = permissions[accessKey.value] || {}
|
||||
const hasAccess = getPageAccess(roleAccess, 'read') || true
|
||||
const canCreate = hasCreateAccess(roleAccess)
|
||||
const canRead = hasReadAccess(roleAccess)
|
||||
const canUpdate = hasUpdateAccess(roleAccess)
|
||||
const canDelete = hasDeleteAccess(roleAccess)
|
||||
const roleAccess = computed(() => permissions[accessKey.value] || {})
|
||||
const hasAccess = computed(() => getPageAccess(roleAccess.value, 'read'))
|
||||
const canCreate = computed(() => getPageAccess(roleAccess.value, 'create'))
|
||||
const canRead = computed(() => getPageAccess(roleAccess.value, 'read'))
|
||||
const canUpdate = computed(() => getPageAccess(roleAccess.value, 'update'))
|
||||
const canDelete = computed(() => getPageAccess(roleAccess.value, 'delete'))
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -5,6 +5,7 @@ import { permissions } from '~/const/page-permission/ambulatory'
|
||||
|
||||
// Helpers
|
||||
import { usePageChecker } from "~/lib/page-checker"
|
||||
import { getServicePosition } from '~/lib/roles'
|
||||
|
||||
// Pubs
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
@@ -28,6 +29,19 @@ useHead({
|
||||
// Preps role checking
|
||||
const roleAccess: Record<string, Permission[]> = permissions['/ambulatory/encounter/add'] || {}
|
||||
const hasAccess = getPageAccess(roleAccess, 'create')
|
||||
|
||||
// TODO: Make a function for this
|
||||
const { user } = useUserStore()
|
||||
const servicePosition = user.user_contractPosition_code == 'emp' ? getServicePosition('emp|'+user.employee_position_code) : null
|
||||
const subClassCode = servicePosition == 'med' ?
|
||||
// medic
|
||||
(user.unit_code == 'rehab' ? 'rehab' : 'reg') :
|
||||
// non medic
|
||||
(
|
||||
user.employee_position_code == 'reg' ?
|
||||
(user.installation_code == 'rehab' ? 'rehab' : 'reg') :
|
||||
undefined
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -35,7 +49,7 @@ const hasAccess = getPageAccess(roleAccess, 'create')
|
||||
<Content
|
||||
:id="0"
|
||||
class-code="ambulatory"
|
||||
sub-class-code="reg"
|
||||
:subclass-code="subClassCode"
|
||||
form-type="add"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -11,6 +11,7 @@ import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
|
||||
// Apps
|
||||
import Content from '~/components/content/encounter/list.vue'
|
||||
import { getServicePosition } from '~/lib/roles'
|
||||
|
||||
const { getRouteTitle, getPageAccess } = usePageChecker()
|
||||
|
||||
@@ -37,15 +38,28 @@ const canRemove = getPageAccess(roleAccess, 'delete')
|
||||
|
||||
// User info
|
||||
const { user } = useUserStore()
|
||||
const subClassCode = user.unit_code == 'rehab' ? 'rehab' : 'reg'
|
||||
// TODO: Make a function for this
|
||||
const servicePosition = user.user_contractPosition_code == 'emp' ? getServicePosition('emp|'+user.employee_position_code) : null
|
||||
const subClassCode = servicePosition == 'med' ?
|
||||
// medic
|
||||
(user.unit_code == 'rehab' ? 'rehab' : 'reg') :
|
||||
// non medic
|
||||
(
|
||||
user.employee_position_code == 'reg' ?
|
||||
(user.installation_code == 'rehab' ? 'rehab' : 'reg') :
|
||||
undefined
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
{{ user.employee_position_code }}---<br />
|
||||
{{ servicePosition }}---<br />
|
||||
{{ subClassCode }}---
|
||||
<div v-if="hasAccess">
|
||||
<Content
|
||||
class-code="ambulatory"
|
||||
:sub-class-code="subClassCode"
|
||||
:subclass-code="subClassCode"
|
||||
:can-create="canCreate"
|
||||
:can-delete="canRemove"
|
||||
/>
|
||||
|
||||
+23
-13
@@ -1,23 +1,19 @@
|
||||
<script setup lang="ts">
|
||||
import type { Permission } from '~/models/role'
|
||||
import { permissions } from '~/const/page-permission/chemoteraphy'
|
||||
import { permissions } from '~/const/page-permission/ambulatory'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
|
||||
import Content from '~/components/content/encounter/list.vue'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Daftar Kempterapi',
|
||||
roles: ['room|resp'],
|
||||
title: 'Daftar Kunjungan',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: Record<string, Permission[]> = permissions['/chemotherapy'] || {}
|
||||
|
||||
// Preps role checking
|
||||
const roleAccess: Record<string, Permission[]> = permissions['/outpatient/encounter'] || {}
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
@@ -28,13 +24,27 @@ if (!hasAccess) {
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canRead = hasReadAccess(roleAccess)
|
||||
console.log('canRead', canRead)
|
||||
|
||||
// Page needs
|
||||
const route = useRoute()
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="canRead">
|
||||
<ContentChemotherapyList />
|
||||
<Content
|
||||
class-code="ambulatory"
|
||||
sub-class-code="chemo"
|
||||
type="encounter"
|
||||
/>
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
<Error
|
||||
v-else
|
||||
:status-code="403"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,7 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import type { RoleAccesses } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
import { permissions } from '~/const/page-permission/client'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
@@ -16,7 +16,7 @@ useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: RoleAccesses = PAGE_PERMISSIONS['/client/patient']
|
||||
const roleAccess: RoleAccesses = permissions['/client/patient/add'] ?? {}
|
||||
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Tambah Assessment Education',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/patient']
|
||||
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
// const hasAccess = checkRole(roleAccess)
|
||||
const hasAccess = true
|
||||
if (!hasAccess) {
|
||||
navigateTo('/403')
|
||||
}
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canRead = hasReadAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="canRead">
|
||||
<ContentAssessmentEducationAdd />
|
||||
</div>
|
||||
<Error
|
||||
v-else
|
||||
:status-code="403"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,44 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Protokol Terapi',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentKfrEntry mode="edit" />
|
||||
</div>
|
||||
<Error
|
||||
v-else
|
||||
:status-code="403"
|
||||
/>
|
||||
</template>
|
||||
@@ -1,44 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Protokol Terapi',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentKfrEntry />
|
||||
</div>
|
||||
<Error
|
||||
v-else
|
||||
:status-code="403"
|
||||
/>
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Update PRB',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/patient']
|
||||
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
// const canRead = hasReadAccess(roleAccess)
|
||||
const canRead = true
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="canRead">
|
||||
<ContentPrbEntry />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Detail PRB',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/patient']
|
||||
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
// const canRead = hasReadAccess(roleAccess)
|
||||
const canRead = true
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="canRead">
|
||||
<ContentPrbDetail :patient-id="Number(route.params.id)" />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Tambah PRB',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, getPagePermissions } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const pagePermission = getPagePermissions(roleAccess)
|
||||
const callbackUrl = route.query['return-path'] as string | undefined
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="pagePermission.canRead">
|
||||
<ContentPrbEntry :callback-url="callbackUrl" />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,42 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
import EncounterProcess from '~/components/content/encounter/process.vue'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Tambah Kunjungan',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess, getPagePermissions } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const pagePermission = getPagePermissions(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="pagePermission.canRead">
|
||||
<EncounterProcess class-code="ambulatory" sub-class-code="rehab" />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Update Surat Kontrol',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/patient']
|
||||
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
// const canRead = hasReadAccess(roleAccess)
|
||||
const canRead = true
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="canRead">
|
||||
<ContentSurgeryReportEntry />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
-41
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Detail Surat Kontrol',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/patient']
|
||||
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
// const canRead = hasReadAccess(roleAccess)
|
||||
const canRead = true
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="canRead">
|
||||
<ContentSurgeryReportDetail :patient-id="Number(route.params.id)" />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Tambah Surat Kontrol',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, getPagePermissions } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const pagePermission = getPagePermissions(roleAccess)
|
||||
const callbackUrl = route.query['return-path'] as string | undefined
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="pagePermission.canRead">
|
||||
<ContentSurgeryReportEntry :callback-url="callbackUrl" />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
-44
@@ -1,44 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Protokol Terapi',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentTherapyProtocolEdit />
|
||||
</div>
|
||||
<Error
|
||||
v-else
|
||||
:status-code="403"
|
||||
/>
|
||||
</template>
|
||||
@@ -1,44 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Protokol Terapi',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentTherapyProtocolAdd />
|
||||
</div>
|
||||
<Error
|
||||
v-else
|
||||
:status-code="403"
|
||||
/>
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Detail Data Vaksin',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS[`/rehab/encounter`]
|
||||
|
||||
const { checkRole, hasReadAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
// const canRead = hasReadAccess(roleAccess)
|
||||
const canRead = true
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="canRead">
|
||||
<ContentVaccineDataDetail :patient-id="Number(route.params.id)" />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Tambah Data Vaksin',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => route.meta.title as string,
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, getPagePermissions } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// navigateTo('/403')
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const pagePermission = getPagePermissions(roleAccess)
|
||||
const callbackUrl = route.query['return-path'] as string | undefined
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="pagePermission.canRead">
|
||||
<ContentVaccineDataEntry :callback-url="callbackUrl" />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</div>
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Resume',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentResumeAdd />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Detail Protokol Terapi',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentTherapyProtocolDetail/>
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Edit Protokol Terapi',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentTherapyProtocolEdit />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</template>
|
||||
@@ -1,41 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import type { PagePermission } from '~/models/role'
|
||||
import Error from '~/components/pub/my-ui/error/error.vue'
|
||||
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
|
||||
|
||||
definePageMeta({
|
||||
middleware: ['rbac'],
|
||||
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
|
||||
title: 'Tambah Protokol Terapi',
|
||||
contentFrame: 'cf-full-width',
|
||||
})
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
useHead({
|
||||
title: () => `${route.meta.title}`, // backtick to avoid the ts-plugin(2322) warning
|
||||
})
|
||||
|
||||
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
|
||||
|
||||
const { checkRole, hasCreateAccess } = useRBAC()
|
||||
|
||||
// Check if user has access to this page
|
||||
const hasAccess = checkRole(roleAccess)
|
||||
// if (!hasAccess) {
|
||||
// throw createError({
|
||||
// statusCode: 403,
|
||||
// statusMessage: 'Access denied',
|
||||
// })
|
||||
// }
|
||||
|
||||
// Define permission-based computed properties
|
||||
const canCreate = true // hasCreateAccess(roleAccess)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="canCreate">
|
||||
<ContentTherapyProtocolAdd />
|
||||
</div>
|
||||
<Error v-else :status-code="403" />
|
||||
</template>
|
||||
@@ -20,6 +20,11 @@
|
||||
"title": "Konsultasi",
|
||||
"icon": "i-lucide-building-2",
|
||||
"link": "/ambulatory/consultation"
|
||||
},
|
||||
{
|
||||
"title": "Triase",
|
||||
"icon": "i-lucide-stethoscope",
|
||||
"link": "/ambulatory/triage"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -47,7 +52,42 @@
|
||||
{
|
||||
"title": "Kemoterapi",
|
||||
"icon": "i-lucide-droplets",
|
||||
"link": "/chemotherapy"
|
||||
"link": "/chemotherapy",
|
||||
"children": [
|
||||
{
|
||||
"title": "Administrasi",
|
||||
"link": "/chemotherapy/early-encounter"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/chemotherapy/encounter"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Hemofilia",
|
||||
"icon": "i-lucide-droplet-off",
|
||||
"link": "/hemophilia"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"heading": "Ruang Tindakan Anak",
|
||||
"items": [
|
||||
{
|
||||
"title": "Thalasemi",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/thalasemia"
|
||||
},
|
||||
{
|
||||
"title": "Echocardiography",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/echocardiography"
|
||||
},
|
||||
{
|
||||
"title": "Spirometri",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/spirometry"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
[
|
||||
{
|
||||
"heading": "Menu Utama",
|
||||
"items": [
|
||||
{
|
||||
"title": "Dashboard",
|
||||
"icon": "i-lucide-home",
|
||||
"link": "/"
|
||||
},
|
||||
{
|
||||
"title": "Rawat Jalan",
|
||||
"icon": "i-lucide-stethoscope",
|
||||
"children": [
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"icon": "i-lucide-stethoscope",
|
||||
"link": "/ambulatory/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"icon": "i-lucide-building-2",
|
||||
"link": "/ambulatory/consultation"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "IGD",
|
||||
"icon": "i-lucide-zap",
|
||||
"children": [
|
||||
{
|
||||
"title": "Triase",
|
||||
"icon": "i-lucide-stethoscope",
|
||||
"link": "/emergency/triage"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"icon": "i-lucide-building-2",
|
||||
"link": "/emergency/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"icon": "i-lucide-building-2",
|
||||
"link": "/emergency/consultation"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Rawat Inap",
|
||||
"icon": "i-lucide-building-2",
|
||||
"children": [
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"icon": "i-lucide-building-2",
|
||||
"link": "/inpatient/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"icon": "i-lucide-building-2",
|
||||
"link": "/inpatient/consultation"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"heading": "Ruang Tindakan Rajal",
|
||||
"items": [
|
||||
{
|
||||
"title": "Kemoterapi",
|
||||
"icon": "i-lucide-droplets",
|
||||
"link": "/chemotherapy"
|
||||
},
|
||||
{
|
||||
"title": "Hemofilia",
|
||||
"icon": "i-lucide-droplet-off",
|
||||
"link": "/hemophilia"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"heading": "Ruang Tindakan Anak",
|
||||
"items": [
|
||||
{
|
||||
"title": "Thalasemi",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/thalasemia"
|
||||
},
|
||||
{
|
||||
"title": "Echocardiography",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/echocardiography"
|
||||
},
|
||||
{
|
||||
"title": "Spirometri",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/spirometry"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -12,16 +12,6 @@
|
||||
"icon": "i-lucide-stethoscope",
|
||||
"link": "/ambulatory/encounter"
|
||||
},
|
||||
{
|
||||
"title": "IGD",
|
||||
"icon": "i-lucide-zap",
|
||||
"link": "/emergency/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Rehabilitasi Medik",
|
||||
"icon": "i-lucide-bike",
|
||||
"link": "/rehab/encounter-queue"
|
||||
},
|
||||
{
|
||||
"title": "Rawat Inap",
|
||||
"icon": "i-lucide-building-2",
|
||||
@@ -18,20 +18,10 @@
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/ambulatory/encounter"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "IGD",
|
||||
"icon": "i-lucide-zap",
|
||||
"children": [
|
||||
{
|
||||
"title": "Triase",
|
||||
"link": "/emergency/triage"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/emergency/encounter"
|
||||
"title": "Triase",
|
||||
"link": "/ambulatory/triage"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -1,350 +0,0 @@
|
||||
[
|
||||
{
|
||||
"heading": "Menu Utama",
|
||||
"items": [
|
||||
{
|
||||
"title": "Dashboard",
|
||||
"icon": "i-lucide-home",
|
||||
"link": "/"
|
||||
},
|
||||
{
|
||||
"title": "Rawat Jalan",
|
||||
"icon": "i-lucide-stethoscope",
|
||||
"children": [
|
||||
{
|
||||
"title": "Antrian Pendaftaran",
|
||||
"link": "/ambulatory/registration-queue"
|
||||
},
|
||||
{
|
||||
"title": "Antrian Poliklinik",
|
||||
"link": "/ambulatory/encounter-queue"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/ambulatory/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"link": "/ambulatory/consultation"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "IGD",
|
||||
"icon": "i-lucide-zap",
|
||||
"children": [
|
||||
{
|
||||
"title": "Triase",
|
||||
"link": "/emergency/triage"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/emergency/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"link": "/emergency/consultation"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Rawat Inap",
|
||||
"icon": "i-lucide-building-2",
|
||||
"children": [
|
||||
{
|
||||
"title": "Permintaan",
|
||||
"link": "/inpatient/request"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/inpatient/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"link": "/inpatient/consultation"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Obat - Order",
|
||||
"icon": "i-lucide-briefcase-medical",
|
||||
"children": [
|
||||
{
|
||||
"title": "Permintaan",
|
||||
"link": "/medication/order"
|
||||
},
|
||||
{
|
||||
"title": "Standing Order",
|
||||
"link": "/medication/standing-order"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Radiologi - Order",
|
||||
"icon": "i-lucide-radio",
|
||||
"link": "/radiology-order"
|
||||
},
|
||||
{
|
||||
"title": "Lab - Order",
|
||||
"icon": "i-lucide-microscope",
|
||||
"link": "/cp-lab-order"
|
||||
},
|
||||
{
|
||||
"title": "Lab Mikro - Order",
|
||||
"icon": "i-lucide-microscope",
|
||||
"link": "/micro-lab-order"
|
||||
},
|
||||
{
|
||||
"title": "Lab PA - Order",
|
||||
"icon": "i-lucide-microscope",
|
||||
"link": "/ap-lab-order"
|
||||
},
|
||||
{
|
||||
"title": "Gizi",
|
||||
"icon": "i-lucide-egg-fried",
|
||||
"link": "/nutrition-order"
|
||||
},
|
||||
{
|
||||
"title": "Pembayaran",
|
||||
"icon": "i-lucide-banknote-arrow-up",
|
||||
"link": "/payment"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"heading": "Ruang Tindakan Rajal",
|
||||
"items": [
|
||||
{
|
||||
"title": "Kemoterapi",
|
||||
"icon": "i-lucide-droplets",
|
||||
"link": "/outpation-action/cemotherapy"
|
||||
},
|
||||
{
|
||||
"title": "Hemofilia",
|
||||
"icon": "i-lucide-droplet-off",
|
||||
"link": "/outpation-action/hemophilia"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"heading": "Ruang Tindakan Anak",
|
||||
"items": [
|
||||
{
|
||||
"title": "Thalasemi",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/children-action/thalasemia"
|
||||
},
|
||||
{
|
||||
"title": "Echocardiography",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/children-action/echocardiography"
|
||||
},
|
||||
{
|
||||
"title": "Spirometri",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/children-action/spirometry"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"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-circuit-board",
|
||||
"children": [
|
||||
{
|
||||
"title": "SEP",
|
||||
"icon": "i-lucide-circuit-board",
|
||||
"link": "/integration/bpjs-vclaim/sep"
|
||||
},
|
||||
{
|
||||
"title": "Peserta",
|
||||
"icon": "i-lucide-circuit-board",
|
||||
"link": "/integration/bpjs-vclaim/member"
|
||||
},
|
||||
{
|
||||
"title": "Surat Kontrol",
|
||||
"icon": "i-lucide-circuit-board",
|
||||
"link": "/integration/bpjs-vclaim/control-letter"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "SATUSEHAT",
|
||||
"icon": "i-lucide-database",
|
||||
"link": "/integration/satusehat"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"heading": "Source",
|
||||
"items": [
|
||||
{
|
||||
"title": "Peralatan dan Perlengkapan",
|
||||
"icon": "i-lucide-layout-dashboard",
|
||||
"children": [
|
||||
{
|
||||
"title": "Obat",
|
||||
"link": "/tools-equipment-src/medicine"
|
||||
},
|
||||
{
|
||||
"title": "Peralatan",
|
||||
"link": "/tools-equipment-src/tools"
|
||||
},
|
||||
{
|
||||
"title": "Perlengkapan (BMHP)",
|
||||
"link": "/tools-equipment-src/equipment"
|
||||
},
|
||||
{
|
||||
"title": "Metode Obat",
|
||||
"link": "/tools-equipment-src/medicine-method"
|
||||
},
|
||||
{
|
||||
"title": "Jenis Obat",
|
||||
"link": "/tools-equipment-src/medicine-type"
|
||||
},
|
||||
{
|
||||
"title": "Sediaan Obat",
|
||||
"link": "/tools-equipment-src/medicine-form"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pengguna",
|
||||
"icon": "i-lucide-user",
|
||||
"children": [
|
||||
{
|
||||
"title": "Pegawai",
|
||||
"link": "/human-src/employee"
|
||||
},
|
||||
{
|
||||
"title": "PPDS",
|
||||
"link": "/human-src/specialist-intern"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pemeriksaan Penunjang",
|
||||
"icon": "i-lucide-layout-list",
|
||||
"children": [
|
||||
{
|
||||
"title": "Checkup",
|
||||
"link": "/mcu-src/mcu"
|
||||
},
|
||||
{
|
||||
"title": "Prosedur",
|
||||
"link": "/mcu-src/procedure"
|
||||
},
|
||||
{
|
||||
"title": "Diagnosis",
|
||||
"link": "/mcu-src/diagnose"
|
||||
},
|
||||
{
|
||||
"title": "Medical Action",
|
||||
"link": "/mcu-src/medical-action"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Infrastruktur",
|
||||
"icon": "i-lucide-layout-list",
|
||||
"children": [
|
||||
{
|
||||
"title": "Kasur",
|
||||
"link": "/infra-src/bed"
|
||||
},
|
||||
{
|
||||
"title": "Kamar",
|
||||
"link": "/infra-src/chamber"
|
||||
},
|
||||
{
|
||||
"title": "Ruang",
|
||||
"link": "/infra-src/room"
|
||||
},
|
||||
{
|
||||
"title": "Depo",
|
||||
"link": "/infra-src/warehouse"
|
||||
},
|
||||
{
|
||||
"title": "Lantai",
|
||||
"link": "/infra-src/floor"
|
||||
},
|
||||
{
|
||||
"title": "Gedung",
|
||||
"link": "/infra-src/building"
|
||||
},
|
||||
{
|
||||
"title": "Counter",
|
||||
"link": "/infra-src/counter"
|
||||
},
|
||||
{
|
||||
"title": "Public Screen (Big Screen)",
|
||||
"link": "/infra-src/public-screen"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Organisasi",
|
||||
"icon": "i-lucide-network",
|
||||
"children": [
|
||||
{
|
||||
"title": "Divisi",
|
||||
"link": "/org-src/division"
|
||||
},
|
||||
{
|
||||
"title": "Instalasi",
|
||||
"link": "/org-src/installation"
|
||||
},
|
||||
{
|
||||
"title": "Unit",
|
||||
"link": "/org-src/unit"
|
||||
},
|
||||
{
|
||||
"title": "Spesialis",
|
||||
"link": "/org-src/specialist"
|
||||
},
|
||||
{
|
||||
"title": "Sub Spesialis",
|
||||
"link": "/org-src/subspecialist"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Umum",
|
||||
"icon": "i-lucide-airplay",
|
||||
"children": [
|
||||
{
|
||||
"title": "Uom",
|
||||
"link": "/common/uom"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Keuangan",
|
||||
"icon": "i-lucide-airplay",
|
||||
"children": [
|
||||
{
|
||||
"title": "Item & Pricing",
|
||||
"link": "/common/item"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -26,24 +26,10 @@
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"link": "/ambulatory/consultation"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "IGD",
|
||||
"icon": "i-lucide-zap",
|
||||
"children": [
|
||||
},
|
||||
{
|
||||
"title": "Triase",
|
||||
"link": "/emergency/triage"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/emergency/encounter"
|
||||
},
|
||||
{
|
||||
"title": "Konsultasi",
|
||||
"link": "/emergency/consultation"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -139,12 +125,22 @@
|
||||
{
|
||||
"title": "Kemoterapi",
|
||||
"icon": "i-lucide-droplets",
|
||||
"link": "/outpation-action/chemotherapy"
|
||||
"link": "/chemotherapy",
|
||||
"children": [
|
||||
{
|
||||
"title": "Administrasi",
|
||||
"link": "/chemotherapy/early-encounter"
|
||||
},
|
||||
{
|
||||
"title": "Kunjungan",
|
||||
"link": "/chemotherapy/encounter"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Hemofilia",
|
||||
"icon": "i-lucide-droplet-off",
|
||||
"link": "/outpation-action/hemophilia"
|
||||
"link": "/hemophilia"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -154,17 +150,17 @@
|
||||
{
|
||||
"title": "Thalasemi",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/children-action/thalasemia"
|
||||
"link": "/thalasemia"
|
||||
},
|
||||
{
|
||||
"title": "Echocardiography",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/children-action/echocardiography"
|
||||
"link": "/echocardiography"
|
||||
},
|
||||
{
|
||||
"title": "Spirometri",
|
||||
"icon": "i-lucide-baby",
|
||||
"link": "/children-action/spirometry"
|
||||
"link": "/spirometry"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -252,20 +248,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pengguna",
|
||||
"icon": "i-lucide-user",
|
||||
"children": [
|
||||
{
|
||||
"title": "Pegawai",
|
||||
"link": "/human-src/employee"
|
||||
},
|
||||
{
|
||||
"title": "PPDS",
|
||||
"link": "/human-src/specialist-intern"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pemeriksaan Penunjang",
|
||||
"icon": "i-lucide-layout-list",
|
||||
@@ -288,6 +270,20 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Pengguna",
|
||||
"icon": "i-lucide-user",
|
||||
"children": [
|
||||
{
|
||||
"title": "Pegawai",
|
||||
"link": "/human-src/employee"
|
||||
},
|
||||
{
|
||||
"title": "PPDS",
|
||||
"link": "/human-src/intern"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Layanan",
|
||||
"icon": "i-lucide-layout-list",
|
||||
|
||||
Reference in New Issue
Block a user