commit 72ce2260c50597f782f07d29db3985607ecc2f34 Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 17 15:19:36 2025 +0700 Feat: add doc preview in Therpay protocol List commit 7032cd2409a660d40899ffd421137e4158cfde4a Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 12 15:34:30 2025 +0700 Fix: prepare API integration protokol terapi verification commit dbf6f78d00afc818baf2b34d128ee2153814cc88 Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Wed Nov 12 14:09:28 2025 +0700 Feat: add basic CRUD therapy protocol commit 46a44e90fe4d4097b5460d2d4e5689b2a5389467 Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 11 15:57:54 2025 +0700 Fix: Prepare protokol terapi API Integration commit 4674090566727cebd947e50e2c06c44e8c7afa7e Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 10 15:33:22 2025 +0700 Fix: hotfix style add protokol terapi commit 919c91abd8ef8b4cd193012eed7f5e8cf635cda2 Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 10 15:17:14 2025 +0700 Fix: Typo drpodown-action-p in protokol-terapi commit e21d30eacf1a08118e289d4bb64889e708d5023a Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 10 15:14:33 2025 +0700 Fix: add diagnose & procedure dialog picker in add protokol terapi commit 9a3d73b72b0dceea778d83e7630c5ead110a6a4c Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 4 10:21:24 2025 +0700 Fix: Add Schema therapy protocol rehab medik commit 4d8d2d633bbbd78038b1cc607558c1ceb31c5986 Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Tue Nov 4 09:30:55 2025 +0700 Fix: refactor Actions Btn ba-dr-su commit 5f290a6e4bd1559c0e5864a508c5ab650cfae6e8 Author: hasyim_kai <muhammad.hasyim.c.a@gmail.com> Date: Mon Nov 3 17:08:20 2025 +0700 Feat: UI protokol terapi in Rehab medik commit 63010f69ff30532bb8ac91443112f31d4942b221 Author: Khafid Prayoga <khafidp@pm.me> Date: Tue Oct 21 09:54:13 2025 +0700 wip: list protokol terapi commit 44eedc298680a5255fee0ee8feee3e24beda93dd Author: Khafid Prayoga <khafidp@pm.me> Date: Mon Oct 20 12:54:01 2025 +0700 feat(therapy-protocol): init form entry feat(therapy-protocol): init page routes wip: init entry form wip: form entry protokol terapi todo: table procedure, and diagnose picker wip: schema form new entry todo: picker/modal yang relateds ke form entry
178 lines
5.1 KiB
Vue
178 lines
5.1 KiB
Vue
<script setup lang="ts">
|
|
import type { HeaderPrep, RefSearchNav } from '~/components/pub/my-ui/data/types'
|
|
import type { Summary } from '~/components/pub/my-ui/summary-card/type'
|
|
|
|
// #region Imports
|
|
import { Calendar, Hospital, UserCheck, UsersRound } from 'lucide-vue-next'
|
|
import RecordConfirmation from '~/components/pub/my-ui/confirmation/record-confirmation.vue'
|
|
import { ActionEvents } from '~/components/pub/my-ui/data/types'
|
|
|
|
import Header from '~/components/pub/my-ui/nav-header/prep.vue'
|
|
import SummaryCard from '~/components/pub/my-ui/summary-card/summary-card.vue'
|
|
import { usePaginatedList } from '~/composables/usePaginatedList'
|
|
|
|
import { getPatients, removePatient } from '~/services/patient.service'
|
|
import DetailRow from '~/components/pub/my-ui/form/view/detail-row.vue'
|
|
import Dialog from '~/components/pub/my-ui/modal/dialog.vue'
|
|
import Action from '~/components/pub/my-ui/nav-footer/ba-dr-su.vue'
|
|
import type { Encounter } from '~/models/encounter'
|
|
import { cn } from '~/lib/utils'
|
|
import { CalendarDate, DateFormatter, getLocalTimeZone } from '@internationalized/date'
|
|
import type { DateRange } from 'radix-vue'
|
|
// #endregion
|
|
|
|
// Props
|
|
interface Props {
|
|
}
|
|
const props = defineProps<Props>()
|
|
// #endregion
|
|
|
|
// #region State
|
|
const isVerifyDialogOpen = ref(false)
|
|
const { data, isLoading, paginationMeta, searchInput, handlePageChange, handleSearch, fetchData } = usePaginatedList({
|
|
fetchFn: (params) => getPatients({ ...params, includes: ['person', 'person-Addresses'] }),
|
|
entityName: 'patient',
|
|
})
|
|
|
|
const df = new DateFormatter('en-US', {
|
|
dateStyle: 'medium',
|
|
})
|
|
|
|
const dateValue = ref({
|
|
start: new CalendarDate(2022, 1, 20),
|
|
end: new CalendarDate(2022, 1, 20).add({ days: 20 }),
|
|
}) as Ref<DateRange>
|
|
|
|
const summaryLoading = ref(false)
|
|
|
|
const recId = ref<number>(0)
|
|
const recAction = ref<string>('')
|
|
const recItem = ref<any>(null)
|
|
// #endregion
|
|
|
|
// #region Lifecycle Hooks
|
|
onMounted(() => {
|
|
getPatientSummary()
|
|
})
|
|
// #endregion
|
|
|
|
// #region Functions
|
|
async function getPatientSummary() {
|
|
try {
|
|
summaryLoading.value = true
|
|
await new Promise((resolve) => setTimeout(resolve, 500))
|
|
} catch (error) {
|
|
console.error('Error fetching patient summary:', error)
|
|
} finally {
|
|
summaryLoading.value = false
|
|
}
|
|
}
|
|
|
|
async function handleConfirmAdd() {
|
|
isVerifyDialogOpen.value = true
|
|
}
|
|
|
|
async function handleActionClick(eventType: string) {
|
|
if (eventType === 'submit') {
|
|
// const patient: Patient = await composeFormData()
|
|
// let createdPatientId = 0
|
|
|
|
// const response = await handleActionSave(
|
|
// patient,
|
|
// () => {},
|
|
// () => {},
|
|
// toast,
|
|
// )
|
|
|
|
// const data = (response?.body?.data ?? null) as PatientBase | null
|
|
// if (!data) return
|
|
// createdPatientId = data.id
|
|
|
|
// If has callback provided redirect to callback with patientData
|
|
// if (props.callbackUrl) {
|
|
// await navigateTo(props.callbackUrl + '?patient-id=' + patient.id)
|
|
// return
|
|
// }
|
|
|
|
// Navigate to patient list or show success message
|
|
// await navigateTo('/outpatient/encounter')
|
|
// return
|
|
}
|
|
|
|
if (eventType === 'back') {
|
|
isVerifyDialogOpen.value = false
|
|
}
|
|
}
|
|
// #endregion
|
|
|
|
// #region Provide
|
|
provide('rec_id', recId)
|
|
provide('rec_action', recAction)
|
|
provide('rec_item', recItem)
|
|
provide('table_data_loader', isLoading)
|
|
// #endregion
|
|
|
|
// #region Watchers
|
|
watch([recId, recAction], () => {
|
|
switch (recAction.value) {
|
|
case ActionEvents.showDetail:
|
|
navigateTo({
|
|
name: 'therapy-protocol-id-detail',
|
|
params: { id: recId.value },
|
|
})
|
|
break
|
|
|
|
case ActionEvents.showEdit:
|
|
navigateTo({
|
|
name: 'therapy-protocol-id-edit',
|
|
params: { id: recId.value },
|
|
})
|
|
break
|
|
|
|
case ActionEvents.showConfirmVerify:
|
|
// Trigger confirmation modal open
|
|
handleConfirmAdd()
|
|
break
|
|
|
|
case ActionEvents.showPrint:
|
|
navigateTo('https://google.com', {
|
|
external: true,
|
|
open: { target: "_blank" },
|
|
});
|
|
break
|
|
}
|
|
})
|
|
// #endregion
|
|
</script>
|
|
|
|
<template>
|
|
|
|
<Popover>
|
|
<PopoverTrigger as-child>
|
|
<Button variant="outline" :class="cn('mb-3 w-[280px] justify-start text-left font-normal',
|
|
!dateValue && 'text-muted-foreground')">
|
|
<CalendarIcon class="mr-2 h-4 w-4" />
|
|
<template v-if="dateValue.start">
|
|
<template v-if="dateValue.end">
|
|
{{ df.format(dateValue.start.toDate(getLocalTimeZone())) }} -
|
|
{{ df.format(dateValue.end.toDate(getLocalTimeZone())) }}
|
|
</template>
|
|
|
|
<template v-else>
|
|
{{ df.format(dateValue.start.toDate(getLocalTimeZone())) }}
|
|
</template>
|
|
</template>
|
|
<template v-else> Pick a date </template>
|
|
</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent class="w-auto p-0">
|
|
<RangeCalendar v-model="dateValue" initial-focus :number-of-months="2"
|
|
@update:start-value="(startDate) => (dateValue.start = startDate)" />
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<AppTherapyProtocolHistoryDialog
|
|
:data="data"
|
|
:pagination-meta="paginationMeta"
|
|
@page-change="handlePageChange" />
|
|
</template> |