useRenderLayout.tsx 13 KB

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