hgh_admin/resources/js/pages/patients/PatientQuestionProfile.vue
nasir@endelospay.com 7083bd4551 fix
2024-06-11 02:12:38 +05:00

526 lines
14 KiB
Vue

<script setup>
import { useRoute, useRouter } from 'vue-router';
import { useStore } from 'vuex';
import QuestionProgressBar from '../patients/QuestionProgressBar.vue';
import questionsJson from '../patients/questions_parse.json';
const router = useRouter()
const route = useRoute();
const store = useStore()
const questionsJsonData = ref(questionsJson)
const answers = ref(null)
const QuestionsAnswers = ref([]);
const username = ref(null);
const email = ref(null);
const phone = ref(null);
const address1 = ref(null);
const dob = ref(null);
const agePatient = ref(null);
const isMobile = ref(window.innerWidth <= 768);
const patientId = route.params.id
onMounted(async () => {
// console.log('patient id',props.patient_id)
const navbar = document.querySelector('.layout-navbar');
const callDiv = document.querySelector('.layout-page-content');
if (navbar) {
navbar.style.display = 'block';
}
if (callDiv)
callDiv.style.padding = '1.5rem';
store.dispatch('updateIsLoading', true)
await store.dispatch('patientDetial',{id:patientId})
await store.dispatch('getAgentQuestionsAnswers',{patient_id:patientId})
username.value = store.getters.getPatientDetail.patient.first_name + ' ' + store.getters.getPatientDetail.patient.last_name;
email.value = store.getters.getPatientDetail.patient.email
phone.value = store.getters.getPatientDetail.patient.phone_no
dob.value = changeFormat(store.getters.getPatientDetail.patient.dob)
agePatient.value = calculateAge(store.getters.getPatientDetail.patient.dob) + " Year"
address1.value = store.getters.getPatientDetail.patient.address + ' ' +
store.getters.getPatientDetail.patient.city + ' ' +
store.getters.getPatientDetail.patient.state + ' ' +
store.getters.getPatientDetail.patient.country;
// address.value = patient_address;
answers.value = store.getters.getPatientAnswers
// console.log('questionsJsonData', questionsJsonData.value)
// console.log('API Answers', answers.value)
createFinalArray();
store.dispatch('updateIsLoading', false)
window.addEventListener('resize', checkMobile);
});
function changeFormat(dateFormat) {
const dateParts = dateFormat.split('-'); // Assuming date is in yyyy-mm-dd format
const year = parseInt(dateParts[0]);
const month = parseInt(dateParts[1]); // No need for padding
const day = parseInt(dateParts[2]); // No need for padding
// Create a new Date object with the parsed values
const date = new Date(year, month - 1, day); // Month is zero-based in JavaScript Date object
// Format the date as mm-dd-yyyy
const formattedDate = month + '-' + day + '-' + date.getFullYear();
return formattedDate;
}
// function changeFormat(dateFormat) {
// const dateParts = dateFormat.split('-'); // Assuming date is in yyyy-mm-dd format
// const year = parseInt(dateParts[0]);
// const month = String(dateParts[1]).padStart(2, '0'); // Pad single-digit months with leading zero
// const day = String(dateParts[2]).padStart(2, '0'); // Pad single-digit days with leading zero
// // Create a new Date object with the parsed values
// const date = new Date(year, month - 1, day); // Month is zero-based in JavaScript Date object
// // Format the date as mm-dd-yyyy
// const formattedDate = month + '-' + day + '-' + date.getFullYear();
// return formattedDate;
// }
const createFinalArray = () => {
questionsJsonData.value.forEach(question => {
const { label, key, type } = question;
if (answers.value.hasOwnProperty(key)) {
QuestionsAnswers.value.push({
label,
key,
type,
value: answers.value[key]
});
}
});
// console.log('------finalArray ', QuestionsAnswers.value)
};
const checkMobile = () => {
isMobile.value = window.innerWidth <= 768;
};
const calculateAge = (dateOfBirth) => {
const today = new Date();
const birthDate = new Date(dateOfBirth);
let age = today.getFullYear() - birthDate.getFullYear();
const monthDiff = today.getMonth() - birthDate.getMonth();
if (
monthDiff < 0 ||
(monthDiff === 0 && today.getDate() < birthDate.getDate())
) {
age--;
}
return age;
}
</script>
<template>
<v-row class='mb-2'>
<!-- <VCol cols="12" md="12" class="mb-4 " v-if="username || phone" style="font-size: 16px;">
<VCard>
<VCardText>
<h3 class="mb-2"> {{ username }}</h3>
<div class="mb-1">
<VTooltip location="left" activator="parent" transition="scroll-x-transition">
Email
</VTooltip>
<VIcon icon="ri-mail-line" size="20" class="me-2" />{{ email }}
</div>
<div class="mb-2">
<VTooltip location="left" activator="parent" transition="scroll-x-transition">
Age
</VTooltip>
<VIcon icon="ri-calendar-event-line" title="Age" size="20" class="me-2" />{{ agePatient }}
</div>
<div class="mb-2">
<VTooltip location="left" activator="parent" transition="scroll-x-transition">
Date of Birth
</VTooltip>
<VIcon icon="ri-calendar-line" size="20" class="me-2" />{{ dob }}
</div>
<div class="mb-2">
<VTooltip location="left" activator="parent" transition="scroll-x-transition">
Address
</VTooltip>
<VIcon icon="ri-map-pin-line" size="20" class="me-2" />{{ address1 }}
</div>
<div>
<VTooltip location="left" activator="parent" transition="scroll-x-transition">
Contact Number
</VTooltip>
<VIcon icon="ri-phone-line" size="20" class="me-2" />{{ phone }}
</div>
</VCardText>
</VCard>
</VCol> -->
<v-col cols="12" md="12">
<VList class="">
<VListItem class="">
<VListItemTitle class="d-flex align-center justify-space-between bg-dark mt-1"
style="padding: 5px;">
<div :class="isMobile ? '' : 'w-40'">
<p class="mb-0" :class="isMobile ? 'heading-text-m' : 'heading-text-d'"><b>SYMPTOM
CHECKLIST</b></p>
</div>
<div class="d-flex align-center" :class="isMobile ? 'heading-text-m' : 'heading-text-d'">
<p class="mb-0"><b>MILD</b>
</p>
</div>
<div class="d-flex align-center" :class="isMobile ? 'heading-text-m' : 'heading-text-d'">
<p class="mb-0"><b>MODERATE</b>
</p>
</div>
<div class="d-flex align-center" :class="isMobile ? 'heading-text-m' : 'heading-text-d'">
<p class="mb-0"><b>SEVERE</b>
</p>
</div>
</VListItemTitle>
</VListItem>
<!-- Move the second list item inside the loop -->
<VListItem class="pt-0 pb-0 ht-li" v-for="(item, index) of QuestionsAnswers" :key="index">
<VListItemTitle class="d-flex align-center justify-space-between">
<div class="border-right"
:class="{ 'bg-silver': (index + 1) % 2 === 0, 'w-custom-m': isMobile, 'w-40': !isMobile }"
style="padding-left: 5px;">
<p class="text-wrap mb-0" :class="isMobile ? 'heading-text-m' : 'heading-text-d'">{{
item.label
}}</p>
</div>
<div class="d-flex align-center" :class="isMobile ? 'w-custom-d' : 'w-60'">
<QuestionProgressBar :type="item.type" :value="item.value"></QuestionProgressBar>
</div>
</VListItemTitle>
</VListItem>
</VList>
<!-- <v-table density="compact" fixed-header>
<thead>
<tr class="text-right">
<th class="bg-dark">
<b>SYMPTOM CHECKLIST</b>
</th>
<th class="text-right bg-dark">
<b>MILD</b>
<VIcon icon="mdi-menu-down"></VIcon>
</th>
<th class="text-right bg-dark">
<b>MODERATE</b>
<VIcon icon="mdi-menu-down"></VIcon>
</th>
<th class="text-right bg-dark">
<b>SEVERE</b>
<VIcon icon="mdi-menu-down"></VIcon>
</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) of QuestionsAnswers" :key="index">
<td class="border-right" v-if="!isMobile">{{ item.label }}</td>
<td :colspan="isMobile ? '4' : '3'">
<p v-if="isMobile" class="mb-0">{{ item.label }}</p>
<QuestionProgressBar :type="item.type" :value="item.value"></QuestionProgressBar>
</td>
</tr>
</tbody>
</v-table> -->
</v-col>
</v-row>
</template>
<style lang="scss" scoped>
.mdi-email {
margin-bottom: 5px;
}
.ht-li {
min-height: 20px !important;
}
.bg-silver {
background-color: silver;
}
.text-wrap {
text-wrap: balance;
}
.w-40 {
width: 40%;
}
.w-custom-m {
width: 36%;
}
.w-60 {
width: 60%;
}
.w-custom-d {
width: 65%;
}
.v-list-item--density-default.v-list-item--one-line {
min-height: 40px;
}
.heading-text-m {
font-size: 9px;
}
.heading-text-d {
font-size: 12px;
}
.bg-dark {
background-color: #808080b3 !important;
}
.text-right {
text-align: right !important;
width: 23%;
}
.border-right {
border-right: 1.5px solid black;
}
.hidden-component {
display: none
}
.meta-key {
border: thin solid rgba(var(--v-border-color), var(--v-border-opacity));
border-radius: 6px;
block-size: 1.5625rem;
line-height: 1.3125rem;
padding-block: 0.125rem;
padding-inline: 0.25rem;
}
::v-deep .custom-menu {
position: relative;
}
::v-deep .custom-menu::before {
content: "" !important;
position: absolute !important;
transform: translateY(-50%);
top: 50% !important;
left: -8px !important;
border-left: 8px solid transparent !important;
border-right: 8px solid transparent !important;
border-bottom: 8px solid #fff !important;
}
// Styles for the VList component
.more .v-list-item-title {
color: rgb(106 109 255);
}
.more .menu-item:hover {
cursor: pointer;
}
.slide-enter-active,
.slide-leave-active {
transition: transform 0.3s ease;
}
.slide-enter,
.slide-leave-to {
transform: translateX(-100%);
}
.start-call-btn {
opacity: 0;
display: none;
transition: opacity 0.3s ease;
}
.button_margin {
margin: 2px;
}
.dialog_padding {
padding: 5px;
}
.custom-menu .v-menu__content {
background-color: #333;
color: #fff;
border-radius: 4px;
padding: 8px 0;
}
.user-info {
display: flex;
flex-direction: column;
transition: opacity 0.3s ease;
}
.list-item-hover {
transition: background-color 0.3s ease;
&:hover {
background-color: rgba(var(--v-theme-primary), 0.1);
.start-call-btn {
opacity: 1;
display: block;
position: relative;
left: -35px;
}
.user-info {
opacity: 0;
display: none;
}
}
}
.pop_card {
overflow: hidden !important;
padding: 10px;
}
.v-overlay__content {
max-height: 706.4px;
max-width: 941.6px;
min-width: 24px;
--v-overlay-anchor-origin: bottom left;
transform-origin: left top;
top: 154.4px !important;
left: 204px !important;
}
.button_margin {
margin-top: 10px;
font-size: 10px;
}
/* Responsive Styles */
@media screen and (max-width: 768px) {
.pop_card {
max-width: 100%;
margin: 0 auto;
}
}
.container_img {
display: flex;
flex-direction: column;
width: 100%;
align-items: center;
}
.image {
order: 2;
/* Change the order to 2 in mobile view */
}
.text {
order: 1;
/* Change the order to 1 in mobile view */
}
/* Media query for mobile view */
@media (max-width: 768px) {
.container_img {
flex-direction: row;
margin-top: 10px;
}
.button_margin_mobile {
width: 100%;
}
.image {
width: 20%;
padding: 0 10px;
}
.text {
width: 80%;
/* Each takes 50% width */
padding: 0 10px;
/* Optional padding */
}
}
::-webkit-scrollbar {
width: 10px;
/* Width of the scrollbar */
}
/* Track */
::-webkit-scrollbar-track {
background: #f1f1f1;
/* Color of the track */
}
/* Handle */
::-webkit-scrollbar-thumb {
background: #888;
/* Color of the handle */
border-radius: 5px;
/* Roundness of the handle */
}
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
background: #555;
/* Color of the handle on hover */
}
/* Container for the content */
.scroll-container {
max-height: 191px;
/* Maximum height of the scrollable content */
overflow-y: scroll;
/* Enable vertical scrolling */
}
/* Content within the scroll container */
.scroll-content {
padding: 20px;
}
/* Example of additional styling for content */
.scroll-content p {
margin-bottom: 20px;
}
.cross button {
padding: 0px;
margin: 0px;
/* font-size: 10px; */
background: none;
border: none;
box-shadow: none;
height: 23px;
}
.v-data-table-header {
display: table-header-group;
}
</style>