提交 | 用户 | 时间
|
820397
|
1 |
import { computed } from 'vue' |
H |
2 |
import { useAppStore } from '@/store/modules/app' |
|
3 |
import { Menu } from '@/layout/components/Menu' |
|
4 |
import { TabMenu } from '@/layout/components/TabMenu' |
|
5 |
import { TagsView } from '@/layout/components/TagsView' |
|
6 |
import { Logo } from '@/layout/components/Logo' |
|
7 |
import AppView from './AppView.vue' |
|
8 |
import ToolHeader from './ToolHeader.vue' |
|
9 |
import { ElScrollbar } from 'element-plus' |
|
10 |
import { useDesign } from '@/hooks/web/useDesign' |
|
11 |
|
|
12 |
const { getPrefixCls } = useDesign() |
|
13 |
|
|
14 |
const prefixCls = getPrefixCls('layout') |
|
15 |
|
|
16 |
const appStore = useAppStore() |
|
17 |
|
|
18 |
const pageLoading = computed(() => appStore.getPageLoading) |
|
19 |
|
|
20 |
// 标签页 |
|
21 |
const tagsView = computed(() => appStore.getTagsView) |
|
22 |
|
|
23 |
// 菜单折叠 |
|
24 |
const collapse = computed(() => appStore.getCollapse) |
|
25 |
|
|
26 |
// logo |
|
27 |
const logo = computed(() => appStore.logo) |
|
28 |
|
|
29 |
// 固定头部 |
|
30 |
const fixedHeader = computed(() => appStore.getFixedHeader) |
|
31 |
|
|
32 |
// 是否是移动端 |
|
33 |
const mobile = computed(() => appStore.getMobile) |
|
34 |
|
|
35 |
// 固定菜单 |
|
36 |
const fixedMenu = computed(() => appStore.getFixedMenu) |
|
37 |
|
|
38 |
export const useRenderLayout = () => { |
|
39 |
const renderClassic = () => { |
|
40 |
return ( |
|
41 |
<> |
|
42 |
<div |
|
43 |
class={[ |
|
44 |
'absolute top-0 left-0 h-full layout-border__right', |
|
45 |
{ '!fixed z-3000': mobile.value } |
|
46 |
]} |
|
47 |
> |
|
48 |
{logo.value ? ( |
|
49 |
<Logo |
|
50 |
class={[ |
|
51 |
'bg-[var(--left-menu-bg-color)] relative', |
|
52 |
{ |
|
53 |
'!pl-0': mobile.value && collapse.value, |
|
54 |
'w-[var(--left-menu-min-width)]': appStore.getCollapse, |
|
55 |
'w-[var(--left-menu-max-width)]': !appStore.getCollapse |
|
56 |
} |
|
57 |
]} |
|
58 |
style="transition: all var(--transition-time-02);" |
|
59 |
></Logo> |
|
60 |
) : undefined} |
|
61 |
<Menu class={[{ '!h-[calc(100%-var(--logo-height))]': logo.value }]}></Menu> |
|
62 |
</div> |
|
63 |
<div |
|
64 |
class={[ |
|
65 |
`${prefixCls}-content`, |
|
66 |
'absolute top-0 h-[100%]', |
|
67 |
{ |
|
68 |
'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)]': |
|
69 |
collapse.value && !mobile.value && !mobile.value, |
|
70 |
'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)]': |
|
71 |
!collapse.value && !mobile.value && !mobile.value, |
|
72 |
'fixed !w-full !left-0': mobile.value |
|
73 |
} |
|
74 |
]} |
|
75 |
style="transition: all var(--transition-time-02);" |
|
76 |
> |
|
77 |
<ElScrollbar |
|
78 |
v-loading={pageLoading.value} |
|
79 |
class={[ |
|
80 |
`${prefixCls}-content-scrollbar`, |
|
81 |
{ |
|
82 |
'!h-[calc(100%-var(--top-tool-height)-var(--tags-view-height))] mt-[calc(var(--top-tool-height)+var(--tags-view-height))]': |
|
83 |
fixedHeader.value |
|
84 |
} |
|
85 |
]} |
|
86 |
> |
|
87 |
<div |
|
88 |
class={[ |
|
89 |
{ |
|
90 |
'fixed top-0 left-0 z-10': fixedHeader.value, |
|
91 |
'w-[calc(100%-var(--left-menu-min-width))] !left-[var(--left-menu-min-width)]': |
|
92 |
collapse.value && fixedHeader.value && !mobile.value, |
|
93 |
'w-[calc(100%-var(--left-menu-max-width))] !left-[var(--left-menu-max-width)]': |
|
94 |
!collapse.value && fixedHeader.value && !mobile.value, |
|
95 |
'!w-full !left-0': mobile.value |
|
96 |
} |
|
97 |
]} |
|
98 |
style="transition: all var(--transition-time-02);" |
|
99 |
> |
|
100 |
<ToolHeader |
|
101 |
class={[ |
|
102 |
'bg-[var(--top-header-bg-color)]', |
|
103 |
{ |
|
104 |
'layout-border__bottom': !tagsView.value |
|
105 |
} |
|
106 |
]} |
|
107 |
></ToolHeader> |
|
108 |
|
|
109 |
{tagsView.value ? ( |
|
110 |
<TagsView class="layout-border__top layout-border__bottom"></TagsView> |
|
111 |
) : undefined} |
|
112 |
</div> |
|
113 |
|
|
114 |
<AppView></AppView> |
|
115 |
</ElScrollbar> |
|
116 |
</div> |
|
117 |
</> |
|
118 |
) |
|
119 |
} |
|
120 |
|
|
121 |
const renderTopLeft = () => { |
|
122 |
return ( |
|
123 |
<> |
|
124 |
<div class="relative flex items-center bg-[var(--top-header-bg-color)] layout-border__bottom dark:bg-[var(--el-bg-color)]"> |
|
125 |
{logo.value ? <Logo class="custom-hover"></Logo> : undefined} |
|
126 |
|
|
127 |
<ToolHeader class="flex-1"></ToolHeader> |
|
128 |
</div> |
3e359e
|
129 |
<div class="absolute left-0 top-[var(--logo-height)] h-[calc(100%-var(--logo-height))] w-full flex"> |
820397
|
130 |
<Menu class="relative layout-border__right !h-full"></Menu> |
H |
131 |
<div |
|
132 |
class={[ |
|
133 |
`${prefixCls}-content`, |
|
134 |
'h-[100%]', |
|
135 |
{ |
|
136 |
'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)]': |
|
137 |
collapse.value, |
|
138 |
'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)]': |
|
139 |
!collapse.value |
|
140 |
} |
|
141 |
]} |
|
142 |
style="transition: all var(--transition-time-02);" |
|
143 |
> |
|
144 |
<ElScrollbar |
|
145 |
v-loading={pageLoading.value} |
|
146 |
class={[ |
|
147 |
`${prefixCls}-content-scrollbar`, |
|
148 |
{ |
|
149 |
'!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]': |
|
150 |
fixedHeader.value && tagsView.value |
|
151 |
} |
|
152 |
]} |
|
153 |
> |
|
154 |
{tagsView.value ? ( |
|
155 |
<TagsView |
|
156 |
class={[ |
|
157 |
'layout-border__bottom absolute', |
|
158 |
{ |
|
159 |
'!fixed top-0 left-0 z-10': fixedHeader.value, |
3e359e
|
160 |
'w-[calc(100%-var(--left-menu-min-width))] !left-[var(--left-menu-min-width)] mt-[var(--logo-height)]': |
820397
|
161 |
collapse.value && fixedHeader.value, |
3e359e
|
162 |
'w-[calc(100%-var(--left-menu-max-width))] !left-[var(--left-menu-max-width)] mt-[var(--logo-height)]': |
820397
|
163 |
!collapse.value && fixedHeader.value |
H |
164 |
} |
|
165 |
]} |
|
166 |
style="transition: width var(--transition-time-02), left var(--transition-time-02);" |
|
167 |
></TagsView> |
|
168 |
) : undefined} |
|
169 |
|
|
170 |
<AppView></AppView> |
|
171 |
</ElScrollbar> |
|
172 |
</div> |
|
173 |
</div> |
|
174 |
</> |
|
175 |
) |
|
176 |
} |
|
177 |
|
|
178 |
const renderTop = () => { |
|
179 |
return ( |
|
180 |
<> |
|
181 |
<div |
|
182 |
class={[ |
|
183 |
'flex items-center justify-between bg-[var(--top-header-bg-color)] relative', |
|
184 |
{ |
|
185 |
'layout-border__bottom': !tagsView.value |
|
186 |
} |
|
187 |
]} |
|
188 |
> |
|
189 |
{logo.value ? <Logo class="custom-hover"></Logo> : undefined} |
|
190 |
<Menu class="h-[var(--top-tool-height)] flex-1 px-10px"></Menu> |
|
191 |
<ToolHeader></ToolHeader> |
|
192 |
</div> |
3e359e
|
193 |
<div class={[`${prefixCls}-content`, 'w-full h-[calc(100%-var(--top-tool-height))]']}> |
820397
|
194 |
<ElScrollbar |
H |
195 |
v-loading={pageLoading.value} |
|
196 |
class={[ |
|
197 |
`${prefixCls}-content-scrollbar`, |
|
198 |
{ |
3e359e
|
199 |
'!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]': |
H |
200 |
fixedHeader.value |
820397
|
201 |
} |
H |
202 |
]} |
|
203 |
> |
|
204 |
{tagsView.value ? ( |
|
205 |
<TagsView |
|
206 |
class={[ |
|
207 |
'layout-border__bottom layout-border__top relative', |
|
208 |
{ |
3e359e
|
209 |
'!fixed w-full top-[var(--top-tool-height)] left-0': fixedHeader.value |
820397
|
210 |
} |
H |
211 |
]} |
|
212 |
style="transition: width var(--transition-time-02), left var(--transition-time-02);" |
|
213 |
></TagsView> |
|
214 |
) : undefined} |
|
215 |
|
|
216 |
<AppView></AppView> |
|
217 |
</ElScrollbar> |
|
218 |
</div> |
|
219 |
</> |
|
220 |
) |
|
221 |
} |
|
222 |
|
|
223 |
const renderCutMenu = () => { |
|
224 |
return ( |
|
225 |
<> |
|
226 |
<div class="relative flex items-center bg-[var(--top-header-bg-color)] layout-border__bottom"> |
|
227 |
{logo.value ? <Logo class="custom-hover !pr-15px"></Logo> : undefined} |
|
228 |
|
|
229 |
<ToolHeader class="flex-1"></ToolHeader> |
|
230 |
</div> |
3e359e
|
231 |
<div class="absolute left-0 top-[var(--logo-height)] h-[calc(100%-var(--logo-height))] w-full flex"> |
820397
|
232 |
<TabMenu></TabMenu> |
H |
233 |
<div |
|
234 |
class={[ |
|
235 |
`${prefixCls}-content`, |
|
236 |
'h-[100%]', |
|
237 |
{ |
|
238 |
'w-[calc(100%-var(--tab-menu-min-width))] left-[var(--tab-menu-min-width)]': |
|
239 |
collapse.value && !fixedMenu.value, |
|
240 |
'w-[calc(100%-var(--tab-menu-max-width))] left-[var(--tab-menu-max-width)]': |
|
241 |
!collapse.value && !fixedMenu.value, |
|
242 |
'w-[calc(100%-var(--tab-menu-min-width)-var(--left-menu-max-width))] ml-[var(--left-menu-max-width)]': |
|
243 |
collapse.value && fixedMenu.value, |
|
244 |
'w-[calc(100%-var(--tab-menu-max-width)-var(--left-menu-max-width))] ml-[var(--left-menu-max-width)]': |
|
245 |
!collapse.value && fixedMenu.value |
|
246 |
} |
|
247 |
]} |
|
248 |
style="transition: all var(--transition-time-02);" |
|
249 |
> |
|
250 |
<ElScrollbar |
|
251 |
v-loading={pageLoading.value} |
|
252 |
class={[ |
|
253 |
`${prefixCls}-content-scrollbar`, |
|
254 |
{ |
|
255 |
'!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]': |
|
256 |
fixedHeader.value && tagsView.value |
|
257 |
} |
|
258 |
]} |
|
259 |
> |
|
260 |
{tagsView.value ? ( |
|
261 |
<TagsView |
|
262 |
class={[ |
3e359e
|
263 |
'relative layout-border__bottom', |
820397
|
264 |
{ |
H |
265 |
'!fixed top-0 left-0 z-10': fixedHeader.value, |
|
266 |
'w-[calc(100%-var(--tab-menu-min-width))] !left-[var(--tab-menu-min-width)] mt-[var(--logo-height)]': |
3e359e
|
267 |
collapse.value && fixedHeader.value && !fixedMenu.value, |
820397
|
268 |
'w-[calc(100%-var(--tab-menu-max-width))] !left-[var(--tab-menu-max-width)] mt-[var(--logo-height)]': |
3e359e
|
269 |
!collapse.value && fixedHeader.value && !fixedMenu.value, |
H |
270 |
'w-[calc(100%-var(--tab-menu-min-width)-var(--left-menu-max-width))] !left-[calc(var(--tab-menu-min-width)+var(--left-menu-max-width))] mt-[var(--logo-height)]': |
820397
|
271 |
collapse.value && fixedHeader.value && fixedMenu.value, |
3e359e
|
272 |
'w-[calc(100%-var(--tab-menu-max-width)-var(--left-menu-max-width))] !left-[calc(var(--tab-menu-max-width)+var(--left-menu-max-width))] mt-[var(--logo-height)]': |
820397
|
273 |
!collapse.value && fixedHeader.value && fixedMenu.value |
H |
274 |
} |
|
275 |
]} |
|
276 |
style="transition: width var(--transition-time-02), left var(--transition-time-02);" |
|
277 |
></TagsView> |
|
278 |
) : undefined} |
|
279 |
|
|
280 |
<AppView></AppView> |
|
281 |
</ElScrollbar> |
|
282 |
</div> |
|
283 |
</div> |
|
284 |
</> |
|
285 |
) |
|
286 |
} |
|
287 |
|
|
288 |
return { |
|
289 |
renderClassic, |
|
290 |
renderTopLeft, |
|
291 |
renderTop, |
|
292 |
renderCutMenu |
|
293 |
} |
|
294 |
} |