2023-01-18 22:46:19 -03:00
|
|
|
<script setup>
|
2023-01-25 20:55:24 -03:00
|
|
|
import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
|
|
|
|
import { useLayout } from '@/layout/composables/layout';
|
|
|
|
import { useRouter } from 'vue-router';
|
2023-01-18 22:46:19 -03:00
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
const { onMenuToggle } = useLayout();
|
2023-01-18 22:46:19 -03:00
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
const outsideClickListener = ref(null);
|
|
|
|
const topbarMenuActive = ref(false);
|
|
|
|
const router = useRouter();
|
2023-01-18 22:46:19 -03:00
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
onMounted(() => {
|
|
|
|
bindOutsideClickListener();
|
|
|
|
});
|
2023-01-18 22:46:19 -03:00
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
onBeforeUnmount(() => {
|
|
|
|
unbindOutsideClickListener();
|
|
|
|
});
|
2023-01-18 22:46:19 -03:00
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
const onTopBarMenuButton = () => {
|
|
|
|
topbarMenuActive.value = !topbarMenuActive.value;
|
2023-01-18 22:46:19 -03:00
|
|
|
};
|
2023-01-25 20:55:24 -03:00
|
|
|
const onSettingsClick = () => {
|
|
|
|
topbarMenuActive.value = false;
|
|
|
|
router.push('/documentation');
|
|
|
|
};
|
|
|
|
const topbarMenuClasses = computed(() => {
|
|
|
|
return {
|
|
|
|
'layout-topbar-menu-mobile-active': topbarMenuActive.value
|
2023-01-18 22:46:19 -03:00
|
|
|
};
|
2023-01-25 20:55:24 -03:00
|
|
|
});
|
|
|
|
|
|
|
|
const bindOutsideClickListener = () => {
|
|
|
|
if (!outsideClickListener.value) {
|
|
|
|
outsideClickListener.value = (event) => {
|
|
|
|
if (isOutsideClicked(event)) {
|
|
|
|
topbarMenuActive.value = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
document.addEventListener('click', outsideClickListener.value);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const unbindOutsideClickListener = () => {
|
|
|
|
if (outsideClickListener.value) {
|
|
|
|
document.removeEventListener('click', outsideClickListener);
|
|
|
|
outsideClickListener.value = null;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
const isOutsideClicked = (event) => {
|
|
|
|
if (!topbarMenuActive.value) return;
|
2023-01-18 22:46:19 -03:00
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
const sidebarEl = document.querySelector('.layout-topbar-menu');
|
|
|
|
const topbarEl = document.querySelector('.layout-topbar-menu-button');
|
2023-01-18 22:46:19 -03:00
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
return !(sidebarEl.isSameNode(event.target) || sidebarEl.contains(event.target) || topbarEl.isSameNode(event.target) || topbarEl.contains(event.target));
|
|
|
|
};
|
2023-01-18 22:46:19 -03:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<div class="layout-topbar">
|
2023-01-25 20:55:24 -03:00
|
|
|
<button
|
|
|
|
class="p-link layout-menu-button layout-topbar-button"
|
|
|
|
@click="onMenuToggle()"
|
|
|
|
>
|
2023-01-18 22:46:19 -03:00
|
|
|
<i class="pi pi-bars"></i>
|
|
|
|
</button>
|
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
<button
|
|
|
|
class="p-link layout-topbar-menu-button layout-topbar-button"
|
|
|
|
@click="onTopBarMenuButton()"
|
|
|
|
>
|
2023-01-18 22:46:19 -03:00
|
|
|
<i class="pi pi-ellipsis-v"></i>
|
|
|
|
</button>
|
|
|
|
|
2023-01-25 20:55:24 -03:00
|
|
|
<div
|
|
|
|
class="layout-topbar-menu"
|
|
|
|
:class="topbarMenuClasses"
|
|
|
|
>
|
|
|
|
<button
|
|
|
|
@click="onTopBarMenuButton()"
|
|
|
|
class="p-link layout-topbar-button"
|
|
|
|
>
|
2023-01-18 22:46:19 -03:00
|
|
|
<i class="pi pi-calendar"></i>
|
|
|
|
<span>Calendar</span>
|
|
|
|
</button>
|
2023-01-25 20:55:24 -03:00
|
|
|
<button
|
|
|
|
@click="onTopBarMenuButton()"
|
|
|
|
class="p-link layout-topbar-button"
|
|
|
|
>
|
2023-01-18 22:46:19 -03:00
|
|
|
<i class="pi pi-user"></i>
|
|
|
|
<span>Profile</span>
|
|
|
|
</button>
|
2023-01-25 20:55:24 -03:00
|
|
|
<button
|
|
|
|
@click="onSettingsClick()"
|
|
|
|
class="p-link layout-topbar-button"
|
|
|
|
>
|
2023-01-18 22:46:19 -03:00
|
|
|
<i class="pi pi-cog"></i>
|
|
|
|
<span>Settings</span>
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<style lang="scss" scoped></style>
|