purityselect/resources/js/@layouts/components/VerticalNav.vue
2024-10-27 02:51:48 +05:00

189 lines
5.3 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup>
import axios from '@axios';
import { PerfectScrollbar } from 'vue3-perfect-scrollbar';
import { useDisplay } from 'vuetify';
const currentUser = ref(localStorage.getItem('user_role'));
const seetingPlanLogo = ref();
const props = defineProps({
tag: {
type: [
String,
null,
],
required: false,
default: 'aside',
},
isOverlayNavActive: {
type: Boolean,
required: true,
},
toggleIsOverlayNavActive: {
type: Function,
required: true,
},
})
const { mdAndDown } = useDisplay()
const refNav = ref()
const route = useRoute()
watch(() => route.path, () => {
props.toggleIsOverlayNavActive(false)
})
onMounted(async () => {
let setting = await axios.post('/api/settings', {})
// console.log(setting.data)
seetingPlanLogo.value = '/assets/logo/' + setting.data.logo
})
const isVerticalNavScrolled = ref(false)
const updateIsVerticalNavScrolled = val => isVerticalNavScrolled.value = val
const handleNavScroll = evt => {
isVerticalNavScrolled.value = evt.target.scrollTop > 0
}
</script>
<template>
<Component :is="props.tag" ref="refNav" class="layout-vertical-nav" :class="[
{
'visible': isOverlayNavActive,
'scrolled': isVerticalNavScrolled,
'overlay-nav': mdAndDown,
},
]">
<!-- 👉 Header -->
<div class="nav-header px-0 py-3">
<slot name="nav-header">
<RouterLink to="/provider/dashboard" v-if="currentUser == 'agent'"
class="app-logo d-flex align-center gap-x-3 app-title-wrapper">
<!-- <div class="d-flex " /> -->
<h1 class="leading-normal text-primary">
<VImg :src="seetingPlanLogo" width="150" height="50" class="logo-img" />
</h1>
</RouterLink>
<a href="https://purityselect.com/" v-if="currentUser == 'patient'"
class="app-logo d-flex align-center gap-x-3 app-title-wrapper">
<!-- <div class="d-flex " /> -->
<h1 class="leading-normal text-primary" style="margin-right: 27px;">
<VImg :src="seetingPlanLogo" width="150" height="50" class="logo-img" />
</h1>
</a>
</slot>
</div>
<slot name="before-nav-items">
<div class="vertical-nav-items-shadow" />
</slot>
<slot name="nav-items" :update-is-vertical-nav-scrolled="updateIsVerticalNavScrolled">
<PerfectScrollbar tag="ul" class="nav-items" :options="{ wheelPropagation: false }"
@ps-scroll-y="handleNavScroll">
<slot />
</PerfectScrollbar>
</slot>
<slot name="after-nav-items" />
</Component>
</template>
<style lang="scss">
@use "@configured-variables" as variables;
@use "@layouts/styles/mixins";
.logo-img {
display: block;
position: relative;
margin: 0 auto
}
.nav-header.px-0.py-3 {
margin: 1px 45px !important;
}
.layout-nav-type-vertical .layout-vertical-nav .nav-link .router-link-exact-active:after,
.layout-nav-type-vertical .layout-vertical-nav .nav-group.active:not(.nav-group .nav-group)>:first-child:after {
position: absolute;
background-color: rgb(var(--v-theme-yellow-theme-button)) !important;
block-size: 2.625rem;
border-end-start-radius: .375rem;
border-start-start-radius: .375rem;
content: "";
inline-size: .25rem;
inset-inline-end: -1rem;
}
.nav-header {
display: block !important;
position: relative !important;
margin: 0 auto !important;
}
// 👉 Vertical Nav
.layout-vertical-nav {
position: fixed;
z-index: variables.$layout-vertical-nav-z-index;
display: flex;
flex-direction: column;
block-size: 100%;
inline-size: variables.$layout-vertical-nav-width;
inset-block-start: 0;
inset-inline-start: 0;
transition: transform 0.25s ease-in-out, inline-size 0.25s ease-in-out, box-shadow 0.25s ease-in-out;
will-change: transform, inline-size;
background-color: rgb(var(--v-theme-yellow)) !important;
.nav-header {
display: flex;
align-items: center;
.header-action {
cursor: pointer;
}
}
.app-title-wrapper {
margin-inline-end: auto;
}
.nav-items {
block-size: 100%;
padding-left: 0px;
// We no loner needs this overflow styles as perfect scrollbar applies it
// overflow-x: hidden;
// // We used `overflow-y` instead of `overflow` to mitigate overflow x. Revert back if any issue found.
// overflow-y: auto;
}
.nav-item-title {
overflow: hidden;
margin-inline-end: auto;
text-overflow: ellipsis;
white-space: nowrap;
}
// 👉 Collapsed
.layout-vertical-nav-collapsed & {
&:not(.hovered) {
inline-size: variables.$layout-vertical-nav-collapsed-width;
}
}
// 👉 Overlay nav
&.overlay-nav {
&:not(.visible) {
transform: translateX(-#{variables.$layout-vertical-nav-width});
@include mixins.rtl {
transform: translateX(variables.$layout-vertical-nav-width);
}
}
}
}
</style>