1
1
<script setup lang="ts">
2
- import { NButton , NDrawer , NDrawerContent , NFlex , NIcon } from ' naive-ui' ;
2
+ import {
3
+ NButton ,
4
+ NDialogProvider ,
5
+ NDrawer ,
6
+ NDrawerContent ,
7
+ NFlex ,
8
+ NIcon ,
9
+ } from ' naive-ui' ;
3
10
import { ref , Transition , watch } from ' vue' ;
4
11
import { RouterView , useRouter } from ' vue-router' ;
5
12
6
- import { NavbarComponent } from ' ~/components/common' ;
7
13
import GridBackground from ' ~/components/common/background/GridBackground.vue' ;
8
14
import DebugProvider from ' ~/components/common/debug/DebugProvider.vue' ;
9
15
import PageLoading from ' ~/components/common/loading/PageLoading.vue' ;
16
+ import NavbarComponent from ' ~/components/common/navbar/NavbarComponent.vue' ;
10
17
import IconChevronLeft from ' ~/components/icons/IconChevronLeft.vue' ;
11
18
import IconClose from ' ~/components/icons/IconClose.vue' ;
19
+ import CheckinComponent from ' ~/components/views/checkin/CheckinComponent.vue' ;
12
20
import { useAuthSettingsStoreRefs } from ' ~/stores/settings/auth.store' ;
13
21
14
22
const { isAuthenticated } = useAuthSettingsStoreRefs ();
15
23
const { currentRoute, push, back } = useRouter ();
16
24
17
25
const panel = ref (false );
18
26
const base = ref ();
27
+ const footer = ref (false );
28
+
29
+ const appRef = ref ();
30
+ const mainRef = ref ();
31
+ const footerRef = ref ();
19
32
20
33
watch (
21
34
currentRoute ,
27
40
immediate: true ,
28
41
},
29
42
);
30
-
31
- const asideRef = ref ();
32
-
33
43
const onAfterLeave = () => {
34
44
if (! base .value ) return ;
35
45
push ({ name: base .value });
@@ -46,68 +56,75 @@ const onBack = () => {
46
56
</script >
47
57
48
58
<template >
49
- <header :class =" { open: panel }" >
50
- <RouterView v-slot =" { Component }" name =" navbar" >
51
- <NavbarComponent v-if =" isAuthenticated" :disabled =" panel" >
52
- <template v-if =" Component " #drawer =" { parentElement } " >
59
+ <div ref =" appRef" >
60
+ <NDialogProvider :to =" appRef" >
61
+ <header :class =" { open: panel }" >
62
+ <RouterView v-slot =" { Component }" name =" navbar" >
63
+ <NavbarComponent v-if =" isAuthenticated" :disabled =" panel" >
64
+ <template v-if =" Component " #drawer =" { parentElement } " >
65
+ <Transition name =" scale" mode =" out-in" >
66
+ <KeepAlive >
67
+ <component :is =" Component" :parent-element =" parentElement" />
68
+ </KeepAlive >
69
+ </Transition >
70
+ </template >
71
+ </NavbarComponent >
72
+ </RouterView >
73
+ </header >
74
+ <RouterView v-slot =" { Component }" >
75
+ <main ref =" mainRef" >
76
+ <GridBackground v-if =" !Component" :size =" 20" />
53
77
<Transition name =" scale" mode =" out-in" >
54
78
<KeepAlive >
55
- <component :is =" Component" :parent-element = " parentElement " />
79
+ <component :is =" Component ?? PageLoading " :panel = " panel " :footer = " footer " />
56
80
</KeepAlive >
57
81
</Transition >
58
- </template >
59
- </NavbarComponent >
60
- </RouterView >
61
- </header >
62
- <RouterView v-slot =" { Component }" >
63
- <main ref =" asideRef" style =" position : relative " >
64
- <GridBackground v-if =" !Component" :size =" 20" />
65
- <Transition name =" scale" mode =" out-in" >
66
- <KeepAlive >
67
- <component :is =" Component ?? PageLoading" :panel =" panel" />
68
- </KeepAlive >
69
- </Transition >
70
- </main >
71
- <aside >
72
- <RouterView v-slot =" { Component: PanelComponent }" >
73
- <NDrawer
74
- v-model:show =" panel"
75
- :to =" asideRef"
76
- width =" 100%"
77
- class =" panel"
78
- close-on-esc
79
- :on-after-leave =" onAfterLeave"
80
- auto-focus
81
- >
82
- <NDrawerContent :native-scrollbar =" false" >
83
- <!-- Header -->
84
- <NFlex justify =" space-between" class =" panel-header" >
85
- <NButton circle quaternary @click =" onBack" >
86
- <template #icon >
87
- <NIcon >
88
- <IconChevronLeft />
89
- </NIcon >
90
- </template >
91
- </NButton >
92
- <NButton circle quaternary @click =" onClose" >
93
- <template #icon >
94
- <NIcon >
95
- <IconClose />
96
- </NIcon >
97
- </template >
98
- </NButton >
99
- </NFlex >
100
-
101
- <!-- Content -->
102
- <div class =" panel-content" >
103
- <component :is =" PanelComponent" />
104
- </div >
105
- </NDrawerContent >
106
- </NDrawer >
82
+ </main >
83
+ <aside >
84
+ <RouterView v-slot =" { Component: PanelComponent }" >
85
+ <NDrawer
86
+ v-model:show =" panel"
87
+ :to =" mainRef"
88
+ width =" 100%"
89
+ class =" panel"
90
+ close-on-esc
91
+ :on-after-leave =" onAfterLeave"
92
+ auto-focus
93
+ >
94
+ <NDrawerContent :native-scrollbar =" false" >
95
+ <!-- Header -->
96
+ <NFlex justify =" space-between" class =" panel-header" >
97
+ <NButton circle quaternary @click =" onBack" >
98
+ <template #icon >
99
+ <NIcon >
100
+ <IconChevronLeft />
101
+ </NIcon >
102
+ </template >
103
+ </NButton >
104
+ <NButton circle quaternary @click =" onClose" >
105
+ <template #icon >
106
+ <NIcon >
107
+ <IconClose />
108
+ </NIcon >
109
+ </template >
110
+ </NButton >
111
+ </NFlex >
112
+
113
+ <!-- Content -->
114
+ <div class =" panel-content" >
115
+ <component :is =" PanelComponent" />
116
+ </div >
117
+ </NDrawerContent >
118
+ </NDrawer >
119
+ </RouterView >
120
+ </aside >
121
+ <footer ref =" footerRef" @mouseenter =" footer = true" @mouseleave =" footer = false" >
122
+ <CheckinComponent :parent-element =" footerRef" />
123
+ </footer >
124
+ <DebugProvider />
107
125
</RouterView >
108
- </aside >
109
- <DebugProvider />
110
- </RouterView >
126
+ </NDialogProvider >
127
+ </div >
111
128
</template >
112
129
113
130
<style lang="scss" scoped>
@@ -140,6 +157,7 @@ header {
140
157
}
141
158
142
159
main {
160
+ position : relative ;
143
161
display : flex ;
144
162
flex-direction : column ;
145
163
align-items : center ;
@@ -148,6 +166,13 @@ main {
148
166
margin-top : layout .$header-navbar-height ;
149
167
}
150
168
169
+ footer {
170
+ position : fixed ;
171
+ bottom : 0 ;
172
+ z-index : layers .$layer-ui ;
173
+ width : 100% ;
174
+ }
175
+
151
176
.panel {
152
177
position : relative ;
153
178
max-height : calc (100% - #{layout .$header-navbar-height } );
0 commit comments