{"version":3,"file":"ClinicSelection-B4hDPYjA.js","sources":["../../src/enums/CustomWeekDaysEnum.ts","../../src/components/Clinics/DayOpenHour.vue","../../src/components/Clinics/OpenHours.vue","../../src/components/Clinics/ClinicList.vue","../../src/pages/ClinicSelection.vue"],"sourcesContent":["export enum CustomWeekDaysEnum {\r\n    MON = 'MON',\r\n    TUE = 'TUE',\r\n    WED = 'WED',\r\n    THU = 'THU',\r\n    FRI = 'FRI',\r\n    SAT = 'SAT',\r\n    SUN = 'SUN',\r\n}\r\n","<template>\r\n    <div class=\"grid grid-cols-3 gap-2 sm:grid-cols-2 md:gap-8\">\r\n        <span class=\"col-span-1 m-0 text-xs font-normal capitalize text-openhours-day-c\">{{ isMobile ? props.dayName.slice(0, 2).toUpperCase() : props.dayName }}</span>\r\n        <span class=\"col-span-2 my-0 text-xs font-normal text-openhours-time-c sm:col-span-1\">{{ `${morningTimeFormatted} - ${afternoonTimeFormatted}` }}</span>\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { breakpointsTailwind, useBreakpoints } from '@vueuse/core';\r\nimport { DateTime } from 'luxon';\r\nimport { computed } from 'vue';\r\n\r\nconst props = defineProps({\r\n    dayName: {\r\n        type: String,\r\n        required: true,\r\n    },\r\n    morningTime: {\r\n        type: Number,\r\n        required: true,\r\n    },\r\n    afternoonTime: {\r\n        type: Number,\r\n        required: true,\r\n    },\r\n});\r\n\r\nconst breakpoints = useBreakpoints(breakpointsTailwind);\r\nconst isMobile = breakpoints.smaller('sm');\r\n\r\nconst morningTimeFormatted = computed(() => {\r\n    return DateTime.fromObject({ hour: Math.floor(props.morningTime / 60), minute: props.morningTime % 60 }).toFormat('HH:mm');\r\n});\r\n\r\nconst afternoonTimeFormatted = computed(() => {\r\n    return DateTime.fromObject({ hour: Math.floor(props.afternoonTime / 60), minute: props.afternoonTime % 60 }).toFormat('HH:mm');\r\n});\r\n</script>\r\n","<template>\r\n    <div class=\"mb-5 font-light\">\r\n        <h3 class=\"mb-1 text-sm font-normal text-openhours-title-c\">{{ $t('open-hours-title') }}</h3>\r\n        <DayOpenHour class=\"py-1\" v-for=\"d in sortedOpenHours\" :key=\"d.id\" :dayName=\"mapDayTypeToDayNameI18N(d.dayType)\" :morningTime=\"d.start\" :afternoonTime=\"d.finish\" />\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, PropType } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport { CustomWeekDaysEnum } from '@/enums/CustomWeekDaysEnum';\r\nimport { APISharedDTOOnlineBookingWorkingHourItemDto } from '../../../generated';\r\nimport DayOpenHour from './DayOpenHour.vue';\r\n\r\nconst props = defineProps({\r\n    dateList: {\r\n        type: Array as PropType<APISharedDTOOnlineBookingWorkingHourItemDto[]>,\r\n        required: true,\r\n    },\r\n});\r\n\r\nconst { t } = useI18n();\r\n\r\nconst sortedOpenHours = computed(() => {\r\n    if (!props.dateList) {\r\n        return;\r\n    }\r\n\r\n    // Custom order of days\r\n    const customDayOrder = Object.values(CustomWeekDaysEnum);\r\n\r\n    return props.dateList\r\n        .slice()\r\n        .sort((a, b) => {\r\n            if (!a.dayType || !b.dayType) return 0;\r\n            const dayA = customDayOrder.indexOf(a.dayType as CustomWeekDaysEnum);\r\n            const dayB = customDayOrder.indexOf(b.dayType as CustomWeekDaysEnum);\r\n\r\n            return dayA - dayB;\r\n        })\r\n        .filter((d) => d.opened === true);\r\n});\r\n\r\nconst mapDayTypeToDayNameI18N = (dayType: string) => {\r\n    switch (dayType) {\r\n        case CustomWeekDaysEnum.MON:\r\n            return t('primeVue.dayNames.1');\r\n        case CustomWeekDaysEnum.TUE:\r\n            return t('primeVue.dayNames.2');\r\n        case CustomWeekDaysEnum.WED:\r\n            return t('primeVue.dayNames.3');\r\n        case CustomWeekDaysEnum.THU:\r\n            return t('primeVue.dayNames.4');\r\n        case CustomWeekDaysEnum.FRI:\r\n            return t('primeVue.dayNames.5');\r\n        case CustomWeekDaysEnum.SAT:\r\n            return t('primeVue.dayNames.6');\r\n        case CustomWeekDaysEnum.SUN:\r\n            return t('primeVue.dayNames.0');\r\n        default:\r\n            return '';\r\n    }\r\n};\r\n</script>\r\n","<template>\r\n    <Accordion :activeIndex=\"activeAccordionTabIndex\" :multiple=\"false\">\r\n        <AccordionTab\r\n            v-for=\"(clinic, index) in props.sortedClinics\"\r\n            :key=\"clinic.id\"\r\n            :disabled=\"true\"\r\n            :pt-options=\"{\r\n                mergeProps: true,\r\n                mergeSections: true,\r\n            }\"\r\n            :pt=\"{\r\n                header: ({ props: ptProps }) => ({\r\n                    class: [{ '!select-auto !pointer-events-auto !cursor-auto !opacity-100': ptProps == null ? void 0 : ptProps.disabled }],\r\n                }),\r\n                headerAction: () => ({\r\n                    class: ['!p-0 border-none', isSelected(clinic) ? 'bg-select-item-bg-color' : 'bg-item-bg-color hover:!bg-item-bg-hover-color'],\r\n                }),\r\n                content: { class: '!p-0 border-none' },\r\n                headericon: { class: 'text-clinic-title-c ml-2 absolute right-4 !mr-0' },\r\n            }\"\r\n        >\r\n            <template #header>\r\n                <div @click=\"onClinicOpen(index)\" :id=\"`clinic-${clinic.id}`\" class=\"w-full font-medium\">\r\n                    <div class=\"flex items-center p-4 xl:flex-row xl:px-8 xl:pl-4\">\r\n                        <img v-if=\"clinic.logoSquare\" class=\"my-0 mr-4 size-11 rounded-full\" :class=\"{ 'opacity-50': isInactive(clinic) }\" :src=\"loadLogo(clinic) || ''\" alt=\"clinic-icon\" />\r\n                        <div v-else class=\"my-0 mr-4\">\r\n                            <FontAwesomeLayers class=\"fa-3x w-full text-clinic-icon-active-c\">\r\n                                <FontAwesomeIcon icon=\"fa-sharp fa-thin fa-circle\" />\r\n                                <FontAwesomeIcon icon=\"fa-sharp fa-solid fa-location-dot\" transform=\"shrink-7\" />\r\n                            </FontAwesomeLayers>\r\n                        </div>\r\n                        <div class=\"mr-6 flex h-fit w-full flex-col items-start justify-between md:flex-row md:items-center xl:mr-2\" :class=\"{ 'text-white': isInactive(clinic) }\">\r\n                            <h2 class=\"mb-2 text-clinic-title-c\">{{ clinic.name }}</h2>\r\n                            <span class=\"text-xs text-clinic-street-subt-c\" v-html=\"getAddress(clinic)\"></span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </template>\r\n\r\n            <div class=\"grid w-full grid-cols-2 gap-x-2 gap-y-8 rounded-b-xl rounded-t-none bg-select-item-bg-color p-4 xl:mt-0 xl:grid-cols-2 xl:p-8\">\r\n                <div class=\"block\">\r\n                    <OpenHours v-if=\"clinic.workHourList?.length > 0\" :dateList=\"clinic.workHourList\" />\r\n                    <div class=\"grid grid-cols-1 gap-2\">\r\n                        <a v-if=\"clinic.phone\" class=\"flex w-fit flex-row items-center\" :href=\"`tel:${clinic.phone}`\">\r\n                            <FontAwesomeIcon icon=\"fa-sharp fa-solid fa-phone\" fixed-width class=\"text-clinic-description-c\" />\r\n                            <span class=\"ml-2 text-xs text-clinic-contact-c\">{{ formatPhoneNumber(null, clinic.phone) }}</span>\r\n                        </a>\r\n                        <a v-if=\"clinic.email\" class=\"flex w-fit flex-row items-center\" :href=\"`mailto:${clinic.email}`\">\r\n                            <FontAwesomeIcon icon=\"fa-sharp fa-solid fa-envelope\" fixed-width class=\"text-clinic-description-c\" />\r\n                            <span class=\"ml-2 text-xs text-clinic-contact-c\">{{ clinic.email }}</span>\r\n                        </a>\r\n                        <a v-if=\"clinic.twitter\" class=\"flex w-fit flex-row items-center\" :href=\"fullUrl(clinic.twitter)\" target=\"_blank\">\r\n                            <FontAwesomeIcon icon=\"fa-brands fa-square-x-twitter\" fixed-width class=\"text-clinic-description-c\" />\r\n                            <span class=\"ml-2 text-xs text-clinic-contact-c\">Twitter</span>\r\n                        </a>\r\n                        <a v-if=\"clinic.facebook\" class=\"flex w-fit flex-row items-center\" :href=\"fullUrl(clinic.facebook)\" target=\"_blank\">\r\n                            <FontAwesomeIcon icon=\"fa-brands fa-square-facebook\" fixed-width class=\"text-clinic-description-c\" />\r\n                            <span class=\"ml-2 text-xs text-clinic-contact-c\">Facebook</span>\r\n                        </a>\r\n                        <a v-if=\"clinic.instagram\" class=\"flex w-fit flex-row items-center\" :href=\"fullUrl(clinic.instagram)\" target=\"_blank\">\r\n                            <FontAwesomeIcon icon=\"fa-brands fa-square-instagram\" fixed-width class=\"text-clinic-description-c\" />\r\n                            <span class=\"ml-2 text-xs text-clinic-contact-c\">Instagram</span>\r\n                        </a>\r\n                        <a v-if=\"clinic.web\" class=\"flex w-fit flex-row items-center\" :href=\"fullUrl(clinic.web)\" target=\"_blank\">\r\n                            <FontAwesomeIcon icon=\"fa-sharp fa-solid fa-globe\" fixed-width class=\"text-clinic-description-c\" />\r\n                            <span class=\"ml-2 text-xs text-clinic-contact-c\">{{ getURL(clinic) }}</span>\r\n                        </a>\r\n                        <p class=\"mb-4 text-xs font-light text-clinic-description-c\">\r\n                            {{ clinic.description }}\r\n                        </p>\r\n                    </div>\r\n                </div>\r\n                <div v-show=\"!mapError && !isMapLoading\" class=\"ml-auto mr-6 xl:mr-2\">\r\n                    <div class=\"relative size-32 cursor-pointer max-[375px]:size-24 sm:size-36 md:size-64\" @click=\"onMapPointClick\">\r\n                        <div class=\"absolute inset-0 z-10 flex items-center justify-center\">\r\n                            <FontAwesomeIcon @click=\"onMapPointClick\" size=\"2x\" icon=\"fa-sharp fa-solid fa-location-dot\" class=\"text-blue-400 -translate-y-1/2\" />\r\n                        </div>\r\n                        <img class=\"size-full rounded-xl object-cover grayscale\" :src=\"mapURL\" alt=\"map\" />\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </AccordionTab>\r\n    </Accordion>\r\n    <ConfirmDialog\r\n        :draggable=\"false\"\r\n        :pt-options=\"{\r\n            mergeProps: true,\r\n            mergeSections: true,\r\n        }\"\r\n        :pt=\"{\r\n            footer: () => ({\r\n                class: ['gap-6'],\r\n            }),\r\n        }\"\r\n        group=\"templating\"\r\n    >\r\n        <template #message=\"slotProps\">\r\n            <div class=\"flex-column border-bottom-1 flex w-full items-center gap-6\">\r\n                <FontAwesomeIcon icon=\"fa-sharp fa-solid fa-exclamation-triangle\" class=\"text-4xl text-danger\" />\r\n                <p>{{ slotProps.message.message }}</p>\r\n            </div>\r\n        </template>\r\n    </ConfirmDialog>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { FontAwesomeLayers } from '@fortawesome/vue-fontawesome';\r\nimport Accordion from 'primevue/accordion';\r\nimport AccordionTab from 'primevue/accordiontab';\r\nimport ConfirmDialog from 'primevue/confirmdialog';\r\nimport { useConfirm } from 'primevue/useconfirm';\r\nimport { computed, nextTick, onMounted, ref, toRefs, watch } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport OpenHours from '@/components/Clinics/OpenHours.vue';\r\nimport { IExtentedClinic } from '@/interfaces/IExtendedClinic';\r\nimport { useWizardStore } from '@/stores/wizard';\r\nimport { fileUrl } from '@/utils/fileUrl';\r\nimport { formatPhoneNumber } from '@/utils/formatPhoneNumber';\r\nimport { fullUrl } from '@/utils/fullUrl';\r\n\r\nconst props = defineProps({\r\n    sortedClinics: {\r\n        type: Array<IExtentedClinic>,\r\n        default: () => [],\r\n    },\r\n});\r\n\r\nconst wizardStore = useWizardStore();\r\nconst { t } = useI18n();\r\nconst confirm = useConfirm();\r\n\r\nconst mapError = ref(false);\r\nconst mapSrc = ref('');\r\nconst isMapLoading = ref(true);\r\n\r\nconst activeAccordionTabIndex = ref(null);\r\nconst pendingTabIndex = ref(null);\r\n\r\nonMounted(async () => {\r\n    await loadMap();\r\n\r\n    const index = props.sortedClinics.findIndex((clinic) => clinic.id === wizardStore.getSelectedClinic?.id);\r\n    activeAccordionTabIndex.value = index === -1 ? null : index;\r\n\r\n    await scrollToClinic();\r\n});\r\n\r\nconst isInactive = (clinic: IExtentedClinic) => {\r\n    return computed(() => clinic?.services?.length === 0).value;\r\n};\r\n\r\nconst isSelected = (clinic: IExtentedClinic) => {\r\n    return computed(() => wizardStore.getSelectedClinic?.id === clinic.id).value;\r\n};\r\n\r\nconst getAddress = (clinic: IExtentedClinic) => {\r\n    if (!clinic || !clinic.city || !clinic.street || !clinic.post) {\r\n        return '';\r\n    }\r\n    return `${clinic.street}, ${clinic.post}, <span class=\"font-bold\">${clinic.city}</span>`;\r\n};\r\n\r\nconst loadLogo = (clinic: IExtentedClinic) => {\r\n    try {\r\n        if (clinic.logoSquare) {\r\n            if (clinic?.logoSquare !== '') {\r\n                return fileUrl(clinic.logoSquare, 100, 100, 0);\r\n            }\r\n        }\r\n    } catch (error) {\r\n        console.error(error);\r\n        return '';\r\n    }\r\n};\r\n\r\nconst getURL = (clinic: IExtentedClinic) => {\r\n    return new URL(fullUrl(clinic.web)).host;\r\n};\r\n\r\nconst mapURL = computed(() => {\r\n    if (!wizardStore.getSelectedClinic?.geoCache?.idMap) {\r\n        return '';\r\n    } else {\r\n        return fileUrl(wizardStore.getSelectedClinic.geoCache.idMap, 100, 100, 0);\r\n    }\r\n});\r\n\r\nwatch(\r\n    () => wizardStore.getSelectedClinic?.id,\r\n    async () => {\r\n        await scrollToClinic();\r\n        await loadMap();\r\n    }\r\n);\r\n\r\nconst loadMap = (): Promise<void> => {\r\n    return new Promise((resolve) => {\r\n        if (mapURL.value) {\r\n            const img = new Image();\r\n            img.src = mapURL.value;\r\n            isMapLoading.value = true;\r\n\r\n            img.onload = async () => {\r\n                mapSrc.value = img.src;\r\n                mapError.value = false;\r\n                isMapLoading.value = false;\r\n                resolve();\r\n            };\r\n\r\n            img.onerror = async () => {\r\n                mapSrc.value = '';\r\n                mapError.value = true;\r\n                isMapLoading.value = false;\r\n                resolve();\r\n            };\r\n        } else {\r\n            mapError.value = false;\r\n            isMapLoading.value = false;\r\n            resolve();\r\n        }\r\n    });\r\n};\r\n\r\nconst onMapPointClick = () => {\r\n    if (!wizardStore.getSelectedClinic) {\r\n        return;\r\n    }\r\n    const { street, post, city } = toRefs(wizardStore.getSelectedClinic);\r\n    if (!street?.value || !post?.value || !city?.value) {\r\n        return;\r\n    }\r\n    window.open(`https://maps.google.com/?q=${street.value},${post.value},${city.value}`);\r\n};\r\n\r\nconst scrollToClinic = async () => {\r\n    await nextTick(() => {\r\n        setTimeout(() => {\r\n            const clinicElement = document.getElementById(`clinic-${wizardStore.getSelectedClinic?.id}`);\r\n            if (clinicElement) {\r\n                clinicElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n            }\r\n        }, 300);\r\n    });\r\n};\r\n\r\nconst onClinicOpen = async (index: number) => {\r\n    pendingTabIndex.value = null;\r\n\r\n    const clinic = props.sortedClinics[index];\r\n\r\n    if (!clinic || isInactive(clinic) || wizardStore.getSelectedClinic?.id === clinic.id || !clinic.id) {\r\n        return;\r\n    }\r\n\r\n    pendingTabIndex.value = index;\r\n\r\n    // Reset selected staff and service if the clinic is changed\r\n    if (wizardStore.getSelectedStaff || wizardStore.getSelectedService) {\r\n        confirm.require({\r\n            group: 'templating',\r\n            message: t('confirmChangeClinic'),\r\n            header: t('confirmChangeClinicHeader'),\r\n            icon: 'pi pi-exclamation-triangle',\r\n            acceptClass: 'bg-[#00aeef] text-white rounded-2xl hover:opacity-50 !text-sm !p-2.5',\r\n            rejectClass: 'bg-danger text-white rounded-2xl hover:opacity-50 text-sm !p-2.5',\r\n            rejectLabel: t('cancelButton'),\r\n            acceptLabel: t('confirmButton'),\r\n            accept: async () => {\r\n                wizardStore.resetService();\r\n                wizardStore.resetStaff();\r\n                wizardStore.selectClinic({ ...clinic });\r\n                activeAccordionTabIndex.value = pendingTabIndex.value;\r\n            },\r\n            reject: () => {\r\n                pendingTabIndex.value = null;\r\n            },\r\n        });\r\n    } else {\r\n        wizardStore.selectClinic({ ...clinic });\r\n        activeAccordionTabIndex.value = pendingTabIndex.value;\r\n    }\r\n};\r\n</script>\r\n","<template>\r\n    <ErrorOverlay v-if=\"sortedClinics.length === 0\" icon=\"fa-sharp fa-thin fa-location-dot\" :title=\"$t('no-clinics-available')\" />\r\n    <div class=\"flex size-full flex-col\">\r\n        <div class=\"mb-3 hidden h-12 pl-5 pt-4 text-xl font-extralight text-section-title-c xl:mt-6 xl:block\">{{ $t('section-title-clinic') }}</div>\r\n        <div v-if=\"sortedClinics.length > 0\" class=\"h-0 grow\">\r\n            <ScrollBar>\r\n                <div class=\"mx-0 mt-2 flex flex-col xl:mx-4 xl:mt-0\">\r\n                    <div class=\"px-4 pb-5 xl:px-0\">\r\n                        <ClinicList v-if=\"sortedClinics.length > 0\" :sortedClinics=\"sortedClinics\" />\r\n                    </div>\r\n                </div>\r\n            </ScrollBar>\r\n        </div>\r\n\r\n        <ButtonPanel\r\n            v-if=\"sortedClinics.length > 0\"\r\n            :hintComplete=\"!!wizardStore.getSelectedClinic\"\r\n            :hintText=\"$t('hint_clinic')\"\r\n            :submitTitle=\"$t('select-title')\"\r\n            :submitDisabled=\"!wizardStore.getSelectedClinic\"\r\n            @submit=\"onSubmitClinic()\"\r\n            :loading=\"loading\"\r\n        />\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, onMounted, ref } from 'vue';\r\nimport ButtonPanel from '@/components/ButtonPanel.vue';\r\nimport ClinicList from '@/components/Clinics/ClinicList.vue';\r\nimport ScrollBar from '@/components/ScrollBar.vue';\r\nimport { ROUTES } from '@/enums/RoutesEnum';\r\nimport ErrorOverlay from '@/pages/Overlays/ErrorOverlay.vue';\r\nimport router from '@/router';\r\nimport { useUserStore } from '@/stores/user';\r\nimport { useWizardStore } from '@/stores/wizard';\r\n\r\nonMounted(async () => {\r\n    wizardStore.currentStep = 0;\r\n    window.onbeforeunload = null;\r\n    await preselectFirstClinic();\r\n});\r\n\r\nconst userStore = useUserStore();\r\nconst wizardStore = useWizardStore();\r\n\r\nconst sortedClinics = computed(() => {\r\n    if (userStore.getClinics.length === 0) return [];\r\n    // Copy the array to avoid sorting the original\r\n    const copyClinics = [...userStore.getClinics];\r\n    // Get only clinic with services\r\n    return copyClinics.filter((clinic) => clinic.services && clinic.services.length > 0).sort((a, b) => a.position - b.position);\r\n});\r\n\r\nconst loading = ref(false);\r\n\r\nconst preselectFirstClinic = async () => {\r\n    if (!wizardStore.getSelectedClinic && sortedClinics.value.length === 1) {\r\n        const firstClinic = sortedClinics.value[0];\r\n\r\n        wizardStore.selectClinic({ ...firstClinic });\r\n    }\r\n};\r\n\r\nconst onSubmitClinic = async () => {\r\n    if (wizardStore.getSelectedClinic === null) return;\r\n\r\n    loading.value = true;\r\n    wizardStore.steps[0].isValid = true;\r\n\r\n    try {\r\n        await router.push({ name: ROUTES.SERVICE_SELECTION });\r\n    } catch (e) {\r\n        console.warn(e);\r\n    } finally {\r\n        loading.value = false;\r\n    }\r\n};\r\n</script>\r\n"],"names":["CustomWeekDaysEnum","props","__props","isMobile","useBreakpoints","breakpointsTailwind","morningTimeFormatted","computed","DateTime","afternoonTimeFormatted","t","useI18n","sortedOpenHours","customDayOrder","a","b","dayA","dayB","d","mapDayTypeToDayNameI18N","dayType","wizardStore","useWizardStore","confirm","useConfirm","mapError","ref","mapSrc","isMapLoading","activeAccordionTabIndex","pendingTabIndex","onMounted","loadMap","index","clinic","_a","scrollToClinic","isInactive","isSelected","getAddress","loadLogo","fileUrl","error","getURL","fullUrl","mapURL","_b","watch","resolve","img","onMapPointClick","street","post","city","toRefs","nextTick","clinicElement","onClinicOpen","preselectFirstClinic","userStore","useUserStore","sortedClinics","loading","firstClinic","onSubmitClinic","router","ROUTES","e"],"mappings":"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"}