1
1
<script setup lang="ts">
2
- import { NDrawer , NDrawerContent } from ' naive-ui' ;
2
+ import { NButton , NDrawer , NDrawerContent , NFlex , NIcon } from ' naive-ui' ;
3
3
import { ref , Transition , watch } from ' vue' ;
4
4
import { RouterView , useRouter } from ' vue-router' ;
5
5
6
6
import { NavbarComponent } from ' ~/components/common' ;
7
7
import GridBackground from ' ~/components/common/background/GridBackground.vue' ;
8
8
import PageLoading from ' ~/components/common/loading/PageLoading.vue' ;
9
+ import IconChevronLeft from ' ~/components/icons/IconChevronLeft.vue' ;
10
+ import IconClose from ' ~/components/icons/IconClose.vue' ;
9
11
import { useAuthSettingsStoreRefs } from ' ~/stores/settings/auth.store' ;
10
12
11
13
const { isAuthenticated } = useAuthSettingsStoreRefs ();
12
- const { currentRoute, push, getRoutes } = useRouter ();
14
+ const { currentRoute, push, back } = useRouter ();
13
15
14
16
const origin = ref ();
15
- const drawer = ref (false );
17
+ const panel = ref (false );
16
18
17
19
watch (
18
20
currentRoute ,
19
21
(_next , _prev ) => {
20
- const isDrawer = !! _next .meta ?.drawer ;
21
- drawer .value = isDrawer ;
22
- if (origin .value && isDrawer ) return ;
23
- origin .value = isDrawer ? _prev : undefined ;
22
+ const isPanel = !! _next .meta ?.panel ;
23
+ panel .value = isPanel ;
24
+ if (origin .value && isPanel ) return ;
25
+ origin .value = isPanel ? _prev : undefined ;
24
26
},
25
27
{
26
28
immediate: true ,
@@ -36,12 +38,17 @@ const onAfterLeave = () => {
36
38
};
37
39
38
40
const onClose = () => {
39
- drawer .value = false ;
41
+ panel .value = false ;
42
+ };
43
+
44
+ const onBack = () => {
45
+ if (window .history .length > 1 ) return back ();
46
+ return onClose ();
40
47
};
41
48
</script >
42
49
43
50
<template >
44
- <header :class =" { open: drawer }" >
51
+ <header :class =" { open: panel }" >
45
52
<RouterView v-slot =" { Component }" name =" navbar" >
46
53
<NavbarComponent v-if =" isAuthenticated" >
47
54
<template v-if =" Component " #drawer =" { parentElement } " >
@@ -64,18 +71,37 @@ const onClose = () => {
64
71
</Transition >
65
72
</main >
66
73
<aside >
67
- <RouterView v-slot =" { Component: DrawerComponent }" >
74
+ <RouterView v-slot =" { Component: PanelComponent }" >
68
75
<NDrawer
69
- v-model:show =" drawer "
76
+ v-model:show =" panel "
70
77
:to =" asideRef"
71
78
width =" 100%"
72
79
close-on-esc
73
80
:on-after-leave =" onAfterLeave"
74
81
auto-focus
75
82
>
76
83
<NDrawerContent >
84
+ <!-- Header -->
85
+ <NFlex justify =" space-between" >
86
+ <NButton circle quaternary @click =" onBack" >
87
+ <template #icon >
88
+ <NIcon >
89
+ <IconChevronLeft />
90
+ </NIcon >
91
+ </template >
92
+ </NButton >
93
+ <NButton circle quaternary @click =" onClose" >
94
+ <template #icon >
95
+ <NIcon >
96
+ <IconClose />
97
+ </NIcon >
98
+ </template >
99
+ </NButton >
100
+ </NFlex >
101
+
102
+ <!-- Content -->
77
103
<KeepAlive >
78
- <component :is =" DrawerComponent " @close = " onClose " />
104
+ <component :is =" PanelComponent " />
79
105
</KeepAlive >
80
106
</NDrawerContent >
81
107
</NDrawer >
0 commit comments