useRenderLayout.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  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. export const useRenderLayout = () => {
  24. const renderClassic = () => {
  25. return (
  26. <>
  27. {!hideLeftMenu.value ? (
  28. <div
  29. class={[
  30. 'absolute top-0 left-0 h-full layout-border__right',
  31. { '!fixed z-3000': mobile.value }
  32. ]}
  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);"
  45. ></Logo>
  46. ) : undefined}
  47. <Menu class={[{ '!h-[calc(100%-var(--logo-height))]': logo.value }]}></Menu>
  48. </div>
  49. ) : undefined}
  50. <div
  51. class={[
  52. `${prefixCls}-content`,
  53. 'absolute top-0 h-[100%]',
  54. {
  55. 'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)]':
  56. !hideLeftMenu.value && collapse.value && !mobile.value,
  57. 'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)]':
  58. !hideLeftMenu.value && !collapse.value && !mobile.value,
  59. 'w-full left-0': hideLeftMenu.value,
  60. 'fixed !w-full !left-0': mobile.value
  61. }
  62. ]}
  63. style="transition: all var(--transition-time-02);"
  64. >
  65. <ElScrollbar
  66. v-loading={pageLoading.value}
  67. class={[
  68. `${prefixCls}-content-scrollbar`,
  69. {
  70. '!h-[calc(100%-var(--top-tool-height)-var(--tags-view-height))] mt-[calc(var(--top-tool-height)+var(--tags-view-height))]':
  71. fixedHeader.value
  72. }
  73. ]}
  74. >
  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. >
  88. <ToolHeader
  89. class={[
  90. 'bg-[var(--top-header-bg-color)]',
  91. {
  92. 'layout-border__bottom': !tagsView.value
  93. }
  94. ]}
  95. ></ToolHeader>
  96. {tagsView.value ? (
  97. <TagsView class="layout-border__top layout-border__bottom"></TagsView>
  98. ) : undefined}
  99. </div>
  100. <AppView></AppView>
  101. </ElScrollbar>
  102. </div>
  103. </>
  104. )
  105. }
  106. const renderTopLeft = () => {
  107. return (
  108. <>
  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. <div class="absolute left-0 top-[var(--logo-height)] h-[calc(100%-var(--logo-height))] w-full flex">
  114. {!hideLeftMenu.value ? <Menu class="relative layout-border__right !h-full"></Menu> : undefined}
  115. <div
  116. class={[
  117. `${prefixCls}-content`,
  118. 'h-[100%]',
  119. {
  120. 'w-[calc(100%-var(--left-menu-min-width))] left-[var(--left-menu-min-width)]':
  121. !hideLeftMenu.value && collapse.value,
  122. 'w-[calc(100%-var(--left-menu-max-width))] left-[var(--left-menu-max-width)]':
  123. !hideLeftMenu.value && !collapse.value,
  124. 'w-full left-0': hideLeftMenu.value
  125. }
  126. ]}
  127. style="transition: all var(--transition-time-02);"
  128. >
  129. <ElScrollbar
  130. v-loading={pageLoading.value}
  131. class={[
  132. `${prefixCls}-content-scrollbar`,
  133. {
  134. '!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]':
  135. fixedHeader.value && tagsView.value
  136. }
  137. ]}
  138. >
  139. {tagsView.value ? (
  140. <TagsView
  141. class={[
  142. 'layout-border__bottom absolute',
  143. {
  144. '!fixed top-0 left-0 z-10': fixedHeader.value,
  145. 'w-[calc(100%-var(--left-menu-min-width))] !left-[var(--left-menu-min-width)] mt-[var(--logo-height)]':
  146. !hideLeftMenu.value && collapse.value && fixedHeader.value,
  147. 'w-[calc(100%-var(--left-menu-max-width))] !left-[var(--left-menu-max-width)] mt-[var(--logo-height)]':
  148. !hideLeftMenu.value && !collapse.value && fixedHeader.value,
  149. '!w-full !left-0': hideLeftMenu.value
  150. }
  151. ]}
  152. style="transition: width var(--transition-time-02), left var(--transition-time-02);"
  153. ></TagsView>
  154. ) : undefined}
  155. <AppView></AppView>
  156. </ElScrollbar>
  157. </div>
  158. </div>
  159. </>
  160. )
  161. }
  162. const renderTop = () => {
  163. return (
  164. <>
  165. <div
  166. class={[
  167. 'flex items-center justify-between bg-[var(--top-header-bg-color)] relative',
  168. {
  169. 'layout-border__bottom': !tagsView.value
  170. }
  171. ]}
  172. >
  173. {logo.value ? <Logo class="custom-hover"></Logo> : undefined}
  174. {!hideLeftMenu.value ? <Menu class="h-[var(--top-tool-height)] flex-1 px-10px"></Menu> : undefined}
  175. <ToolHeader></ToolHeader>
  176. </div>
  177. <div class={[`${prefixCls}-content`, 'w-full h-[calc(100%-var(--top-tool-height))]']}>
  178. <ElScrollbar
  179. v-loading={pageLoading.value}
  180. class={[
  181. `${prefixCls}-content-scrollbar`,
  182. {
  183. '!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]':
  184. fixedHeader.value && tagsView.value
  185. }
  186. ]}
  187. >
  188. {tagsView.value ? (
  189. <TagsView
  190. class={[
  191. 'layout-border__bottom layout-border__top relative',
  192. {
  193. '!fixed w-full top-[var(--top-tool-height)] left-0': fixedHeader.value
  194. }
  195. ]}
  196. style="transition: width var(--transition-time-02), left var(--transition-time-02);"
  197. ></TagsView>
  198. ) : undefined}
  199. <AppView></AppView>
  200. </ElScrollbar>
  201. </div>
  202. </>
  203. )
  204. }
  205. const renderCutMenu = () => {
  206. return (
  207. <>
  208. <div class="relative flex items-center bg-[var(--top-header-bg-color)] layout-border__bottom">
  209. {logo.value ? <Logo class="custom-hover !pr-15px"></Logo> : undefined}
  210. <ToolHeader class="flex-1"></ToolHeader>
  211. </div>
  212. <div class="absolute left-0 top-[var(--logo-height)] h-[calc(100%-var(--logo-height))] w-full flex">
  213. {!hideLeftMenu.value ? <TabMenu></TabMenu> : undefined}
  214. <div
  215. class={[
  216. `${prefixCls}-content`,
  217. 'h-[100%]',
  218. {
  219. 'w-[calc(100%-var(--tab-menu-min-width))] left-[var(--tab-menu-min-width)]':
  220. !hideLeftMenu.value && collapse.value && !fixedMenu.value,
  221. 'w-[calc(100%-var(--tab-menu-max-width))] left-[var(--tab-menu-max-width)]':
  222. !hideLeftMenu.value && !collapse.value && !fixedMenu.value,
  223. 'w-[calc(100%-var(--tab-menu-min-width)-var(--left-menu-max-width))] ml-[var(--left-menu-max-width)]':
  224. !hideLeftMenu.value && collapse.value && fixedMenu.value,
  225. 'w-[calc(100%-var(--tab-menu-max-width)-var(--left-menu-max-width))] ml-[var(--left-menu-max-width)]':
  226. !hideLeftMenu.value && !collapse.value && fixedMenu.value,
  227. 'w-full left-0': hideLeftMenu.value
  228. }
  229. ]}
  230. style="transition: all var(--transition-time-02);"
  231. >
  232. <ElScrollbar
  233. v-loading={pageLoading.value}
  234. class={[
  235. `${prefixCls}-content-scrollbar`,
  236. {
  237. '!h-[calc(100%-var(--tags-view-height))] mt-[calc(var(--tags-view-height))]':
  238. fixedHeader.value && tagsView.value
  239. }
  240. ]}
  241. >
  242. {tagsView.value ? (
  243. <TagsView
  244. class={[
  245. 'relative layout-border__bottom',
  246. {
  247. '!fixed top-0 left-0 z-10': fixedHeader.value,
  248. 'w-[calc(100%-var(--tab-menu-min-width))] !left-[var(--tab-menu-min-width)] mt-[var(--logo-height)]':
  249. !hideLeftMenu.value && collapse.value && fixedHeader.value && !fixedMenu.value,
  250. 'w-[calc(100%-var(--tab-menu-max-width))] !left-[var(--tab-menu-max-width)] mt-[var(--logo-height)]':
  251. !hideLeftMenu.value && !collapse.value && fixedHeader.value && !fixedMenu.value,
  252. '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)]':
  253. !hideLeftMenu.value && collapse.value && fixedHeader.value && fixedMenu.value,
  254. '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)]':
  255. !hideLeftMenu.value && !collapse.value && fixedHeader.value && fixedMenu.value,
  256. '!w-full !left-0': hideLeftMenu.value
  257. }
  258. ]}
  259. style="transition: width var(--transition-time-02), left var(--transition-time-02);"
  260. ></TagsView>
  261. ) : undefined}
  262. <AppView></AppView>
  263. </ElScrollbar>
  264. </div>
  265. </div>
  266. </>
  267. )
  268. }
  269. return {
  270. renderClassic,
  271. renderTopLeft,
  272. renderTop,
  273. renderCutMenu
  274. }
  275. }